diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..3f18d607f --- /dev/null +++ b/.dockerignore @@ -0,0 +1,4 @@ +/var +.idea +.vscode +.github diff --git a/Makefile b/Makefile index 4b2472608..60008306d 100644 --- a/Makefile +++ b/Makefile @@ -109,7 +109,7 @@ go_clean_deps: ## Runs `go mod tidy` && `go mod vendor` .PHONY: go_lint go_lint: ## Run all linters that are triggered by the CI pipeline - docker run -t --rm -v $(shell pwd):/app -w /app golangci/golangci-lint:v1.51.1 golangci-lint run -v --timeout 2m + docker run -t --rm -v $(shell pwd):/app -w /app golangci/golangci-lint:v1.51.1 golangci-lint run -v --timeout 2m --build-tags "test" .PHONY: go_imports go_imports: ## Group imports using rinchsan/gosimports @@ -164,11 +164,11 @@ build_and_watch: ## Continous build Pocket's main entrypoint as files change # TODO(olshansky): Need to think of a Pocket related name for `compose_and_watch`, maybe just `pocket_watch`? .PHONY: compose_and_watch compose_and_watch: docker_check db_start monitoring_start ## Run a localnet composed of 4 consensus validators w/ hot reload & debugging - ${docker-compose} up --force-recreate node1.consensus node2.consensus node3.consensus node4.consensus + ${docker-compose} up --force-recreate validator1 validator2 validator3 validator4 servicer1 fisherman1 .PHONY: rebuild_and_compose_and_watch rebuild_and_compose_and_watch: docker_check db_start monitoring_start ## Rebuilds the container from scratch and launches compose_and_watch - ${docker-compose} up --build --force-recreate node1.consensus node2.consensus node3.consensus node4.consensus + ${docker-compose} up --build --force-recreate validator1 validator2 validator3 validator4 servicer1 fisherman1 .PHONY: db_start db_start: docker_check ## Start a detached local postgres and admin instance; compose_and_watch is responsible for instantiating the actual schemas @@ -179,7 +179,7 @@ db_cli: ## Open a CLI to the local containerized postgres instance echo "View schema by running 'SELECT schema_name FROM information_schema.schemata;'" docker exec -it pocket-db bash -c "psql -U postgres" -psqlSchema ?= node1 +psqlSchema ?= validator1 .PHONY: db_cli_node db_cli_node: ## Open a CLI to the local containerized postgres instance for a specific node @@ -320,10 +320,11 @@ generate_rpc_openapi: go_oapi-codegen ## (Re)generates the RPC server and client oapi-codegen --config ./rpc/client.gen.config.yml ./rpc/v1/openapi.yaml > ./rpc/client.gen.go echo "OpenAPI client and server generated" +SWAGGER_PORT=127.0.0.1:8080 .PHONY: swagger-ui swagger-ui: ## Starts a local Swagger UI instance for the RPC API echo "Attempting to start Swagger UI at http://localhost:8080" - docker run -p 8080:8080 -e SWAGGER_JSON=/v1/openapi.yaml -v $(shell pwd)/rpc/v1:/v1 swaggerapi/swagger-ui + docker run --name pocket-swagger-ui --rm -p $(SWAGGER_PORT):8080 -e SWAGGER_JSON=/v1/openapi.yaml -v $(shell pwd)/rpc/v1:/v1 swaggerapi/swagger-ui .PHONY: generate_cli_commands_docs generate_cli_commands_docs: ## (Re)generates the CLI commands docs (this is meant to be called by CI) @@ -571,4 +572,4 @@ search_interfaces: ## Greps and outputs all of the structs in the project (exclu .PHONY: search_protos search_protos: ## Finds all of the proto files in the project (excluding vendor) - find . -name "*.proto" -not -path "./vendor/*" \ No newline at end of file + find . -name "*.proto" -not -path "./vendor/*" diff --git a/app/client/cli/debug.go b/app/client/cli/debug.go index 558878678..bd581fa64 100644 --- a/app/client/cli/debug.go +++ b/app/client/cli/debug.go @@ -106,7 +106,7 @@ func NewDebugCommand() *cobra.Command { // persistentPreRun is called by both debug and debug sub-commands before runs func persistentPreRun(cmd *cobra.Command, _ []string) { // TECHDEBT: this is to keep backwards compatibility with localnet - configPath = runtime.GetEnv("CONFIG_PATH", "build/config/config1.json") + configPath = runtime.GetEnv("CONFIG_PATH", "build/config/config.validator1.json") rpcURL := fmt.Sprintf("http://%s:%s", rpcHost, defaults.DefaultRPCPort) runtimeMgr := runtime.NewManagerFromFiles( @@ -257,7 +257,7 @@ func broadcastDebugMessage(cmd *cobra.Command, debugMsg *messaging.DebugMessage) // TODO(olshansky): Once we implement the cleanup layer in RainTree, we'll be able to use // broadcast. The reason it cannot be done right now is because this client is not in the - // address book of the actual validator nodes, so `node1.consensus` never receives the message. + // address book of the actual validator nodes, so `validator1` never receives the message. // p2pMod.Broadcast(anyProto) pstore, err := fetchPeerstore(cmd) diff --git a/app/client/cli/query.go b/app/client/cli/query.go index fd2cf32d0..dcea5f176 100644 --- a/app/client/cli/query.go +++ b/app/client/cli/query.go @@ -884,6 +884,33 @@ func queryCommands() []*cobra.Command { return rpcResponseCodeUnhealthy(statusCode, resp) }, }, + { + Use: "NodeRoles", + Short: "Get current the node roles", + Long: "Queries the node RPC to returns the type of utility actor(s) running on the node", + Aliases: []string{"noderoles"}, + RunE: func(cmd *cobra.Command, args []string) error { + client, err := rpc.NewClientWithResponses(remoteCLIURL) + if err != nil { + return err + } + response, err := client.PostV1QueryNodeRoles(cmd.Context()) + if err != nil { + return unableToConnectToRpc(err) + } + statusCode := response.StatusCode + body, err := io.ReadAll(response.Body) + if err != nil { + fmt.Fprintf(os.Stderr, "❌ Error reading response body: %s\n", err.Error()) + return err + } + if statusCode == http.StatusOK { + fmt.Println(string(body)) + return nil + } + return rpcResponseCodeUnhealthy(statusCode, body) + }, + }, } return cmds } diff --git a/app/docs/CHANGELOG.md b/app/docs/CHANGELOG.md index 2cf322c60..1b2098eb3 100644 --- a/app/docs/CHANGELOG.md +++ b/app/docs/CHANGELOG.md @@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.0.0.8] - 2023-06-06 + +- Adds `query nodeRoles` sub-command the client CLI +- Renames config file + ## [0.0.0.7] - 2023-04-28 - Adds debug sub-commands to the debug CLI and appropriate documentation diff --git a/build/config/config.fisherman1.json b/build/config/config.fisherman1.json new file mode 100644 index 000000000..ea20cff45 --- /dev/null +++ b/build/config/config.fisherman1.json @@ -0,0 +1,56 @@ +{ + "root_directory": "/go/src/github.com/pocket-network", + "private_key": "90ccfd6ba76d876e02ba09440af67582e0f4a37cbda2ce4c30b251132b670eda2777a49cdfde21867a538ddcfca05002f0115b1955a75b80e965ed63fc95f809", + "consensus": { + "max_mempool_bytes": 500000000, + "pacemaker_config": { + "timeout_msec": 10000, + "manual": true, + "debug_time_between_steps_msec": 1000 + }, + "private_key": "90ccfd6ba76d876e02ba09440af67582e0f4a37cbda2ce4c30b251132b670eda2777a49cdfde21867a538ddcfca05002f0115b1955a75b80e965ed63fc95f809", + "server_mode_enabled": true + }, + "utility": { + "max_mempool_transaction_bytes": 1073741824, + "max_mempool_transactions": 9000 + }, + "persistence": { + "postgres_url": "postgres://postgres:postgres@pocket-db:5432/postgres", + "node_schema": "fisherman1", + "block_store_path": "/var/blockstore", + "tx_indexer_path": "/var/txindexer", + "trees_store_dir": "/var/trees", + "max_conns_count": 50, + "min_conns_count": 1, + "max_conn_lifetime": "5m", + "max_conn_idle_time": "1m", + "health_check_period": "30s" + }, + "p2p": { + "hostname": "fisherman1", + "port": 42069, + "use_rain_tree": true, + "is_empty_connection_type": false, + "private_key": "90ccfd6ba76d876e02ba09440af67582e0f4a37cbda2ce4c30b251132b670eda2777a49cdfde21867a538ddcfca05002f0115b1955a75b80e965ed63fc95f809", + "max_mempool_count": 100000 + }, + "telemetry": { + "enabled": true, + "address": "0.0.0.0:9000", + "endpoint": "/metrics" + }, + "logger": { + "level": "debug", + "format": "pretty" + }, + "rpc": { + "enabled": true, + "port": 50832, + "timeout": 30000, + "use_cors": false + }, + "fisherman": { + "enabled": true + } +} diff --git a/build/config/config.servicer1.json b/build/config/config.servicer1.json new file mode 100644 index 000000000..c5b0e713b --- /dev/null +++ b/build/config/config.servicer1.json @@ -0,0 +1,57 @@ +{ + "root_directory": "/go/src/github.com/pocket-network", + "private_key": "e4ad8d293ebf5287e2403e6483ecb6c4e80b22b2d3effc8698dfe34eb35fc9466ac62bddc541432cff818a02bab732f815ef2e6f7099e7dddc793d62d482b451", + "consensus": { + "max_mempool_bytes": 500000000, + "pacemaker_config": { + "timeout_msec": 10000, + "manual": true, + "debug_time_between_steps_msec": 1000 + }, + "private_key": "e4ad8d293ebf5287e2403e6483ecb6c4e80b22b2d3effc8698dfe34eb35fc9466ac62bddc541432cff818a02bab732f815ef2e6f7099e7dddc793d62d482b451", + "server_mode_enabled": true + }, + "utility": { + "max_mempool_transaction_bytes": 1073741824, + "max_mempool_transactions": 9000 + }, + "persistence": { + "postgres_url": "postgres://postgres:postgres@pocket-db:5432/postgres", + "node_schema": "servicer1", + "block_store_path": "/var/blockstore", + "tx_indexer_path": "/var/txindexer", + "trees_store_dir": "/var/trees", + "max_conns_count": 50, + "min_conns_count": 1, + "max_conn_lifetime": "5m", + "max_conn_idle_time": "1m", + "health_check_period": "30s" + }, + "p2p": { + "hostname": "servicer1", + "port": 42069, + "use_rain_tree": true, + "is_empty_connection_type": false, + "private_key": "e4ad8d293ebf5287e2403e6483ecb6c4e80b22b2d3effc8698dfe34eb35fc9466ac62bddc541432cff818a02bab732f815ef2e6f7099e7dddc793d62d482b451", + "max_mempool_count": 100000 + }, + "telemetry": { + "enabled": true, + "address": "0.0.0.0:9000", + "endpoint": "/metrics" + }, + "logger": { + "level": "debug", + "format": "pretty" + }, + "rpc": { + "enabled": true, + "port": 50832, + "timeout": 30000, + "use_cors": false + }, + "servicer": { + "enabled": true, + "chains": ["0001"] + } +} diff --git a/build/config/config1.json b/build/config/config.validator1.json similarity index 90% rename from build/config/config1.json rename to build/config/config.validator1.json index 71970410c..67051df18 100644 --- a/build/config/config1.json +++ b/build/config/config.validator1.json @@ -1,7 +1,6 @@ { "root_directory": "/go/src/github.com/pocket-network", "private_key": "0ca1a40ddecdab4f5b04fa0bfed1d235beaa2b8082e7554425607516f0862075dfe357de55649e6d2ce889acf15eb77e94ab3c5756fe46d3c7538d37f27f115e", - "use_lib_p2p": false, "network_id": "localnet", "consensus": { "max_mempool_bytes": 500000000, @@ -19,7 +18,7 @@ }, "persistence": { "postgres_url": "postgres://postgres:postgres@pocket-db:5432/postgres", - "node_schema": "node1", + "node_schema": "validator1", "block_store_path": "/var/blockstore", "tx_indexer_path": "/var/txindexer", "trees_store_dir": "/var/trees", @@ -30,7 +29,7 @@ "health_check_period": "30s" }, "p2p": { - "hostname": "node1.consensus", + "hostname": "validator1", "port": 42069, "use_rain_tree": true, "is_empty_connection_type": false, @@ -51,5 +50,12 @@ "port": "50832", "timeout": 30000, "use_cors": false + }, + "validator": { + "enabled": true + }, + "servicer": { + "enabled": true, + "chains": ["0001"] } } diff --git a/build/config/config2.json b/build/config/config.validator2.json similarity index 94% rename from build/config/config2.json rename to build/config/config.validator2.json index ad3dd4dd2..25b952ecc 100644 --- a/build/config/config2.json +++ b/build/config/config.validator2.json @@ -1,7 +1,6 @@ { "root_directory": "/go/src/github.com/pocket-network", "private_key": "ba81e6e56d293895b299bc495ae75d490644429a5e0028fabeb5e1871c1098e7eb2c78364525a210d994a83e02d18b4287ab81f6670cf4510ab6c9f51e296d91", - "use_lib_p2p": false, "network_id": "localnet", "consensus": { "max_mempool_bytes": 500000000, @@ -19,7 +18,7 @@ }, "persistence": { "postgres_url": "postgres://postgres:postgres@pocket-db:5432/postgres", - "node_schema": "node2", + "node_schema": "validator2", "block_store_path": "/var/blockstore", "tx_indexer_path": "/var/txindexer", "trees_store_dir": "/var/trees", @@ -30,7 +29,7 @@ "health_check_period": "30s" }, "p2p": { - "hostname": "node2.consensus", + "hostname": "validator2", "port": 42069, "use_rain_tree": true, "is_empty_connection_type": false, diff --git a/build/config/config3.json b/build/config/config.validator3.json similarity index 94% rename from build/config/config3.json rename to build/config/config.validator3.json index 8e4c9a57f..648ef2a5a 100644 --- a/build/config/config3.json +++ b/build/config/config.validator3.json @@ -1,7 +1,6 @@ { "root_directory": "/go/src/github.com/pocket-network", "private_key": "25b385b367a827eaafcdb1003bd17a25f2ecc0d10d41f138846f52ae1015aa941041a9c76539791fef9bee5b4fcd5bf4a1a489e0790c44cbdfa776b901e13b50", - "use_lib_p2p": false, "network_id": "localnet", "consensus": { "max_mempool_bytes": 500000000, @@ -19,7 +18,7 @@ }, "persistence": { "postgres_url": "postgres://postgres:postgres@pocket-db:5432/postgres", - "node_schema": "node3", + "node_schema": "validator3", "block_store_path": "/var/blockstore", "tx_indexer_path": "/var/txindexer", "trees_store_dir": "/var/trees", @@ -30,7 +29,7 @@ "health_check_period": "30s" }, "p2p": { - "hostname": "node3.consensus", + "hostname": "validator3", "port": 42069, "use_rain_tree": true, "is_empty_connection_type": false, diff --git a/build/config/config4.json b/build/config/config.validator4.json similarity index 94% rename from build/config/config4.json rename to build/config/config.validator4.json index a8e107eda..65887d398 100644 --- a/build/config/config4.json +++ b/build/config/config.validator4.json @@ -1,7 +1,6 @@ { "root_directory": "/go/src/github.com/pocket-network", "private_key": "4ff3292ff14213149446f8208942b35439cb4b2c5e819f41fb612e880b5614bdd6cea8706f6ee6672c1e013e667ec8c46231e0e7abcf97ba35d89fceb8edae45", - "use_lib_p2p": false, "network_id": "localnet", "consensus": { "max_mempool_bytes": 500000000, @@ -19,7 +18,7 @@ }, "persistence": { "postgres_url": "postgres://postgres:postgres@pocket-db:5432/postgres", - "node_schema": "node4", + "node_schema": "validator4", "block_store_path": "/var/blockstore", "tx_indexer_path": "/var/txindexer", "trees_store_dir": "/var/trees", @@ -30,7 +29,7 @@ "health_check_period": "30s" }, "p2p": { - "hostname": "node4.consensus", + "hostname": "validator4", "port": 42069, "use_rain_tree": true, "is_empty_connection_type": false, diff --git a/build/config/genesis.json b/build/config/genesis.json index 5ce30bd75..0b7f1e3cc 100755 --- a/build/config/genesis.json +++ b/build/config/genesis.json @@ -4040,7 +4040,7 @@ "address": "00104055c00bed7c983a48aac7dc6335d7c607a7", "public_key": "dfe357de55649e6d2ce889acf15eb77e94ab3c5756fe46d3c7538d37f27f115e", "chains": null, - "service_url": "node1.consensus:42069", + "service_url": "validator1:42069", "staked_amount": "1000000000000", "paused_height": -1, "unstaking_height": -1, @@ -4051,7 +4051,7 @@ "address": "00204737d2a165ebe4be3a7d5b0af905b0ea91d8", "public_key": "eb2c78364525a210d994a83e02d18b4287ab81f6670cf4510ab6c9f51e296d91", "chains": null, - "service_url": "node2.consensus:42069", + "service_url": "validator2:42069", "staked_amount": "1000000000000", "paused_height": -1, "unstaking_height": -1, @@ -4062,7 +4062,7 @@ "address": "00304d0101847b37fd62e7bebfbdddecdbb7133e", "public_key": "1041a9c76539791fef9bee5b4fcd5bf4a1a489e0790c44cbdfa776b901e13b50", "chains": null, - "service_url": "node3.consensus:42069", + "service_url": "validator3:42069", "staked_amount": "1000000000000", "paused_height": -1, "unstaking_height": -1, @@ -4073,7 +4073,7 @@ "address": "00404a570febd061274f72b50d0a37f611dfe339", "public_key": "d6cea8706f6ee6672c1e013e667ec8c46231e0e7abcf97ba35d89fceb8edae45", "chains": null, - "service_url": "node4.consensus:42069", + "service_url": "validator4:42069", "staked_amount": "1000000000000", "paused_height": -1, "unstaking_height": -1, @@ -4095,27 +4095,38 @@ ], "servicers": [ { - "address": "43d9ea9d9ad9c58bb96ec41340f83cb2cabb6496", - "public_key": "16cd0a304c38d76271f74dd3c90325144425d904ef1b9a6fbab9b201d75a998b", + "address": "00104055c00bed7c983a48aac7dc6335d7c607a7", + "public_key": "dfe357de55649e6d2ce889acf15eb77e94ab3c5756fe46d3c7538d37f27f115e", + "chains": ["0001"], + "service_url": "validator1:42069", + "staked_amount": "1000000000000", + "paused_height": -1, + "unstaking_height": -1, + "output": "00104055c00bed7c983a48aac7dc6335d7c607a7", + "actor_type": 2 + }, + { + "address": "00604d18001a2012830b93efcc23100450e5a512", + "public_key": "6ac62bddc541432cff818a02bab732f815ef2e6f7099e7dddc793d62d482b451", "chains": ["0001"], - "service_url": "node1.consensus:42069", + "service_url": "servicer1:42069", "staked_amount": "1000000000000", "paused_height": -1, "unstaking_height": -1, - "output": "43d9ea9d9ad9c58bb96ec41340f83cb2cabb6496", + "output": "00604d18001a2012830b93efcc23100450e5a512", "actor_type": 2 } ], "fishermen": [ { - "address": "9ba047197ec043665ad3f81278ab1f5d3eaf6b8b", - "public_key": "68efd26af01692fcd77dc135ca1de69ede464e8243e6832bd6c37f282db8c9cb", + "address": "00504987d4b181c1e97b1da9af42f3db733b1ff4", + "public_key": "2777a49cdfde21867a538ddcfca05002f0115b1955a75b80e965ed63fc95f809", "chains": ["0001"], - "service_url": "node1.consensus:42069", + "service_url": "fisherman1:42069", "staked_amount": "1000000000000", "paused_height": -1, "unstaking_height": -1, - "output": "9ba047197ec043665ad3f81278ab1f5d3eaf6b8b", + "output": "00504987d4b181c1e97b1da9af42f3db733b1ff4", "actor_type": 3 } ], diff --git a/build/debug_keybase/73e3f85e886d74e4cea14458f39a338a.md5 b/build/debug_keybase/909aa7caea408519a7ed73df70ca3e65.md5 similarity index 100% rename from build/debug_keybase/73e3f85e886d74e4cea14458f39a338a.md5 rename to build/debug_keybase/909aa7caea408519a7ed73df70ca3e65.md5 diff --git a/build/debug_keybase/debug_keybase.bak b/build/debug_keybase/debug_keybase.bak index 5759fddef..55138faa2 100644 Binary files a/build/debug_keybase/debug_keybase.bak and b/build/debug_keybase/debug_keybase.bak differ diff --git a/build/deployments/.env.example b/build/deployments/.env.example index b763972e4..6bcd95ace 100644 --- a/build/deployments/.env.example +++ b/build/deployments/.env.example @@ -1,21 +1,29 @@ -# docker compose stuff -# override with your own values if the default host port mappings in docker-compose do not suit you -# NODE1_PORT_7081=127.0.0.1:7081 -# NODE1_PORT_9081=127.0.0.1:9081 -# NODE1_PORT_42070=127.0.0.1:42070 -# NODE1_PORT_50832=127.0.0.1:50832 -# NODE2_PORT_7081=127.0.0.1:7082 -# NODE2_PORT_9081=127.0.0.1:9082 -# NODE2_PORT_42070=127.0.0.1:42071 -# NODE2_PORT_50832=127.0.0.1:50833 -# NODE3_PORT_7081=127.0.0.1:7083 -# NODE3_PORT_9081=127.0.0.1:9083 -# NODE3_PORT_42070=127.0.0.1:42072 -# NODE3_PORT_50832=127.0.0.1:50834 -# NODE4_PORT_7081=127.0.0.1:7084 -# NODE4_PORT_9081=127.0.0.1:9084 -# NODE4_PORT_42070=127.0.0.1:42073 -# NODE4_PORT_50832=127.0.0.1:50835 +# VALIDATOR1_DEBUG_PORT=127.0.0.1:7081 +# VALIDATOR1_P2P_PORT=127.0.0.1:42070 +# VALIDATOR1_RPC_PORT=127.0.0.1:50832 + +# VALIDATOR2_DEBUG_PORT=127.0.0.1:7082 +# VALIDATOR2_P2P_PORT=127.0.0.1:42071 +# VALIDATOR2_RPC_PORT=127.0.0.1:50833 + +# VALIDATOR3_DEBUG_PORT=127.0.0.1:7083 +# VALIDATOR3_P2P_PORT=127.0.0.1:42072 +# VALIDATOR3_RPC_PORT=127.0.0.1:50834 + +# VALIDATOR4_DEBUG_PORT=127.0.0.1:7084 +# VALIDATOR4_P2P_PORT=127.0.0.1:42073 +# VALIDATOR4_RPC_PORT=127.0.0.1:50835 + +# SERVICER1_DEBUG_PORT:-0.0.0.0:7085 +# SERVICER1_P2P_PORT:-0.0.0.0:42074 +# SERVICER1_RPC_PORT:-0.0.0.0:50836 +# SERVICER1_SERVICER_ENABLED=true + +# FISHERMAN1_DEBUG_PORT:-0.0.0.0:7085 +# FISHERMAN1_P2P_PORT:-0.0.0.0:42074 +# FISHERMAN1_RPC_PORT:-0.0.0.0:50836 +# FISHERMAN1_FISHERMAN_ENABLED=true + # GRAFANA_PORT_3000=127.0.0.1:3000 # POSTGRES_PORT_5432=127.0.0.1:5432 # LOKI_PORT_3100=127.0.0.1:3100 diff --git a/build/deployments/docker-compose.yaml b/build/deployments/docker-compose.yaml index 3031db52d..76e65f6dc 100755 --- a/build/deployments/docker-compose.yaml +++ b/build/deployments/docker-compose.yaml @@ -21,31 +21,29 @@ services: dockerfile: ./build/Dockerfile.client environment: # Any host that is visible and connected to the cluster can be arbitrarily selected as the RPC host - - RPC_HOST=node1.consensus + - RPC_HOST=validator1 volumes: - ${PWD}:/go/src/github.com/pocket-network stdin_open: true tty: true - node1.consensus: + validator1: logging: *loki-logging - container_name: node1.consensus - image: pocket/consensus:latest - command: "build/scripts/watch.sh build/config/config1.json build/config/genesis.json" + container_name: validator1 + image: pocket/validator:latest + command: "build/scripts/watch.sh build/config/config.validator1.json build/config/genesis.json" build: context: ../.. dockerfile: ./build/Dockerfile.localdev expose: - - "7080" # dlv debug - - "9080" + - "7081" # dlv debug - "9000" - "42069" - "50832" ports: - - "${NODE1_PORT_7081:-0.0.0.0:7081}:7081" - - "${NODE1_PORT_9081:-0.0.0.0:9081}:9080" - - "${NODE1_PORT_42070:-0.0.0.0:42070}:42069" - - "${NODE1_PORT_50832:-0.0.0.0:50832}:50832" + - "${VALIDATOR1_DEBUG_PORT:-0.0.0.0:7081}:7081" + - "${VALIDATOR1_P2P_PORT:-0.0.0.0:42070}:42069" + - "${VALIDATOR1_RPC_PORT:-0.0.0.0:50832}:50832" volumes: - ${PWD}:/go/src/github.com/pocket-network # Needed for DLV debugging @@ -59,25 +57,23 @@ services: # Uncomment to enable DLV debugging # - DEBUG_PORT=7081 - node2.consensus: + validator2: logging: *loki-logging - container_name: node2.consensus - image: pocket/consensus:latest - command: "build/scripts/watch.sh build/config/config2.json build/config/genesis.json" + container_name: validator2 + image: pocket/validator:latest + command: "build/scripts/watch.sh build/config/config.validator2.json build/config/genesis.json" build: context: ../.. dockerfile: ./build/Dockerfile.localdev expose: - "7082" # dlv debug - "42069" - - "9080" - "9000" - "50832" ports: - - "${NODE2_PORT_7081:-0.0.0.0:7082}:7081" - - "${NODE2_PORT_9081:-0.0.0.0:9082}:9080" - - "${NODE2_PORT_42070:-0.0.0.0:42071}:42069" - - "${NODE2_PORT_50832:-0.0.0.0:50833}:50832" + - "${VALIDATOR2_DEBUG_PORT:-0.0.0.0:7082}:7082" + - "${VALIDATOR2_P2P_PORT:-0.0.0.0:42071}:42069" + - "${VALIDATOR2_RPC_PORT:-0.0.0.0:50833}:50832" volumes: - ${PWD}:/go/src/github.com/pocket-network # Needed for DLV debugging @@ -87,25 +83,23 @@ services: # environment: # - DEBUG_PORT=7082 - node3.consensus: + validator3: logging: *loki-logging - container_name: node3.consensus - image: pocket/consensus:latest - command: "build/scripts/watch.sh build/config/config3.json build/config/genesis.json" + container_name: validator3 + image: pocket/validator:latest + command: "build/scripts/watch.sh build/config/config.validator3.json build/config/genesis.json" build: context: ../.. dockerfile: ./build/Dockerfile.localdev expose: - "7083" # dlv debug - "42069" - - "9080" - "9000" - "50832" ports: - - "${NODE3_PORT_7081:-0.0.0.0:7083}:7081" - - "${NODE3_PORT_9081:-0.0.0.0:9083}:9080" - - "${NODE3_PORT_42070:-0.0.0.0:42072}:42069" - - "${NODE3_PORT_50832:-0.0.0.0:50834}:50832" + - "${VALIDATOR3_DEBUG_PORT:-0.0.0.0:7083}:7083" + - "${VALIDATOR3_P2P_PORT:-0.0.0.0:42072}:42069" + - "${VALIDATOR3_RPC_PORT:-0.0.0.0:50834}:50832" volumes: - ${PWD}:/go/src/github.com/pocket-network # Needed for DLV debugging @@ -115,25 +109,23 @@ services: # environment: # - DEBUG_PORT=7083 - node4.consensus: + validator4: logging: *loki-logging - container_name: node4.consensus - image: pocket/consensus:latest - command: "build/scripts/watch.sh build/config/config4.json build/config/genesis.json" + container_name: validator4 + image: pocket/validator:latest + command: "build/scripts/watch.sh build/config/config.validator4.json build/config/genesis.json" build: context: ../.. dockerfile: ./build/Dockerfile.localdev expose: - "7084" # dlv debug - "42069" - - "9080" - "9000" - "50832" ports: - - "${NODE4_PORT_7081:-0.0.0.0:7084}:7081" - - "${NODE4_PORT_9081:-0.0.0.0:9084}:9080" - - "${NODE4_PORT_42070:-0.0.0.0:42073}:42069" - - "${NODE4_PORT_50832:-0.0.0.0:50835}:50832" + - "${VALIDATOR4_DEBUG_PORT:-0.0.0.0:7084}:7084" + - "${VALIDATOR4_P2P_PORT:-0.0.0.0:42073}:42069" + - "${VALIDATOR4_RPC_PORT:-0.0.0.0:50835}:50832" volumes: - ${PWD}:/go/src/github.com/pocket-network # Needed for DLV debugging @@ -143,6 +135,76 @@ services: # environment: # - DEBUG_PORT=7084 + servicer1: + logging: *loki-logging + container_name: servicer1 + image: pocket/servicer:latest + command: > + sh -c ' + if [ "$SERVICER1_SERVICER_ENABLED" = "true" ]; then + build/scripts/watch.sh \ + build/config/config.servicer1.json \ + build/config/genesis.json; + else + echo "😴 Going to sleep. Servicer is not enabled."; + fi' + build: + context: ../.. + dockerfile: ./build/Dockerfile.localdev + expose: + - "7085" # dlv debug + - "42069" + - "9000" + - "50832" + ports: + - "${SERVICER1_DEBUG_PORT:-0.0.0.0:7085}:7085" + - "${SERVICER1_P2P_PORT:-0.0.0.0:42074}:42069" + - "${SERVICER1_RPC_PORT:-0.0.0.0:50836}:50832" + volumes: + - ${PWD}:/go/src/github.com/pocket-network + # Needed for DLV debugging + security_opt: + - "seccomp:unconfined" + environment: + - POCKET_RPC_USE_CORS=true + # Uncomment to enable DLV debugging + # - DEBUG_PORT=7085 + + fisherman1: + logging: *loki-logging + container_name: fisherman1 + image: pocket/fisherman:latest + command: > + sh -c ' + if [ "$FISHERMAN1_FISHERMAN_ENABLED" = "true" ]; then + build/scripts/watch.sh \ + build/config/config.fisherman1.json \ + build/config/genesis.json; + else + echo "😴 Going to sleep. Fisherman is not enabled."; + fi' + build: + context: ../.. + dockerfile: ./build/Dockerfile.localdev + expose: + - "7086" # dlv debug + - "42069" + - "9000" + - "50832" + ports: + - "${FISHERMAN1_DEBUG_PORT:-0.0.0.0:7086}:7086" + - "${FISHERMAN1_P2P_PORT:-0.0.0.0:42075}:42069" + - "${FISHERMAN1_RPC_PORT:-0.0.0.0:50837}:50832" + volumes: + - ${PWD}:/go/src/github.com/pocket-network + # Needed for DLV debugging + security_opt: + - "seccomp:unconfined" + environment: + - POCKET_RPC_USE_CORS=true + # Uncomment to enable DLV debugging + # - DEBUG_PORT=7086 + db: logging: *loki-logging container_name: pocket-db diff --git a/build/docs/CHANGELOG.md b/build/docs/CHANGELOG.md index 06a727ce4..e850683eb 100644 --- a/build/docs/CHANGELOG.md +++ b/build/docs/CHANGELOG.md @@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.0.0.46] - 2023-06-06 + +- Renames config files and actor hostnames +- Adds servicer and fisherman nodes to localnet deployments +- Removes hard-coded default namespace + ## [0.0.0.45] - 2023-06-01 - Added 2 applications to genesis.json in LocalNet configuration diff --git a/build/localnet/README.md b/build/localnet/README.md index 079f05391..ae52c319a 100644 --- a/build/localnet/README.md +++ b/build/localnet/README.md @@ -17,6 +17,7 @@ This guide shows how to deploy a LocalNet using [pocket-operator](https://github - [Make Targets](#make-targets) - [Addresses and keys on LocalNet](#addresses-and-keys-on-localnet) - [How to change configuration files](#how-to-change-configuration-files) + - [Overriding default values for localnet with Tilt](#overriding-default-values-for-localnet-with-tilt) - [How does it work?](#how-does-it-work) - [Troubleshooting](#troubleshooting) - [Why?](#why) @@ -173,6 +174,30 @@ If you need to add a new parameter – feel free to modify the section in place. Please refer to helm charts documentation for more details. +### Overriding default values for localnet with Tilt + +You may also create a overrides YAML file in the `charts/pocket` directory and override the default values for the various actors. + +Override files supported: + +- pocket-fisherman-overrides.yaml +- pocket-servicer-overrides.yaml +- pocket-validator-overrides.yaml + +```sh +touch charts/pocket/pocket-validator-overrides.yaml +``` + +For example, to enable CORS for the RPC server, you can run the following command. Note, this overrides config.json **for all** validators in localnet. + +```yaml +cat < charts/pocket/pocket-validator-overrides.yaml +config: + rpc: + use_cors: true +EOF +``` + ## How does it work? [tilt](https://tilt.dev/) reads the [`Tiltfile`](./Tiltfile), where LocalNet configs are specified. `Tiltfile` is written in [Starlark](https://github.com/bazelbuild/starlark), a dialect of Python. diff --git a/build/localnet/Tiltfile b/build/localnet/Tiltfile index 58cfdb4a8..bf5c62300 100644 --- a/build/localnet/Tiltfile +++ b/build/localnet/Tiltfile @@ -11,6 +11,8 @@ localnet_config_path = root_dir + "/localnet_config.yaml" # Create localnet config file from defaults, and if some default configuration doesn't exist in it - populate with default values localnet_config_defaults = { "validators": {"count": 4}, + "servicers": {"count": 1}, + "fishermen": {"count": 1}, "full_nodes": {"count": 1} } @@ -58,7 +60,7 @@ def check_helm_dependencies_for_chart(path): check_helm_dependencies_for_chart("dependencies") -k8s_yaml(helm("dependencies", name="dependencies", namespace="default")) +k8s_yaml(helm("dependencies", name="dependencies")) k8s_resource("dependencies-prometheus-pushgateway", labels=["monitoring"]) k8s_resource("dependencies-loki", labels=["monitoring"]) k8s_resource("dependencies-prometheus-node-exporter", labels=["monitoring"]) @@ -161,49 +163,104 @@ k8s_resource('dev-cli-client', labels=['client']) k8s_yaml(['manifests/cluster-manager.yaml']) k8s_resource('pocket-v1-cluster-manager', labels=['cluster-manager']) -check_helm_dependencies_for_chart(root_dir + "/charts/pocket") +chart_dir = root_dir + "/charts/pocket" +check_helm_dependencies_for_chart(chart_dir) + + +def formatted_actor_number(n): + return local('printf "%03d" ' + str(n)) # Provisions validators +actor_number = 0 for x in range(localnet_config["validators"]["count"]): - validator_number = x + 1 - formatted_validator_number = local('printf "%03d" ' + str(validator_number)) + actor_number = actor_number + 1 + formatted_number = formatted_actor_number(actor_number) - k8s_yaml(helm(root_dir + "/charts/pocket", - name="validator-%s" % formatted_validator_number, - namespace="default", + k8s_yaml(helm(chart_dir, + name="validator-%s-pocket" % formatted_number, set=[ "global.postgresql.auth.postgresPassword=LocalNetPassword", "image.repository=pocket-image", "privateKeySecretKeyRef.name=validators-private-keys", - "privateKeySecretKeyRef.key=%s" % formatted_validator_number, + "privateKeySecretKeyRef.key=%s" % formatted_number, "genesis.preProvisionedGenesis.enabled=false", "genesis.externalConfigMap.name=v1-localnet-genesis", "genesis.externalConfigMap.key=genesis.json", "postgresql.primary.persistence.enabled=false", "nodeType=validator", - ] - )) + ], + values=[chart_dir + "/pocket-validator-overrides.yaml"] if os.path.exists(chart_dir + "/pocket-validator-overrides.yaml") else [],)) + + k8s_resource("validator-%s-pocket" % formatted_number, labels=['pocket-validators']) + +actor_number = 0 +for x in range(localnet_config["servicers"]["count"]): + actor_number = actor_number + 1 + formatted_number = formatted_actor_number(actor_number) + + k8s_yaml(helm(chart_dir, + name="servicer-%s-pocket" % formatted_number, + set=[ + "global.postgresql.auth.postgresPassword=LocalNetPassword", + "image.repository=pocket-image", + "privateKeySecretKeyRef.name=servicers-private-keys", + "privateKeySecretKeyRef.key=%s" % formatted_number, + "genesis.preProvisionedGenesis.enabled=false", + "genesis.externalConfigMap.name=v1-localnet-genesis", + "genesis.externalConfigMap.key=genesis.json", + "postgresql.primary.persistence.enabled=false", + "config.servicer.enabled=true", + "nodeType=servicer", + ], + values=[chart_dir + "/pocket-servicer-overrides.yaml"] if os.path.exists(chart_dir + "/pocket-servicer-overrides.yaml") else [],)) + + k8s_resource("servicer-%s-pocket" % formatted_number, labels=['pocket-servicers']) + +actor_number = 0 +for x in range(localnet_config["fishermen"]["count"]): + actor_number = actor_number + 1 + formatted_number = formatted_actor_number(actor_number) + + k8s_yaml(helm(chart_dir, + name="fisherman-%s-pocket" % formatted_number, + set=[ + "global.postgresql.auth.postgresPassword=LocalNetPassword", + "image.repository=pocket-image", + "privateKeySecretKeyRef.name=fishermen-private-keys", + "privateKeySecretKeyRef.key=%s" % formatted_number, + "genesis.preProvisionedGenesis.enabled=false", + "genesis.externalConfigMap.name=v1-localnet-genesis", + "genesis.externalConfigMap.key=genesis.json", + "postgresql.primary.persistence.enabled=false", + "config.fisherman.enabled=true", + "nodeType=fisherman", + ], + values=[chart_dir + "/pocket-fisherman-overrides.yaml"] if os.path.exists(chart_dir + "/pocket-fisherman-overrides.yaml") else [],)) + + k8s_resource("fisherman-%s-pocket" % formatted_number, labels=['pocket-fishermen']) # Provisions full nodes +actor_number = 0 for x in range(localnet_config["full_nodes"]["count"]): - node_number = x + 1 - formatted_node_number = local('printf "%03d" ' + str(node_number)) + actor_number = actor_number + 1 + formatted_number = formatted_actor_number(actor_number) k8s_yaml(helm(root_dir + "/charts/pocket", - name="full-node-%s" % formatted_node_number, - namespace="default", + name="full-node-%s-pocket" % formatted_number, set=[ "global.postgresql.auth.postgresPassword=LocalNetPassword", "image.repository=pocket-image", "privateKeySecretKeyRef.name=misc-private-keys", - "privateKeySecretKeyRef.key=%s" % formatted_node_number, + "privateKeySecretKeyRef.key=%s" % formatted_number, "genesis.preProvisionedGenesis.enabled=false", "genesis.externalConfigMap.name=v1-localnet-genesis", "genesis.externalConfigMap.key=genesis.json", "postgresql.primary.persistence.enabled=false", "nodeType=full", - ] - )) + ], + values=[chart_dir + "/pocket-full-node-overrides.yaml"] if os.path.exists(chart_dir + "/pocket-full-node-overrides.yaml") else [],)) + + k8s_resource("full-node-%s-pocket" % formatted_number, labels=['pocket-full-nodes']) # Exposes grafana k8s_resource( diff --git a/build/localnet/cluster-manager/utils.go b/build/localnet/cluster-manager/utils.go index 0b6bb38b2..51f7595da 100644 --- a/build/localnet/cluster-manager/utils.go +++ b/build/localnet/cluster-manager/utils.go @@ -21,7 +21,11 @@ func isValidator(service *v1.Service) bool { // // it follows the pattern defined in the pocket helm chart. func extractValidatorId(validatorName string) string { - return validatorServiceNamePatternRegex.FindStringSubmatch(validatorName)[1] + match := validatorServiceNamePatternRegex.FindStringSubmatch(validatorName) + if len(match) != 2 { + logger.Fatal().Msgf("Could not extract validator id from service name: %s", validatorName) + } + return match[1] } // TODO: Create a type for `validatorKeyMap` and document what the expected key-value types contain diff --git a/build/localnet/manifests/cli-client.yaml b/build/localnet/manifests/cli-client.yaml index 3e2b7b8f7..7acf3e5a7 100644 --- a/build/localnet/manifests/cli-client.yaml +++ b/build/localnet/manifests/cli-client.yaml @@ -2,7 +2,7 @@ apiVersion: apps/v1 kind: Deployment metadata: name: dev-cli-client - namespace: default + # namespace: default # default namespace commented out to allow user override labels: app: v1-cli-client spec: @@ -75,7 +75,7 @@ spec: value: validator1 # Any host that is visible and connected to the cluster can be arbitrarily selected as the RPC host - name: RPC_HOST - value: pocket-full-nodes + value: full-node-001-pocket # TECHDEBT(#678): debug client requires hostname to participate # in P2P networking. - name: POCKET_P2P_HOSTNAME diff --git a/build/localnet/manifests/configs.yaml b/build/localnet/manifests/configs.yaml index 03adbf223..3ea11b0cc 100644 --- a/build/localnet/manifests/configs.yaml +++ b/build/localnet/manifests/configs.yaml @@ -4119,14 +4119,14 @@ data: ], "servicers": [ { - "address": "43d9ea9d9ad9c58bb96ec41340f83cb2cabb6496", - "public_key": "16cd0a304c38d76271f74dd3c90325144425d904ef1b9a6fbab9b201d75a998b", + "address": "00604d18001a2012830b93efcc23100450e5a512", + "public_key": "6ac62bddc541432cff818a02bab732f815ef2e6f7099e7dddc793d62d482b451", "chains": ["0001"], - "service_url": "validator-001-pocket:42069", + "service_url": "servicer-pocket:42069", "staked_amount": "1000000000000", "paused_height": -1, "unstaking_height": -1, - "output": "43d9ea9d9ad9c58bb96ec41340f83cb2cabb6496", + "output": "00604d18001a2012830b93efcc23100450e5a512", "actor_type": 2 }, { @@ -4154,14 +4154,14 @@ data: ], "fishermen": [ { - "address": "9ba047197ec043665ad3f81278ab1f5d3eaf6b8b", - "public_key": "68efd26af01692fcd77dc135ca1de69ede464e8243e6832bd6c37f282db8c9cb", + "address": "00504987d4b181c1e97b1da9af42f3db733b1ff4", + "public_key": "2777a49cdfde21867a538ddcfca05002f0115b1955a75b80e965ed63fc95f809", "chains": ["0001"], - "service_url": "validator-001-pocket:42069", + "service_url": "fisherman-pocket:42069", "staked_amount": "1000000000000", "paused_height": -1, "unstaking_height": -1, - "output": "9ba047197ec043665ad3f81278ab1f5d3eaf6b8b", + "output": "00504987d4b181c1e97b1da9af42f3db733b1ff4", "actor_type": 3 } ], @@ -4286,4 +4286,3 @@ data: kind: ConfigMap metadata: name: v1-localnet-genesis - namespace: default diff --git a/build/localnet/manifests/private-keys.yaml b/build/localnet/manifests/private-keys.yaml index 34b757e0f..08ffbe7a6 100644 --- a/build/localnet/manifests/private-keys.yaml +++ b/build/localnet/manifests/private-keys.yaml @@ -9,7 +9,6 @@ apiVersion: v1 kind: Secret metadata: name: validators-private-keys - namespace: default type: Opaque stringData: # DEPRECATE: Delete this when enough time has passed; OLD keys kept around for reference @@ -1023,7 +1022,6 @@ apiVersion: v1 kind: Secret metadata: name: misc-private-keys - namespace: default type: Opaque stringData: "000": 4840233ccd9023266b1b140f7f1c12d28f4fb2d9bc58cd96a544ed6581e1cfe34e4c4bad72f587fbfc64aece0e24a60680a8bcea6686ec316b336a878b4a118d # 0000085e3333920cfa506f0c956f109b056772f4 (4e4c4bad72f587fbfc64aece0e24a60680a8bcea6686ec316b336a878b4a118d) @@ -2031,7 +2029,6 @@ apiVersion: v1 kind: Secret metadata: name: applications-private-keys - namespace: default type: Opaque stringData: "000": 468cc03083d72f2440d3d08d12143b9b74cca9460690becaa2499a4f04fddaa805a25e527bf6f51676f61f2f1a96efaa748218ac82f54d3cdc55a4881389eb60 # 00001fff518b1cdddd74c197d76ba5b5dedc0301 (05a25e527bf6f51676f61f2f1a96efaa748218ac82f54d3cdc55a4881389eb60) @@ -3037,7 +3034,6 @@ apiVersion: v1 kind: Secret metadata: name: servicers-private-keys - namespace: default type: Opaque stringData: "000": acbca21f295caefdfe480ceba85f3fed31a50915162f94867f9c23d8f474f4c6d1130c5eb920af8edd5b6bfa39d33aa787f421c8ba0786de4ca4e7703553bb97 # 00002b8cea1bcc3dadc72ebecf95564ceb9c2e2a (d1130c5eb920af8edd5b6bfa39d33aa787f421c8ba0786de4ca4e7703553bb97) @@ -4040,3 +4036,1010 @@ stringData: "997": 5ab34176347667d5f9d03bedfe71c165d7eb22c78694a94b7c812f917c455296903bcb9bb70b06b0271c73fa34de188351ed03abc59bb179d5ef5535ca01dbf8 # 99702075da6f3a8f60153e5182f86e5d9bc51923 (903bcb9bb70b06b0271c73fa34de188351ed03abc59bb179d5ef5535ca01dbf8) "998": 0c7ad1ac80d0997ff44e7207139234c06997253e0e8a1756704ed313ef58d31e1119362ed527850c851e54d41df369ef28478dd80fa01df1fcafd82dfaca85b1 # 998023be7779c2f4da291d1c0cca318960c32359 (1119362ed527850c851e54d41df369ef28478dd80fa01df1fcafd82dfaca85b1) "999": 2163fec6e314e7b51324aa14588b88ada45897b84ba557a840b7776220ec2f5c1e48829dd932c3451943a89e1f453a3304334e4ba8c1cbe7b5ee3a041a8dacb2 # 9990225aadf97ed4b252db0078f5ae3345fe8208 (1e48829dd932c3451943a89e1f453a3304334e4ba8c1cbe7b5ee3a041a8dacb2) +--- +apiVersion: v1 +kind: Secret +metadata: + name: fishermen-private-keys +type: Opaque +stringData: + "000": e001ee8dbc9a0f515bc25c2e4367e0e0ac8e78377812f694f5998b32cf03b8899da904c2ab3735cad1ae1ace3662c7b552b3818a3020cee4397df758358d6520 # 1337b39333e676efad1d19fd835ba35b0a957fd3 + "001": 9c5cec0c641476218d11b13143ce253414cf8d0902a208777a562f44b90652a80357938c4a89566c98cbf6264b135d9e6364c1ae71f2bb377213d4fa4802ac03 # 133755472e62f20439d41e652b0486c79dd3c52e + "002": 7572e07ba5d7f63eb0e42a8561194e065d6d4c8d65a4dbb3fe2c2d67226c7ec9331827cccb52f7bdc59c07b79619d062a2d213c9b410e38d1fd8c59a914e2b62 # 133748333808a8c7d0850f50b7c23e396cdccc64 + "003": 57cd9f158e81ab32d77bcd75c732481c65f5ea10f13c1576f8024c99f016a6ff24cb48f5a7e0edbadef61c70d54b00255afa687bc00e11ab5bc48616671b06bf # 1337bf9ee52f26919d203791ae3bc50f18a46da3 + "004": ecfa9cdb4f17c5fc0c9c71688034f7ff9768eff9a768398693cc9e48be9498bd0fe477b09d58d0dfe717bf4a055463208968362dfacf986a53df8a0ee1c5efe6 # 133794359f767a1b681c2b7f18e7f60183a70015 + "005": 97cf9cfa873f78ed937523da1f4c3b3b913147b2e695a525bcb65703d659b7cb5c10c9d87343a1f961ede9c89c00b9c1b40eb2755fb5e697d2248c799af53399 # 1337d5fce8f0ef9b01ad7cda06beae68171b6491 + "006": d2d9318c50331977f4c421fa76fb5544de43efb75a105aa614dd3faaa2e3346691fb982f4ef0fb35daf76d983c7b49d647b3eb9073de446e2541b87135feca3d # 1337ebf605a58018aa4717cbd64b4f18de4b1ba5 + "007": 773116f32e5c5282a4515a11d65186849fa5b63a07736161b82b6e9ed852696a4cb9fe572c38274dd8df34707751d434ca465caeedfa59f39f007329f9bcbb39 # 1337f6c72a4c3948b28845eff157d9a5c4850a60 + "008": 567d0f04244a9b16ebe5003baa474498fa3ee19c39ec92dffe1db2867b29366aec81082423498f734daede1963cf8ddc8d6dcf76c76591dcbc4d2e2b63246481 # 133790505b7cb745a316d9d2a38c461dbfe44668 + "009": a9190c697b8624780cbc75f626d2f1aa6d4654ae22a9025839f3119e5a093355543e4d13cd55911f6fd74b2399bd1ab769cc8577af9ac38b74157e3e98b82409 # 13370e2c87410482ff8d4a6581697e29238ad4dc + "010": ba4f58246661d6e3126aa483f9523bb9cb2d9254a09dc42b2fccd13e436bb3a6410315466eb24f1752d86994634c4eb3814ad1a3599edb1bcc153e2c67e58447 # 133706aa8abb59d858df387830c8f94e1675afe0 + "011": 08f498282f5928c715740cabc0f86cf45485e4232c28ded1cbca8f89dce54241f1ba18e3ffe3207aed79f1adbe89f168333fbe1c7ccd9cda4570a33df743f794 # 133767ef51f7783e743047ee0d580cf07ba52c7b + "012": 29d7c4d231cf8daffd2ee14d63b2695ec285f54a9daa0cbf47496d0df6f51223460a321c04e49b4a8ad602d20f9206e4b6fa43338145abb77947dfba6e5410e7 # 1337072486762342a21026719bc30fccab9ea079 + "013": 2117ffa03f9f43753bb7371dc6fdd04c6e3070a053b93e850fd95b21a1b3d3819e1ec18901f674a1a45f32bc4628ee782947df0f45a7e9b8e2872a072e901dd7 # 1337895bca71b00c6774343ea95fff742f422847 + "014": 4b9c149311517c31cd2a2cd92f927b41bc1878da29ca4f049402507adbff35ef89c7804f660e97a4ee70272297e2e8ef248af8eef4da41581c0976faa610c086 # 13372bb9348da4d3766b21576c3d56f378176e29 + "015": fa0523df46db75174728077f028d45a44c383f53495cc5f8b1b7bcd021163c41de840c791083de59b27f058436119152330f979f8c4de08f722fd887009c7700 # 1337fd4724549aebf5fb8c603893cbce6ac754ce + "016": d2a74e6ca0738b3f4a59867a430159d2d6bcb410165cae6d1882f380af1f594a502cf74df36b180ace0bd0dffec80f4b7e716c1a24b3f9f649b623f4c66eeff8 # 1337fb97a985d791f8821bc843bb23e5d100a1d7 + "017": c80ff47a9052e95c032501f835056072807b2f0b83f13fdc9a9f5871f1a2f64a92bb08c3d8c2ff09d557ae2f133d06ed73d69d0150e919ebcc4353218b2dc986 # 1337c17341c90c44c92e3d2c97c7f9403ae2cf81 + "018": 345a31e7d02ab7262c4bc9d5ef4b842a5fa1e5474e3c7bcf517bafa9141ff5261137755338112e30e3dc99c2652ce2b39f13c6b162d6c5bd4e868706a2e2a89e # 13372dc71acae65fa93ffc7f9277da18b2eda87e + "019": 0c56ae9a2df01eed852b6318d60451445be2a91a9a5cb306a91bd83a9cf0940001780722f0989895ea0ea0be7c640c7d356523703bfeffbacfda633a2ba2599f # 133763954c110d85271dc1844cbb1e6f36aa1f83 + "020": ec2a9e7e4b7866a77f0cb341ac3cd650ded9fb851b4a830baf55920e835d4b26275c6c8d30f34efda15d3573f630c7b8818eb403f83cd3c0bab34bd8934ccbcb # 1337136e80adeeecc50a80ec41e3033ff7c8daf8 + "021": e508c2afbf15cad469fca675278815fdb78793ed586eca559850d911757586bfee976bad42ce5b40058a559991a1e154e0a29efa78f36c748dc4ec0a5e4119e4 # 133757071ee1878f299351dbc2b28947109f501c + "022": b54afe11d60127411fd3850b1da280844dfff9dbc38002d18541cf3f988fa87a90b762a3268d9a71a0bc97b1801ea35fe9bce114b208ba2342c821b550eeb2f8 # 1337a3657d19d7e80d122c2767fd21204e1eb62d + "023": e32fd2472235fd2f7e2d1cf8c298a57f9199cfc835e998678e8f24a81a6b3f8e5a60976073975f80a76fddae99c55c50e0804f4d22b1f34cdb811db687a16ee0 # 1337582808a4dfce0f4ce0ea4b186f0b212be564 + "024": c9d4fa5a09ee25f06734b6b1c56580fd476557ca66ff5a1f968cdc58cfadffd575f07c7cbe62780f0272b8fe0794743bdfda1bc01671fa5b2e2d33208aec77a6 # 1337a6ed06ee64a7d0379908ec96bcaf97da59a7 + "025": a0ba4110784753839f9836fa4465e9b1040fdabce6b255c0b5d404a45eb218a5bda447d64d371aa45f87e436c251edf1439aa676bd473ccb77f0a808496b4ec9 # 1337e06426b276553dbb51efa8e3d370f2d04dde + "026": a1b21a0b6eefba5bf94a3598cd7fdc4f28f27573989389fc5f0a06be9ce6fc665de1d81cb2a8a30ae02b4b6d8117e70e50deaf03cc178277e82d6149a8d22b6e # 133761f860c86edc8e0e65dbe9fa0c40d48bd37c + "027": 7548dadddbdc6df8e8dfadce5b6e4936e3a34db4031fad1916c3e14aee7be8436a3a3006693dbce136242e937fb05fc5e0500daae663e75e58adbd4d78fd41bd # 13373aa73471a5d066151f76613e8f7590825234 + "028": 7c528391b93aa1fc9342201bf5d6839a7eb764803a4cbaa48edfe1faf4b87e05cfedf8f6b846aa4dd831872293d0fd8b1e43e753f51cc68b0fbdd8d43824ba40 # 13374a6a75ca4b090b00d357f74191677b64579d + "029": 3fe1051bf87d7afdf58e70d8d4bb726f543b0d5b27e675768b590f60cadb4978cd7cb6564933c4fe5d6c7971ea0fc1560a5fa782b4f2c094a6bb82b9e8ae43cd # 13373ebde9a46d183dbed4e4a546f44d5fb0693c + "030": 309d65a20db78ea5b4055709ee9bed4d11c4b3f3b6d68fabf23f369b7f01d23b1842b05251b85da0b53473bd30cceb5070f534fee6e67612636fbad0ef863aac # 133749e24aecd65786c51f18bfde428fc00d28ff + "031": 55a2d640088c1a1525d3b9c7cb71b3cbccd8cd3882bd6d08f563770a8d4f48666fd4f2ca7b670d2d90ecc31866da6be6d72956b9c157c7fb476207deeeab411e # 1337c0ef537b5ad6171675afca3a9f4564d95f8c + "032": 7ee7498af53f75f3b88f3a7820150b91279b9660a5d7a67ecf5ad9ee6e0226eb68b3be18409ff13c0b9025bf03d37bff0950663ca75cb56842e55447782f5a0c # 1337e78269ea0a79465aa7bf1895420ba5281424 + "033": 08eff57501718a6b1cefb41d66920ee6ed843a2d25a65a62404d6f83c6c7050baf150e60c2a287bacc7e5e43fca86fcf68e76526c6929333f911ec1802de9ad0 # 1337501cd1354f4325763416a823c7b210b8101f + "034": 59fd586f7de5a71f6713f72cc50804d05419155b1e451bd87dabcb4db26578b0a71fef3036c7bd088d26474c4b59ea85efaef33651dfc58d94809d0cc1d6fbc7 # 1337efddf6c55a273710367cee4c2017f5aef355 + "035": 1b7e229cfbc97d1a9775bca38c60a77ffff1c5a584b354ca05c5d4d8d7dd7e98ef19578fd3d087fd11e1903fa3a257c53dcf7def073b4090ef17ff01617fc64a # 13378f9eebd72dad37509646df2d35133b7fc87a + "036": 1117617933c99f3160a8722e2103bd05049da6d397ebbdcb847026b8247ba27a2cac4994cff3695ad16b12ef6d2ab44883d8daf2f35fa5d3b3c2bf805ac98017 # 13373fbc0c9903f5e3860b6987080978c5aba43a + "037": 44d8facf32541695352f86b142540e37ea23e1ea6d34bc78f461f5d620704c01b78d05d91575b2c0b94cb0800a9217041988487bc0992ee5e28f7314f4506fd9 # 13373652de71d4a8013c373ff453ffa49b9cfc18 + "038": 2cab25379e3e642b11cd81f06b87105a62862d2c84d7cc2e60fb874ffd6cd33c29b74d19911d45c46d9a8b53edca1c77744c2d45de9edb84c110a9106cd4b4d6 # 133735542eaa54f251b4622cac582ec4e420e26a + "039": f8f8fe4beba83aec7b3934ee689d967badca50ae39dcc70b38c877243b767fcea33c0ccec0d6f718ff15722c6a0705ac447500877a641ad963e7ee18a74a19ed # 13373728586ffbebead18b6fc23bc49edccafd2c + "040": 563a6f5f0f213549a1b100be66d5fc5ca1c6b383c1d7d762269adf93085ea79e29a7e0e5e89906d0a68e28f0704f2db811779afc598144c99addc129a5a53453 # 133749e96bfe53d48b8347829b79a9172589a92b + "041": 0f2d8395c4c38a57e056dcd3e2d157f83d8477a4936ef3badbe9da06adc937c9770b98a2f1a0a6b8438f897e80e827ae93e9b63b632a8110700a6af66a618421 # 1337909319b708e5b8d5a4449f5fd1fe5a8b6b24 + "042": effef27443336ee167024a0f1a1fc2d53d1d8d386e735d57795ac9e78b4b9f24f9bcf05e0934ed7d78a379e50f1c948b5b04232aa79c2b086ca5148ac83b2a8e # 1337f98a9b3ca5e35a74f9e7732016626293eb9f + "043": 2a1437c63f4581964187d64c0ef8c2cc0353a15a2567f146fcf145b7de7807315af32b0ad01c302cced0c2c84982f24d9c6f9c689cc420e08681f50b3c6259db # 1337bfd57385d7874ec5e5ab55ea13cd242e6599 + "044": a9a36de7869206f708d49503ab07d7d284b5cfb4821c1874e8d8875c55df7e1dfe9e7673a4cff76770d1acbcfb3e4ad69cf282a5c60d2722084afe314b2e701f # 1337815b93bcb382496d098f947d498fb2bce710 + "045": 564a84c17172e3c7768770fea689cff60828640246415bc967876bb02d24a2046eed7a51f6ffd3c7d5437bd623a51001c4a4198a689516fb884a4907a720bf42 # 13373c02967e0ddc894aa8f5846db6ce4d2a2802 + "046": 4cf2af195bb810138cf56c29df6e5aa068b777647e7c1c54b6cd2af2a7a6f969845ad2178d4d797e611908ca56f12ad3a65539f84f250b0e3d1a1529fd531b84 # 13371aedfbc0e0e37527f526c462cbc19268cf3a + "047": 4be1f3a4635a468ee60c70b227d6c3b362609ae314e2bcf058a41d216fe6153315ab50ea976b87e3f18821879114e019cd48d3e53fdb77f56e40e69f6e1c88f4 # 1337775cebd16af38d83f33fa589042e5ae68fdf + "048": cc44967e5f4b9782e8dc059681f8b78c2484ecda10fd47f2b753d3bbc24aa4247907143864ab6326ab119ef3c84462ea66e725c7f286185496d027578b75d514 # 13379ee3b6a569657a80d2e34cb5620133cdde65 + "049": 0aa6d90e29163196b5c0bd1adac3da3568b4d9efd37f66990e9ff5dbe038619e3c71b5430257010bec204cc0dd5e9eee5786f150b2dc4b66ffe7981b4fdd4dea # 1337291f06b6de81979c410a25bcd750cc31a5cf + "050": ae58a015fb2481b6b85aca99fb33f22e919cbdc02b5da1b17bbb86377bf83907558558758e8ac0f9a63b6cabfa29b1d1fc3d798ba128544a4343c369319e266b # 13379f9511bfe40d5d208a24fe46ec0ecacb68f2 + "051": 7a48038de6f1116f47ad2ab14c732937595afd2cff11276e58f0244ca3c4638ab88ec6b0a08c5576c9bfdbb1b34898f78092a9044d9c234094b9934c4ca046c1 # 133704515181e0772b3e625f844de0e362c4c2e8 + "052": e5c0787cd19fdae86cda27fddb89e9e85a9345652b3c3d285ecccbbff482f3cbd202c85853e3a6c20103c4937ee52e4f08424d2cae35b31373c31b2319fe4cff # 133751b7eea1739c34b1016314e7cd443eaa85fd + "053": cdeeee1c7bb6ea5872159f277afa30ae5f922867b20a1c535a6b68f9f0ffddf13fc0b85b7a80264b3f9d6c1b5cec0a544494bbcb9f851344be001855fcd5539d # 1337e450925f857bcdc9b8f1e268e177b79fe45a + "054": 59fad2024afda824cfa02b914cf628b31c3031a1f6fd5e55a15310b2a4ae64750e115d744bedb76d79b79f69071ca092c07d2a63dd28ec46d6aae33e7f2b2a77 # 133750eeb38a6dc72be0ccdbd4c0e1cba3655f8d + "055": 8798a0abeb58e137967d654025d77c186248b02ddc467da3140774f3bc8bd2e23f9e8f75a9277fba3ca81b5815d6af6113340503351231a18da9d8974a0a6d51 # 13379f3c796dab07b89f65faead15e4aecd10e87 + "056": a14eeb07d15069a5397a54a30ff3cb8785777c947c212d76a111972b0f0a372c7be82ecaf442ecf6f1684673663977575dd280db83b89fbb0f4fd77a4992b6e4 # 133783dc589c69b78343ba2165136b426cb93d61 + "057": 9bf64464f2ce9e38bda29943dfb59d65858166df617051dcc2d80fb617ad05759ad1ca7d8567a90c756f8077875e8ae5da11ba0ebf3634b49d434fff97c583e9 # 1337e8a6462206f6380ca0c79b0d8efcd9e61b81 + "058": 6b6fee1d86d1476312086ec433344163ab936335347bbd34f99d27a3ef8af7e7d776ecdd528fcf05c6ba78dc21b9adc37efbb617cdf2a0ab3ada19b103a48179 # 1337f72b64c79c3e149733c4e0db05ef0866d896 + "059": 44adce3a16eaf1a035915cecc1a5caa2e1b6a3729b4a1fa6578f6ca5577e439267e7ee78f2a52da09039c201cbbd7829923d4e78e80d5abd718fdf6a749c0b07 # 13373427f10f7f25ecd83cea09c36d84710c1378 + "060": 4d4e8c7efe66a69c7b1503a4185c5cb7903294259d74201d426969d188bad7ee8df214168edeba6816229680b32a6eb720168c4c8a59c584a6973b60116330df # 133700324d742cc071ea19cdf7328b586f4a4a83 + "061": bd047b42975f59c1cd71a8b865accb4a7adcb04066e0504842f9402ebf2c45100e520e362f1a28a21f130d65d398044d5e1058d90b8b7458cd0ef164f760db15 # 1337e166cdc55e1ea5e53fbf58f48147a5d4dfd8 + "062": 54dd039a7e01f6b0fedf39cb11a43ebb8fb70f084e3a08598de923538db1041540214fb05f3c0551ce70f5c36ca7e8b2d5a67a92866f6e2316088cdb86fa220d # 1337831f2aa770b1872b434d33047e97686e0a53 + "063": a75ea2ec386878f1a168df035d3c1d55cc83258befe131cf80b89839f4e3d5624a2d0e895e3c97682240af6e8d00e81cf27e5180a4863a093eec722dddd4ebfd # 133781279578b2231548f9496f7979b44344756c + "064": b4c7645545e4202aab451d2ecba17ed631c8308951fb7fa438d13985c1de9759b89f520e0b09f709d90de1907f41c72b16c1869cb258df9d1f2b95893b59664f # 13372d7a5ac6aa9ba9e70e50d8dfede5ff82bd91 + "065": 036a1cb2d5394ea9b26c1d41673792f8fe83ee2183035e016745cf83ed3e46f3b2cac18aa3968622d93bf5664eaf51a7e7a43784775198b172d983b93087a16a # 13375e707be53ac668b90549b16346149732edd5 + "066": ed0a65ec200c360a0958b863cb86c52389707e8f4fa2a80279fa40700d78273daa395449bd7f6e29a21a5e3792c2552e8b04ea61d9bebf3c81c2b2771ba10f02 # 13378751848586f87c3364014a89646b2fe01e36 + "067": 0e124f9bc969080451b09bf28d1e98b3cfe386037580db2d579fba5dca9fc567cb3e5db26a5d19da76f68309c7fe7005daa2fbd882930f3255fc096ca655ea37 # 1337e2f0a37552715261569f6441e65de089a5b1 + "068": f4c9c5f0d36ab23fea4d831f3abdd0c64f1f13a92801926f15fb906aec1e04fb04a2c9252a72fdded5cce0e7b48aa72efb4347ff554eec322bd7225a898a045b # 1337f6c871b72794cdd17419ed239e70c70918ad + "069": 5524311a0fbc7c4ac907a7bf3d08098c91bcc6ba41919ec0babf255e1066efc7263dc99e2e1d5a7eed5c9a68534d0c1216f542f1c54e54fc0d2d5f394990b228 # 13370b5c86d9483025d0f70291d0638d692fc9ed + "070": 2a573808aa6ed80986fa1892c815c395ca1a3dd34a9cd5e09a94af03f61b6eeb2238d68e42996487cb572fc3757224a6550da455e18f8d069f6a684cecdf6c6a # 1337544c62a7a73730cf6e1284f5398153aa1232 + "071": 04278daa96dd40fa3f801baa13a904c79cb046431b557f431f53254447ec2821f00d6338641dd1789d0b7d9ee681d90e51eb09da794b56bba893516935bd34a9 # 1337e331f0b7d531d9a5f3efb3dad094432f0037 + "072": 3baa0780436e938e8eb8f2ca19dd8c4f038ca4d9698d4630ba754ff2f56b8265d5df46f78e093440c3b9dee9d46df5ffe3ea295643b6e39b458023dc509253fe # 13373fa25b04546239c45414f1c6769d29358d02 + "073": ad0e528dc37b4328227dbae200a8d1e5482bb0ec69a47df15d57431d5211a9c46bd57d53c450eb6bd34147435ccf81a3947ad299171a6903fff531490fa4e95b # 133785fdb88fa6227e2e1d3d9018efa58dd7f5cc + "074": 14592b0f7bb6b4c6f52f77e516c955817c5c1e7e1c54619ecd30acf1b74969a761000a3ff155345e80db1f41110814981662da0b9264eb95a83bad736d348c97 # 1337d948f8b25c48d3f9505cbcc20cb1fab4d3cf + "075": af18c76ca8df0986cae4772c30a46b45b23cd333a3b3130aba0e16193c1fc8cb2cbc07252cc2f3fb648155320b50df971624ce50b69f4f69134948eb1b2d8e21 # 1337764628ffe7d1a6b0f97b2b308b704d0d9ea5 + "076": 992567712c5ae8f8b111316697e36981d3ff2cf0eea1da99bd983a041ab8e4478937982a3d21e1f1b10d793eda29adfc5900a843dfd10cc60165ba3670d0eb1a # 133735f8ea2751fede9b03f9acc3ec9c5dc88bdb + "077": 2b9064a28e660fc7eb427e893d51f1e7d0e348890d02f90b15302c42f0c8e7dfa6a1d705090c34fe7ab50ee7824acb31f70c923b47acabb1a1c920ee21f7109e # 13375469ed06d1f754aeacb913a7963d006b73a7 + "078": 57d92fd30fadc4f339aed580ccab2921727d1b93f5bbd604084699577c5dcf90f18de19c028834176b13a4832419535861daef3be3772c82bbcc149ccbe90052 # 133757f914a07e1334dfca6b7779efc5a5849d34 + "079": bcecc68866c2ccba48dfcdd6f4d90dd04fc37c26899d2d7a2f167e074265cd0af0abbe90dba6ae553929bee4248d0e7afa24866adaa8f76173aa9b407c453186 # 13376e0319212466a98f31675dad98be25f79d35 + "080": 78a4de07735242a9e0a5333a6339e8dfadbc02d4a72957f4065067ea30f9ab83b6f6bd2b7720cd8ddf62135866f7c388c6e39ffc3c7bce45d3da61f2a1e7d676 # 1337a49f7e941456c861a67f4184175c4a92d1a1 + "081": d5cb8c9b269ceac8a0759423e5b6b238625f57cd5c675135aa51d9c88308d6d56d188d051aa44c9b84480c4c56ee8049155496ff0952912bb68695f7d79f7137 # 133780afe2385233977193b7a8638776127b8a8a + "082": 3cb32d9aa491b0a7b649c8c64304ee38935f9fef6cb18d326fe8119b9f17755da2db377f605dc575f447ca1aa277ba7c445146aa14638eb6589210bccd28481e # 13378ac4e3901e5d7b55d6369c6040333587e103 + "083": 002bcbece263423717eb358791236a85b26c011528949e9420a623c0c9137b2a2fa4638aa8b1a35257f363e21a1243c892ed2fa318897cfd2c1cfbb8e73ced98 # 1337143b2886b76e59f13e915320f6be06a26c4e + "084": 52777b6c5ab574e7abfc8f71084d78180326d5969d30653ef18552acb79c2f5b5431863e96857d2de3b9fb9bd37e4217a1e829afeec0db33d756e33d032a9496 # 133773a7cfc129d56b68b2f8f0f9d249516f0f73 + "085": bbee3fd14df5ca244ab1c7733af72055ef5218a78143b5c4cc794f820b23066e2984949d5bd1932487f5dfe0fb49d0053a4f1933be1efd189be659c6f653f1f4 # 1337411603f327175e3be324dc4d3937145cf27e + "086": ae4ac9e711dab9ea9e155fa64bfdc0f96076e3ba16a9828f645772377f5d55ea0b83ebaeb80522b9f09b8f6e62e4cbfb424c0b3ebb9f94e8cd8a1d03d53afffd # 13376bf9bea81c273135c7adfb474d4f0367891d + "087": fcdd942a2ad3abc05b83e0fd2fed1f3e8deaa1a7b4902fa19b7ced9c18c7ca8b194a95d3f0bfbf72e8304fed1fd2120ac4a79360a636e0f628d3a4d11845c891 # 13378201a22414e4896e3162182c96436c71ede5 + "088": ddbb0b29a513d0b86b93e0d0e5056719accae10e867606c9939be19346918c7df8518dcf548b6e4e1b9adeae3be3dec68ad92dc1564509e8f941799203d71471 # 1337775f9b2361d665fb0c55d1870bae33961d9e + "089": 65300c04f5f825e68580ef0aeb24483b945b5ac7021e29e17b9b012ff506399e7eeadaa67e0bb9aafbececd4043160a22b3f7088d220bd3a51bc471514cd8aee # 1337ba27b5dcedabe82de18102c596f12571df9d + "090": 3d08df88aa2aaeccb037bed84a41db105d3af701acfe83f44f39dea1a1d90a2bc45ebe389c45616d02990b9bc6c7c384f678245ac915975d45938f06173fcd4f # 13374c4272595d0d86b4ec4c2fbf5b64512905a4 + "091": e1644a4c186bfc4ce821909813acf25b12d26465e70f6de715591fb9d78621652d0666429affb039c282f92505aec7bd801c55385d83c5ffd3b7fe41bc89a6d4 # 1337a83ad6b16318007c883da3fe51efc0ddb728 + "092": 14e87eca6cb0e366738b17707d7fc935ff080fb674cef5a811a7d73adbbc99114a468414f935930bfc1613ce4475a009fbe1c71664e5c04f7964821771ec0fd7 # 13372869b6dfb3358dbd8361ff99dbd41dd6278e + "093": 2e8b3233d1b4843edc072776724799fac3d05f2e5f57d01ab15ac2dec168464faef4cc0d59d245cd08f294db500be5ada4f755fb13836774ff3af884820c38ea # 13374bd7545683d68d3c20c8f4311be5829e6108 + "094": 14b6a227491eb470d7cf38ee38066b8d780f1966ec4be48f23d9d2e4d01de8deebc48e2d4aadcb9a02bea2e597c29abeddf8f863d9f2a7336924ef2dc8efd97b # 13373e00ec9d1b013f6530908e0ddeb5f7f8aa96 + "095": 8eaaeb6e68db5faf9589eaa25aff42f071696d4776a653da632396fe8165f6706454647214e9064b6935ce382b3a6ed2494380d89178a7b3073bc53e579c7f7f # 133752a187b0c7bfa09681074f119ab907889e1e + "096": c122d4241d6e2326662e347f831abfda437ca0dded41f76d1ea1e15a96c1ec876dfa862bb87f9bdff6d8f3aec5ee1ece1c8412056536a30707fc54b1745d5eef # 1337e6212cd386b9b4cb4fdd776ad3c7038617d1 + "097": bf25015344a1838856029ce1164b844d666dc9f254d4754013b7c0ce4dc37f0fb1c278cf84ad4db9e00f951dfef0bd81677e5536f400bf43232c684d98d2bee2 # 133728cad1c397f84a73ddf0853d9a52aa7db9f1 + "098": 147f3cd9bec69bc117be867899914d08d20289e759c14ec0430c342ab4250b033a448553e19976e76307696f524e0c92698b3bc89b9f5dcd072e5dd2e5e49dde # 13371848942b50eae32a512ad3f86d0440cbf0d8 + "099": 9e2108ade99eb7ada97221c069f8cd1ca2b7e6981ad1adf901439009de296e8f9e1143259694f407a9f7cdcf3242c86e3bf0c6e0d0fed9ed7688ff578c14f503 # 13378fea75b4d1749e6d538cf512f1011bee7505 + "100": 62c9b912f10e92fe01b0fe6f25a44485fcc9abafc377c29edda64c62e0d64a0904cae779ebbce727d2e350b5640818c6ebdc50a9c4487ebcaa4e461d9b38b9cd # 13377529a98989df6ca5a4698ad14f2016c386b8 + "101": ea7f4093d35c460846b67191c83c9abe91754643c7039ab4696dc93b8524c3100db80edce4c5ff5d58810b7d2a660d1b1c74c6a257e916a164ea00fbf7a7eb4b # 133769425b843b5ac7b7371191ba99160a50223b + "102": 4482636a27d3c539e751b2a9252a0ae0e168fdc4f202628e5932ad894ace041f07501298e0763cee1e165f420332e2f4e6b7a720f0d7668ff4ab53326c7d2058 # 13371f338a01a15aeadb7436dcdf0782018f1c68 + "103": 238f2dfba86aefb35c96008bcf4a892137ab6b7af6bbac5e5d781dcc9ed6a7d3c62180c17815efaeca9ed55b9673610c031031e3be6de9e739107393acb2542f # 1337d3f4c31a873f408934e226b85a21b3df99ce + "104": 61ac385843da5fceef98604132f882df9263b2f7350f3ed7f7bbd48a61911959eeda55cf27cec5c97100b7ea88a2e6bdd70f4124d472baac24ed7b70738c0d83 # 1337bad7db91c73396261c846b0147ad0447859e + "105": 8ecf02649fb44db2e641dac0d41a1ed3deac684bfcbe62c73206552890086e48e534be4102c87f445a0739f3dfd009102c151ab35bd1a2fd920a1b31b20311a6 # 1337d92b6d85e050056b554155f3710b80000315 + "106": 3b3d48404a6d09c9e130a6e9bbe5108fed8202ce85c6d9db3c02be8a0a2e277c88c39ecd07435fe2548c3754ba8f400c0704c9b7c21df8f4086eb949085337bd # 1337f4e49a7f3be3ba7a2b870b3355f5cb083a56 + "107": 64ed5958e68b04f6085ca227a8d22faadef1270ba6fda2938a2971fb18880e3b423bbe8ff1b2fd5829b83a7cda42e2309f08f2cf18b30d12ec09837e6d1a42b8 # 13373a140d854a563b59e86f6028cc5100968c56 + "108": 1b265d88df0fa8cb8019dc1b2eba9c6761ffc183eeda711bc9acdcb6a88f923d5532953ac38ef54201d042a20a21884cdbd40791361e3b48b1a60962e370d5d3 # 1337560dce80a471082fa34d9779f51d1d001969 + "109": 0e8628a047000cccb360bde67763fee798a072e7e6ea19dc9ee88e06170c81245d9b7835e7bbcfbee76e531f6ad36d0cb1bb028475e651b207426de7d8c30de1 # 133728630114cd30d5ab17d4584b3d9232c6bc3f + "110": 1fb1757a9faa053a8a83d8e32edb7a0a0a7186fdbcd96e660676bb7f7c623fb0247dc37aafeed5cea9f004b70029b6284171f142e5c5c101f9f03453d4ab7224 # 1337367f20a5cc95f96da2d272d20764bfdd82f9 + "111": a28f32b0c1484ed03074cd6c3429a9ab7ff82f36f03237678d91c1a77453ea0d36bd0b3f012dd3786310facb9186ffea94f6265915364e55439e7de275cb4dc6 # 133740660063b7ff54d241d980b347cc014f9c5d + "112": d2bc811100e724a708970ad33b8a6fa6ee0d5ac42aba0d8336e2a8460e3052fc4cdc3ad62156f9ae1281dae51247eb2c8ee0241624e2469a9c05272926e7a36e # 13376df8d2818f2ad867f3d76f03bb4a38396c8b + "113": f7a1a3651ca19587c526e3d28b36939f9e9da1a3d77b033435ea212f5fc5d5ea0b5907b3619a0abd27ff2f5f34666a8438eea1fb1b27f23a4ef5e1591b79904e # 1337f3e73ac51daf766c873ad7a5171d99d8f197 + "114": 16e8f41c9203fca1b24a908050444c6c10f795c7b3c1ce7ff74bfcdf0cb152eaf8640ae21f1ff2cc27324fcb59e21ad335500b04037677b3d154cb2c471e7c3e # 1337f2d5f52a8a2aba422f9f5afe4642dd105a3c + "115": f052dd92b635c532b371561930bcccf1a69aa9266c894cce354855312a2c734ef3030a1064e5784f04ad62f55f60840c479d8b825ac33564fa867aa96ef1087a # 133758a51cd2905cae79a8e89ed3e5f841d0d496 + "116": c0e515203490dcd4f0daf7d21a86b1aa0b8fd6c23ea65f110c91766908537325ad98c23152fc784c1682473e9414a091665f5363d8bd6ae229993728c50d7605 # 1337c9f9bd8f208d1f7727799a3eadcfff7f3854 + "117": e647659f5e58e46620693680ff8b25504c576180b87ab925a4c3f9867febb04958ec0562a2ed40741638d5ef0ab9b3f803eb52f15a56c0db0ae909c4c4a00667 # 1337c7bd0b7b2067bcdb4e3c025fb09724639f0c + "118": 501a3c17a21c246dd891b97b7a30c1b89b210d36335a0f55b21cde06c29f23dcbdae3e982f1f297f07834bb1fc78cd3572804cb5a6e147bf519adbfad473a254 # 1337db95e4a12714c5cf0215f9a0bebcb016aa38 + "119": 3185b706375c6b0d69f98b042032f63ae44436eec5503a8def56643dbb3304baeb59459548c501d5dd0fd63417bdc323c942bc379df524c67580beb32826520b # 1337d3e6f7b59aa84f9d3a3061bbea4ca5d4a1c3 + "120": 7d38a9ca7ebfa456a749b101bbde992823c4d863e6626f10ab55da2e2ed8eb2afb80aa3224f5b10ec6bd0795ef49d1fa7199a88c9a5db89130ab794d326e32f6 # 1337713e3530f6f13b44265faf6f6d7f4e79ce7c + "121": 65fb686ad5d8f17132abb6d11eba9d318e4420e42a66990fe3c8a29b4c4d758499e9b1f565539f88f47cffb88f71d80ff0800cabd89552d1f28c693a85d346ed # 1337c9b42221671be9848155b38751f17c9bcd82 + "122": f0bf880576fcfb9cd27d8883ab23160231e363af10c573d88780447d8055abc7d2739515d7f23460404a7fbec6f906942c970e9bb427784e8f36dc35d544103f # 133747d98ff7431cca8052158dd4126aaab88a41 + "123": 8d56ed5eb06808611ce505049c8487ef81acb8375e53cdef4d9046687e60e5454c761bf4af6420ad36214c5d97fa63601776a26b1ea5bad3f41f18170c4cef67 # 1337bbaddd8608b1963b2f5a1321cef5ecb20885 + "124": b7ccf5f47b09b6206119cda12bae24a13788820010a0ab5a1a4a321d529356326411939348a9e12cd933acdd727451b7df65dc2b3c463a782ffa8fea48c97c81 # 13370f7fe6853dec9599484114b78ccf4c5d2b2f + "125": e72867ae42c6fb2096a80cb86741a0c943411b7ee965ed5302ae8665963d74d432db8e9a5ba3c2d10b82b826828aae7f06b34579ebef2835d64decb1b13f554c # 133771c6a77768a714170d9a682dc9bab45774de + "126": 35a9feedb63c70d070f91aaefb03f5d3178171e85c601e23e7edc70d5477f0f149d7515f27986cb861b2c08622b4af720440d90ca04e30c763658dbaa77bd7d7 # 13376eefd1ebb5373747d16631195c6349d45cae + "127": 0e6deeef910124af9d442f17d63f018cfeb26385c7ce29dcbe33b4cd9a268bc82f0580decb1c0ddac187e0da094f8a0bf10ce44daf3c22f2d74af5a098bca2b9 # 13373ed1635afd0241c0973525df79f11c7577f1 + "128": bcb8dbc5a726db0b2748fb24d2633ec76ba9504480a1bcd10bb3ea71131aaf889e8f058daefa4751a0179e2a0a76eead61d95d927d3bd0a247a204da33666918 # 1337550a9fa4c76c447341437a64de459f0ddb8c + "129": 8d1a110be58974cf8f8ffe423258cfd15172c3490e3b3727c5e3577f03b6d14adfbd3f016ba9081592412e0c13a4fc82b53e74bd4fe06c67196f76733f866099 # 133723ae9e546d2e2b67552d0073168558ffe5f4 + "130": d2578211fe5ff69c4bb5137b44676f5e4c66bd67b63cdf12d6c8cc2f61f6309c7a0e32b88847f6f396bbb87fa99b15f3d6c1c96b3ba6c21c0159fbad2e4d2a0f # 13374b4751658bf44692e67827f23348c8e0d095 + "131": 4747efaeb55ad8bea9cd9fa84f66782236c8c44aa6a4b9c417deaa366240f53ce756bdc024aed6033782541184e396c7328c52b93a0bbab46a8e4ec5589cccf1 # 13373ccf2d33026a597859bed6ceb1a9abe68a0e + "132": 3ee43f9860f15baaaafde7aab48f2686589ab7004f8020af5a64b6032af9510c240daac194e1ead49b87bb7378dfc5f429672d019eae1f64f423793d62aff2f6 # 1337d21dffa5e490b5a55ebb3c058c9a1378c464 + "133": 7d1561807fad061514548353fcbb796996ecb00846327ff505763eea1f4e09cc383893e47a1ae793716d8e150e13619410b2c563747887b1b0e71f356cb360c0 # 13374d82fcbdb8906d8e977d58a9876c044f3513 + "134": 04eca34490d83d1395a42675d7aff5cf393d0994ef6ea06f18ebdb86d831603a8e7e98ad173d786791a9cae9604e82cb1fa023ca535f543faef6e1b8c09e8279 # 1337829d361c0f9dcc0c1b72144c9ed9c8a1ba47 + "135": e8b096f23fd3abdc669e8a94e33b34437d760b93d99181bd69dcb401ac463996be9c0fe0389e14fa781703561d37f6ee1f49072f89fc334769f16d2d855f135f # 1337585ca33d4ce17a5f13bbc1eb75e6a69b931c + "136": 469d771aad2981ff5666e862227df78dd3388d635eb2747622ff24ba91a4bdfc1622cd1db576f319ac24b1b98e0f4294b2fbb8ac0702e86712db1ebb90d63aa2 # 133756fb6ca0549ef87db53d2630b560d8b88043 + "137": ca65644ed849b08046fa73393c1d05ebbb351c2f2c67c15d3da9007d898d8c5729ae566dd110c008c7bdbc695d27c1458b71be9e5b56b4d29218bb85656a7c06 # 1337b6afee130392bf1c6a59c562b351b12e5c0b + "138": a5e933c00e9070c2e68e02d02e42fe3ff2cda78118eff2cc57cc4070264329062dc2e089a5726d341b755a8d9f13fa9162664ab477e89967db2f641c714a5666 # 13373443bd2d39f7b29f506856bc916bf15e8a2b + "139": 9c97bd744dc617be01f5d67ccd0b4074321ecdcfc7181c1a6e758a7cdb2c16599a398299c9784f8a1799dde9b6a08b9884f8ecd9748f65373480e96345c8a714 # 1337466180b089796b8422e37eb32ac723e2ea5d + "140": c54de22ffd629e8ae53a2c28c697e1eb577304afec56fd0c5d25ebc2b6b3df8c74114334d6c1234374db1c6939bd76b67c15d91de87a1e03a5edb53ddded4647 # 13378a24c1b713b590f760ec6d88ba55172d5a45 + "141": 0ace66104ccad6c6ef3c7ba7640117852205530d1f8870f836a2e651b3fa762449e9b9bda48e4f9dc6019bfc35e71653d9c8c5acb853212f4c62113911716d84 # 1337b182275417ee56dd823fc19d82040f001c31 + "142": 4f8fa5ed28eb94a7f78ef6081d2ee2eda095e1934bc2dac0a115a7d03040d6e2aaf0af8f3abd6b91e0b6ae5da66c229707649756414fc13578a544e570fc4441 # 1337adeecfe54620a00384e88d6263cd0e8dc9ab + "143": 3f393c431fe9c3f4a2a5f1ddad1c26679598a01b9a67baaeb566ec05a67e56c0da7f7f66fbda8b49fb99a292adb5d94419999ccf12d6df74d25341c454eb0a4b # 1337cea4634d8cd9c94863b0e8a0b02dfeb71ba8 + "144": 71ccda1a35a449521a2693f471035eb395edf2b4b2de79542b0a3e0418a7f9e0c68367c26c3b84e8aa6a03479c484a66b8edf957bc3102e77abf08ab42ad674d # 13373f473cb4b59f730cea410f75d3c879f3368f + "145": 0dd30b6c72bc86b4e2f6dd3632dd6867b616fb654443987c904fab1a80e35d31832e120b1450233efc139d69f40e12b7eac9f75b40d4c0cbbf00e21af145d1fd # 13375054718eef5391e5b484111c0be8577f5af0 + "146": c279aa4be120735c0fd2aace96f77da0604b4e456b338f82925bd6fae02451aa81d040c286dd716f27c4b4d9f745e68fc1f3bdeb5880e107b6cb8d95ae50eed5 # 133720f32a9535faa0c68bf142d33a31de6fc52f + "147": aa96501db4863fae2609adc94ef93d80f9e449e54a512a91f263b5f1792e33dc5bef57a1c5599f1702472864fc0430d360c6135d2a2a13f507fc13843f864eb7 # 13375bbeb1a115fd209641b3ff37b72f8f7f81d6 + "148": 63429ea245b3b61300d243d70a58f026fc94a1c50ecf99ed37b2bc15cb7b14c95676038fb4c457f3e652f915ca4b4f0f2f04bc6a0bd3eb5a7ea499f43c0f2e2c # 13377659bb645fb1de7ede006c07b3d690739a73 + "149": fdeb21afbb45354007584f6aa6340e4093f9ba64677ce181fce6c0045ce76f9ef0fe3982d4a86ddba2d4a3f7e885b5a3edc35d8aa1dd4fc519364a2fca037055 # 13374f713035be29da36d6dfb276cfcf6c63abcb + "150": 6a0faab40b12baee11cbbfd99f7c0ad9e59ebeaf9fc2faa1db3d93febcfa42cf2b2d20cde1cb7d171ee892fa78b87f8777a9b268888b86241f335503ca375e7c # 1337f40241cea0320dabacc9766d7e1699383d13 + "151": 956b6ed137abb895f2cfb0e676ff297794f63da632cd8f5acb418f684267c62557373d8ed902a1e0cdd716024d6bcac12cdf0b393a77ca918bd33d6a620a306b # 1337cb925e9dde64ae9a3fb3f62479185617e13e + "152": b7fdec948642bb40f9cc1a10ce34aa98c4870d00767223d194d2f572a89ab3d16ac40d0e25723b687b0e50b413e121e0549f5fbb703211fe696fc75fe60fcf3b # 1337d519f7050d49b2d19f6cfb48e91729aabf2f + "153": 2f6d3de38162a88118e21d0e72eb3d73ae3ed24005aa278c80d74eae719c9bd09cf2e5214e91deb6a98b4043cd459748f9990dc9d6b94464db6b37591a149c2d # 1337c5de66f104cf9037cca05dd3834df424f0ef + "154": ceb72459722875e0702c7f881e8769ec7d5ca65386a2855b307dcc22cf4311921a9c7d374ec9a9e6c1402556394373396adc46744fdedbc6034f7f38086d03d9 # 1337f16c262f353004ca63134bf68bd7ce4220ff + "155": 88e82fa0d36a9524c805f6bf188c3a3456e0cb6f66fb69dac59d1406e46ae872a3187eeecd80c4e2800d1b4e801a85a99f50a4e291b6cfd8f384b4e2e167d150 # 13377516d046e8c8d63527727ddd3519b0a5efa2 + "156": d7bb1d09d40d747d2d7569a565100865b75c9d575d7c2440268ceda164a6d1bcab712f09c675d61abdfd0f3505fede2457d9d49569924b99841a8baa85265cb6 # 1337a387c1d183770b859d6c5e972ef33a57679d + "157": f2bdef5077a6a88b30ff93871dab3e635ad59f37cc3224550fafa8cd1217911f35403d61698df9fe03ff107c2e9adceec4f32eb82bef7e7573465e66e733d70f # 1337ecd81442fbf9f06fd6bb2d4d3324073c275a + "158": 31053b9600098f748412aa9a8c38cf88db76be4e77aaee005f56e0fee56fce459ce4aff512709c47fa63be138c25ee5eb49aa386f0e77b949a6201114c2f2e9c # 13374c704c3b7b2cecc73456836f0d12a9ddfa9b + "159": 10d6bdb8f79addecafc9a671c4b513dce1eb37e074afed3d76b6dd8e860bf98b72197db8ec9e4ccc04af03ddb22b37db96f64154694d28ba8531281fbcc0e52d # 1337b15713c7decfd4b03fd8442a67e6a5444583 + "160": 049ee7dbb43bbab50db558ee3f5c4c781f0334f72bef95808c9e34a1aa1f742960e93370ae51be8e43994c97babfd576c94ff3ad725b5f47592245178844df7d # 133762ad3ca33cc42c9ea128daca5357a4bc4be2 + "161": f45dace6347dca7bbddfed3676fa32cd2e102ce4a9f199302115036348d583894a2a6ae2a637a1b39f2818f1251d0b781cfad0e017f46ef55041ab9cb062b919 # 1337111aa23d2243e4f8b7667cc26e5ee8123351 + "162": edf5a48db632488306801ad2546ea46c71f80fae580274e6d1038c5ec994a11bb1c3c7e9d2a6dcee8a524a2656a939998bab1e84499f437f014033eb4c2b2012 # 1337a4f35edd7a6352739ba65d9a37d513804791 + "163": 3eeb3c3c2bb806ce900f04e74def9b416a651d46645fef6fac9ebc750f04b40cd4e80e9f0d3b789c6744a324020402649b2062557043ac0147746ae6a89ec7e3 # 13378504f8469430299f5f6ae362145a0dcd43b3 + "164": 7f80c219587342ddb4cb0d61c149de62d4ea9ed37562047ae0bd5f947a4a9879a15395667c9a2eeebe3047a8d78d1e30380360b36358381236dedc60b8d52c86 # 1337a4c94dd45d407ea6bb140384672e7de7f106 + "165": dade88a32367fd949ef181331fd1a18b9680d9eb5f54a1dc3c06e81100f7a7625bad670b24ea08a16d6c30103fd082e21a9f7f5686b55c216deadc61cd84b540 # 133758431b3f9878688adf8350a04aeb31e86297 + "166": bd23c32aba79ae8c4d8e9f119d6b9db7e0dce3a013265e8e6a731cc5e9c9fd1baea5ea6ba381195b7905de9f5493a0189055f05d40006958029d1ba0a15b6e3e # 1337842d2c5894cce242a8762e963209a600c826 + "167": 950251a9d00d9b1ffe003cb702503d6e5fe26c62b37024f571697888c350ab7b69f7f275cf2906e79d231ace21f1499aaaaf6ecf293aa144ba8b0bff57ee64ce # 133734985b6ac08236b6f5c8d61637318dfb1781 + "168": de555099e814fc8d779595e418b451814175e0a227400156ab8111fafbf72890209023b2d2dd93704b5be0c82a7219e3053b0308d45283bee1f980bdc3dee346 # 1337a8997fa74a2cd7e09ddf376e7f7c64aae34e + "169": a8fcff239c38f33aa4065a91130ac70d09b6b0898fe0276e71461a73b11c2d9e6697cb3fe32a97ad2cf765038ada9011263875adbf03518f8bea7d6ba98aafbf # 1337fc46e98827b5c85c93ba69cea9a2548e5cb8 + "170": b80217e75ed1aa174168344c9b204295bf599f368ee8938cbedac18e09a5b9658eb9e8deaa019fc3f01c69b19ce8b7e5549558cfb1086adf1168086ff1329a67 # 13376a253b7dcfeb6af2440007400b9d1a0ec44a + "171": d62977e1bd8c2d45769cc49a875da566c52a2e20ef9435fd3b0582468ea0755dca89b9d47e3fba086d9915a1c8362776685973939998eb8e8e77c4695ee17f1b # 133788d3f72999a485035a35a7e039d3a44fc92f + "172": 5adcc6ecfa514ee87dbfab78411002fcb419a9032b2c60b8e638941e95434bc33c5f5b837d1101de166bf72d6299b1654cb3fc094d68159421cf8ae2749cbf25 # 1337ebb59f98c65bf6e2ea4e060bf54a788926b9 + "173": 391b0372f82bb94035d65b063882c859e85ef4ea3c466a763529fab1405f4e33d1f20e9d48e2807edfbabd770527d0f98b70dae48c2627f841d3d6b3f4dfd4a0 # 1337ffdeecad32f7e9c740ed1cfb88bc83627aa4 + "174": 652238c6bfb6d2962cd483ea1f28b6a4a64b40ddf91deefd7aa5f842eac432b4560c5333f9e8152a1d1f69c01e9b9321b93590f41bb8c0ac0c7a802c9b2fdbd6 # 1337d3d3e91059ba87280617ce08bea6a790b4eb + "175": b990fcfb5ac20bed3856cb50fc4ba2c8f101db09f0446ab2a7a215efe08a156ea9276f5c067a1361e525d4222c51340288f0d34983e0c888776ed42135dcb826 # 133792673b04132ebd772537eeeb44deabf6bcc6 + "176": 54052e8fa8b8219a5404913b376d51b6fa6ef0e2dea244bdda90444fbeb981d53ec5d257568bfcc0446812b7767cfe72598b779715acf82911f77ba4f94d04f3 # 13379ad12cd688f9d5cf0a5a64e16929f127df28 + "177": ebfca0427816fcdd38d37d4fdec649101cb890365ed56cfeb0e48df9d4967821f2a7dea84a3b28f15be4d761a7cc31e0e5086438c57d23eeea45c55d1fa42532 # 1337f8199664f1b8be096018d6c84a66f773fd82 + "178": 4cf60f88e84b96901e7349f3879f45cab1fe1c872fa6f5844af64a4a4f384a2909ceabceca6344015549fc6843865035a8aee1100426ce4182ecba696a9cdeab # 1337ab64e437177a44e506f6c65ab5d41c2791b3 + "179": 3093436ed427f8cc0b55b02bf3a8343346a1d8a24597738606df25afc5aa0d63b4cb2e60468e5d095551354bfee0f01bfd712f0730fa345957effa24eb2a5ac9 # 13375bd211f8817ffec950395ad2bc095006e49b + "180": f3a7acef3f0f20663bd08d68cdcdafeeae9875aee186569b29073c17ea163ef6b5accaf1fa2962c62ffffb8b1ececfe5cf8a79ec37d1ca49bf6da3ad14324ce0 # 13373aa383d25a616442ef5e66b5a79f40f12335 + "181": 7690372d2677d3c5f61582e732a708d91aa7d40f6005fe98aa484f7607ea3b6fe7cc3d1249505850e3c200a7a79b530f83f13c6cca8439c6563308eda3cb06a2 # 133769995c235bddf6b80ad32aa45eb2addd801c + "182": c54a5c6eb3d3ebb59cb6e8b1dc1e85ac091355d4e7f5f42bf64157d181a3e6ae9678b9fb80a69cc56bf20ef938f5c052da21631ed05abefa6a8ca72fa4bafffe # 1337217888a04c6f59b7f496192a61f8ac56c2a5 + "183": 8a48ae171b7f6f65789addd6b489c3ca3dce3897f2e21b535ed6778c9e537b9e622224d0f7c6fb51241d70369b08d8d5bc8cf6b00ebc1a2fcf1ed9c6fdbf23dc # 1337668b92455899d3bf42e4d561b75254f3fb26 + "184": 950f259e46609a2dc268e415f44bb2a3cd593265d578e49d957b3846b3f47b4d3c7e9cce9c9311e4eff8010221d9413a32dd3cba69ef86e02eb3e95e2d0390bd # 13371f545ad75f20b655033ea99bcf2cd109f1f3 + "185": 2c35b225051bdfca8347122c642365392a348c91d2fbc6bed3005a22ac3108b4f72d47c5a2d6ecb400348efa9582f3f847a41a474856055e0b90d9562e1d8183 # 1337aa8650074949da83cd56e353fef7cc725fb9 + "186": 78a4b1af8b5b04a781784e7d53043e138f50aa38108d03ca1a022bbbf990dd881163b9822e33816fa962177b4dd4066d85652f2335db2d450eaa06912cca23fd # 1337d8fedbb6e3997d86ff532155256ceadd1fe0 + "187": 8851fc4436c700abd2a7ca8408868359348b6b11aedb8e1fed00f6bb4e5822790d7e30de821072a032a620b8d02ab3c6793c921a86371aedcb31d7d63d0177ec # 1337501346bfe15fcc5dd763524a7482c1f0244f + "188": 5c78ff8217c27c2dd546840f27eb72171a40f1924b0e07682181d3ce4d0c6ddb898d04c2172888920086320bf119817d900f7b918da91ef7d4766c2c5d862713 # 133748621cb790d15a5bef892e69cdeafe7ce001 + "189": 2f90f1317db73f4a9107dc271a280a3bb3566f73dca519d8805a7a84915497f33607799b99a63788f51e00faaec780dc2690d1d8388366c5234d4c265e9a53aa # 13371a856c32c04919926f766ea44dc8d880c8c1 + "190": 67574e31ffffc73f14ae62fea4f40645427dfc4dd666837d3781525f02dacb693f9f47146694731c94a4f65d703e533e1cd0b6161be231501fd11827048af976 # 133714f1744a60f6042ecf3f8a0087d3e7200d09 + "191": d2ffee51a177584d33e9e599e59e91465e962036b311fde3db1bc5222528797fd93f9ec4607f20597a299f2eebba1d46ab48d55af0845ee89c7a655eb35df86a # 133729800bf5ca53cb0fd9ff3bad4d7e16e89f92 + "192": de1cdd147564066691c0bbdd0867b487445fd9399622e2a928afad04cf49257177eaef543eca1c803358b9d0020cca66c8035d862c45deb824eeeeb83f7c9b45 # 1337b23f43ed40b7fde75c318773699acc4c1070 + "193": 1dd069277317370af19185c29223c5d401165dc59d49314be9c4b5c29dc7c96027f61913cb571963e77c5fc1a18677ac873982fccaface2cab34b5e76be14f68 # 1337068dbfe5b6c57f2de097bb4937b8919df8b4 + "194": 48f12d2ca488e2896e7eca5cd244b08a7b3478a50894b11689adcc2dde5307b081b8e787cbb0fa991ccfde445b65f526b25cc093d2cb3fe72b2426ca3f21d27c # 133722aac90ab31db5acb457a08f9894332a4de8 + "195": d22972ddf59b8a5594b2cfc04ad2d008cc845ece981433311f290c07176e8f3d3535747146ce43d0d0aa35be4975dedbf191f30cc8fbb8d186798a5766d6016c # 13378ba8f14f1500a116c66e479d1387143caa2e + "196": 24026f0cb6a0f09d5b67391d0f4c4ae7857f124605dd8600c67c4a70a0a62fff5b4d56b277670587ab5372fd188da040df65ba556475eb69d6677fee9efaba50 # 13379492a2319f3b0e389b940d4e590140652161 + "197": 749c2621d1b962ed60bbe65678326a420875a1302ae96b08580981e006703ff80bef768ad3b19325621907ac370c1aa6a9d30d59c3fb975759c1ff3f01973be3 # 133771330d6d4e622461a914ef7542126c0911fa + "198": 406f738aa73044252c9bb2641fe00deb23aea6f87615f5659de7b448e642880d604e1d7f041528e7b50f7899a73c7b48832ccff2394f51fb5943879e70bbc381 # 133735f025536bb5cb95cf460573ddf6586637c3 + "199": 24bdcb7367493ed3779c0a112e36ae291e12313e1300ef2c10f1ba55b9e706140a34cdb3ba306a3eae4d40f892ad8e6a1ce2871c685849078071a3197a782c95 # 13373dc33a8d246e1fff9725a68bd3002a658dac + "200": d0adbd5239bd07a8bd7a4546a9aba17f9721297b6365f0905caf58c82c7c813414d1ae3b44d5ebb2172e6bfef751993ad499394a9b5ea97ef53d0e6dd209f597 # 1337adb419ad779054eac3dc5a9963393ba4bf48 + "201": 144f3371a141473fd209832fa62e7d24ad54bd0c02ff806bb9e28bfc3b1feceec22f75eefcdbd8bf5c46acb9be9ec256bbbb83efe1ced5ca626bf711f0409e09 # 133754e663491b9aaa614ef5cc1784760913dbd8 + "202": 76cd492169dc00ae440d53999f15b9d927d697723f965b4d13006eefc862eada02b23dba6a424db50c38771599dbe176d6a6bc12a7119f3d881d75a85915f3d2 # 1337d73026e9409cdf86ba1307db2488b993fb3d + "203": 973c27c82a57a7fd94e8d55eef11e3355e81a6bc73841fe21ba4c9a3bf468fd427a9f297e3e8b67b858390d3361598f80b2bdac675eb0b4ad082f526aba98bab # 1337c04e89ae250ae0badeac6ca4c295d0c548ae + "204": af12587c217d843cf893efbb664c13037e8b92d578e05b93700847537af6d3288164af8a5866a5a4540dd5f30c50616a9c918a887c902b6ed8deccee532ba32f # 133738a77e06ad25b6763681ea850d74a2494739 + "205": 6ae6bfc66acfd91af39a8b3a4857899bdc0c3ff2d69ff1ec6160952e6aa361ca481b952678e5308cb0e3c7545509e4fa0ec0883d3804eab876a20e034b5b5f7d # 1337d42f81c0ae6cd253698b0295ab34888345c0 + "206": 2df481c4eafe787f8ddf1d6a60bc37af547a79e47a693fdc4d3670fda63e522bebbaf83d771bb08f9d75e6e5afaf7338b6f17e05652b5839b02bb4efd3264f39 # 1337ad0d4800508c7147184784dd76f05948bf04 + "207": 530854777c828a89e83abb39b9d894a7e5bee5922a852d726470ccc1ad38aadc9c5eaa1ed5947e434672a926d483d1c7110fb45678b6d7693858198287d0524e # 133781ca001a052d939ab01e4d629ab80995b327 + "208": a5140a011e0993e20f129ef0735cc3aed04bfb193310b8126452c0171919adce00db9c6e64a18e4924b1c19631f47077d998083b9b048cf4d9c8ea6ee6b5b30d # 1337a2672fc94e25ace78244c150798269cf4488 + "209": ad00d605340e21a8f287960bcc95fa6c39ac5f61b2172661d9702e524f3ccddc8c6c0cdf3bd1690dbbc4ea54d00c1398b4fb65f6a24e03e4c64a64797eaf63ca # 13371fb5456327f0274035016cdb6a29bb54a7c3 + "210": fd11a0d34aff0b2578b0214ee1d1721780e13f59eff581ca5da2d8c1d858f7ced924ebff8c4f5addf3bcf831591bc6654bb161ceb6d9bbc069540f8d7a0561cf # 1337d3c94c640bc2547f515b8297aa75617cd96d + "211": 46473c29a02d9b51525bf788eefbc185755f8c4b74cfd483379a710c9c05e18b2ff46401bf3fd1a1ba498ba670654794ffc68607fcebb2c80bc4f867a7058d2e # 1337105513e1802036d30e71bd1249dddb5835e0 + "212": 5c353f2e7ffc137a805507a150c0a49079739d5cfd61ded3b691e07c18a3d92a2fc8086c10017603874cf62bbce6e738256504b3826164e4e32979cf1590042d # 13377fad2ff8f4f62f1b9f51a7c0360bc74bc49d + "213": f0e68565364f12131790aa82f006eb8a65b077cba724e0920872a56557aca5823231980f2ad59591a10b23df4e31f1e4c4f82f77d3daa61f69baeea5f1492b67 # 1337117322ea58c5b93b48192f6e15973c7028d5 + "214": a1f6f3cf692c2477c7cd388eabf5d8d6f5f5e9cecf1ceee7ea01dbf89b5aca856bc85fa706624762c1f882fd0b6867e6c685f52399adbce0b62fe3398ae02ef5 # 13374b868b52b80a8ab8c833384525bf68e21593 + "215": b6dd7215f01423128e62c8cddb45e70be9c356a2b7755a86633a8e5c265b6b4d4a46861a94a8de93e90ca5b35102db9ca051feba84755ccc50069d0ceaacce64 # 133735666e646f8c195ad7b94d44227b01ae6883 + "216": 62e22d32aea55f99db4cbaac23fa30cd996ee994398ebe78ca74e8e35b12c182934692e60cf036ffcf95146ba227015d541c9e5c5e91d0b80739a57524f6567f # 13376721efc09a4b03aa922e5a030a3bb54870a9 + "217": 7d84329ae7dc2bdd7f9166d1b9374886270149db761125f0041ce5bb9d8b3cce18cb289fb3c750fd0a6b5c5143e17f66be9eab733177be24f9ecf8a3b8b21fae # 1337f2126cea333b265c3bc4f06c100b4a06fcc0 + "218": 3761fcffbd5091dabfd84147de80369a201830d15ab65a13d19a55da707bdf33922e602fa6776cc4ca01d1a8afbcb43d293d639cec85f1cf975a32711adf5ed6 # 13371691a1a02e1a2efd23d07f93d022887148b7 + "219": 34911317a8f33289a4b23216c37cfeb87ba5388590a818688faf8ed9d7ca656e46feffcd916458d7f5d4c826a5786df7385ca89970a3954d3688e17e54b9f82d # 1337315fb09ec11265ab071ed27ef856de81e263 + "220": 6322d5931c3187220d644286640c29c717098b9ce1d670651899904f01c9e0faf023bf249d90200b647090de1b9ff32b06eb7c03d351cb3abda36cecb626745f # 13370089565e2d40bd3cb117221f0166ca4e3c01 + "221": 20341e7eca6c4d2eda27aefa49c04e8d9124025c7d3474899e4411573b73168d926586f97d30c24701355666954583309f2441ce774c3fe2ee9904540cfe27c1 # 13374db5bb315d5982c17a6f787cacd768cda5d1 + "222": 126aa7447a4a8e5ce06d72ce043c1b8710f6b3633646176a03684c4babcecf95da7d6a6b94f0b88294316c5ad81fc395e5e2b953e70edacc3a0b404671401d7b # 133741ceea9e3a99b48a12bd7c0666c80579221f + "223": 9698cd99ca282427b53e520247b96157660ff8a1f030f6adecaa3ad3190a037483ac4c24b6272e22f6cda324a3fd6336a13c8edeea372c646a167a3bca6f2cda # 1337b6ac71e76ce1a2c70f54917db0dfc30a8cee + "224": bf8a6741f29b136159160fb3db1fdc780eef0704f7b8996efe2ea82af77d64ab472f2e47badecc96985a31a4c2d20434718ebde55a24b46dc1c83d574190b0fb # 13377145549ad120f560143a765aac3875381836 + "225": 7414eaf74d6cbe97743259abd448472ee3710f250d2604ea324551d0216937fb647adcd596646cddbae5c323624753462c41e96cf9b952987b04aaa566ef5072 # 13374bfc82087d48a929bad0d5296a29d8e8aed2 + "226": a85ea0cb8dbb6046509a9d96c0b066a788bc6d8d5219e6ada0396dc3a7ee5ab8bb2c6db75a010d65988108181e569df033e9136f4d5ee86555f7d41120c9e73a # 1337cfaa8cda356718a88defdb3caed4ed44a18f + "227": 6cece20f1442fb5a5a89800ce6c5d8c49148fef17b2bd36b6fad4c8e14de2ebbd0fbad6a930e18d47d046f14f23c712f7fe1d3cfa71502cd56eb01209e8c3fda # 13377a6b907ae46d6ed0d1b194987ffc41d398d4 + "228": 33689b7d17631964dba165843de18316e509ae87e375085f05545842d371272bb635ab5fe1c9b395e11bffe76b8ffc0ac65bd6040768a45dfaac20d55115bbe5 # 13370491485211fb05945c6bbcd9d42869b38829 + "229": 6f789d59defad8c5d4aa6bd92a029c80e24c36bb894bff81e0e9ecb615efd0df610e3111c4e4cca563287a47d819c48830fb194b9242c1fda7eb027991374a39 # 133726f270ba6af7e057dd988604f74a52e770d7 + "230": 6e0aed8a3df984d293f4eeb2a2cf72b26bdf4138857c681fd20ffec7ac740a5bf2ab768dd55228bf5e329913cdb00f96534960bba11aaa354160bf6726bae2c0 # 1337ea008c545186884a3a52417ceded97783993 + "231": 25859765d1c4c07251edc155ffc15f5fb4cdf64c970576b114e80f320b9c3934ef53ddfa79ea67095eb967ddfc8c6937ab1e14c38b5ea00963997cf3743d6252 # 13377a70c3ef2d16c7c85b7730ae1321fe6a82d8 + "232": 7e1e341ffb6a42297f53cf61549cb220f85e95046d12524972a640d6951ff2cb87139ccc46a4db075c81ed79fd5dd567d85bd2f746d00b9d13840ab897ff0fc9 # 13379d7f023e3e60f84be3f9e6577e2ec7535d93 + "233": 2511b828596890d615ba6f60023bfb5068299a8cc2d434f442b6ced2e09721164a2d96808d65b7ab04bb40536d17153cc7abf65535bc7f57565231f6d9832640 # 13377cfeb50fc31b42704d919af4bbeb93cc33cf + "234": 8009b6d7de6b2baec765659d4b91d29ef3aedf6eab4cb4d2683d491b4d54509f8c3b3169042d2a8d6792a34276c996205f25797b6d3c8570c8ca8f01a57ffe65 # 1337ca8044cc3670d673f25d22447ed854d6a087 + "235": 1569d4279dd46f6cec8729e6dcafdb1c2865447af114c92d039b82ef035c7568109ec4897eedeeb538034266493bb2feda80dd19214bbbe2186a04960207b10f # 133717cf9fb29e340dcd671779daab27fa2c531a + "236": cf53dc18ff8e335274b55840e8658dc8f51b68f1ff692e81ba5eed1336e98e2c2a5dc3efa564983ab381a6c531d0d2b68650cf4d4345b36e2ad1870a3f7ca451 # 13374a9cf236204d7fa142dda352c1976fd0b93c + "237": 2a76b6fcf7f6176ab33bdeb7595bbc5b96bd0f4ad1071f246af4a3d0e7709ff9edda043bdc006c841213b66f9ba7f0d22eaa30c99a9d188afab8d37c9cc564bf # 13376b01faabd73f1fb1806572e82508f8a64d24 + "238": 1dc6f5704d60358b65d56cbc3d56cffc5d3114e988f48996148c5a332ec9e9b7955907dc340743e775d96dee409bee417cc68c58e992bb232a081b823c3de708 # 13377b28399a94f71771d5a245d45bda19ad4017 + "239": 2fead677c6c9813bc91915e0b1efd1d95d31a945967fe0c24a9af8015db8e81dd9764151381e59bafc765996b3ee39b4eb80d05b27080fea57c46a23f35abdd5 # 1337420246fe3e5556e0f1a495f30d5ebf0f179d + "240": 05b910583da4239c0c951a86675631fb5f7b6101a02508d434f41f1e9e35a47abffce549ac849e52b4ef92e6b8f99022f1ce2b81a92af9c7bf71625d75bd700f # 13374b69009e348c3984c3f342c5b02402139b9d + "241": 524f000a5772370b88be392d97ecf6080e4d82ea8dbe0919b641339e4202055d8f4a680800033b988210e028ade480fff83c8deb45ee0684d69e11eb883f73f8 # 1337a489d0da07d9c963dc281316f3d8bf6bc31f + "242": 08a3b6473ffd44532912bfe771287df46fbf14879ded0ad52b7bdb88934fe5e6082a731a387a2f4b71e2cf5ac5c64e8a4637f9892d0d38314eece4f091999377 # 13375d591f12d608eb91ded5a5ad1314c0f98731 + "243": a859ba935969c1ffe9cdb3c220044c108d0d1b07391140644561a9518b9123ddab2f655c46e21c51347028b3fed7604bcccfa093d92e4670909ac148f667fba4 # 1337964f5749fcb08d263e63d2fc8819deec643f + "244": 828bc62b90cfcdc47b17049927d89e626c8a1b4b920126bbded43d892f80b3277a5987d0220c1d5813932d81ffaa8e699767423cac291b714c48c0b9da8c5abf # 1337a80d08ec9f227ef59c3fc52266a56072c9ad + "245": 1f34c84734a7e6e2a5943afe2282106ba04c2e4f4be24373994b75ab4ba94abbcb57f65e79ed6d344ad770209df53f3d346b5ca0c7b21279f87684472c3fd68d # 1337154460b5b8f093c31a2b84af2065d892ffda + "246": b74e6fbf89d2623e673bfe6fcdcee54ce3bd80475be3c0859982d5f14ee2a0956ff86fe8ff0976cab6ece63e8381280c276c9193b3d958281b86c79e323a88eb # 1337c4f159c5fcc9b948af846468bbc5ce074707 + "247": 985f874f20d000d0ee695e69ff56f56fb4a63f0c71e19647380eb8ee0255158fe8f886f6b5aa9df59147a130365c012a80dffd7bcb2721ef57fe989a01f1ef84 # 1337ee71de440856509f056a9812cdf52ee89659 + "248": cd132d6dd0e7cb191663bcab9e9ad589272f4d8782de9636fe0f63f55db3b4aceb40aeba338de6058255c1c78f6a6f1e1e7d2735fcb61d1d866da16dc38bbe8f # 13371d4e46ca36d4050b62435f5837e876e7e4b9 + "249": 6e935639f102ac83cc473911c73198c02776456408be0b6b0d051b1a2c8be051b927b6c00f31beb0e647d895f09baca07f5763870f8331fd2fd08974e733695e # 13374f32c403076941b66424f5e5ff3d0cb37374 + "250": 9de077326848482fbdf57eaa172ab337d83476ec7f7bb76a7403a35ef1eb76b34961af5f8e845b87b9d0e43d69013b3b4d3602cb97e58155578a79d22287b2d5 # 1337752616d890bc2cabc81c3ac898afcdfcec9c + "251": 5a5ac14288ab833e01053bbc48bb8b852e7b176b5772a9d6c79687f1acb4f4739f6fc706f1f3b0a7327f99db8c07d68a7d2763e95c64a46156ee3713e678bd6a # 1337bf306335c158113422adc6da2c77b899d1da + "252": 2b979c18899f1bc37d2bda70d0c1927208e26d1f27ddf66c04ca652c05d5d84c0860ff98419a9da5d3592e3883fc2917576b01f5f4aebe7efd2d42b8fc290df4 # 133761060c5469f7d5ca7519707f6b092bd14c05 + "253": b33f35191a10f9f72e298d60e68e0766445c72e229f9404391a5ee41dffef8ac51e84d99c611ae225ee50e8ed4d24a3786e5ec6618ceea3c12ec9c9dae06a36b # 133716f23a645417e8b8c4b2943bc6e608013a59 + "254": 317c2fa4d36a30560e57db324aea1c0a868b8db2080ec3884e218c40ed696da91ff2c6571ae94d93ea896e7fee54f82eb90264c33ae119beba1c2ad048b9e9c1 # 1337ce154ef72b3dd2f9c84f06dd525660be518b + "255": 27fb42e45170eab6c7b117cbee2bc0bab0b53afb53bcf61d1b244439faa924838c73a5f9248dd78d1bc8dcbe0779afe9d34662ef2943522a0f56de96e78912a6 # 133789b3bd957ca0ff9234e3bd47383240f2a828 + "256": 12487257aa7c7ff8f25fd327a634467be10dee55cce9861701fe2cf499c8987d199119ee9f4ffaaaf19c51b5d51d78b5e3f34f2220717856f4e0b7e4a01ef5a5 # 1337a646fff0bac92c93a11d354b00acc8b31b8b + "257": 55d384dab13becb6af0a283811e48b144e79f56e379e1ba931f60119a0013a38931b7cbbe5b7e3fcd9b124beaab0a42e15c1be8132d67e16a53da56ca79a4a29 # 1337adf703f2686bacd56da29400f477040134b8 + "258": 57454b194bc554f958711a9174075cddc41ef2636b3c99acaabf0e33cba779cbcd2ba855d7f81f626835f62d5fec9ac02b40e1d49da9fd335bfe1a51755fd096 # 1337c644b934a6be59fb73887be2e063a41a0009 + "259": 8980eee02f750c17bf2d0dbf0f39ec0fbb7faf0d404fd994f8cdf353434b3b6cad272175b88ef48db672762e2c410ae0dce0ad201b8c91865a33b04e1bcdbcdc # 1337af18d8cb3f4893235bbe4283907dfd71cec3 + "260": 0c5af6829452e6fd8ccb1d6852b320e31553197943df334102a8b5b8377d512b7aa6221192540a300ec52bc5867d01a4b52ce376eb87479116cc9c80e05bdfa3 # 1337c52266c50a6456437c41200604c3f2a2b735 + "261": aed8b87551e04d73486384ef9b9eedb030bdae079d6ad67ae377b0c654844af62d611b840104b567c02b4f5cfa7d06464244c55333baf3d90a3aaacaf4b1522e # 1337ff2bdcbfc13b72321528ba9d29d998024b81 + "262": 20d47c11b80b0b67bacc2fc54685ef505757cadc398c7f44f0121d077f365432645c1ed305e279c28f696229c82ff5cc80cfc64b681797f845b91d1368555bfc # 1337cf248cc9e398d3ae9bb4ad4f544105e9469f + "263": 895b2a34af2d7d4ec92555f3ddd258fb8d8d379c1e22c81c6a81eedae7d5b43d06dccf15245aedd6a1fa90f2f7d3951c5d6df0f6cd5ecaf54e39d8eeb36b2cfb # 1337930718f12ade957865870a91e406f464c665 + "264": 1edb33cd03b3c91547c5084a0c122eb86817bc095c05aa8cd9fd937f83be01eaa11786aa63b035d5164d36ed238c05bbbe28c5539e696f9ad330aa54c49cf2dc # 133729d81521aea77dfa9d40f9799a209ad9793b + "265": fdcd1fc3bce7d1f678c83139e8e2f147348a980fa74d34276bed16f6749852834a2d235b4e5412bdcf66bc7d4812ee157fe807b1257a5fd3fc72c3c7fdba349b # 13375b7a68432c8c7d06ab65f7f88bc44a349d49 + "266": 77e6452c97af8581cc8e6d99a6da6b6fccaf5cb7c826f2dbccd395885f535dea74218e5884f41f18e0d868ed97fb5357630a64d003dad5dda003ba36c6bed17c # 133766b027d4ef46c432dca40a19099313f3f6f2 + "267": d3a08bcde504343d94f1d54fd0640d24189a4353c9ba3d356e5f8b6fda82486226cd19a54201ea3fbff5e96bcb218d7f3cce24dd592da0258ecdded8b5444434 # 1337b3ca573c976b5593cd8bb6df4b008078ec9c + "268": 9c934f96d1ba0036cbd6bd9580999838a598737e38a3fac9560bc5b32939d882e7ed46a6fb8b51ad1fd0d2853850ad056aca88add65a312283622cf5785b90cf # 13379a8ff723539db34f2425fd72a595d14c4739 + "269": 39d9ebf8c2eafd4e1e3a5caca371cfbb3732e5d17550e608d8b29080a9f6f9600051f3fd573728061a5111bd0f691ac6ecb11bdbc175041c31b55e96f7d907aa # 1337257bb2c7ab21734579a3b93ab5e2d815d96d + "270": 40b97e7fbfb3c2d516b8e167b351135100beb5628dd185a380509a8b1cecfc873d1e38075cfc353df405f645f59b8bf46bead629cd4eb82ca41abbd95ac5b22a # 13375390f58e55e126d0c1b2d406f0f48671cfd1 + "271": 8c262a653d75eb0962598f137ff6ff6c7b1d4dcbb9fd62af999f5e19c01e3f9ec64e0f6f7d51030338dbde328a6bd37e7094a8b16397721555f994bc4ecd1295 # 1337cf3b21e7f54291f45e2cdb5b60216469b100 + "272": ce04430a00cf5f3b73de425428e177d35487dffb9f24525a2af6a8018ae5d7d4684ecbcf943bda7fdecc028aeeb4c5f5e80c5d05decf287e2d1568202cd7755c # 1337e0e8bd8d2640bf865b53c38fb2a1c6f6d848 + "273": 6f6c6b647d4cbf0d1a45ee3e4812fa5efd13965db72fdbc87bb25426e9ac5ec6fe68713ba37bd7cb9c8a61695ffec2500c00dfe52a29044a8913ca0abadfa5e2 # 1337facd45a4d3283da1a654ae20da81237d3e8d + "274": 7b91b1f2c4282f9f30f0d8c35e10e31f19edf8213147c0534633f2e29561e0a62809c21af198ba9841760dba7cddbcf678437f8f9b35af1ec65591223acb6bdc # 13376ce5220a5ed37a88f1554c51f0397f134c30 + "275": 1e40ebc43800a8d085cc0645f7403d639fe3386fb6635895e7cbe7dea9553d51162cd11107879e6e84ba80114c4e430adb3bc57e4eae72d753d744915294dfdc # 1337ca606f41c4c433c42e0be09e0316f6a2c271 + "276": 1f3d8814092dc3df59eecb5c02e77ace7b5a920960b5b68af9765c30d719a52c49157ec770e415ebccf70ba5cc8e5b35f11a5bb21418cd0b97fe8e82fe7b4944 # 133738d2ff6769441963e200233ceca2ebbc1957 + "277": bff0ed5ed69bb0ef8b4b027a565975fd910d02eb8715067d858ee634d8f79ee5f157abf89e8de2d720d6423ec431fe053ae361806ce3a4034ad52f0cd28ba90f # 133773b7b9b2f000e9154f6b82abc92b2826cf12 + "278": 852aa04fd57dcc0d12b3c6cc13884eac78efa4fd5ffca2e4a6366158c5ff349fd7451ce362bb8d69bdfba57fba84eecc656d461bc6f49144af983e621543e6e7 # 133711516618156815698487fa0a4b73532e7d11 + "279": 1afd2017d31d1a05944eb60ce17fb88f707393a2f8eee0b249e765c47e8c65b2795d63e4f7897885201b17ac794ea534dea375d5e80714b27a4f30769ef52553 # 1337f860e39365a1a0ce3d7733a2c12830cb5e36 + "280": d2b8b65fa12e0487e1e9f2b83e7a67bbb438ccf06fe8de194b55dbf6c8a8fc58eff54a86cc2527f7668f533dd760507d19366ff783257fa5c66296de321bf69b # 1337ca866f8d3d5934b18f3482a367ff152c6c9a + "281": 9ef2c11c92f703669cdbb925ea16b33d0205e9f245e4b50cf1ccd8aebe0a89a25d67649e88e477f220b1986ae8aa1f889a4bbc28eebc879e82731905bc07187b # 133706d137bce68a25e5c07c5d2bd15d93586612 + "282": ad8c7a034f9177083ffe8b5b05bb6d0bc6d2a0ecacef37378331174331333c3a6c7c39e2a2f5d581c8a6f4e2693cecfb3dc7c2d8f1b08dc1628e48f7fe50cefa # 13373cd5ef75d71ebbe24a6dfce99092987a5d80 + "283": 3a885075e7adf5767cc0b6cc55a3f92af8b8eb2a7eacef7292a4997aa74e14042236b3a59f90014afe3c977cf71c41e28f9fe08e88af80d7a90e1c0ff18910ca # 1337d6c00a169259426edaa990d576c1602f1532 + "284": fc36cbe7c12866a88e249fbce4346e2ba63eef8dbebccd72246beb251883a4380dd41a3a2c419e72eedda189066ffb7c7f4a7472f6057589d087f02102de8e0c # 13376da9510d4ab0bb0a9bf91d3ebc509595c973 + "285": 2ffb8ef9bd3d6f6845ea5278d753ee4fec644124c6a296943a4b4e8f49e7af298185f52bd3aca4c171f8a27d7b0f0ce6fc26ced402bc45de4372a6bda6cbcb11 # 1337357a47faddbef49876e8e2fcbc84698924ef + "286": a7592eebe1f35123b0ffcf8e2866ccb8032c73989a3a4a2f429d560a8c8ea38b8361110c0a1429b2dc0ae2e9e64d78d7aaacaf67eeadb745cacdba76b7e65493 # 1337965bfb31bdd06fabf5d9e682c88d19a72380 + "287": ec27931acaf4e6ad3875f09d4feaa3bf6b6368e63daa53652f3bc654d366475db3b6525696124ed2f87f3c823fbad8210a396e63e2de8f8fe207e70c014c2590 # 13371225d5983c5fa5b5a31a2e7071edfc1829d4 + "288": 45a7112fe5e42e31e63832a19be5ca1598a909a227715424f701c51d04ae8e6e55abac234327129bea73e38d828886e65088152f0f5200a561f1486cee1cd501 # 133767e250409ab2df8a6127822ae7bfce25c01b + "289": 00e3a05eff43ce74649a51ec5fda7445ca507d17ab96d6764aaf14044550e1815fdd13c97ed52e6e51c5b0b7b2d0a9cb2c035a1e7cc78f0f4638ba34914a1020 # 1337e1820d3d7863acc34ed32fcdb0b4dbb19c46 + "290": 029707a1df1eebfe772ad686707d6991afc63356e5d9ce694ba2ac1dad28f046033a21a48954b2c04bcdbe61c03abdc42ea08644d6fcfb9cb574dfe19593b6e3 # 1337527ecd33fc7440800639a13820fa620fa2e2 + "291": 12b259c5eb9d15ca75f079fecec10f76bfc16d426949577ba4f3e33ef79d90bdb829ab8897e37cbee7e736dd37d2a341c076ed8fc2ca1b15d3163baaaf4b036f # 133780554cefb89beba3f05d15c4882907293b25 + "292": fc8cc293c6adfba17cf6f2577d64da29982c2d16bf88524458e92e8c212b308171a1a12138bfa8231267516b5e2e3e574a16d4ceca068a0fa6f2dad48fc0ff87 # 1337763089ab8df9f4ec8887620b0c200f52cd56 + "293": f2834e2b69456acc33b48ce221e50c636f29e0536329acba2b87bb417d524f29e1a9bb41e4f309c09b94b843a2ef41a1a35b45f2a3651fee6acd8b49f6af7827 # 133766d34b0ce52a20a22a121d7d66daafee962e + "294": 83d5c704fa023f42304af8af0fb7f957454500ce656a7b349c1010b824fb417cd457e0fe149391f0659fa6d134f0b98be7c45a485b47f65c5cdbb8172af45c75 # 1337349f1add44db348d5b7978eb85a6541cbec1 + "295": 7fe877c8f2457b670bf6b3b1d76e8b64386e03ffd5632985191790245f3ba657bb8bad8eab6bd8e7337899d237cc2289d3574d0fd7903daf3f1a7ae6a7a24174 # 1337b3ca12b160e8d3327fc29fb2838d249b1675 + "296": 989f684da3f057109cc81e7b83cbd8a13c7f174afdb5a06c10c4b2eb2953741679f8233d05756ed2b655816c46178e18992d1b6526e4d464bd119524c9e75053 # 13376d406caf1352d894d2046166a0200ebcd362 + "297": 28f3ca7bfb0d6dbc00902b14083777b8415abd7fe4387d9ab8d68fce7ab5417a1fd1dca75a838a75512af350018c9697901b7712fc54b236c73b7ca5b252f760 # 133732db85e44c50d1d20de07ac0970daf306a16 + "298": 23781f537ac6b91cf7b7bd9b972111c58553e070d3501558e680b6558e1e06fff7b1fd0a0148af5bddfc423120e33e92abe0d5cecd1480ecacfc4ed2b96cd36e # 1337d49963724091670ebc73702ceed0535792d6 + "299": c99441504f1b48bbf3647e97cd917f89ce9debbc5c8d6c40cd04bb1b0baeb21eaf7a1fda1cae496d49dffe0aea93f6534239729b872f6d6e8058850f60b59ed6 # 133754fa2fe6e2034ccfeb158536dd035ab5c3da + "300": 323f2164f9e6e5aa520d367f38fef43eaae5897be7a7d0b789508f411ad61c54269ac1bd389e55a1dd5eafa903fadcedd8d61ad75448f21e054139d2cc9b05c4 # 1337b4a064ba03d28482ba3f453d1a4ea1155e19 + "301": 33ba23d69f104cc8220fa46c138aa2c57754c869e68b0c170321e477a18b70ee6f8da167c4cceab39da34b291995efd76ec4bcd5a5c522377b477fa4c1219676 # 13371bc4afa7c8aff91e1e12dc0ae8a246144cac + "302": b7182b1d21b7a8b4fef69a56a87eed71ad8cafc82bf67bfad5ac1abe90c0fea800bb30ec81a52c8feafb32059b102dc6d5530d3dd77a3f229848bcef658251af # 1337cb867824d5487d03e706f2c2c0563796d121 + "303": 6060b58a35b7efe471ac70b6af796f7a7445fced813bc52af2c1218dcedacbfbadbdec5cfc7a1f49808954340f8a294497e53215f3aaf257f5c186d35079eb97 # 133775c2706af26a1af10424c973587c5e2810d4 + "304": 17266cb08e331be4893663d39dbe8438a4e2a5da7d49f7f4ebc34dc753e753e1600070bf1a7f4308ff4c34cf6cf8721288a86d3806a39a63b3bf4e9c29c62b2b # 133720448bace0662584aaaaaca7cb5b5374667e + "305": 6df6f3eaa0636faa3caa0b5ef8630acfb59745d446091d6b2393a28ecc0f9aa3c0971367419c8e029ba587528fb6d1c8f08f1c735bd99c019f59fdce15eb8bd0 # 13370a5ffd4efdddbec56ecb8dcd22e270538ded + "306": 9a6995d60425b062d6494bac8d6b749738fefb6929d316b88725d8167aa8ed6f74d3b84837e642ea7e8dcf4b63eb21fdb56731c21e5bd926df1db9373b014328 # 1337ab0e0d5dd03b3b0a0f8e83880a5031004b39 + "307": 62215c272eb14474d5ffa92b666a6f94e68539d43a5405d5850e273edcf146eaf782f8d2f8f0c68f444d282a926a0454fe658b7ad2aa578b06aece9edcfb0431 # 1337cf8359dda874ced1a505b693b645a4379783 + "308": 98341bbd7fba29bf4b140fa00af680aad561411c933279f18187f9ba0475d7dd2bad2a55813d7d7d0edc6b3012f86162b71e0362b22b7b6db3cdac490502d551 # 1337f33ecda04702a0dc5760001b8cbb688951b8 + "309": 4b42be7da69d0d649989308ca238273ebbcf0970c21134310866c0b662c45ff6c60b753fabb5cc45ff2d4d36b75b5d49cbf90fe1b47fd18ce047e2fe15fe2011 # 13379f1ba66cbe32435ecf4601e9473f44064331 + "310": 2ea405e6bc573777a92e4f98b7849b417472709ac447ff76fa23a4ffa38973e2bf24b2d9a7bf4eee24d7fd1e2f2c49a696657a97ebf477b635fe2342ac984e85 # 1337d7ccf08f786a0b6f2f3dd673a9e4c882f4e2 + "311": 488b2d7202c23688dbcdf4f9b32c106b53eeebbcd8dcb7e010a7b644e58bac65778c3c5fce6f8f88259852b8a4af870128be8f7f9ceb1428fb4ff7e1f2c9220f # 1337d5b45cb07a44baed4e7f2bc80d9ae2fc83e7 + "312": 0df168dddad0ebb237c4914b1be1ee74bd8b143f9a7c8d41ac63252890b8f1d6d1355448beafc51b3f16329da883c0bc49a5dd0214ddbda0e68be32917d91063 # 133712269b1cfb8ae7ee933b8019a4b9df634b63 + "313": 207896eb0707fec8f5e14997b8f6c24cff36985a8fcf0c58cc7c1b5b6d01294146e3c7120d69eb2c985ef1b5cfb7766f7da0c2571e0fde433ffaff63a04d8863 # 1337fbad49b09cbdf990796e8fb813b94dea2f6e + "314": d0a3a3501bbbab616f074189e9f45e555ab632cb7d0045cc91682e233037995a7bfd5f41972ffbd76336fa82b00f7d77f763c3ac95a88c08fe6558a50eee4a20 # 1337f381d59395b4d39e5123499a4acea4f32531 + "315": 1b2f31bfb8af01f7d7471e0f0479c40fd7f1b4deae1fe416f3878ce8a27c66e9c8734d02aa021cf8cccc91efbb14ac8307ec444e33d4690674abd24d2f5c502a # 1337e92e67619f5791e277d05a0f0cd80321ae96 + "316": 0416d7e0643a732ebcbc8cff9d49da836fe26784990b551e02431b36455579f269f353f8cd8484a5b08c35099f9747ff5e392c4697244a1fd5f3b21d8c0be0a2 # 1337866bf2345ab63dc5c1193a12e44e8a360fea + "317": 870e736662947c9b4da9f9c46bc14f4b7fca4fa29762010e39e8ccaa1c9c3bb100270a314a44b37e43c675f23c657055e954a4cb6373b01e4430dd280bf99207 # 1337437972aca71c4843e06744812a319906c0e5 + "318": cf0856332afac249dd21221d7d492757f0fe28b7d559f0b69aa213e1649d1a7765afe5e12382a114b15f64f97aa4f940d0e490c48fd4154f9a64de83d74f90ab # 1337724620475c9f4841243b697fedc8fdf7c482 + "319": 27d6382146820503a19031954e48b2ab5af3a46a97a59c37d3a8b1e01bb1619c97ce662ce7cae363a26b3e8d8a33e4a9cb93370b045f3ec4d6f72b076d263fde # 13376b6514a6c25f028774160c4dafb969d0c4f3 + "320": 28cb33a908b17262f99fda13d1492032427821e0a0931d4f81dc7db6149e5e24c823b7d9a67ac21a8b131d90036cc478a1435b9fbbdb58991181369f7955da0a # 1337bd4961ba0f3ea1927a57408eda936e3fe4d2 + "321": f82eebbc7eede68e80fe3be6b2f86de1b9a59201f50923cbc22dc7851f6eedde84a87e3c0aca6693bf92c6f774f98a7fff67b5c4f70295cafad0eb60110dfe72 # 1337626a7363c17d8aee69577a1ee3f83a9b60c2 + "322": 9666702c80efa7fcc30a1cc2f3a27b8d03a8e9614c87881c1168155a6f8ecd526df24d2cc72c5b9f9ecd1d233c1f45b8b80cef6430a48384e985099720583a97 # 1337315dafaa998bcfc8976e418166f1584ee2f2 + "323": f2b4f2b3b7cc1e5bd40ab92f6e31e4861aaeaecafdeb5baea53394f254e348cd8f59eb45b36277156cc83350b9ef4b37fd639752000adf32ba7d1101f3c1b312 # 13370700ba51cf7f72934b207d47cda3d465550b + "324": 56c91f2a76bc7669c455972145f9600c7babce6c804b9cac406f062106c7f738cfba4a1f7cd45f8e2f668c3c82bd44af2921ec164e33abc2b5a19cf4f1758c70 # 1337c6fc04edbd235b94cbb55674e28924818b56 + "325": 12da999456d216e01a74e4d0f59486d3e13a389cfae3837eafc74db909825fb072268235368dfecef7d5419d3095745d6078848d8df8dff8879d335fb6ea2490 # 13379996d12246a76462ebf78555d06652979b99 + "326": 5b76664818328430cc4ddd3a7bdbe24f18527a250954ecc240266076c9d81712fa72eb0eccb387b2a745c554ed1b3e69b1a68c942c47ed7a86c9050a48b4dcb8 # 1337d36c3d3d2ed5bd87e6166f4736460fc34437 + "327": 7ca13a687eb66684fae8f03c6220194b65ff8e41057b19f3a0de6afeebb37d5a864c4ffb80eb9259b6cfce9bc1d42d1cdb0e486c695ab9caf5525043dc814782 # 133752696692a786194f3d547a1da8b5616e953b + "328": 27eb96db0bca5ac7ec3b00d34ec25ee4d25c3d3a01cc9bc9b1049c6e2c562503a779783eff4c695caad250c95b18d3851161549321b7eb7d13770d5d1a497144 # 133793d483b84b50afdc6e7f560882f141e8439f + "329": 932e4e4411f254766e310036da301ad1e3f41e5e97b14f878f558aab907e2825357a8ba799657efe3aa6cb625830b9b28621c4afe107fc5f7a8c98d005deaab4 # 13374b496cb789100b81b14830b52ee8490967f7 + "330": fefc0f2b87cf76977a257effd782a08844bc811dec22d9bff2c95caeb2c5d41966c8de5b9600f58fa5c6fa08217462e3e2572789c482d9e18a864ec8a02243e4 # 1337354eab367b87ad5f8290be16cb45229b2e21 + "331": ca6135f83e0db72aa2b59ed0d2d7b473f09c92fb08be067f3d2370e68f5b640ffbfeb6c210fe7e305e44fdeacec55e777ed8aa57a6824749c3403d693a31ec07 # 133708dced92555912f5d9176e75af79db3245ed + "332": c357ac91c362b4e2e6ae2c52a7d912ebe16e6dd0d66e716e4463a5ab5ef2678c5e6667e959de8547bae554eb706b9f0f1651b56a8c08fd7caa5eff65aaf86430 # 13375be63b386af4b00837fc154cdd2125ee9713 + "333": 74fdcfee1e7a9d3d61cd49b00a0c8bfa7f7795a52b799c8a75874173e666377cbaeca5f414d1b5c864b3d1aa0600bcebbbfbcab4f6d66355c28d5165267fb0d4 # 1337d88df67e368737caa79962cd1371bed254fa + "334": 49774a0d98871639be5c2b797e0471eacc23967335f9bc3fe69c0ab789b75fcd4b0dc51552293ebae51557cd27a87eeb1426e94058f54a3e61f77177c21eb787 # 1337313f78dd7eed5997673a35c7d00e204e5b8e + "335": bf29d8e38dc15821bad13eed8743dd16464e6dfb5210efc6516db6db2f3bff4b29eca9abe59854e7cf596eb0ce4d4c3bbe04876fce4af1d3ab71fca9713c4e15 # 133712719413b04fb09d4754c1408686bdc86465 + "336": 668bbb8290fa7d7c27e3d39dd56c067c4dfea4f80d006f465b3797ebb15709a628a12dda5b048944dde5641f6ce221aa6888d41e37ad2e34a50a298ae08996ce # 13373abf8ab23d6e87b4561d3a304069d04a473a + "337": 80451432c6064ed0629704eee16150ff61e43b404f92dd3ebb6f8a17bfe59e711cbadbe9090abee273cabfff042bd7a7b66bd38aa5a93bdf4a95acf010e073e8 # 1337087a5ac445a3e61e7a2cc1e1787448180a9a + "338": 88ac20c1d44b5642c4b59a7c8e434aec084d1a6a602c80d16c003cacb73810c2375da19001d522d3774627cc55cd9023b77405dd45328b86eed3c8f09ec5b793 # 13375088fb690e8e1ae786c521bdf928e7ae090a + "339": fdd413295f16230afbbe0c378eb9d1b48107de6f96d0ec7c65d8003e0bc53e191569dd81e4f101080fd88e984e5a18aececf2e86f99b5d2b26719cb0b7ae0919 # 1337677ddfbdf65ca6f1326b40b0610b8e942235 + "340": ffb14f9353cbfc96e5af82e1e104d8884642546f2567972afa686b970a4023ab9180401b43b3ac881980eaf3450b4cca75a7704e1e6c57c6b49985af60430a35 # 1337300b7200af0ae8d29c329d6fa31a491635f7 + "341": 8ec038f23ee90bf5349476c8deac6bcf5b3b95a9317d66afbf0e4c08b46d39eea05b6b62f5da870ee04bae0d0e14cb5854b16ab240021af5369d8e11953abef0 # 1337bb1a602a0f49eeff034955ae05d78450faa9 + "342": f9206b7721745d7b6567f95c74ecbd0dc53bf6628fb25a418388edc3bdcea7204800f445c5b0586ae12f59a1d5e0cb1f7e9261da3259c4809ab349966798af72 # 1337e6b5857e2de5cbd78ac1996b3b878a29f13c + "343": 67405f963b2a9a4aab7ecbb736d5a808e0f704c04f12c3c04e4b8ac9168591d09aefaee5860cb91444306b58850967044f7d4104642fd0b77310b3ca89d5c86d # 1337b09e2d185baea5abddb2b1334fcc48157723 + "344": 5c83fc136e2ff6f0ad893896e3e0b88430c2d4017a272833bbf985c210fce1b17aadcf7f04ab70f2abbd1c179ed4d95950f30729353b6e9f405ad586ec564c5a # 13372d5bc474d45cbaa5b076e269ab69af4d56d9 + "345": 98a57331b34fbfbed38f9ad134447fcb7f44244220583248e40848d4642f9f7038261736514f0f81155a2935ddeae506e75efd87345356c7c95cf1275f05796f # 133708923bc94e7d08de6ead88a7ed37a92dd312 + "346": 96fd7974510136bb1e0998a3e4d1da398bec492455d1ef964826fb04108c3445ee0ec0db68aad8dde2c39e0737338f454bdb139c25f8b543082dff300dca0cb2 # 1337a25bd4908a2cd77038a794017e558f7d55a6 + "347": 0eb03cbe7ad623b34112aeba07f5bf0cfc442d34545b0e7997980f3e24fd0ef8b6b82cc18afbba68497627799fba12b56b1964f0693fa6936b77db1d1c052000 # 1337d5fb8b03bcc64879834001a71b7cc8ea29ce + "348": c235996c9e64fc0c8482ed64575776b0ae67f89ae25e211ce5629a4df71e4c064059226409bd807a18c4d1ee6ae4e2ba8292d26bca01694a1b7690c062b7998c # 1337a78954ca5f7208e1ab49de6fa605eb609a6e + "349": 4537b21587cedc5bfb4f1f5135c7c496ca13b98711a03c811f71010bc0fc55641ac03bbf60179bc3cf7b30253fa1f57438193e15e7b1f2370c7594e21aa717bb # 1337a4d7e5f3621223d1f9c3c5535547fb76a7c5 + "350": 2a912bd023838924a6820cff82a2d181fbe626566596f6acabde1d83c417cd2f3942ba4b35a9da6cb8fc9cad2870b041b3e96a288ea529886085ba6ed1f5a340 # 1337a422103c3bdfdac2b59962f2bd76e05fa951 + "351": 192498ceb511b039a84194d7f230d7d0905543f3d63ff42d609ed418d1c7fb0fa989a23abfee5d75b47d8d0bad75f6f979dc1b8ebea5fc25e6483da92d6b6a61 # 1337821d96ec52a88e6fbe77518edf022761c3ac + "352": 2db3e488a3ba05998a0e24c17a53aad6c231f16438a44bfc5707bccc92f19e0ca4b80f5b86d9f9f1400365dd048e081a51c9f5bbaf2693d2793014ffc62ef998 # 1337c9726738e8620b0e424fbc204b4af79692ee + "353": 9508b3efddbf5074cd1aeded947c6f2dd078f17f02661936011f6f594bd55f2b45805bfc78b093baf790331a1d8d90ec03c0d5105cfd656fb05b333e6974da51 # 13378c4bd930fd635c076189f83a88cda7ac74db + "354": 38f57e39f451512722d5ee995cd97f72d1bc2818a41652f3b2959ff236e9824f7f3e17424c00b19115be8d0d2c2b4f6908511fd97feffdd2af42fcaf3888fa91 # 1337e30adbda91c57b0601a6d0966f47ceb81ce2 + "355": 2b5e5f035a7394bf22adaea3156f0f807bd24e37ab5aae46e4ec48b6d2b08adbc0cf50713e461fb5947ccf1b75456e33f58e07f95873c57bb1d6db7bdf9321ed # 1337d1e7608c7ec098f05e1857a68d382a4bf6ee + "356": 9113885998bd50a59b818758979de9a42c19d554b0ba3b69b24036a2ab910131dfcb6cb717150b699b83b49363ed25d9d560c0c51568772c0cbb8ab9994cdf01 # 13372a0b5d569a7ad0a770ec649c0440e8cabdcc + "357": 689cf08a8944188f98c54ff62007e7c9cfb7ef293364e6beb3864a093c0fcb260ae16142632bc22624896fda7f5b0ba2d2a2d78868a9661de20598465bd270e6 # 1337ad91d8d11297c57e345834b00eae4d80c979 + "358": ffbdf561422c92b565fb32023fa310fa5bd9adcbd77e261ff1935815dc09ccd9ac7f1529a5935ea6a8a11bdfc038f98715f198b91be87562894b42496eb044e5 # 1337986e54913819daa0bea36c8ddd9118ef4d46 + "359": 7b0cd3db25398527fd2c7ae1587dd45b2ea4c7a5a00728874d4ecf425b2851c04ef7daf883007d5053eeb3a7df284c6fb5ab2ba3758d47a678266f4b2a0c895d # 1337518ac86dd8948168b5373544bfed98d2d3cf + "360": 781d5705c44d0ce5df54d61c7f2cd0579c906e863ea442dc0e3b5b03c334551446c25a9cb6345b72d3426452fb0639067b2a22cc5ad84f64a0028b907d96d32a # 1337f1745fcc003a8774e403eebd5c86cf8180a5 + "361": 28728013a4da6ffd228441df5413bd97e1a5c838807318b355641be0f583affd8ee2f69269ffe38964be14bb446662aeb19eb7f2f94e109fcd9470236873c358 # 133766db626b317036f940ba43ca74c5bae35fab + "362": eb012fc292507fbb803fafca4c1cde50c2d9384f7fc98056f94afab1720ba8a3360520114c087dfa7d56fd01d8568291ece6e6a379b4779c0d1ec4341108f254 # 1337c28a7efa05a3df18c6f0f4468007bf84cee7 + "363": 00a5831d216dda3c068f7cfc0cf67d0e3254c72283eca7c5cfe317b3ce405b921ccf571fcd126add5dc4ce0c3dcde2be7aef596d3fa86d63b248aa8be3d74a76 # 13372afbc35a29f2950a951d2227ed5e0d4a3409 + "364": da587fc3aedfb3dbd43e621bc68b876cf145fa692db3532315b3c6d27135f4ee770503d1f46d4632c7e1397b1cb4412fddfc914d5a4871e318759a35181b44e1 # 13379a5347e3b3c75c841531ef3062a4f34bee60 + "365": 033ed156161cef70202f5158c66749180482144ccc0581f1d9d23a8ba86fc76e8ccddc18684e886bf89a42c9cdc366a13df7854f70c69c5d9989baac10b9ac3b # 13370aa7e31f1654fd95f9151f46961010938355 + "366": 9f9d0500bf3d864a2dfc68a945009e2fd4364d7f2ab5ea3b8374b713547d1dd2065678936806a6ed72046ecc2900b474de61fb036b280d7a980d7d57d511612e # 1337425296e20aa13a26acff1366aa5436e78417 + "367": 877dad2eaca6275d7ba3cdf31d0b6de13f4ea8e9ce80a252ba70c5571326d31f01333484c8bf326e83c4b32979b7d376b236541b152bc6a2232d10b89b6821f1 # 13378630d785a51ca261b91bbae50e0820578c8b + "368": 334ffa27c76f412b13d720bc8cfd7e69b8001edaa63896ae623ac3101b67885b1b73d65a2381dc9a724810f1c7b9ab6732c11cf2e02e6d89d75e8beec476309d # 1337b407fae70f5a829db190cd9bf3b64ccec720 + "369": 52ec0e11fce9775d216b249909d3709705a2b5bc5f9774e8913336415b294fda238ea664859d6a21c1cbc471c6a2516ea2e3e6554de3f9c690d25a651905ac96 # 1337440252bf45787d5f4ac970ce2c4c7790470e + "370": de85c679b6eded972b4bd781c46c2fc509c991492a4d4eb54f23b8a1843585ba9f40b5dbce3935069825eb042a6726be7634a8bccf102ccdcdc6032341d6c7c1 # 1337b786722e2539f97b25bf133399deaac8a6ea + "371": de6d6f111986d91a80bb6f78662212f82bf63b65a5ffeb3d91dfdbabbee872f263d2882cd864a97d48ccfc1966fb1faff5ab67777beff3004b1d8f568905a793 # 13377d3e262252df9c3ca1b2da416274b5b0ec6b + "372": a7800139345e21ea4b064e74d5bbc6be452c05fc4cd13318ffc263b446a2161535bb2e1f0d13571e9c4697127447013cf74f6fff1d641f8ded68b5729f64ef2a # 13378333375fa78e82cdd54977a404084bc1e765 + "373": 9350dea3bdf151cbf4690f2b8e8738d111e3191f5af202b134545c61f67ec9d27960ec6f86c8785a7a523657656f30e1d9c2bb256418f45ebc6918f149d6a18c # 133750b90342c84cece7863536604ef6916f780f + "374": b95857632ca27278354bc7b904c0361ddeab2468e22ee27207338e125adbd46732a5f55ef31f1267ac6d36533fe988a8e31ee4f933d51b41a9bd72f7d3b6ec12 # 1337f2f0256a2045059b247097be4e4365d1f42f + "375": 868fa22db657fd911ace7cd939047c9d091538f875b1cc6d80dc9944e817950667dd4c7de2d205324606ef1396c58ad2d1f6cdd6c35e08774ab63480ee0c88ed # 133708af6a4f6a9939e9f3a7f96c2dc4cd8d0f00 + "376": 4001d80e74ca1cfec0fa3ee2775d42ddba74996ae97b956fd2dd0c81043310db941e0fb396f1b9e35aefb8236bc05588fa1c3304aab13a0f2a4df6be51b49c52 # 13377567687528ff605bea64f78b084a203d2295 + "377": 22d9317667dcface2c5bd32e004f652f3f7fe7cb97ff2abcc83535225d3d1b848547a7601d3e15e29d7569bd4b50e5bab88c0f3e6621970d43c7c746dcc1ec07 # 133757b0cb39752d096fe07eb3229189c8ad2605 + "378": a8fc24c4086b73811ca28ae2c789277cf6e21b800d44d9bf4251849735962c8cbb786d6221d0c20495d51366d9536e8b998255cdf0bd4d7968f18d6c5712c0a5 # 133758e7d9dde2143df0dd8424a060a9bd78a0a4 + "379": 09c46ac7b5e41cde30258520877ef888aa8b13104e44abb106a9bfe068e565f7c97503e13d1baad2a78f873bf122d87446bcc3da0602d5dbd6f58fd7567a2cbd # 1337a65984b78d2b29b178323ef0cfa663fb3277 + "380": fe55b51565f5023d5a6ebc03dc4c42cd63252393d7078754d8d1bf6ce00faf5bac0fab8a48e93664c5395e7cd5b5b1a5a159e256d4d3e10cd122d9d11d23b123 # 133761e412aa7e764f2690512f90e52adefe5f5f + "381": 53d8bdb2503b860bb340abe73f4d4505714641b3682c815892718d4ef3499e48039308ab293a605f411dfac2988bdd742cf9179684fed6df63353e27441367d2 # 1337399d1613c66f31c8c993e52b0f89a0f9166b + "382": d88c150e7acb66e82d2803ecd1e8082872dc28422c65887b781b2c6b78c46de1f61bd314ed7bfbb20b135a6e79bec95b765c72ee22d5305ba75d6d102bf92bfe # 13374b3f28dcfd711131c70851e8c9f8b8462063 + "383": 4b385cb35bace4b88e932eae3415f4f873fc5fc44bd6d76c113fb94a8804b529acc4d6c0e2a8494ddfce77ab6d6bcf8b020c038687d8c1cba006ce64ab05162a # 133758f6c559d83d46c81bf980ec5d5380ce0246 + "384": c814d187b4ea2ccce45bb2e62e8899beb400fad8ae1dd63a12b51cafba7753b14a55892113c334c2778c06dd955f53cbea9c7d28ec02da78f37109d697559183 # 13373d8dd1302123268715bdeaddfdac4b01c97b + "385": 35eb20a5cf967e40e9effdafee01bf1dee64bfe579d51333c7e8994c695c9251c56f30d645e8e7168e001317868dc6d2141e4f3e777cf0c40dbe0921a7d2eb37 # 13376009e8ec881b2e22d85c4cdae57513d651a9 + "386": beac107f077584dccfa02069db7467fb5f9963b7aaa05933ae7aec9ade3ecc187de056519a9bb6669ccabb232f6de39d997b690d293fe9e4564204e34f8d44dd # 133760d5bc17047449e61bea1848950bc5537385 + "387": a085bcc7c085eca06d97e21ff4103dbb200bb56fce578232e91e2cea215677dc21a16b8d8f6a4d0558650fb870761e33208380534c494a2a3949976aca185590 # 13375aa14dfaa2668de393bed71f8ede04931ca8 + "388": 5887879d014653f08e84fe634abb9a1fa0a29adcc34daacdad396c64790e96511f5be71e82144677246edf3fad60fdae7d8cd4a8b0de5bbf538c407b2f75d2e6 # 13377f6d02607645d14aa0b0e1af0e7f8746682e + "389": 6cf06f74d1710b5e9262330c90071c97a90fdc5d5e343683b8dda82bcfffcd417983ccc2e86992a7d4f8d546625939ac4ee673cbe5c47ff72abb2df83af37a19 # 1337037e88ac6f94e29c76b1c8e8a2a8e7044884 + "390": 44cfafccfb65f82f41c37dbe867ac7ce56880406cbb8a1626ab3dd57f5e6b3c17e123f9ffd53452efe5cee11c39a033adc35236b0b378ef4d23df40bb74d2eed # 1337a0e70e95cf26bf411ab4810bab8d49726345 + "391": c1abafd002a99e85f90aec07566e934b51e423657bcc7de72bf614aadd325113b53f032e2ce67e79f3b994fa08101ddb7c5ef293f55fa85bec08e83aeaef598b # 1337dd6faa7de82d3779a234999b0e31f8fc4548 + "392": 222e92df3a005e813cc922441fa8a0351bbde9ac67fb1016f5b54312761cb77561e52b91201a1fabe6b4533cd57091c12d64ffc457114d5b2c8cc1cba7dfbf7a # 13373fccb9d2cee15a3589993f931b05d16e05e9 + "393": b0c8925731adba3dac849e6a7470142acc37b371a7e1947750f195f12f1f41ccc0048f82e7c62ddf3a668be7a0ed0e6b33cac5e5f4a30dc1908a5281a9a5817e # 13372c650cf969db80828fbd6bcb00ab75b62870 + "394": 1586e9c374770a96e36a1d48d295d2d7d7ad62c2eacc74ed19b76fa761dc9acc7f833bb3dd70010580629f9dcac533dc4220c880848e34aaca0c4bc6a882420f # 13374e03ee171acfd40066505194a88f0bf47aa2 + "395": 507fcdcd865caa995408bac3e2d58e5338385df4d14b4ab750e992e2fcaed26ac17f9785fcd8dc478d316893c3bc711ea1e5d77463544260b5f35b96c02bf25c # 1337c748d577f76a7ce5bdea58078c40b44a793d + "396": 4d8c0b0e50bfe3ba479ae8b543c1bc52dd7c3c8884c90713c2ddc356e9a2d4f17db93680fcd07a506ab66a58b5ea8ab0b2e058c87cc937b5a1d4a6749b9104ef # 13373db0cc77f4ae46f1f3ede6d8f977df844771 + "397": 19219dab6d76d09e6a4ce2259cbcce577b2ff5f0e6226a943237c54fc9e5b02d57cd81cd5290cedf807d2f1bdc450adba57e2e10435ed7b804b9c8adc60415bc # 1337b9994fca8e5fc192d8376f5e105f8bd4afae + "398": 24aeb40832749d44698d86fdfebccf31c8be271b63f4a8cb0ddde3d1a22c54de4443f95373f7084fa674990124bb221b05c6d022d15ead15c43a9c1f181e72f2 # 13372f71e3926b7557efa62314fa242855adc83b + "399": 4d73b455daca39e3de5a44960a2964ea2315a6a5d0b17ceb4643ec21dab98454db42d51938f5df8706e78ed3154ff75275441d229992f5cd56063b4b76ef139c # 13379ed92dfe1bd73fd878780d0b4667b7b16359 + "400": 25df017ee4de88178d2d03879d645f86bacb378fcc360e045448419f38ca050edca3ffd0b9836d593fc3f7e2d749d32910c983b8b5ee41b752604f32a901a357 # 13379b9714c3e873944051d21395de0ab0e4ae0c + "401": cb6ac59484a8ab944d12cbfc305e212e096d89224c4a5d84203e6fcf38b0d6f1c28637af0b65bc0483e4e9c3fb5cf509319aee8da585af2be661f2e860427c2f # 1337cb2cc1daa4375eae7e7b14412215eadb79a0 + "402": f59dbd61317fea40ac0153aff0379382b8057e2a79296484568533cdc561835ce2f3e4f9020c637fdf9f8db7aca35ffd653767c783fab91a4d02ca8294ee2b2d # 1337f61cd89bd56733f366e2060efc7f73ca94ab + "403": 1112c20249b943028fdf462c55941bc88c89d565d82e38b0ad088d84727a2670c3d98c70d006b1fb9291e896816cfea32424aea851c4c6fdcd9e64fe13b82525 # 1337464876440fc65272b11734192f38a93d0e51 + "404": aab0db66bb32e5053b65c1dda60d131744061b453dd8373c03a26e98cf81440644edad23b4ad8e9976fd664fbcbb77ae597c2fe507418d17562939a1cc5b588e # 13374167ef4aee156f8fce70973b96b413d564f6 + "405": 724a9f6786e2768a673c1e57f50834128d95989e2b00cf0796722dcba8ee6928e296a9c5bdd4563b261d7aa22f7c3075c00785b118882fe729e82dfa2b1c72bc # 1337c2ed6d04de184c3ffa2766f30606c598aaf5 + "406": 540eb138045c923bbcbab9bba0527df5e36dc29b580290d0d11c3f909aa270bb9aaeb908a6f74c9e4a34c845924d396c93fd944d71bdc0748251ed771884817e # 13372a68038f3202bb88b5272bdbf50dba0aeb84 + "407": ecc55996d6e8f6ea3c66a16dc9e8eb796f55452b40cf891b9601df936dc8b3ab79f484b9a422ad8296d87da1de51fcf5739375e9538f0931ea4cf155e5ee7a6a # 1337da522151d1a60b32df0313dc60d72f7b5ed0 + "408": 681b1afe11ba1694dffafcefc0eb772ce2cecbe3dd09c814649fdaa4036d32fec67815e51c5aba8d9533413e0accad8d71e5b18d72e962fd2fb286379cc15ab2 # 13374848877c23353d15d589bdbede710068fbf1 + "409": 73b633a6ea0adaca753a62c58fe5cc74da3495e9e471ff8733f115e13c40d4f281987cf4d704b28b2c6788960dfb934f903c45f4669fd36f5699ab702955eb89 # 13370e1d5bacc650222f30da57bcc9bce2fefc58 + "410": 1e2d17c5735eadce6ad452488dfd291dc8baae66a492a9647ed19b3112e1ee9f47318c5b169349cd43145e057bd67b8423a9e7e0b11b6e687fce0b025a86b741 # 13374c7eb8373d3887f4d7f7454a9c8cc8ff7538 + "411": 3f09623906c9339b57c4ffffee346f5d37402414b6b2cb9922c38a310c8c1ccb9b68bd8f5288fa5fe95e0cdb1746b12ef7ed34ab8dda6ea758924a22b7e56a63 # 13370b6eec44743f0c1bebde72d9eb2c91e91ee3 + "412": 4181e36d7d3df110ff2dca6f76f93b006b192f70480090fd421d74cf840470ee311f2d48a126550144ee37f285249fcff67397784af091ff5c68d500a4c63f6d # 1337725a8099f29944ab60c8e14d6d2327a7917b + "413": bcd29fad249e05b755a32dea56b797f09ee3b4687bf773ea7fb36b5763a43be8e3acc0a1db0a42e50bb39e49b5c58a4d4d26dc5f2f73f7086b6e4cd1bec9c9a8 # 133771b3be5940f5a352ffdfd7a82d07bc3ecbf4 + "414": 2eac4a427a51e141bf5a6c87f4d8a70e677157f22c1885db4678f987809df1cf86dc46d2b088c661677b1ab0d634a3318f62da7e40e6c382109d070e386ac143 # 13378b7a71e9bed12f7c861abaae1af0a5ea834b + "415": 6fa9ede97a889a086073e67de2f34d13b5771e72702bc0af2c631e31e546e39321ad8484bff1be97b1c0813c5dc1740e107e79c2ad7f29b3bc8e37547b60a4e4 # 13373c4f656c0a5ed8e2be34eee82270d1729372 + "416": 5ee3b8ee6ba56312bc8bc95391bd408721edf38f145225d3fe20949bb0bbb68f21501fc5ac310a184303b3ce1bf5a69133988a923e8f96267e13ffc8ac7b5515 # 1337f6617c1c48e636f232b42066c6e7189f0ed3 + "417": 6db2c45430e80933b4c65e033595ed6a303abac5ac597291ef2cf9b096886509457ed89e53650b6937e3524781a32402d97b886b2d2cc6eea38f0451925c181c # 133751001171b85e26aa8782b4e09be2bd6a1472 + "418": 243e576dfbfa59bb61589fabc5369e9dbc668716b0663dcbc4c701bf98978c4218edbd77be4491ea623d746283dc0b513a153c95b39612f3bf02c92b5b276d70 # 13373a6774c5e60846a34e82f6a438d2bd5e26c1 + "419": 0bfb558bda0341beba7308112be76278c7777ded45f3807e7eedcf07ec4749ffae2635100b0a05a01f97390b934e4a7678363b7abbfde38db5e35acc984083bb # 1337eb905ef709983e718622eb0d7ba28064200e + "420": 3c2c7b3c9b48912d966781d31f578207b79d5e0011235e143c7e693f58e41d456259256fcfa6ad7f9c925f4e60e1c095a693c6c62c673759fe7952275b305557 # 1337d3666c97bc8973502a97163b2250530cf116 + "421": 3159c5d886bbb928097e63f107398ae171b8fda598f78773b1b8277fac7bb4e58f1c63e5c64933ced888b28cf79c7d1d91b6aaddd4a8116ada3da17d98ddbe66 # 133704173cc9a4d9e14255007f7f0bdd33000284 + "422": c1b24ea1520bf5dc1f7db1363c28a32eb9a6e7ee9b80c62dad8ddcb8969349fbbb92b1c21bc34ca2c6c7c40229f294b897617689e3bf0b1a9b9f62eeb4d3bf08 # 1337469aedd6887ece4903c9f6b5c7df0b736956 + "423": b4076abd572831f65ca4a9e4f0367418717327beaba62cc9d39ff686ff8619c07704f72974427148a8d311fb6c6a6a999efd00cbf6ac258e3b14b4000f9e54be # 13375224a9c656934ad95bd6609b5db04db36c60 + "424": 92d09b53f1b4c6f1f4b98d7893adc69ac0e3ac865475d23701af5a287fbffec935c8cfb541826fe91d9966baec07cd33260042af1d2028c7f430b2312652fd0b # 1337ba626d2ba1acc14bb886217b69a7b504e2d3 + "425": 5a1d6b779ae760d904b9a53184f24d1f9212106ef8f93de412bb6230b6529d435f6f0dcfe33bc1edb51a29c0f3c2cab78a12ba98cd94d7686960380494dd22e8 # 1337b7de0f76081958ebbf4da72e63ba9396eac6 + "426": 735272e2f6b15216ca5211009c65a4cff876d5b9edb8d05321e4d711cf252f075f863b5652cf76f46f570043e034fbc49e26999f150d144521a2c3df39d09e24 # 13375fbbad351a414864936d9fd4220d8dd4e51f + "427": 8ea739f945f501b3347d37908520b8b1273c0b5c9cbac9e96027e76dac156bbac953861b1f4d4955f0a4369ef4343be7af62245f44821972c1fe48d665888129 # 13379d8794c5b4ceb5d33aed2928860cd26a68e1 + "428": e3d785175e96dc68ba09314f963d6827e2f43d4f5f3eadd9dbaf2c1c727e9456b1c2ab3e59542c0c1561176204245a571435575fdf16b0fea5c8ec3ea238b88d # 133779ecbec9d51ad3805fe0130ada4fe2cd627e + "429": 5cf96e63fc858302a9d092d14d5821f1cdd28d5ed0ab0be20e39a66aa8900b43241fd559b7515b73d3a9e1674aee22501e3df53b58cbde82e7f0a9063df73330 # 1337d52ee64cc7e23837aadd14803dee2d13eca8 + "430": b7484dfad16a9fa0ac86575f03e9bee249c54c2b124a78fd5fd9f0037292b0a3482498b49f19e93e711b0b19f84a63e5681af70df62f8adfa15f4dfeb06dbf62 # 1337e59f652d2682c06e9e6be30d944e2cc313e8 + "431": 77035d7e679e1281ab1d8a807267603909f01da074ac93e8c3987d3662c97a1a4a5b1b895442bcd46a1a502a9e11c95b561a737115d4594cd14f5d9be4a83ec9 # 1337ab82a8c2169256579c128c5887187b4323bd + "432": 1cc688cec94eec966c4bd08b41554a637c67f34281f8ab924bf65ff7fee4576d673bb7b1ce6508cfb8fe67090efb3368ed66c45fd75536a21287a8d1b32086f4 # 13379574639cf3abadcefb40597f29851a74e3ae + "433": f0aafed676488cad0bd30f9b40dcd9a4026c3e4bc9583d296c479bdf3167c72a6ce990b8e99634b760c943d5a0cc1fc7395a21f1ae39fe069ef5e37e533cb6e3 # 13376a87fd8e93683789b941150e2571a0baeb0e + "434": a52f37d4e2f73091dba467fd499d5629a3974c774f3d80e903858587f81ce04832a526bdf1fdd7f7a48c10866d1b48342d1e7d47648cdbb67286d34b36c70a77 # 13377283a1d27f4b4dafaaf25f7981a8075f2ca9 + "435": f33242e37ac1f6c00de8aa357189d239171d843be5cb4930b703f0202813106860b21595091eafd2e34e300a54c9d9958e2b0a1eca33a21d943da8c99735e535 # 133788ee7e963df953d49befe78eb0c532f82fdc + "436": aa9c9b158e6785676f2cbc31240a3e194ca84daca715c0bda59b1fee9e5728a4d6fab4c4b77592fcfd65cd46a05e3d86a369e8e7a40f919986ab59f7257db5ad # 13379ac12adecfa1000a8e753fcb575823d778c1 + "437": 936ce1af48e9030cd7346691d4ef818d85da591ed4063508562a4a62d4429a2c2f2687ca7e154be1b036bb95b540a4dc27677fa93ce43d8668dd45a18d9884b3 # 13375cde2d7cdf6fe7ff754440d8b27fea59bb98 + "438": ef4c520ab72c99834221c27fa6d62468de6c8972da936517a3881b7640ba78d3aa87daec92c8c00498bda5dea673de320acb601267d8879cbe1bb0775f847670 # 1337af5a6c495c4a5499391d7c6bb551c83283d8 + "439": 609858171bd3b1a07fc5b3aeaa285b58caff121a2254d6b4dd5ad48ad4a19ff0d3f8a8126cfb845ca859d00788e15ca603790ec794c5f47177a653709a802496 # 13377c6be83daedd72030f81f4c9dcf979bc6992 + "440": a00e36f0fc955ab3f95347d88d3cbf26f2be7f021820d5f9ee6a57b8208f50dd1d896a754b0876f8c812f30146f0a12dd8b76c931188a8c1e85cf5ee10323865 # 1337dd3518b4390ddac39ff25b6174a10292d9aa + "441": bb167021040dcedbb38ddd66a7f7b1993e313739adc2084778afa7e7880b4f6158947da3ba45de28a90bb707aca158a79b6e2eb3e3c194ea4a5ed6b8e04dd638 # 1337f89167aa94584a8cd4aed7eb92be03531117 + "442": 9d79c10c706c0c4e17012e9bad95b216cba2f9cf8e38541d926c14411d3f1619929f0f84dd08e536d6e950dfa539381b5c1b24cedada55b516711490017f4e62 # 1337e85a745d021e473d7cf9cdfbea7cd54924e9 + "443": 4a642c6d350d36f549feaae411f4992a45fb88e176eade0f1213fbb9545f6a36004650199d1cd48bc33804646c45c340dbf51aae803c6ee462cc97f59ffbb221 # 1337d839c8518128f8a30fc98e29aac2980deb9b + "444": c5dd19d25e6e7c56bdfb88356838294b9582040b35827ffd77a50ea3b9597e1b7256cca45e39d8c2e4ef3a6e605cfd85dfd6b402b0199e3ad91b7ea4fd4cf07b # 1337ab6a0c8208ab7fc4137d8d254bb3a7d3eaa8 + "445": 088569238e4ee48c35213ee71896433d9639c14b4ac51c74081653d3372e824e62a27b896c9e7a760df12d8bfc8b0231572cdf237af249e1c3d8b1f5a8d4e1d3 # 13379595e7e36315eadce72b584aa4649d53ad46 + "446": b80379774ecaba7d5786e2e36cd5a472c98a744c1919327b85955f58937ad80180b352fb3c55ec632622a68af529f78e11a2c084fe556a33fae89677f58f12d1 # 1337f473ff919bbc1e5d923a4f7922de464487fe + "447": a7280d68d54c3e6075b316c68f1075f7390b9b23e8b1ef6c58461660c702ee25531a6211e45bdf43d36e41a01c286b0ff6aa2f2c071beb465922755bfa04e483 # 1337de5ea8bccef41df53fd05bbdf71ce2e68628 + "448": a989c9e35e57f2c6e43c016d947dd7d065f6a47469a8c3bdb4a3211544ffaf3b99f00070c51ee54b906521ee9ac579d6d61ca360defbb2664490726badb21a53 # 1337d1620e88b578a9fe7ededaa546ca664104e5 + "449": 41046efcd264a1983932d2e0c570608473a5220731500b94f169e6c18d92f22d4d551a35ddafc0f3941f53c87f2256bc1adef579c1911ff8bc8ced3c580694cb # 1337f35bd93f3e533ec366d1f0d87220c9d3f484 + "450": 9977661daaf504e4e2cf56786e3dbb66828e907f149a74c2b920fc0840fc22edb9af477e039d92927478d756c4addc52c4e123a3b877e7c57f6c6a4b2d1a7057 # 13371e93039d125677c58f1ea65331fa36b4359f + "451": 61a90307e5f12a441a80d11a5d131f10acf6b96729e65b1450c89d840a59512eaca3c024c5345e85d0b24dec4762867f806588d9596ccc9bdfd349d6ee0cab26 # 13371e9abcd3515c9f5162f8fc164b8eec01362d + "452": 0bb971f83a9752199659f117fd2212dbcae755f1a918e457b5824e35b024ec48198d75766afded1729725ad146e84321991b0fb5618b02f166105cebc7630491 # 1337386df17e18301ba66397304eb265b400c472 + "453": 2e5c9d7da9e16bf0544d5568364db385f788a85a221c7280870d86bfdd21b4ea5fa4f1561c63b8a272fa126eb7d56cb34b84680efbc6cefafac9a04560a2e5f9 # 1337cb9f8f9b2fdf8105d67dd0b9c028d7328dce + "454": e36d48f549d5b376438a7c70816a572c39caca2b7f35449ebce22db645834a230f9610381ff46f9c77a61112af1f8a549adaa35d82dacdb42322fb585d209a00 # 13372c2900df86dca9a739d42afc5a610218e0bc + "455": e739243b28662746c8c93bd386efdd96c3a5ce3abfe9cb2a24328f241f95fc7255fc2b5db9b3a16481e96caa7c8d6a6adf2c9c48d92ed782da110e7dd9c4d9da # 1337708adb27274303e88f2343227dad6a342cca + "456": 1e27689226f165922e604d40d694f36117258a76e4dbbb87d4351902058154b380adebe77c75913319a53afe1bc2cba8b26de6c156cbad1ef4a26d8f4a175eb4 # 1337d13223be43780373520e2c4f11a3a28122a9 + "457": 9f68fb33a44ce68294ba1690f56853e4898fd49d65e37c5754541a29a00da1582d7ba53a3e159d1a74f7aff2054230ebaf3928c1a9a07b77c2187d9de5ff0a75 # 13375e1bd277edc3d7db6d0a1049b64b7b2f2d11 + "458": 670bd3a61a398b61d86c9a3b4075e64db0b9414d32752eedb503170dcecaf146ebff488428cfbf3e2df59b31681e0457ab9dbe42209c6fa90d272df55310d7a0 # 13377d8d92f19324afa046a0711f515573655c9a + "459": 1ff9901bc5707d574e16a91a8f5c20e362b2ba9ddc546860a2b9ee26d358379aa4de41ce48bee80cc168b0fb026cd226872a7607ad68fb2e17c609e9f001456e # 133764e6c6501b12cecd3b7a1a15509b70517d16 + "460": db00ede9f718cd9fe2f6c960921f2c8b44e2f4fe4ef16853d03f3ad9f62a8a4805255e8de2086bb4d29037485302358d153860131998ab1968005a97856c6852 # 13373cb6163c1bcc2f421ef1f05651ea066f870a + "461": 541de4cb8d54529c9e47a558af8314ffc80deedfd3ca79450619d8617089490d4428116d0ea8c26cecb26073390829e3c688a21cd6882e4915b5c6c1f96f04ad # 133736d56ef572a53d04aadcf799886a2d93d77f + "462": f48380fe9682b309150ac7e06efa1f9993399a4d14928acb653892897202e4c4b532326e70ca89cc70ab2d68f0b2651d31b0c3f4a666775dc2f4dc5bb7940467 # 13376b7e8b5cbce4d935e35a19b7fb1cba95387d + "463": 7e6e18c53069af550e8f4adbefea406a373276cc5425ec35cd1e2eebc4c506e5b304b2891bc23784939e0a9a3e2625f2abe56b7f794c9beb83af68bfd9d15330 # 13375e5192a3fd224ed26cb0c30348f3852bc717 + "464": 867bbfc6a85bfb4c2199d03c3630a800567d9971d5550ad5da223339952e9e7714b9db9c709835df1044272964f8423698d34a9bf6ed3a769658ca94719d2235 # 1337c24ae306a02568eb080b7455c1167e6110df + "465": 067702eace2d72181673876c48f9abc490de9f4359845350431102775217012eb398998d5aff672c40327cf33572f7541ec35d645b3cafe1ac0017fdb6603759 # 1337bd3f47042e17637a9963377a06694aa2fa84 + "466": 5c6d835c053c46087d218301bee6dcc0ddf7ef8a07fddf971464f085b366828e038b38c9d0e32e4a5cefd96525f15d241ac6d3ebe182ca76e0e59a89fa8e17d8 # 133701267220019142f8ef2348f72d893b5c4864 + "467": dfb71126005b677e165b8b33d7c8d6d36d2f04e137d770ddec70cdfadb1db6262b02267db78b51adc8ac6182032771e573cda498df52764ce55eec4335ca73e7 # 1337c96c995d39735c858ee1e16ea26c4e8ca431 + "468": 0ab8e5fb0e5c2283eee4325571fc3665a2025093b7737a9d943e1dccdb46e8aa7b16f07d3f0c932e50b424bd882b8dfdb19fc07d3ab65221c14400b11aa5474c # 1337ea4a45b8ffd7fa1f1d6b817774206e368730 + "469": d4e403561df9c3cc62c1196b44e8483b858bfae8dd4ad066cd58f4bbbb510f30f13858d97adc6f7a364c418257bd472e05da6cc24f69ef702fb70b657dd06f20 # 133786dac7ce45faf4820e0ce6141cdf2e588ef9 + "470": 00a05b98352f8cbf18ca170b8784489615bfb0c253054a359bc37382abbf1d2c6405b6bcd26eb38540c15822f3503151daa14db7d41804ae81e11fa848ee7933 # 133736d718ebed4583c972e3522e4b1a93b4d11d + "471": 9c2c4ccfb026275e15c1d9b85d67aaedb6191d40cb89d0abb3fa03ad3d09b11ab2c928cd61eca9f72070be5c36df7132afe2a0fe1e7b4273f0855f64b02936a0 # 1337bac7caa298d639cbbf961132e6be2b2fd290 + "472": 86804666e67a5b69cb92179f2270c9a8bae9f903bf85057f8e366db4834e8bb0baa26dc6f6db82781a6fe0009399a6fc3234b6531b51edacfc071bd66151eaa5 # 1337f520b7a8142435ce3190231c117f8f91d9d7 + "473": 0170d87af2381d564035172c05710dede93d858dbcd0da6866d5aa036331d18afa1f39206ff11a0a6edae393a81c3a59aefa1ef7ae8e6f6cef654bce4b2d72a7 # 133706f0ceee095bf520f1fe0c5f90ca9b95bba7 + "474": a55289240c31cf2f626a91ef0b9337cbe2b6bdacc2a9465b43f18463457cbdeb9706a8a6d51727c329767124638cb7b3698a3f94c878ae95e673695378e45892 # 13378daa63453f9babcb127d645d01130d0a84e1 + "475": f240e3c2ef0e8b280b6c5bc90adf010ae82c89cb82a83bacc7493bc4a9bbe3e01934afec0f6eba2253ea2ea86ca6742c56f205379810783cb2e3cac2b70fda37 # 13371767d995117e45daf85a25ade02e2f3beb71 + "476": e285ce0686af300d36e19b9995198025bd2df37a93578e9d610d56f399f330100436b18b1165e5e2a13c4c2a226ac0601332db83781030db884a4a8567f2fa8f # 13371cf2a853649f1198523ca2d065815a2a9d32 + "477": 8046cb9df23bcd2c8b4d6b02e461b384f6954a39f76fd79039a79a470eb4789ee44f6ee18cd62fabfb08187bf3e3e55d1c939d2742d3de04d996cd03ae9b8d5b # 1337cf66d98e630fc1bd0922d80482f4a0f6f487 + "478": 2dcfe1181994740e9dce992f149f4433238a6b615539807f7aa531b27773b1e0038d1972dec6866274112aa41d827f472e719892a5da3fe1c7fa5059691b5db2 # 1337e0f6a4772b72379069d80757823dc7edcd90 + "479": 9128b93ea38134e971d500ad5a59313006063a0d30ab5a2bce1cc18fe836488636336623cba1b3e809b25f88f1cadfd871189e20505dd86d4ada6bddea481270 # 1337b5d49cb028719bcea19d00aed2c89cae04ae + "480": 7eb9c8fe307d2b8b45069c5f04c4be5eb158a7acf6bce1d217be4d6534e76930f7e82e90ebd192150f915fea257ab07ae89f6861ef2384ddae32784da2d2cfb6 # 1337432c121c2b94a1756fd000326dbbffc8c239 + "481": ea549a60a0ffd8a354de6ee852053377d69d48d10507e51371d0fc155f19c2ad0f5b1d03e028bb8cb7b7e858a0877456ccc2ea4b7a991c841055df60d02d2dde # 1337f23f6caae95d483617c2bb2e7ce1287026f0 + "482": 966e9c0d72094dc235e91f76022c31970cbac99b96a3703cb5edae4341aaf8f74ce979794033fefdfcf0e42ec005829425219a26716448b16128a997abd6e52e # 13377842a55ed8698f77bd167e6b0e6a71073a97 + "483": a23550b03d42f521f2a029e2010cd6dd92bdb5bba3cb2c68a90fdc4c5055ba49b4775c339467eb9d48a98b36cad68ad61120df393ca69ee345b794c066694405 # 1337c56cbff7b7a4f1622a8335a186bb7364443c + "484": 2145a62a2a1a17332f2ca5425a39208c5ac38df421cb30212020549575060498a22d9d7caea4e8904ca444d04af7856750a5dcc6ce57a7a805b070bf65ceb12e # 13378784eff09b534804fd2d36c75607b4a40072 + "485": 1e55393f42bde1408cdb7ad679c4c1b857a040638dfd17fbd8bc93077ce45351fc289cfae2fc4768ae66435932955b4ce1c2a253ef28122b2227956d65f86716 # 13373bbda63cd46d9350e3807dca4d2aa6c0d7c3 + "486": 52e0ba8cb699b680f14cf0bdb6e17e1b59883206aeb9e232c1f57a7bf0146e3c4438a2fac0f47ebb20bcbf49d9023e035d45ddb02b2da503deb2176960aaede3 # 1337ca0d51254582a06380096f3adb0ba702df4a + "487": c731e43dcb5d2e8ee0fe91fc4ce860fd7fc657d304e752c9bf4c7270c1944eee2f556b966e75789bf1fb649ad6a6903f48155043bc63b1b3022ed973826742fe # 1337ecb86bb27da00c89107fc41aa08b1134ddc8 + "488": 7ff83c0dc5b07e4eb07bb404392437d0323132f31f10d8ffd6df9386a3320fab23161628b16124ff642ecf9a2594d370aa434e77752169e64b2214ef622ddf96 # 1337796ab276a410a771776368176a25b0463188 + "489": 7d1cc97c4c900a253fa8b4390284cc1b516581e2daff3e30711c12bb32dabc688e481b6753c74d9ff13a9656568a5508c06cf82d7e5d321ca4f4ae649760bf36 # 1337baace9571fc74de23371b61b0e3fe5c777eb + "490": 10d875f87799a8beae519007aedcf7adb11e60923f26766fd0d50671c83c427ba2ec78d3767d2fbf4c3d9f74e0b6bd69d47e92848ffc0cb7c115ff31b5536041 # 13371ddf0c080be111dbc2fddf7dfc1d78fa6c13 + "491": 6b4e6a3ae8c1d6d6ced2c159353e258b6758b49f932290041b5ac13199d76448d95ee28b83cc8b7d0571ac305e305428e5300397dbefd3a5a32a2bf4883bda85 # 13376bc0cf2295945bb3b7a7786abf91ee57b6e6 + "492": 965323e7686fd940ae718c4b9fc0bdfa8a3fb2ddec9f07820f0afb744b59aca9917cf15e0c0b5975712236c785394d67d9d71fbd14ea372394a7cfbba5c7eafb # 1337a87213f25889d26d0d20c7e59b5d03f76339 + "493": 83602874eb88146e3aadab06be0c52d3b58c7b5a24e586a38060c851257dca1f2c0d70272ddf40cc635c59410096363604026746ea7e8f4c912ef8c6980f2a8b # 1337f8c99b333c721b1c91081fbcc904417ef1d6 + "494": 39c6eaf2dac10dda662d876e8378085be14e562d83a6e8cb09ac1cb53e67a00187d149443624eceda95c4a31e8a118faa114911b0d553a3a454ee7ef63e0b78f # 133729dbbf2bae4cc14f44accab81f8b2ddf808d + "495": b959184d2c43fd6eca20fac245d816d36df48cfac78cc2dcdbdf380492f1a815dd83a0105ce3410e49384f71edc3b72b6968b94c2b251b75351b117d66a95331 # 1337fdf4111206ec10a068e4551739a0786ce917 + "496": 2598214ae01e3a12ae8fd92863e308ccee0820121f7b767e3d47ab2c0563210b62006792d382311714e129081ad857588899b162955eeb2d2d62237c08d3aada # 1337114fb1cf3e49c7e93ee30790ab638923cc4d + "497": 60dbf8d47e428448c44c3e687260a8bb4833dc100e96950c9d5c369e8179b4a2e08e24c848bbb6ef5d92d6babcae7d764e12f4d4dfa5c17604e6a46075533807 # 1337be12bb8c093f1af0162b0c113abae6232f5b + "498": 832920203cd20f40955c18329dd007634a70cd2d7751bc644d2f453123a11d46d56fbff464b08cba15f52307da30160af5ee7ed70442af8f9f6d4fb219304faa # 1337122c4369d6a4a7422149570f997413f2d84d + "499": 534b3d70906dd9e514764a23dabb37ec96a47c020871a87f5f207a7f7b25bce1ddcd882cc334f774c689ea2a15b9be78fa541dddc1c35ac2df5df604a4ac7d38 # 133776b9444cb6cac52a4aac19011681c9e721b9 + "500": c952dd89b7929749646efd31d8d20c5e23f60aee2fb3678860e4784c90dcdf393a9ce8976716e5c6db3d452340c4e43199499d78e520d4152f68afd0c6354b7e # 1337f561a7e702f924151090f233083d959cbfdb + "501": 6fb0d8a67d22d21479d0c89086263727f1d94b08d1b3be8b9e955906d0f0a0f7eea2dc8eaaf310bd16911fc547bae1c45e2ccbb798e2c91a872fda44374545cf # 13375222cbdf8a1a469f38dcd71beff85da81db5 + "502": 42ce1a38e7b74ecf48a3e57b7ed72043d1df961e34b1ddac2f8780f918997ee6b8ab69ba63de1ac956caaaedb3aa0c12d82c8f2388ca223f3ee1e4f6ed6982e4 # 1337fcf9c96abf28bbbc9512aaa94926b79b3842 + "503": ce75370f884a9c4d9be7b2596f4638e70f1188d4724725356b93bbc63598392b8d81468db28bc117daeecacbbf070d754c0f02ccced0ac0e9bc8b9f9dc4d6a80 # 1337739e01e6b4a900d31319e52037d36373ea15 + "504": c0e9d24b334b98b7318b24475602eebc70c602774aed08614475252fb5d3e3b9437658bbd8fc7b7935122b72bbc4f96237ec662c24b2f8a613000e6de600d915 # 1337376723a12608da526b2cb38e762d6b1ee466 + "505": 144a9754547dff4e55c6f68758586c157add5b6e1c118fe3e24d381454a229531eedfe4e040d059b57f3e445b30496402a2b4164dace97f4b2d3e5dea9dda0d2 # 13372d692f51eb79488e7a9034db437fda818019 + "506": f34b4aeefc1c5b72ac558e6a5a1d84dd189b63b13320104f3e8c9ea0db23337e3db8e450a897884045206a69286388847dd354c8064893b856a4d1060099d89e # 13379b869c841bff5bc7c67e40114c1dc827cee8 + "507": 509e3d7ec0a3b95a87ca610d9f784efff5537c0222e682a8b5f7d8132f882f30ca1f09f0b7105e0e114e7c473483d9a4664f46732e34df2254fe5d2e0aca8bf3 # 13371e6af3a06a3507a43b515b7ea990fcb58a33 + "508": 855ead351800961baed85928176caeed176589859fb43c39559be1f977311c973098c4897081c29ceea7626fb5210dcbfa84eafaded9b74686cea18db10eefe4 # 1337c9afd3750195a3adbfcb34046a97a3583c37 + "509": 80dec109cb94a5f07447b5da0fb8e010a39531db77ccce8f6a6c8828ff554c4ed0c7058e1128713d76d34d0a9e854e9998c0842c5b07e64f145a0fe293a5c1b3 # 13377c1c4e94979541203b20bcf896372e04149c + "510": c3908a0c70c61c26426e1db6fc3b7197e54b8e3e49abd6348067471f448bd1b57527e3ecf6ae2ef256c41ee2e96ebf82b45c8085baaf806388052cd186f2e037 # 1337671a52097e7ccc0d7fa6366d7f5400cb3f84 + "511": 00fdc2b1160b6c969085e0ce8c7103c40fa042846569d7594cbb7d65eab0b1e149b6e47c4730d512819dfab5356ef892dbf09944732aa06b7e18c3f48cedf451 # 133799e511da81a0c95cdac8dac86af9511d422d + "512": 3f23035292d8b28adbdfe8f7d3dc0f0bafed87e3eb68061acd6df8d5686e9e9970b37e411cf91e5c8ff64bd1ba5a2e8e1a5acf5db05ee029d69f42cce2113ac0 # 1337cd1697a6c0b7a409803b5607e711cff05b01 + "513": b8016fc879aa0f58fc89148249cadf4df6f04743f1ca7e77932e512f989e64a574f27a835dfb3067e13ddaf5ed8560762c3ea0299cdf1af71d53eea3ac8f16cb # 1337aa0cd0111c61b78e6e3056ebc44932813447 + "514": 985560d5079d0761d5e17ce04007e82071c3d5c6f37cf1ee740194a039288a45754b522b9f935a3ed5e5cc5112921033f1ad67f77026782a4475c57ae63625bb # 1337e28c5e008902eb035afa304f60cf5960805b + "515": fa8d0aa75fcd65977a156370d0cd90e4f263f0b8d2062b87dc91fb04a5df0a63201a695284a41e577cc2bf92a1295a9da6e8d6c3a1d4c504a918cb16a0de3b80 # 1337c937c5ee0a367d6ce74280b875228f8d6a08 + "516": a8d6a33b480d843472fde71eb2f617c6bcb69ba92f43f7ef9fef60e8e1dc92989ae5b50b58e987997b18e586f1f309fbb4a37010bfc2145711b48a2a4a009e38 # 1337558d6377ac7eec40e44b5228989177167727 + "517": b1a84cdb03325eb710a49486fef587329d6c91db4e45003a25e2577567581c93fac0b57bdb9cbbb1807ebd5737740490b61bedaaec8e855e1712f3c1808aea73 # 1337e6d4c09b613b51be09cb4ac602055aa331d7 + "518": 67aeda3fc311c617e7182d8f3d118af9b52b29112e610f49bb0320259bd7358a7517e78e2e86d14800fed86e219c408a99d62a474ee2934231920c5905ddb198 # 1337ad0703910290974ccace168c24111e596397 + "519": 7428ac3d3422622ed008a772791acfb693693682c313e9c479b0350089e15488ce847e34724223ed00897c51178a9c24e6f4211777191868c668ab2766ed2e3b # 1337a873e3199bc66b9bae7fff240ff5860f7afa + "520": 9fe8afd1b08f26c8edcc8b2797db9f6f635a3f0dfd4ddf48c441356a12adaf624f69aae15be1e79c5969ab98825438b2c5774ec177fbc4aac6563cfe57d0d62b # 1337b847e00e1eb4fd7346291b32a0bc9d2eb496 + "521": 2ae79f07bcb215b3c164c3a477dac466b52abbc36671568853d75ddad07658de369117e0a371541d620170158070706b2f3a6e28d744284b5802d315815275de # 1337b261d3fd138c62203e5f16750ecca6c92421 + "522": 40879b0be0de2534ce8338aafaa39cf4d3a1c27fc61bc941f265b0d217af7609019e7011e732f968258a3a694f875245416bb450c24db4ca77bec6fa8d5f5a6f # 13378f8d00f01f52b039ca0c3da2871b2d4957d1 + "523": 7c5d53938b4dd220b9d4d889864ca3bfe6a8fae1e26c0c124e67205471ec1ed81a7d404058da2da846dada5671269bb0628959c451afc1e91623cd0a145842dc # 13375e0ac793c3b0be52478eb38ccb015e77083e + "524": fc224818d36966f5a83e3ccab48a1cefdb2b599897911f36fa6d2f22651c7d50673c6a7c8a0bc8ffac41cc5d21d02cdddded008550a21705d18aa16f88ded820 # 13371112d885da2adeac89666f3e2ed95082b3a2 + "525": 583e51b1e4067f8905c08b473dce2cb3a9a5a41c92c22a35ee577dc86617b1d95f24fbb14191c2302bbfde024966f29e10c6000dcf1d2fa0051bd8dd30ed3c7e # 1337139265f4efddfc6d676d584c908ba354340f + "526": bed77786c1d77d7106b1939fdacffda42d5de08056c70019b343ff62cc3ab95b5962f8572746cc1240f3dfa84d3f3709859a60f789d42eec05581f6a2ec804b0 # 1337af75a7eb58839e902132567871873c4305d1 + "527": 6998254ec29855c225f4b7d95f1ae32e1a6bc5f5013f9c8ac721e5204d2b0acb85b84850f7943f9af4105796cf168ab053f1d20e3c24df701cfe71c546518f85 # 1337a1102d09906b15087a44c29511e445acb8f2 + "528": 736396c3d78b51cffbe61e71f9a46910544712c35bfb60b5554516dd99cc892187c8fb79e3b99c804f96697a3ae6d621523140ccdc4b277ae67056cceebec667 # 1337ebe3525f26f39f360cf90888067945ea137d + "529": 7a9e58a200cd39db917024286d0fc1b099b9d9998e487d95ffc3b8805630ee111483f3d663d2ec7d93eeab619543bfe463c3944303c2b7b05bf33a155ccd186a # 1337afaa6e5853dcd9d68b76080146783dce3538 + "530": d9a0f800014bc93abea87b713cc8855d3df07cbb3f013aecc9a665ff0e28ed3d611599852a092197693f22ca970bb05520359e1f6818bec0be495c0279400f2c # 1337eba1a582d8699c8ba08da69a59cc9dae8ed5 + "531": 5cf9db06cb5ccb556e28d3d17da93e45dbf0642472e96b43ca56f01d14aa28efb33f42bcb65c8eb8c1c3b22782b048af54cdd922cc8355e241cf94d22abe5239 # 1337f47a707b2445738c53bdbba1287ea56ce07b + "532": 8a5eeb8c201b2b12d2da32de949bef46a73294a616096a9cdfb55edd5c45d86ba8cb25035055c680d050dba8511a19433c3d5937d67765464b481e3df7730727 # 133715b1a364c349319e7cbc2a140838dfd53036 + "533": aa7bd8221456cca695ff482a4425f19085c7cca988914be9e448bbc46733178a0b8765c59a90a9af38c5bbcfeb86032221fcdab7a0dad47fb5b8d2d321a25f47 # 1337572004ebfd0c17e770538111742cf28653d1 + "534": cbbb8efe74c74859dc450e27c4d60ed006b773cfa5ba5a01bc6b10fecaa53ddcd5077633c74565b4c8998af4b81371990af88e7d96b9fcb8f8ba5661379faab9 # 1337688de329acbf81e1fd8ed20f894d23c81bea + "535": 388c6568a99e124f8b3a338505857d75312cbfb8d36f18852a54d6ab287cd9cbf9e396b198e79d93fef8708eec05ee38cea70d43eadb81b1637d60ae5e02342b # 1337fbd9313dde8d08d5b2a3f99c9f599716ef22 + "536": 8261b740ffb7023146b760330e8da4e070bf79b643633a3bbac21fa1fc48c1db2ac88a9db69dbfc52acd73e00b3e23a20721ccaeb8c922bee6a0632db65ffb87 # 133767de793b2b4e7882f93c2ccccb02f365d764 + "537": 11c200c9d90c6d46caa3119b392c0dca3169941422785d476243d05afed0fa42ad545e0e956b3a842fb082dcfd9a5dcd27c4fdf69ed93caa9249103e8dca93a1 # 13375818d67dd242cc19cab7236906e0c03428ad + "538": 01e0703fd8a82b70f81867cd8d4b87975d6b7e9cc69d9e81df369fd4fdee650c1cb336a6d9c9f86f9ff58a1187806848a3ab4577392255757eaeb4e9156817fc # 133744ba6456788e6844e7aeb991b337468daf77 + "539": 87affed703b6c5d2b557041c8cd5d4af2da4d6f5eb0dfdd4b449a187951fe7aef6c5618dd5e4b3a30744169410d84a9e9a670a1d0374efbefa9e924657f899ee # 1337a2824c9aa9f58a275bbad8e8241bd0e57809 + "540": 4fc9033b63bddd203cfe4dc81c87576182128f4dab57d33b56a054adcc411895c8898044d4b2ad1cd653e374c50ff42a2863c94634385d50d8208b784792c86c # 1337691a96ba5484ed8f062dbf981eac7b58da23 + "541": 2d9564ad74ab91db3aea460c16600d5e3c508edae3747af737bfbc84be9d5718849d62c240392190937732b0b5c1028824d9b75e9089144b9bdd2a1a199bb2ea # 1337b473fb29b15b0a2fd3798751dedad884f24f + "542": 060052909c165726190bcf7751427bd0c587297ef3d9cb7621a34ff47bcfa41a2c86a1eb84dbdd8ddc256461b6bc272119e254101ee3d552adc13dd0e0c5c52d # 13378d7d1a0aecd3e77394245f0a054b1cf0f941 + "543": 93f9a90f1422b77c20b9a737ce73c49060211a63c48f6fc2c0f815676fd9d82241f969728e04d79cf2a63c65cbdad5d59bb03b7f709d47f37ae2022cbb0c0ee2 # 1337c86e978724a702d134b12795823cc0a66d31 + "544": 8c294c0933fdaa534e328dbf7680621f2bc595c578280b5a83dcaeb2e5156d6eeb022897eaf0f25f6582a4f4cc3170b64dab70657b0d98f6860ccda5951b675f # 13375d67f467428ad2b0f45d877a5f3bcf194cc1 + "545": 4daf7d1708ffb26a3d0b24648f652f47efb6a738b4f6e60f7d5a47924366512c43ff57d106afb7c1bcccda9f33a0c4356ca00e07593c1ef3ef30ece42228885b # 13374051502cae2fd847dc283d615a4fee7b007b + "546": 7aff399a7b61d1a8041247580f7dd6a108b9c83bbd6d1fac0de16d372f711d9e804c90290bdde58ceb1421b594fd7435c3a64882ebb2263120a10087625094f2 # 1337d216e0d3eaf8e9015abe5b4d8b71fb006711 + "547": fc678998ebda97895ce2bd14275b3cd4cbc32a7fb003820d48d85118c00654c192c8f912e6b67b765f268df00981d4de5e2837a177ba8c54fff6959d0b5e34ce # 13377a9a61ff3e83534660433c85c5b036abb224 + "548": 6514bcc1f69aa24c89bc304a76c264fbb3fa91e854f691ef84f4fc39977cd5dd7d1a2554c66331134588c073e438275adf0db22b24a748b18121f23b4153cdae # 1337f9d6b7d74fd2694a9bf45732643926571bbe + "549": beb1db1735b8a806d9c60cd85971667ec35c6f07c2c72a1373d78067a9b7136bdc2b851a769a45a664762a176008e68feb7577a79a4405d1dfa0615e39e06f7c # 133791a8435803e74b78f990d7754a2f7448da38 + "550": 1edf529834278b4a4f0424b15f4cdf63c58f5a174df6656eba9ff3c8f141619dbc949ddd29fcb983e0c2e37524f7b33290864b8772661aad56e9181126014dd7 # 1337798f24fe49ce5536de3b985bdba410337a48 + "551": 3b84ddb859e8d2151f59e4bd1737718a0f2f1244a72cfee5d2362cc9f2d461432b1371e7b74d78380b3c5541dc1fa5b7bc8e0089fc78142fc1c0fbdf0b14a54f # 13373c0c7301f3fc9584a93d8c1afdc42c00a5f1 + "552": 63bc787cc8f7ee7704f14e81b58268a6681db3e88f9793d67bde8d71724874f95e7557f7e1b10abb7421e55e8de77d40d256b913cea5829322206654e6d88e7f # 1337e3cc9d5cbe883402326fd42c6b8254307aec + "553": ab77077c31dc26c8662513ed9d680e2145836a3a09832a0ed44851a32db0b74576423a2617a29d0c03e3db0c0ab7b31e6e36aa5b337c33bd3a6acc5e500b86cf # 1337e0330dc132378d311be125d0d687b0a63e90 + "554": d0ae8f26743b3db8cbc5dc102899c58671295a901c8d694a2a1125e9f189af037f0435baa45dff0bc826ec48dd191f1d58fd1629585bb90f90db885c956da859 # 13374a80fc2a4bcd93a04d4b6fd7dd0faa236a80 + "555": fc12e37532dd662f0baf6548cf86abf44163fa1fafcb20b3c24260022adcde072f28e9c70a1533cbeaa1cb27bfde8b14b6337c503ae74bf051e9782e194d2624 # 1337e0fb33abc80ff6619ec14b67bfcea0fc1861 + "556": f1fe85ae6c54c3845c9703d146ce2221d7e6659ff8ba6574b659025ee7a06595794c0560a9e10d20b010ac7e9cefb46cb4f2eaef34a6f1b88f4f9c09deca84a0 # 1337fa2feb804d4276f34d3a30a5f6f83f95e2ef + "557": 58c9e73ec1a91a4218f4b3f19a12eb2d89c796c79f2b65c836da343ebc25704559c8fee69a50e8e8f737dc524d16dc4d0fdcce9c6482eccf90d3b5882862fd2e # 1337746e984cc23f6eeec4194bd9502cda58d6e2 + "558": b5e67aeb61b64b260e787984fd240dc05569a06e2388cf41849e0528a82adcd6ce8284935d859ffd19c4ef70ff453977bd624c4f0f58fe5b3f705619ba64ee9a # 133721ab9e017020a9a33da33cbf5eff79620960 + "559": e54418be947d92936e6488baf7b0157171e62f49f6fc4c70849f54f1495d4c0d0c41d2ec1b0276831a23fbbf5a88d16346ac5a1cfee2abd7fb4a95ccbcfbf783 # 1337fe242454721c852cae3cbf46ebcec0bae0d4 + "560": 85dec08d5cd46762c00c946ee86ad9237c8a9fa1fd8e3145145e53a2b56e8f092296a370968f72035b28ad73e01c61789d2647fbf248376307bbc885cbe7b6ef # 1337847d4c80ebc7c3e6327781d8572c6fcf3158 + "561": 8209d5680267fb9c5e54d3dea088417729df19403445a1d7ca983d14bdd79155396cf356979912223525822ca2f2b40aaf4ba8795f9d294a92de8a581277bb9f # 1337a9055af521310ed36b8e1cff7ef975b78b2f + "562": acecb230e8277bd12b1fc26fef939967b2c652854f56957dfabc59932e9e0de27bb8440a1d2b9e5e11c78f67da045f60d25754ce37aefe7ddc76ab5a5d3639bf # 13379de68f4998dad9ec0bc1539858b9d49d7552 + "563": 60c3c93b9b6fc796914a527598e06d52dee39adb708929aecb6ddb88f227a161a45347c99f8811ac3fcead86ed72f359c8ceacf125806c3674e511be25c8d76c # 133750a5da5c9cc1e89b4a4db6f14270059dedee + "564": 7506865d5d37eb5a79efa708daa40b6fd364669de794292676db1116b7b27b80069ab2d93e55b31bd0484a4243598fd41656de42d3e4135f761f5e92cc613483 # 1337f211a912e39f76dcfbc1a22029178a8c1c89 + "565": 2b61c4baad632b1ddc750821546b5061d301faeba398bd9b96e2cd89bddf11fafb4626d82c8f4db075e10d86c385cc2e2ea94038f497082220dd397b4e116d56 # 133706067c0f96d58ebaf37d0dd2239b471d2480 + "566": 162a3161c79c650e661e444acb6ab65169fa63a27cff58aca1eae630f2428d4f523f8936db2d0dc33c720d18d93c0b0ee1ee377ae2c94664d537d5af8a187b18 # 13374a2a7726e16ea00f307d0b22558a2ec869ea + "567": f643471decaec960568d53ea562767618e64b0cab6ea5dff4ba4bbaa74de5a6ffc93031055c1621fe9a07681aef0a3cac787989cf2b219efbb4f9807cc2c15a3 # 1337472d94a635ddee756d1d74a8ef7f4d15e288 + "568": f52dc9043faf83cf62baf87c9c6358ed7d8c478f6c371d4e8efd7e678af154fcd705fdc8b1da81310c17a1c9a37b3356412094f6fbc2525ee1701690a42db0b1 # 13379ce2355654a437738d8007623f6e8b046236 + "569": 9342827895b0ad0a885f36b0594a0a751703eb48e9f4e95e23c857f4495ac684eb4e6d74f4a5e7a02301f61ebfb2490019a6a66a4ab13c2cd98dbaccac7405cc # 13371fe66fa2a1429aaa0c95968d2f689e5bfb84 + "570": 8243e76fb3025f820320582f8010640b3cb1dd912a7f060872ed2fa2babbe0b3de112c8753362cd90f3e0b13a2b6acf22f0653043d7cb918b4efffe9d2ed6479 # 1337af7597b75834356cf30513ed258a0c8cfaaf + "571": 5a4985d07121bc4e0ceab5647c9f06897ee7bcf6463cd36fd06930701a0548e13498c34b9d5f4b90515d8b08aae629ee0a51cc89330bacca34a2cd2c80c355d3 # 133710f28f0f418448f10cbf65c5d36710a07fad + "572": 9a1fb198471b5c28c011f1b64af5054260f6c069642bb98949ff24a426c0539542239072a10773f8fa2f65e76224a078c0ba22338a54355dc4de51e0fdb4468d # 1337483063e183f73222a14124573cc373efada3 + "573": efa684a4f098ccd17e1f41d73e396cca7ce1972bf612b18f9f00c3eb2ab922314d8f2e229ecb46fac52dff2f7ab0cccc7be773e916c1cb55f73a3dc2f6cbef43 # 133759fd4f8d9869cdc6d77064b6a2d606d5149a + "574": 83b9f487b98ef726613f2f6c173f4969daa4e06abf10de6d718809990e13d6f80bd9d78eb1b6fdac2e69d6539e25929de8f3ff90e0dcc3a8c7a2bc7bcfe20c55 # 1337b095a285c5bfb122c7890b99433c3842b6a2 + "575": 804e7b49b8c5d560c51aaecb2675401d0c95321575a85c2a595b87a5c498130a5abe7162a239a81b76bc8d6ec5426667c5bda6c55b5b7229da799ceb1178ddb6 # 1337d9b86c237613d332dbc3ee40c4c28be014a8 + "576": 3954ed75a8d5d37e1e6c0ffbab53f1d4dd9e6b82741739aa61eb75c4e7acc50009a1f4deb03cbeed3053ec33d1be3e8b00711022ac29a7e22b59d2ec2b6fe7bc # 133781e86ba19871ec3cc6dbbbb03c13c458e347 + "577": f1ee5cd1b839eb65b69e42d3b7080f838ecda8292591779f63eab9200fa6bf70a7878e356dfaace03a50faebcf02798c49ae509774817c7c10c134de960b5f7a # 13377db77b7e7b95061789842565126fe3c58a1e + "578": 3b25577f8e7f051fc6adecfec2f7ac3604d0fad82e28eb9a7f72710f9b896c8a7ad317b2d53b1c41c575b1b7faafe3b9aabcd765459058376482b9f4e183d8de # 1337d0e10c2d9ce4147ff14c09eba2d451f23517 + "579": 732e74ab89bb53be3fb32d0acd319f3524511d54750430bf25218b33db04e45353c8dd152f77beee96fb1f585d21618918180cbcae2cf5b27c87e372771fc7fb # 1337e13f080b087b932450d22e8775f017c19e6f + "580": 1b72c772cb4dbbb96065fe946d6135df12e9179905c1603b447db299a9c543d8baf3cc934015cfb12e9ff1253698a4c6904a3a242bb4c527ba1b40b28fb2adf1 # 1337f2ff71de2d8f5440b7007a387d0e4e5e741f + "581": 148c8105f82f3a197208c26e065ee1eaa5b1c9dc4f8655f8e653277f6a45a1f7c38c16f0bf02c0e174b5a2eae98b11d53658ebeab54dfc1e8e707a6b0ecd50dd # 13371a8d0e28c43b9d353c5028cecb1568bb3f62 + "582": a933a90ca2eb4ee69a633ccaf4fb70f9df0bd705385fca4f50941275c55cb2dcbe24f1773f6b655f85b378dd6e04999d40405465a7781464c6d2a1264b92a6a9 # 1337e2ecfa7babc1e0c74657775055232ec7ee97 + "583": e7e9a044b9ac3485f5ca80f7c12be307e7d0eda1d56e15ca68898e184e5ce50c063a22a4f400a39836bfaf688f84f0c726eb61517ac586f6fff108654591ecab # 1337315d05f8b719b42433bfe031412e9165fb01 + "584": ebbb18e0fc5f17883d12f25483a5701952b97bf63c2ddfbde54d146084b7e7852b0efd17b88b3404b2fadf6905646e43ac448b8dc47fd04003e75a746ada38ed # 1337a8fe860c65ad58765e965e91d06b9c193cc8 + "585": b064f17fdfac24df017bfbec38fc5dcbcc48ad0f2f019a25c002d0c61cab602355e8d44fe6e231d26c17fe9876eebfec45cdda4ff60623a8d2cbfdeb7a0fc669 # 1337a1196bc9471d0bb6e6ef82966fb71168d1d9 + "586": 4db2e8d4df7d5d24f99552b481ebd7888ec524143fc4be8b2b0940e71f7eb6d453c4646592b0f9e185acad4227e098deb1fec35169df97a5e155026585d8d783 # 1337a47bea3ceb0d06bb34be1f0f3922fd336e1b + "587": ea09b1588b05f9f28bdf53ca57751a261059e8269efe85f9eadfd92e57f3c6ed9c34acd3036496f9844347bee76ee10037714ad096efbae22349e20df2562d45 # 13374a7502f553e2408f899c6099714296d557fe + "588": d3129ddcc0775a87b4f2e93cfda4151475fcc9afa96a096d845fa06a62959f26528525b11aa5b9a883196bd578d3fac768e28208b437a3d7f2e082a834fb1f34 # 13375b0aac0fe38c19c38f466f7a77f9cad51123 + "589": 0957b7e775057f1a7e05e2bab87714f1be5f80ed3a1869345e157f711c7fef17bb5922002e8aa0126a45ccc3c518fa1faf9161df03cfd1208fbdd9b2b4e3a946 # 1337fb64d342c1fef16565aa3d1932b23d57e465 + "590": bdd7bf86e9bd67e50c31b471a3a89a92f2e4b78707b5fd2e14468ceb3bbaaa29c52f3bfbb05d78a6fb4b8b663db9ee497affc1594a75efb70aa60054dee80a23 # 1337cf1d1c6de28aaadc88f4963c1047855388e1 + "591": 958cf39fe325aa0e762dd2b195904393e85bf693be5aa2609f4847cda183921fa5728df5c3d006dceb391e04a7fac335c18137a7d52d21d9a3469bf56eac21d3 # 13376de47412ecfcb0fe037643c6280031aa6d34 + "592": bf784a3a61b84612ce6652dd092b11f02854770ac933fded293644b1c7c289b8e23b6a331eda4c3acac3910a74687ea85833395fa94c9d969a5ae46f5411973f # 133788e0ade64f8918be147afc7746b082f0e6b2 + "593": 8d88b66798ccf69485a5a8fde9ee463e6a766682a507bc07baee4326f6e852dfdb1c0580212e3caecdfcb2dff950bbe9ae5e2985aa8dbf3735d7bdff33ba2e6e # 1337746f63436cafaf744d7c02bab6365b319fba + "594": 58aa1b03e15cc15f2731b1973a00eb3c30657fc202dd7e6c7aef5d4a9aa1cc82fee335eec434aaf8ec30177ebb3508a6eaad9becb538f942fcf4a1847811ef7b # 1337cf52c73615132f6e35446ed9f3fab285f652 + "595": d1adf46ea732dcb89ad538e7387f17fe097892cd3cd14ab83a3d6bc85fc171da414d3c0416963c0560b55be68d33a0f2ddf8ddc8b5ffbc1465aee5f9badc038e # 13373df5ae0c37d311ba9042e6e1d6ba027b4e1d + "596": 056c69b64243a3ed21c167bf067630c999dd0239341a82521a40ed4091eb1dec2d0ae881347a4d67b5ee414af529b100949bc6adec04751b477daa072da18e7b # 133724eb2868e4cf825d0bd0d6f9049b70bd9644 + "597": d374c1d61b28006912d6f4d67d48acd8e4879afd0f67e26435b27d1980c7341a7bbb7c316a261ffc71a6db07f9e71184b6fe700832a349756a3f64cc80d5f45a # 1337bb9dcc07ead9c7a4d9c88c1d343bbbaba086 + "598": 2dccb1af9ebaf4396ef7d73eed9c0faea9901799547f3460e293bb6d13930f858f76679815fd68d7d8804cb2f70d70d7aefcd85913f1a64d561c25a501901bc9 # 13371e075f4e87fa050114cfd9ef0ff9a3b5536c + "599": 78e1cfb583191113857ffc9a22baff1b69ef61d0077abf1508b873bb147cd5717eb1146a98dcfae3203c65e191f02a0588474b7e3de3c1a338d2b0a98ec78133 # 1337923647029a20ff2024845f04ee3cc405ebf4 + "600": 6b2f080fb561b0d5a9a4989f31f79dee3aa59c95f1bd7568badb23d9cf113c391fbf5d2300d327a2a8f37c1d10a704139bc38a6fce67976aa9d4e8a2bb88a200 # 1337bfd84a559e5357e414f9bd8adc9318cd9917 + "601": 3cabb7bf2a30ce6243923f0ce282246f5c67ff44a3074f99a65797eabb4449ad8980bfe795b6d9b3b01eea33b0161d03edebf38a420febb5c3cfcb097a813e11 # 1337e25aeb1db5af0efa80a98f7096cb707c3cd3 + "602": 4fa6a0ab844dfa9c98d512e62dcfea75828ae82a292af3c64c861152cf0d0c7c0a165cd781a71d29d1c160d328cfa5ac639c0bac5e7e3c50dbf7536bcea0b32e # 133734fee81d2fd6ecf9eaa9608d71bdc27918d4 + "603": 6d1a8a05faf183844ff0ce9cb67fcbb7c4c01f440d8913befc85a96f98c1d962a74d66e4b4f80ad6650b3827cfd3c9b1b0977487a6c8a32a3f300e454b75e6f9 # 1337b7200495057c4ad625cfb7ba0f3e7ce64c26 + "604": 1eeaf41bf2f29fecde26ecd8c2dd6a5b571a6b3d01cd08c5628791891ee9116e87bb8689003e0bf835379555e1828ebc637f97845de0a5599347358695227ac1 # 13372bd35ea03343120024178aacc58a1d847cc3 + "605": e71f7a654b5f15ba9f5051aa6e748338c809bf7b9de89c9bd59101bb8d31c09d582d861cac61dbf60b34756c382ad4eed1a3ca5822c46529c3be20fe75b46b1a # 13377d8f74e25a3adc4aeceb6406605848d6e654 + "606": 67e2357f892edec8772d8687ed2c880a7fd9deeaadc56282a76b91c0f7f585b02a88f859abc8e72481081f20da2c4ef4c8a3d8eec52e7b7ea1d64d227620d461 # 133788588575f63547fb3e1246474a1ac3d7c74d + "607": 3ca0669b659b5ce30ae25cb9a5c81638b442a195c5eaa9db4da63c0977a259a0c0f10978036856822e1d1935f0e453f3b725e644375656414f36ef7cb3977f58 # 133754d066bc275963bf8320601a7353e9fe4a84 + "608": 433b0a1d97f03be49cdce4844e8f576c4b1a5b301692ea73d96147e220652d58ab1c77fe3fa6eab5f74e82391a0c30dadb5ec7842b901106872f20e4edf68dab # 13372ff26abbde0600e731ec8759acc2842fd401 + "609": a6535298f27dc6a421f772c3ea23bafa8356c24998b675a613a1113be6dfe640ab5a52d7a56fa455705b1015c494e61199c1cb402e0d7560ab322f2642f14095 # 1337dba97400e0151e249c6de84e4a4861f69d10 + "610": 3a43dda94435295ec40dcd06e70b8f72cdac3c2f7e65b1308b8b13ebbaf9844736709b7a8471dafe6cd74c9559f137b3211863942a6868110e94d0f1459fb8a2 # 1337e27431f485d7681b602c23cd13741ccab583 + "611": 31d4e3e2649828a64d936495cc536f4c1562efb01c8b1973bcee31c5b2529932b5192cfce08d04113da8b2f422a6bd402d81c567916075cab88cc0413c48afa3 # 13378eded3af7aa8fd548bd2e3cdb40ef63a83d7 + "612": e27522f807a1463163497b13899e5480ad51c3ee3253955f20e98e5a6f10521af9d174b1d4b1272915b7534f61cf3c3ddd46d1505ae5e6a1c1f51d4e949b538b # 1337546354d0850c6e7475cb0e1dc38e9655128d + "613": be4c9e4f4581cbfb5c9a32c7b8564ee674b999b8814cba03fa55965ee14f21f48030530862a365e8ff0285762875994164e4c5934a67002f728da0c8351067a8 # 133726cdf22588b3b3b9350866c24cb5cec4248c + "614": b2030718d42353d2539d52b9a13a60f1bb1938d9dd13c3e047ea0c2bd1a8a023d8a0490a42cc5be458305d978037758e22a63983e048daf02f34fa2ab257cda5 # 1337ab4f6d988e3fd812c019e0afa6a28a93fcde + "615": fd42a1cb0e3141d277c102787765c2679b88ee100e81af038c24b0dca0c059cdb3bca46159d358cb09211142d969e7fc1a2907f055f468a36ec277b97ae26e8d # 13374a28616800a5caec8feaa35beabc264c42e6 + "616": 1e297811d913b76b6f54fe6ff780800d49f7a7dc22aff5d26a18d366f68afd07c68aba8be7a08e2c48e1e19c33dda10e451e20fd811c378b4a427201b289d635 # 133726cc8e0e5a2e60ca41d22d00416e71864f56 + "617": 7c657577867a9c99272116adde893fcbe2e62225bc7c9c132df9fa0cfc4d7d60354f9927ff654f1e9209d205ebf89db13d2150b994acd97161c3c8a2a8878b62 # 1337570b5ca56149250982dac0f154788f4c8b5c + "618": fb4da7d9b6c96bf91f05d477639479f7b2d891a7aee37858e3573c8c85582034b53d4d1099c221db330ed2d91ed97ab2bd86f01179cd8bcd28ed04338a7617cf # 1337b2c37d95c0716d18c5ba9abd1503aa2fe279 + "619": 792f5850cc48752421dff3132d96516faafc4928e36170550ba710f4120c0c329fe97a9b1884e5dd0862ebbb4817302ba2d781d74f76a7e29af7f133f69c36b7 # 1337d46671e3f5396f53d5b3d7671e8eab57ed3a + "620": 2b5fd77b8e5f0bc5cfeeffad8d6fac9c6a2175851d05554a9ba0224f5e69c06c19677a606216a45a7b8b922e210e54a7ca84e3678113e9e385631b5a15df9634 # 13372366a8e637c218b29b3bf0097b61e9a6c4db + "621": d6640885c79eeaf1cd465ed2f66af3183ab24d060a3adc137073834f1fcd9aff60d0d3e9844adb3e52e6a1618bebe8a08eec701c8efc85d85f6f7b0f79d79f1e # 133700aba2d668a82fa81f02ba3d82290ab64c93 + "622": 43507374f976483806c12b91a4be03535f37cfd4018aa688c0a5881445f7e2ad4db897557dd8d6e4e4d1d114974c7a88a0926981cf4b5fef9e5f6d376b74d00d # 1337b8e596e0b41cedf5f3e0eff9cb3ceab42652 + "623": ee2753f7bd3fd162795b7a96cad5023de6a8e931da829271f9b2648b277ae88d711db6079b946bacbb3f2e89c885ae20803a37ee2586793c147497239ded33f0 # 133753a54fc99da953503d22456df5aa510a84af + "624": 904dcd5bbef5e19343cd9130e613c8a381449d115c8eff2696ef6c2916693af2575918ae91c897cc9291747c4a6e2a3820abf6bec3d5df74a35532995736cabe # 1337021f73dc878166786763b3823a35d92306d9 + "625": d64790dc38428aa0e8b5cb53dc4c4d47ae3766409d7219df57868aa62f04035054dc7d3dabfef29d0f0aa7b3ae04438bd51eebf7049ff5949c2b5928dd064b34 # 13375942c0573445723911f11fb251ba49f935bf + "626": e5233694e7520dd8559dc494e5345dae537be08592c1d2c751298d8206525975ab1861bfde098058ad5d6a02ad0a5982ffd391257ed13b1ba4db6b925f4f22ab # 13379763ed7e55d293dc92c45e4dabc213902f11 + "627": 308e1366d43c0156096a434e784c3600483044a046222d4f5766b99f125a486c958bac265ac33b8ab2d5b1900451848d268491a9bda0f6a43c84c2a3e922b4a3 # 133788b49f0118ed4c045309534d0aeb025f25b7 + "628": 721fb7e68787a439a94f7673f4a05fae7731331aba1809361b9c5a6ae50ca54d80f693a9d689c148965ce11cf41521f5b5671556d1f01da3821f8b51b9885d35 # 1337ff2b4bdba0b10f7a6474af021be93d5ef2e6 + "629": 580f9ebbf968e5a55f1006b76b47e677da41531b92aa8f0b2bbba349a8a3942eca25a8ada4ac921adcd85acfd8acdbef98583e59ea2c7e2a0f6acd880c431d0b # 133757f6b254777f84471380e3f98f2216eb4395 + "630": 11a58a1f4a698fa19f03a21344728accddf67a37072bf921f6bc6956324318e2f73bd21c50520808abf990cda9a9c64bf6750fd724483ad671afd7e88b67183a # 1337cc218889c5b5191c609f9ab4cb0c56abcd7e + "631": 00a1295d72186fa01a7c642dc047d486a670d1217239b62ba44018750f1f37059e49f44ba6bb025c2469b9fe91833bccd531918a02211ddd7af4e9e4b16f2dab # 1337ea3c1c7b380ba6654cb951ab78ccdb607a64 + "632": 0ff8fc31cb190f0b4824e1a57c7a6865e4f1d0ed8ced582c5c804717a3bb7f7edcd60a28b1d845214cfa0ba8141a5a8b190ee804ed951d7ed312dd8d125b0783 # 1337167b374b3e801c0b9a3ea757ea9aba9fcb60 + "633": 3693be86e2a0164b4fa5638c2f99e2c445c4394e763bdb2684923026c6882bf18decf13c6d22b5c23c0df5b73fcdc9c1702062ee3c40d110b54c04d2e4bd0e91 # 1337983880f1bf203f431bdd0635cfe900d668cb + "634": a23370e87f3d01a6e1e3fac3e2ef8ec56e2971b17533986a2bd2f6aaff38607b7ee8981873fbe96d7bddd325b33135148fa1d8bf7f0ad2eb3d5e815d8a127e2c # 13375f6fe92a635299bc90466c6914be04158745 + "635": ccdd9825eead5c0c9fbc506acdda5b903eff49f77ec5369c8320512b6b5f6ebc9f817c15e88f401fd29175666dcb23809cad769387524984d11efed936d3d198 # 13376fe9309e034de76264fda0db3dfe5370b51b + "636": 72f6679bf3c94022c5f8f41be1d046da0594570fb541c77bb7e19df1c1c86226046afaf8054ebbec66c0613aef4ffd3aca69e8786fd6a16d377b8f63eb83aa1f # 1337c8dbadb96275705e1b2ad398d63ff17e9a3b + "637": 726fa86f2bf30c9966beaf9a6fea48bdb7eb23aec55e838fb1eae12f873f62cb8bb03ceaa3828c53ded782b1a193b2001d511184e8205d9abad74e92f1120f7e # 133793dce57a80f903574c0ada17592825b8dd3b + "638": a18be10729b2c19e2adc9b41da4179d148427d8547bb75785ddbfac86160c7eed66634c849f80a93b412c12e604f083cba76c0e9f7653e96120661b22a73fd19 # 1337d92a7449683f19f176400bcb73babc6ec8b3 + "639": 7bae581f75fa8e889cc37437777b0565ed5a51e20cf587208acb2daf30c6590b23d7f0c5311dcd9b53b6e9052395731eb80a543ed462cdbcae8efbfea6d7b11f # 133728955228849f8f2f143b2e5185a9c96126a8 + "640": 2cf0437b98e683b6c3fe8052f62ed2ee6cd679917ebd007cab82dc825d5e5f77432c748711e6747648472d2651be6d5d5e04d2bdfcef70233374ad48868d71e1 # 1337e2fd0f41b83f235ba8b143b73f03bb575f0e + "641": b13e6d2b8db101dd8bedfc5654124e272b459aef530b2efb30c3657bf6317cb79715346e887d9db0170d6e0d2ac893c49b0be9beb6171a810542b7b265c151bd # 1337dc343f088c8f48339e85d778e8310b38fac4 + "642": 75f42deae05711913c1f660c183267bc9a337b9f0105dc45e5a1bcaa759eeee4757183da83343600de8118a4f3f9d1705d8a6f695dc7ebd8f17519cea335570b # 1337f72ecad38ea3e753133a08ee3088e475530b + "643": fd6f278a0ee8d3c3d9a391e3271976647f482c868d7b798ba8971500648a5257d9f0173c69b2eb802b105404a4c13faa4f71ae0ccac2e826f5c4e64554b48c36 # 133722677444ad0633a7242a27049b49d0fa4901 + "644": 45710da43089b851ccf7bec20537a6125108b62ad215cf3138e7303870c0e1d420ea37a44bb6bf41538fa3b7a142ef282fe063b0715bd4d5e1ee5e5344384978 # 133728b6c20c8985ac4c1be7ff9a2a25c9aff852 + "645": 8db1f964f36f77ffd13f61ad47e8cae7e044701a0c34fb56899cfc1102fa6664dcb1d7ae95248a796ef5b2e0515577fabf518c0818125be5cced87f7ac8efd09 # 1337e736de8f3300f9289132be18bc0df34a4a66 + "646": bf5c2febe7057737c25739b760a6736d1fbb66f19f76a7771cc6816bad8ec6ac61912fc73e84dee7c3fe2e6ebbceb90a14b7009b5b40ffaaebf77927c427b0f1 # 1337fcd6853b5b78f6d814c5042e02bf8b2f77e9 + "647": a0132664f2da9810f2407f154b6fd13aeacae2a5ebaa76b443bb59f5097de86a28fb80a5c37b9b733a34d789330b414dcac0afa56ac581dfa47204d9d1bb5092 # 13374539ae6e488e05c189af2389a0119b517112 + "648": 590f5ce23bbc5a6525b7f16e563bb3d6b6eb874b51ec1af02a6e9736b770f78c640a0ff6ba4ca243e547c60dd118eb3c118d0bac382fef3212233b4cebf3c56b # 1337513c704c84c4f1300d1ceb77f5323341ef6a + "649": 1428e075a99eb2fae4dd8019ff4382891095a0302d014bf6adfb64802793b0265b555609892876b98b789f34ed61c418d2ea8482c5768e592835cdc7a4b4893d # 1337afd2cf49792c68e9215ccfbb332cf0cefb4c + "650": 67a8b31b7a6e7af0351ed9944d33db04fbe3bcf3f38990f5b4b77ecb978663676eefc8a10b0bfadead37725ac2d46ca6964581e17c336bba44599fba09322b83 # 1337092c4d41589b15f0f99bbedb045987a10d44 + "651": f62192fd576ceff70cde12c7c557430c0ef34de9126445416b54a61d188bf1145b4e9d5d428f6590954747ce84b02c754cf08f65c63aacf05f9b6653eae94f51 # 133789d888e4d769692f496aaaf41772bca77ee3 + "652": 93c555b5477ae094c6f777be0ee0d2521a7732f12672c3037c99e28486c4217ea5fcf1e6c6bed0e099a5e3dbb856dcebc26c1baaf37cc0b7bfcafbcd1428364d # 133764ac77b78a65eddd60745d56776a074931dc + "653": 2901baca19eac8c1f376cedee2e3f0cc476b95603937d6c4a5a45fbc87db591ca2787a10d4f65aadf75a83d7906fd4f5b3e4e8946856a2ee1984ed8866d9270e # 1337941347c6ebd29b52b5937c1707eaa579717a + "654": df1ca9b0876a13a852442e0efd19d054b0504022d2700b740d01c0b383e8cf6637467887e32f54919df6f001207f9bfef867fb8bf5fb24c4d33be1e5a63c152f # 133771977f347cec6cf8d08c1584c5741ef2f3ff + "655": 1d6ac85264f0ecc5a88b6558466267ed444c533738aeeb08dbb355721177e3b6ae7b30df77076d964464ff159e7e2caad31a3d9584552a4c2635466260f8f654 # 1337f9236869ec85237c69756ddd9d04baae90b4 + "656": 9f23ce3f3b9dfcf1af30e4d1e585db280c466689a8ce060a0638650b8f35defe6333766898fc8e27f2dfcec21cf72068ccf5d1b43009047aa4083f31d112c9c9 # 13375a8d865973a0d86e93d64e0acee9e44de5a8 + "657": 7609b1f646668ca56796409408d05f6e92b282e41b36ee94d72a3507606812d47044e0ee82c7df7d96c642328ad5c5bf6d3f93c20879ff27aa9ccf0edfc3d0ac # 133733f91bb67e3108dfbbfba8c39bcc4164e3d1 + "658": e524c5c51a0e6ce390389bdd1762fd639751dcedfda2bdabc0760cb5e40399092a9e21331048e30ccc0bbbc5b6d9bce5dd5c9a59ed625d5a9a932de8b58c108a # 133729326689e010cc0f4877200fb59d9122d100 + "659": 23ef59c253479b67b1c2def1b5870966225101822026addc4f4871d1447dd794578951fe522cde98726bbfa7a505885694b2c3abaaf51eedefee1215b9aedabe # 1337cff7565b9807a69ed46e7453c85c13c8c023 + "660": d4a255a04fbc2ef301b9062329aa3bc9751e670ae53ba94398b375b48fc39c71319dd7bce9d70d6767e1c0948ea5158a24f2ca414379b79f4259ad003d9f5484 # 1337ff16e30b966ba33d10fea1c112682f7b17f0 + "661": 40bfdb9f3f3bd54e655b14113b5d6eadcc39424ad210f1c81ab2998073d3001b8de351f0c4946e15696c1e44859032d2e6f43b4d7e4174925109c2f66ab8748e # 1337e7b35417b27550b84aa758513af40bdeadf5 + "662": 9c473551f59703e121cbde7142f89cc16b224d3891bccdf7aa97267225231577a98bfce3b10e613833e37152e077211201aaf9f88035ab4744c0dfca38705d11 # 13371a0e2f2917007592f5e26422233ed51ccab7 + "663": e5c4374bb5eda3bb192f0583b6dffdd8fee585ed37fe4c9e3f5bcd1b02893f8a7988642b4aad32171749a22790389c221239fb33a620448b95ae0e08969b5e11 # 1337342601817baeb179e75cc715839e8ea68595 + "664": a2cb05cade73d61052bad6aeb0838a820548657f50e347cead1ee919f63955a60bd84ef37911c6dbb2403d3c9a21ccb02524f61787fd77de0b1f1c938d6f4b80 # 13376a0b5ea3b2c59f23e92710e88cb4e5374002 + "665": 892ede2bebca1bb108779cceda8e120db7a9a082b55215134a71faa011c5efc7abe45f660642715d6c39ad10e057f2f87b8221146a29cb64855fb2cd262f9f5f # 133779a51e4d2792c52baee6e0b4916974bb2f40 + "666": 1be42a320a561aecaff8f6ccdf6d0e7d44a063c64b8ea6c17ec3614ca3297295ef5e0dfc2e4048e590ca8a7f4b0face5b0b00af1d5f03de6ffcc2ea2f07499bb # 133727371a100e07b252d7d2a9bb6939180cdf61 + "667": 0bb835508f49a81ece96176d3fc5a2dae5ad9ece4c6c39065608ac486e653e722f255d04e3e5cdadd97fc6ca2f9cdbc27d5f2235bb81de5d569b65d814983356 # 13373569d8159761da5cbfe98d534724ce4fd9f1 + "668": 18e96a6ecf726bbc35c80712ee35ce17bef3d3ad053411f463c826e9ecafa179d309ec9f4b80ff8a9f7d0c0f592cb232b7479908065dd07c8be3b8c83ece1fcb # 1337039d9f6638e4265dc439b070fc15e30c8afd + "669": 12fe5056b23038fb593fcebbb2d223f6bac3d7f16d09f9584a42e3280cccd89a5bf40c0504f11cd51b1535359b087cfe0f68742ddc5ff234b00641765899c8e0 # 1337d089524d754df3d114d863f1d970a4c9ab51 + "670": c47122037dd8ef1adc2f9ff13f4ee935f1a2746054f0d4062fc63f0bbd6dd08cc25b4468db2356be1cb726401d20b9f60a4af5358941175bc64a268bdd313a2b # 1337081f57c111db9ec869606b284253ec7ad56f + "671": 1822ef4cd2a49f0f2686099e489f7f675adb35b1308981dc602ad748527a1b3705ef5292c00d71afbcb55f3835994c42bc648c5edb13205f800861d129c4d4b7 # 1337439600533a3694e4851a79677b031b4a4775 + "672": 11586d5672cde38cf0a041b11990b7f72c38583b49fb68207eb051b634ecceb851daad3c6749000d3e1b5f494faa96e08f9ea0ee4b018a4a9264bb3ff1e49f94 # 13371ff37cca49a4ca8ad6c61d2a3dedb70838e2 + "673": 8742c671d6163bb0066559d15e9f48d1ddfd93d56a6c852f141a10e495587e3a52102148d86a444919a00b6d38e5a03f92f4b9689d16b8aa41fe842c3bef7a52 # 1337f4b301bed4bdc6561295e65e14767d989478 + "674": 26e4757a1933dba9070bb350b4f845b1532927b1c94564ae342cc76156246bdf66bc5c6674516358b8aedddd45f4fa6754a9568f053230ef89c9608c2bbcc198 # 1337cb4199ebfb4d1989c7643778518cb8761089 + "675": 57b0f1aac4e10c872e31c9d03cfff002a95ae8cb6157b9acb127248b5bbc1c4efa49ad86e24e87b4121431376d7f1fcff674847c205c6959e47439a877e6cfff # 1337750e9a789cfe8bbc46fdf8c80bcb05440cfa + "676": 43f70676a627f845bfc5a78279bdd0675bde214ab18d1278bc2d288deee7c4f17d0956a35937cfbd73c61bd092b480b35778517d4378056aceabab622127028e # 1337fe154c00e9985a2c1df362a1a6b40d7a754f + "677": e6e0c275c7300beb17d9f819d4d5c4a0334c3c315242984db7626d4beb307677d8fcd2f9e6ae8a62af4bb5e1822645cfaa2b9927dc2d987c7bf1605c06ad3b4d # 1337b1fc3bf07ffffee79fd8dca91df418780bc0 + "678": 91254b874ea5f481465944820151e503fe658b05da14962808a5e2302fa3a1917a61e9c052cc4f7ea653ca1d9d5efbbad707ae2be090be0859053491d3154e3d # 1337a34c8944ce1601c33f51165218589cc5a15c + "679": 96dd795ba1c9ccc8fc9a70f2d274f65ce877a99f9af0f4bb17075cfad89cb11b733ae06b547cd1dd117f1c3bbd204efee3f9e39f9448de2dd94fe2d59522e160 # 1337afe4806f80f4c195221703b538dc86812b5f + "680": 467d5f1698636cd8b57a02ae221706dafddb286335b0c40f1ba211790d27aa019840697544ae174af6d0de69deac799855afb413bb2460ff83fae8d95b2eb7c3 # 1337fbd5db88971dd921536f8ae268278f16a385 + "681": 465a12b2948fe8ef95e262330dde7fdee8f9bb282bc3efc4f25e39141056a38c61566aecacba433a3461310e04cc0843873bcc070a4c1e63f19f4bff6a94801e # 13374351c5529e612edc7f27061092d4d7347abd + "682": 5d7d7f21607eb4d1a2d0581e6f812af73cacedaa3953fe8ecc218244614359c36537f1b21b344e850e415bca6709897fcc46f75953fd356e6ec92b961ce6d1fe # 1337098f26f78860a98908d56bc8360f9c8f418b + "683": 54333fa1f1afb2a859737dce6afe5ac8aad84a06af7936ae0e24e0925bcde4e65d92b533fa49d4eab8f72245a09a191a6ffaa4fd92e14fc136e4d47fb34667db # 133711c29fd7b1ba597e7a848db1f78f96cfd6e9 + "684": 9d1e4e225cb54f0ab93b03dda852fdb733ee81b2e64ea32e739ba3684e92bc673008716d11b9fce56e763f26fb76f0ee136683297d4bc9aa8b87ad5a399971bd # 133731610ec4b0d3851dc285a01ef4084cf04dcd + "685": 68e9ab55f66643fce625c5cd1eed6b84df69afe269db26d36d0102df6e3e13c431f0decfa857e5eda90e42d59044a64d7bbf315565d75c89e6aebe8d0b865d8a # 13370965e6a9112befd931e52e444b88b186a92a + "686": 828e8671ce534514816dc0dd94ace074bbde50eef9c9026d7158c8bb397aecdc877ec6af3d68585ca1d93adc5613f23110ce964992decb97b6bb73aa06d3bf4f # 133772dca1e0b84f113f3766e493e060b94f0562 + "687": 1694b6293a09eeee5eea0623e70cf98537e33ea883caafd84e2216c4af418ab83afd5f087843e6d9b9da17cc13137d8230069da49359c7a5e8c2a325cf2a727c # 1337397709f36e81ba56b277761e28620343048b + "688": 5ac25ad6049ade3548084db1f4a0834128f73e91b080b0745303a4397a434cd9146253e8768f51bc6f202bc9d500f7f69b990dca4243bd899ff856a2a1e929b4 # 13374034bdc71b8c2c32fdf30e9eec5718f7703b + "689": e27a9be7b4fbbe8db18a459089b93f7207be1b8f74f1837d7d80f05eb21b060c2ae10e72c3311b6831049caa7ca7bb2879473cd0ad92572f1171fe99f78a9fa9 # 13375cb724f6f534cd9e572fcec3c1a97f3d29bf + "690": b1e68f01dfe334a9c2465c7a7d3fb1677787d7c4467f8ceac02bd06a4e6687c36afbfa8c33f0c8de015a46dec17137a1c31caa0ba5c9539285efa8a98b075568 # 133706967cfc0b39539a885fcfcdf4b181f11bf8 + "691": 2dd459f954bad92cea0dfde63c519181ef1df17f0a1dac95232f5998dfe501df2e32b491adaaa07bc6bf01a3d823eecbb66302b227a18c4cc695bfa8e005e37c # 13373ad126d5c11752bb8d8d2b574dd9c7f15cc1 + "692": a3369564b3bb810296c19707454e9c261f9a2e0553dec920af9ea0de710f7918b1b52a85c4210fc8d8033114f367dd61429e9a903520151e24a671aa00dca45a # 133751150d2492bfc8f087bf69dbe67c9fffaa7c + "693": ca415beb86d9c6ed6f26dcc4f3cac0ab9e4c68c0f02cd36a68b44ddbaaaec42cfead7faf70b6271233456dc1543930944334fe50a9f8f182d4cb273cdcb3aa26 # 1337e32951a70233e0d75f2e6df8cbcdd9216e1d + "694": 82c0dbf90be946b8264b6ce335728ab6a422126da1b77d9eb561e6ff5a903b82457f7081ee6c7d501b94d2b35f3200b79d59f4e92982b965fc1f38f8c77e025c # 1337f20b72ebfb60eb83557779c83b2fa7266d96 + "695": fd865c326abca8dc6f2486a8bc79bd85e495db7ee1406f3b3ca5f3540f05c4e6c5a99d9b7a766bb0abe95b67af2e16d90c3acec162d081915e5cd8d6ad1cc9e9 # 1337e7a2e8a7885b3355a983536ea9048893ffce + "696": c989c608dd12105194ab386915e6022de53d236ed5fd0321a7393b93e37e792afc691784fcd073931725504f75a445d1ab70b5e942d7c649a2b7103a49f60d28 # 133777911ff92be543f7e93b9e93aa46e4f70ce1 + "697": cc9f3f68f77e64dd168f054fbde2613fd40ccbce072b1112990df6dd8d628b158925e2a120fdbdfed4f9433d77e49b7312ceaca6b3eef0cd94d1d3217a4dbab1 # 133784ce079e54dcb1be38f464430612adccbb56 + "698": 0fa39937238defd9650567304789983210205625f3853d285f5fb8eb15fe6bd2526b14b6297b2cc182615bf6632be1644f8ee5525d8da9ecf4e8247299e9962d # 133754a34053cd62662f738dc9153853b76c0995 + "699": 90cd0755a49e92ef087f0387eb397fddd973ad904560c35f439a31f7b48d14709e8dfdb6c20d05ffa7bc96bfd3a5a9fd01fefba7fb720c52db6875a99e9d03be # 133744a00f7b8b7c45b77f2922fb6fc5ee46a261 + "700": 8187db0b7850baf8aa53199e5020a82f973247d17043682dc4a423f87cb6401ed66b675d22d570216478373f8a665bb70cc70886a42df1e6c44f7d3f9c7f2bd8 # 13372b362ceff01806eaca3363aa9581dcd1ae14 + "701": 02c74738d250b1e2ead92c2566c0e16f99da858157111aedbb264579efd9ca57f4dbfd115607bced80bf7716bc16db1f69ef4d2542028fafb104a485f8ebc24e # 13374270973476d96a0a88db3c52f874056cc7a4 + "702": 4950664aaffffeca5c2f48cee5345ca9095b75cb38366bbc99ea5a8bfdbd866016fd46cae1fcc1400b06e22108554bc088fc67379a38f054f1e48c3595aee12d # 13378dbb0fc105e8b649a8a3e94b0d7ed3b412ff + "703": 98a1a872e083f72078f0fffd78a50857a56d14afd5d8a66cd4f2088ed59a39aab69cdc202294c68d0992629a4272815512d0af8ac8efb747d07f6cca4b592735 # 1337940346b1bbb30d4aa87c08dc7eb4bc3f895a + "704": c54ae0506469e3c967ddc954b949cd69368aeae9a331b5959a1be4d7e8b0eed3732b79aa52e4b214e7f6775178969128d7abb2a997e0b98c33d7fe75d668d009 # 1337cd0de968eac438b376c6ecae8c4cda59b097 + "705": 84e0efa416995793001c71e37244f2fd17ab08145ecebf6641c46a736c38c8a47985829d5a670c95d0829e1df8d591b4e9dd41b64874cfc48fc8a97bdde4d3de # 13375a1376ee25257ef36a958332cbeedf60078d + "706": c0ab3988d6449406c1b6a9e809a3c850c288a4214888b33473340f316d7f7d75af1455c31c0ba8df1db1c49a892365d7ed9cf468b769bf4b3b96756f326cc84f # 133772da4701f0dcc7b9a2458646adca162e2836 + "707": 03e0aa2e3d19ef575adc086472ac86964d32ca05562ce7cf29843ccf7ff42319254b2c360ed946f0e748d8aacb98f9b48838ed74997720b12bc7bc61532cc8c7 # 133729558770a67d3e2ee72a3268f35f96d9ae20 + "708": f339cfc569e1a55397201467c1466d61fe0bb59cab12d7036609e9c4bebf153ccdd32392e8297cd45e8482e0f2c11f2ecfd27136763b9b4861f117a1edd391d5 # 133788140aafe0234f03f32f8f664e572d8b849f + "709": 833e3c652dc3d865b00056085e5ce226b6a4b181de3f0f3e40024f739e820620537067952a6f3ce95a6ad2e8efdb52d10fd7a64f96fcdb357642d89541d26d86 # 1337156f068ba5ad10530b483b4c41b044e263a4 + "710": b17c9e888a50a1c7bc5acd1dcd9415b842560f64ab516847c997a7406f9fa8839518ada14eccbec94f512dbdca13932f1907f4844012e680244f248319a92f4d # 1337cabd83b503478fcc4ef6d72c9a3a79a1908c + "711": 04d5846c53ca08644ed4cef88465dd788490871cb2de95c0a818d982ea90e5a0864c206f0f277aaaa16d4fa538ff478711b555322fb3af8cdc3afd6339b79b30 # 133745abddaf871d263672866240dfdae76de77e + "712": 3c6556efd182a7bb4f786db62d5e6476a9ef82cc1e1fcce1cd444b8d40a43513735e71fc8b98628b6917fd0967d704d4ab026ef39610a031e9b8627b70b36fdd # 13374be1e686524219697365c38d2683a7b36549 + "713": c10d426db91f6764621934f3b8a8db0ab9c40d75881ab640ae31fc5dd8de2e7b4164a863c1f3aae54c924f372faf6752e8a9ad965c0283d54b6792f870cc4fa5 # 1337b0266fd32f4d6612f3c5d1eda80bceacc841 + "714": 573da2db2bf290ca89305742404497f89da3c76e7e459153a5ed9114fdf0b21234a159f872024455a2e2a9b2454244e64e0b0a60b37471aa36d5567600e5fae6 # 1337cfb91a9795c199b8f71bcd957f0822fdcceb + "715": 991ffcb32f8dc57b28857a33350d184957a34d9f12d3525282147c1174846a1ef356223c2de683f91e62c000713acaf047e5d1e6e941c32763c4bf5f4ed0988f # 1337db38de3f29fbf031b045327c6e5c195bf0dd + "716": 9d9df559ca2b9a4c5e62ab9618e886b15c69e4dadceb60ec6c523639701b20f2a377a82418d409895711fca43647f1b3339595ecf364e20ef6a096194b58ce49 # 1337b735346c8ea96874d962c88e1793961707a7 + "717": 2c077ef54e65de67986bcb47065ba7b64f24cd26ba6ea8ca2a1c184869b80f2be95a91fb0d5e2150eff11b42c19580442b9a88df4095abad9e66cd2dd24a59c1 # 1337e59db36b345991413d14c53d6a8f0298dfd3 + "718": 9ef11eb80f55cd49eb9d99ec675327f84e26270eb219d94d5224a7eb0acbb493c672975daa6ebf13847c201f8cce4373b28ccaf668b2c3cab0f5a7cb8b3f4573 # 1337cc44c3ccae85f1ee2ca79bf6d523e8402bfa + "719": 9e207761b49a05d1e85ff1e340479044b9024dd4dc2dfd4d454dc561d15ca813b503eb3d0dd21d32fc0d36d88ddccd45040069d4d0ecf3d6335c3f41887f0ac1 # 13378512dca36dc726590462ca623db81a991e2a + "720": a0c88827bb374e7b6f040d31fb6e6eea2e4ce98e0b683af0b255110c855a8e69ea3b537ae1de905e82e74352324a58eb07e3c11284f9ffe51bf13d66399fce9b # 1337d5f610f7d1f9beb0d11b4ff9d16788a17ff7 + "721": 1a1a0085ef406f18b75bff198ee5622d1e99113385868925274e05a870f5cd87b66b2ee2b966a1684dc12a03e14840dd0577236858c65d3ead340d0a7f44ef4c # 1337e07ef7cb96d8ecea879f4626d125326641fe + "722": 224ddf3a59b711d98783c826681263bbc03a5963927d15eefe28ba0331532581cf08413efcab6f781bc225da15b1cc7aa7e98eeb61de1cfb77f29b51bc99df7a # 1337b4caf27a5a1863a7af317e5e9206a959ab2d + "723": 61a323b7ad32240201f80e05f7c642977f46f64d0f2dd6f685a7b30f66ce512b02e548fc02b11bc1d1c7ea4d2eb04d370e8bb511267b53472c6db13c81ae0082 # 1337584172179644a1be424fffcd889bec4394a9 + "724": dc534456484844d1ba95759bfc7882dacb162805c5171a87f12d0ceed960c9bbe98353aae5c66b16202c3a18543b78df8f1ab93a8b0bc357f4e9531f0e92dde9 # 1337d6ef1f3eec57f127dbcae005dff714cde68a + "725": e5e078b358ba2089cddfb731ba30e1bb0f1b9aca76ec4f5945d32b09853c692af54c246c17c94b83765cffbdc68c2e8eeb3b330cf349d4680b568c6cbc534741 # 1337a96ab7b23acb9e68c4c6124a7406d6807195 + "726": 0dd7b61c74cdd0870189c1b983ff6ccbd712cc91dec5ad5ca62ba02f9e3acc7c2d49e93cfd2e5d686e6fb18a23b094235c0c52a69e8ce6df896296af4ec995a8 # 13379d4eaf3882a00aa655660230290ac24470a6 + "727": ab3d1e84a141f9b982126ae1327439832b3e2cf74ff4c601f6f3961e2d3d40733c70b6a2a0656ec602420b93fa87a32dc70f9149d4d0cc081be25a0575f68f22 # 1337611602c7b250ec3670d21a12c241480856e2 + "728": 41df749e17acba7e9ff7a42bbfee0d5cb685ac9bfadacf74d3e1784153b104fa9c91b446d92d333a638340e37ff838ef9e9de088b78ad1eafae2e707a8867de6 # 1337be9dedea1498281b701e74066728e6992927 + "729": 9ab68c3e9663a7e80dbd083f00d6f2a3f964a9c79dc4f40eccd8ae921c4fa7f763825ac3dbb7d8e5fe2bd5f52588e55883c22fd5f94202ef51beb82462f5c1be # 1337e86af8715ffe6bd8b60e97a59555164456e6 + "730": 7c5f8941c595c7769518d18e0524ecd0d76702b4dab15ec9a599f01a742be91df6f85a87f22067496f4b451939f990ca8ea45110357cdf6efb1dc11af7c1c666 # 133794baaf39c38e50761c92bee13952556774cd + "731": 927cd9220f01a00de89fd4611a14d1dd44ae30686c84830e116487c75767fdb758b2e76b5b9ad134c2ea77b6f0da8927db9b4293e8813f78b3d99ee07585ecec # 1337bedc29da3cb0d3a76a7a570454b94c072802 + "732": f88d1789a27e1ec2a6b4856d2c582a88135faf608454a0577f7029f40d44eccb56e8cf583e8df2fac5b591d750fd988007b0870745e1997a8590c99e28431fa8 # 1337e9bb968c1da5af83e758cf3fdee77e1017d6 + "733": 79de5b70b7d491e836133e7388d95b49b4b2333dab6beb7f086b3d3657e17aafe6b7a086b3fcd7d62da7f0a96767a4ca6025c5e7756d465fb5785bbe27fd7fd3 # 133791590ea25273c7c579935235b1612b754f4f + "734": 9018b0e20375cd4fad0cc0d0ea3cf16f13c316cb95d1e3f16531f3863ac29fa48e9ed7132453c855729581000cbefa2b30b4b3848ec1658a65d368d823782540 # 1337c649e28da0df3c6f1705517d537f9cc549f0 + "735": e33d252c963152c84e7844ebcf00e6afafeead7fde5d24d42bb5277c16776c005d4358ed7dc1f7144784b19e0417551ba3e3e39d3b9443546460c091e7ac8e90 # 133770ce6a4b4c75ba51300a438dd2bef18f3932 + "736": 81c73ab688996df705cd5deda3e081c22c7e16068f6c97ad13778d226e94b4eb30720478b862182e02c048bef751e6937a3cd52ab68d4456c48e330cf3f72a04 # 1337538d5f24d62d5e6c93704343ec0f339f84c0 + "737": 601bf7079e5e7731f512e34d244f1dec1a475885ac5c5035c810a2364984bfb7716fb76d12b831b52313ca5f7798dbc2f89994b67b77629bf835acb8ad79cc9e # 1337a5d391f26ee274d97b10752cd5b5d043f313 + "738": 823c4441048d2eba08452883c72046bd602eb36430d176730df9952fa63e7454b8bf036c8432596c90289bd8bfbab25b10d37280964f6743aece5367e9d74ab6 # 1337cc0b7370dd46ebf2bbb97450a7a6b0368c7a + "739": 79e8c50b6df7c9db69d3a0c9c92ecca78a2e06e070b139be0827c9bd862cc1246eab4bd7b89410a21116589d76ecaf34172a9a4dd7d55adebe3965a6c4f1a7b7 # 1337da10b237e48560932589a27be81ec760fae5 + "740": 9e148cc8eb0f54994c4b7952ee121b00ca6e3eb61b41b7571ea55b023490994907fd4cd3ec05d41c78375a8963c76d5ba876848e8c4b6e6497d06ec41582a4de # 1337430032de58f02c6f436dae33f177a26bff84 + "741": af743e64cdc98c8a41d11761a22e85555f51f54294072823cebde6856142ad86a7d68edabb4937722c81e6854e9b173e45a59ccf165a40f867213cad8c1da93c # 1337f9d976546e8918481711a139cbf9512f266a + "742": 016d485f6c146a5b6b3e40083f4f6da98a5ff8ff72f17ebb442993caef82f8190a04a5e6608280397405aa361b05f168b2f94f01886e9320d7a6371ce8b23072 # 1337f71a2da0f0d6aa0694ecf0a6c5a6468c508c + "743": 5e04736463a3f771e02d68377369e79cfc02a5a47b3b74421851e0c0a33ac416fe4a32bd73646c159dca65be5dce2e456a2fa5846e6596d4276e194621a2e654 # 1337453646d4bb5dc217d8e4a561bfb010a536d2 + "744": 03a8383ceb22c64b66468848ad9cc1081eec61c6c810ea01c0598070fb5eae59940a158c8c6f3317868a673938997f09e761f300668d1b417a2040a34af7e448 # 13375999b4a5f631512957751200de92cf4eedca + "745": 2b2c24d68af42ea45c7c76c0c330f39b5d20d994b312af75c01ac0d31c5cab98b003750a60a2c1ed809f90adf4a4bc2fae05e3d309ce30cd791f21451c535920 # 13379e09db505715f556938dc28ad8c6f56e3f60 + "746": ce4f019007619779c8fced71cbf1a0d5729f39da1948d5504a82c3ffeba437026d17a91f76e822f367e8d19108525019c5a0beedb1a8ec4da2496cb99d42d25f # 13377d6ddc0375fda070364eebc9f840a9601826 + "747": ceb2491fa90f491f1598558dca618139b509e290ccef48e9ee8c50177963b386d8bfff4050970feb8f7a199ff274348e733402868a292f5c66cde7f0b0a39cb1 # 1337613d8bc4bac98ce9a5d157487011b98a5b35 + "748": 04264b0df0c9860ab491f43f396c84c977e86f8f203a14835e7b9d37df424bae7db060c3ec283ce9281c004340ea465dbc587e6c479be7ce5a95992fb5d8c8e8 # 1337c0b4bcb82627b9c5bf5f6c3a53e3bfcdaa8a + "749": cf0ab6ce73a0ced1abcef26e6f11984f0b6e27301d8792beaa98926fc4f80c4409e0b257df6c0bfee1ff4c97ebbbdca86ac38867c713931c99a2a10ca2a8aa18 # 1337c77f8b99274861f083c24053cb23625541b2 + "750": c7313d4a113f3fadf86dcd0585f2c7f67bf21046d739d6771cade9a0b290d1f8f00f72e10b55c74eb365b0efa727532f7631f1eabbfd96bee39fcd115818d42e # 1337d7e2fb77b7316a2c491e64f3f0a58624188d + "751": f4fb3126d5ec3a4b9c09eec8bfd2dbc108d033d05d0cad1cda6b6964921812a2a298c36517f369316d2c80c60a7ea40ef025465248281c2f0281e3e13c427fa5 # 1337a7666de79ce47d6ecbb432b1a2b479085c5c + "752": 791cabe5db43e293f7887764d4c00ebf3926c2a1f205fb34bbebe18f8b43b63b058b28c3bb264818fc73f17b870e7431eab7af0fb2c0ef1c1622dd472c7df550 # 1337fd7548fade22b5d96c5833d43e1ce6612347 + "753": 6e321e3a12be74ac30ed8d004dfeefd9354b816621145867ba1beb9b66d2fbe01f3a4bdd5306dd1256e67aa8eebd6745104128a36804891f74041ee0af8f585b # 133770e4608d034f3a5607269c19a409fd5bf130 + "754": 8d6ecd271fcbbccd34888e46d6cc89df04c6769fd97dd71fdcfa4c8c116506f163e7a6ef53cc76d6c58a5ef9e3fd70edc1258e1c892c7e448a14abd4a076e308 # 133778dccf2ebf19d7f48dd3478e245bd95567bc + "755": 4527f8b3dc610e10cc818d462c8fa27d90ec9654d1c102a5c6e74e10dc7763deb25297be0af4bf6946698a791deb515c4c419bfdd65cfd0fcd3f79bb7c5fab14 # 1337556b5b44e7e0f4701269a568309e735d2a63 + "756": 1fc1757e99179fdba9465763c72a12758b3f10e76634c1c9c5613af3709c2e67476093dcd58de3b0d6749520457453391ac2deee6aee44b8e36a88183993c8c8 # 1337f99babc435c9d65fac359cdfa3fec18fcaeb + "757": fb073ae24d94584f13312cfb94319ceb7e58ed2da38e7a5f4da8b70ae8261c9212063ac148b901f1a2e2dd84c61b3be611e2315ada5fadbe34594f5a70f7b8ee # 13373fdcfee5584744c880eebc8e62a32c64b1c4 + "758": dac3f0b3a2420ab3e9e9860aa98e37fadbe4d3a8fa27d84406c3ad6697cecf0784c43efc210060e496d3c9b9545b72f30bb951250ac8c1ae49d787747c39a5c1 # 133791c84e72ace783f7dbab1bd6fbfe519f676d + "759": e79e5aa5943880457102dd43a6802901230ddd8aede20fd82cb5e6b7713093676e1b2fe06e9b2bafac58831513e14151e2bcb79499a97dcc58308b2d5740dbd8 # 1337df6bd70bf982b833e054d45e72d598bfbd90 + "760": 7c344c4673031343b49dc61010537db0a3f44b824b5a8294263494b22fc2c2a69262cfef5f8bebe5e5e1ca276bb88ddb7c3b28698ced96963606328012f7c4e4 # 133757bf612b4c188827c63ad060ff31fcac34d8 + "761": 05c8ec54241ce8e37c9c511c5865bb92abdd57c1638a4b5039192eb3185ecc3ac75d90e3d7aa68c51272fa52af9155ff00df8fdf77c703f931fe6e527b44e806 # 1337d0b633defd064089c823428851c0c7d007d2 + "762": a1536a34ee06d576da891e52399e78ced8ce90f05f2c84466d73733fb7fa1ff50614c92cb8586f5858aeb10de6c9a267325ad3361be4a917b433780550de6a61 # 1337adcda2a763d4c4d9f61e457075da591136f7 + "763": b3dbd2c5e3e4a3b690b663fe78d6fdac2b297961488deb742cba8d92e88a6c30981848f7844f0e3be78162b3c8f067b8b06485e21722331b0c7c4a1803e1d500 # 133761abe15b1bf563aa28e76386296a14ed279e + "764": 26e363ecc0012cfdb78739be6df76a13785502ad36f7f3c6b6a60fc5656e591c69e800b2838662d9ff3202bf28e03117eeaad75eca83ce5346f30e480c461a02 # 1337568b191664c70b016d1145d81e03f4226354 + "765": 52bb3af7627ae9c696930451b05a264466828146ad1497940ad000ef01d2c4895b00e4b928f29b396c7b287c2f0b00587eda032cbf3d0e983c3b04bcc9a5ba03 # 1337b758cdf991dd7c6f17d83782807a2bcec842 + "766": 46127913b54167df6b0d8cfd9d8817f2f4b56c152191c1d16c31ef8c88f9c2baedc970fb60b43840fdd02759dac85a1f02ecef9d773e3e13e4502b0c81b38fa4 # 1337474cb6b8805c5cfd186cba801d5432dd284f + "767": af9cdc4903a7ba76db2ec9775c3f68ded1b1621231cbfdc7166fb4809b8a38d86c28275ca3b61fd9c6dbf826ee50c9f03c13e9201be40731fcdbfb1d70731b92 # 1337be0a77c879a543d3be4c01e91b33dfb9f843 + "768": 1efe29fae083f7b0a5d9856bd08e61afb6fe75c28c264fadd4ae7f904704aa50215a7bc93bab23d1a5a296d9e8ad2a8437452163c084ae15f5ad88ec7fbd5ed6 # 133731a881c26a681a07f5a64bead1a310cf3677 + "769": 0a8d062845d81aa5065dcdbaa4add458e189d7bc59d8b447105c6b15d4d7a8bb396801eb299c8426435c2a636ccf4243c04d367facd11a3d15f191c2464113ae # 13377f14049e61ae3759f148f491ffa28b10d493 + "770": 10328a72a55a82092b8e14f5a019d7fece13b92f81eeb5a8182cb4daf6291e239a377b48eb8c241e20c2f439d4fc10d85d2c79ff6efc22295f9011e32fec4f61 # 133747e84324cae762c44e719d1019b1d1519053 + "771": 3dd2e8268749027ba65a723c546ed668de3299f2eae9e777a38ea1c621f0c8ed44a6f48101c0292b6fbdd2704bec6b7bdafab7199aa48881eea23b7968ef8147 # 1337de878c564914cc597502232681f509b58ac9 + "772": 823acc653c2b241eb60b0f3af5ba64c1b0f7b6f21d621e48db912b15313c8bfe7214ad9e45bcfb516878c117be1d4b33b5e004313edd942725880e5ed419215b # 133794063f733c248ac18783e5242834d73f16b7 + "773": 10305b7ecf09df56ab4a9c777b25d5ed2242160fc762d307bfd86a14cbb39df925e82c1abe5ff3266152351492d70d3f802dbe284536ba8bdc747cb8a77fba01 # 1337e8b7423651087e1825e0eae33abf609121cd + "774": 4df469cd1bf155435b0393fe5db9d9df3768fd82ced8d1f664fe68077cdbbcd7bffe7c7354ef7e63433721407527f3fc2cd05796fc6a495c8ffefbb3ecd350bd # 1337211da5959e75d20eb860176c384324b941c4 + "775": 3ace4237f011f99354c905225881ec4d39c45608e1d968f176f52fb7c0d3f76e2420ec2309ffd206dc4270dc7cb26d50bd33f6a5be80e4792cea55e4f313f933 # 1337bcfcb0b1559a5b0a1d236ee29b7dcd29086f + "776": e2c5b6f54515200c4501ac71aeb40ddeec65ed18b5214e0c6ee04cf3ffa72ca61011bb572d9c47503d05f606d5e1fdb19df6cbb0cc43fca5a3fe9e805b826d4e # 13372ff5d74dc29984c474b3e41269a67cdc81e1 + "777": 05d8d9066a325993e833fa89c772417e539586c8bdb8aa59027902b4fb9164dd05a47b8551815d67e5b7fad47bc919e22152f98e76e400e2156d05e1ccafe3c1 # 1337d5bc9ef9d4a2a4abe5b0fe64521379767468 + "778": ec6da6a2a0072cd8d67f2bb69a52f90e11711d9b1209c10ab641db46bbfcca1319896e40ecaefdbcafd80eadd7b8b9e28964eec5b9b0e6698b97b2b40b5ed64d # 13376e9a9a4044b9db5cfba54c24fe1ec7577f84 + "779": 478d09ba0935fbc34c336214c108cedefe22d3e5333b73ad1f7db832433c92cee207b63117d49f24a77b4e1c4db47b4d61680a938dc2e5f8a1267fb345cef861 # 13379d688097d9826768da76a3e3a2867e12ce11 + "780": b1faa8ea278a82495eb6c03d40b638e774dee4b9e7a2ebca49af6b3a40a0616d42c27012ac53e6769052de155a9e20af667c67dc99097e9719ccbc4117790721 # 133755fb7b1ed0505b2db249d7e80f8644d8c792 + "781": a1a510d2f039076ba7747e3581c9746539770f2d80c3de5e2e137143baea68dcd6dedec406bb236a43de6b628709de92035737d5e49b41a75437f2040195fc62 # 133770dd6d8516f876c3dada9b39819998d6c18b + "782": 5881e351f3b6a6f75d9791dab13e1f956e2c1dc52dcf07b9e142382896b9952edfb3b6d67ffb51679a32abb7c7a88e55a8b027e3d880ca46c8a46fd3c45768e7 # 1337cf2d4fc065e44ddc58ce5a46f1b5c75a7c7c + "783": 7e0bd9d9f89749e83173d452d64b84c83dec5b68017a9197e80e74e61f113484369d61f3fed69e37b645f8db9d4118b48fa7fbe2fec1d89201d9f70a64a597b7 # 1337089cd2b841ac6b0f024ed186185edbc2b878 + "784": 2c4cdbd901a4b7a6d6d75bcee7498f5353e35992bb916b991ab11901b67f0de484958bb495e94deb0cc8cc21a1432a8ec4e7ab5fe4f45fd0c83d8d12fd501ec8 # 1337cacd494aed572f98514de78146d2a0a506fb + "785": b0b5119da8f9ac6ea494e2ca94a46590c51d3589af91ae64a568e2811a50ce68b635026d53cdfcfeb8679a6b1f13ec5c1de14d1961560d1507842867709bb2c4 # 133708a8231ef9eae7be6aa6662b4458755672fe + "786": 4bf951a2460efc1495f29121b72a1e25cc8238459bb2cde4d959688e26f72172b830e16d91fbb86ac3f2593d2317456d1c0d3ad492892fa786b075f8e79e328c # 1337ab4a2ee299945705af8edfbf35d04177dd16 + "787": ba1868cb2720b2ee3571ef034c031716a686f91414d030c45f51cde99923735a547b804c700698b6791e1a22c0c5b2669dc930342d0808c3cf0c08608642b27f # 133747b1738c0fa58f6a6c32e64dba7dbbf083d0 + "788": c74c0506bc1ca4177190fd89b3bdef56e90c40265b9c89af799835169c5015f09bd6fdeca333f1f00fde1c6f576ff93d40e63d8a6d51b77286c0231b3b1a3b8c # 13370ca0e52a04a5feb76ba81bc2f49e1a208709 + "789": c3b67442ea94c7cc8ac871be79c7bd2bc38d6c9fa0bc8f7c07f0ad1ee97510492149ce8c68cbd29952231ed782b0fa4fbe67708a989df14f40de7a6f4f2c3669 # 133784e8676cc974f5db2049d0ee1511f0fec954 + "790": f424312c2bff26f587e790a9d264f04ea57f56ab5136d62fedd90d2cec27fbc0c75a8e92d0fe7a72f1d4b7de4043c1ec1b27288f40312062df544d4d0de219d2 # 133762ec86dea701eea9212cdcbe8a9a2c58ee30 + "791": 084331dd94fc1994c8e74a39031a2c00c50a2d8d7c8d14051b9662cbd7a28d740d3ea48f346285b263a319682709901b29adacf55c57382c041829cb4ddf49c5 # 133712e871651c81e5b3875cbbc1eeb924dc8d96 + "792": 44f6aa89441e6c7ce3016db1fdb7dad86e2b54564599a45fd0536abf3b52af5c296a95bf056584aa582fe8c85150730e96080f03b81b0f32df8c7e8900affc88 # 1337b867d17bed9e19e26cce8440e68cf8f6d162 + "793": a550c851286d05aafd04138a36409e529e2631ad9299cde424bc25ac87cbfa33ea788f3d8028e556026a8ebb4559533df5a4f43e2f127fcbc5e5512b1cc0a898 # 13373abfb0f04f5c76504d4ccea96301200168d9 + "794": 0573f8a3018e397d6845dc9108566f1970a9120d054f6b04692beafefd93bc1b00c54c6e6bea39f38a2e95570d0819a8f6c4bd7b32c9fcfb345eaa9293052ae7 # 1337e4dbb70a5f73a8af8c1769770843a790a2b2 + "795": f8ba2685fabb6923c8cbcec162926dd1ae8df942d3450b5f0149b2331d8cbca190986d4d4e4fee5089bcc096670749755c6caf76ff20f8620387710e5d0cc0ae # 13371ca237407878a6b26e2a11a4f118ab99259e + "796": 5beec87068cf5cdd8f17caae31bd86b533b9fda0cc22c1c0bbeada04528c8ac4c3cf36344b9ea973bed5c3c617db4b3e41e5dec7eb3e4fe8071d9b200fcc1134 # 1337da65584615f90df77a8e858f9d484362946f + "797": 1b12203f10ad524ac858e9aaf21d3fd5a039fe8f9b4d4c1f15d3f4d59d151d8fc35fe1f19c0a0079e6bd7c47302af6d329a412bf9ac57e8f54d085380e0ff756 # 13376fa455219b2f588c6b32814dc87b59cf4bcc + "798": b075f0f4112a00d7bd7c34f7af7a19f55f63618ae360b521856ff1642b8016a9dd8825af79dbde31e8dbac4f5eb9f9704f5415ccf1ef48f9c9f988e7d8f661d0 # 1337e5d5cf11162589944e8adb1deec1e85e370b + "799": a1fcda1086c4a928936434a77d0836c475cb8c9e2ab187cab7105de76cbac57ebfc0012c86dbb95b35173e970f46c13bd654d2d7ee3e66a004a570f1ee2e2cf9 # 13373aae738d992899c8cce68e9b249fcc9d6413 + "800": aebd61c39a30750b9157e084a673bc19b80e11ed9708d46d08d4b7a0ff27bc36fc679f1bdd66163265c2d6e6284b2b8b0f6e39a2bd55e07c0adee998d477b93f # 133738c1d1aa93b84973bdeaecfd9b35713bdd29 + "801": b22db2c85c363a621ddf3b3c40c4a108db5c86fade5e41ed7a35f81fc4b77217c8312fb5fc20b5f8e2981b8844dae5890fe1f04c66226065537f3ef0494c8f04 # 1337f42799fe5f13589b60f849a4d1a0ca2809bd + "802": e59bf5e43eca7848eb180e2686fc69a3aa83753fe60d57666679457db848e09c2a4eeaee5f274a5c8a2b2cbe5939170897af2241a0852403bf77a126731c20e7 # 1337966c5a5d1b46eba2f37620a894cb1238662e + "803": e62c9da711d7e3aa8e85dae3dc59c13b90747ace92689adf43f05ddd294103693ca269e5abe2a23881924aff4947b19acd1ecf0360985a0c152a81c5027a9dc1 # 1337541ff8d6279b1314b1fe7650bb757fa80fff + "804": 352c1aaa992066ed0b985e95cff0bcc7633cc08fc516be75cbecd3cf6e8f8f3cd5defac7f6d365b586260a3e19006978d2b391d780a467c2215472993b78bd05 # 133708f6c3284a6bc65655f06ec3e3149a5fe044 + "805": e2fedd9ac47a4f9b72f06d0fafbd23cf1798e059444f122789d2d52c2a26b8581692d6a97130d0e032f0a049e5a22bfd5f7d39ff46f554d5202bf9500a5ebfdb # 13379e65ebc17c77e158bc5d89203edd921f6983 + "806": ccd1779da96e465d3671c4ef6aa6150cbd7d6b949758f5170447dee1ed0c0ea539fcb4fc4de04bcd36e7dd482c0434e464d98fb10d645bd08fefdb3242f5acc4 # 1337414646f13f9b21b556be57a21e2a115ec778 + "807": ce9e691e97b8070a45c7ca076adee6af45c7de7d31ded85ab2abbbfaf190e29066ad1b9b7d8eedcdb6016668d7bb7180ba969ed8ea86d5a6dbc32b5ab936f7d0 # 133764e46109fa2ea36819f6c7224f8146e93a9d + "808": 3ea4e59197ba242d4510cb94819ca74952c7fb4850e0d483d096ee4d6f5bc4add03cac607a9125ac142ad5a713d806c57752ab68faec41b5c3517e7c14bcc502 # 1337b8ebf088ae95fb3d7b1ae32dc86105d84832 + "809": 9af6c4b090e243bd3a727d3210b5f8dae6f09a4276fdbffbd14ee055d2e2a9393ae4453f629cea8db9b56f6e7c60aa57235b3c8a3983e7329e7a6c9387eeb2dd # 1337f81b1b3e1b6a657935aaafe37dc0e9d0618a + "810": 6bbe994fac377994cc57e0b9f019242101a2a2e007214d13cad5cebf0b9243f0885bd51053ef9d816d1f4c199cbcb3b9728d7955316037d94b79ed4e339f7c67 # 133761dc786ef4b408dd507d33a27acf9087e856 + "811": ed6b160ef5da38aabe6e515ff14173975df68f09f0cb690654d1ec63345adef7967f6c1c6bcf416e6eb8ccb954dce8da5c27df20fb0f0464f0f1ce053adfd314 # 1337214e03a31d0a7d73f81a8e3d2b7db7e453dc + "812": 0a87909ff98aa052f32d39da2be4c8887e3db539a3cb3309be426aa6d41f05dd2090568d6dfa7011ff5330eac79d1ea3dd80e0b6b075079dbe25edd5836248a0 # 1337c6c4105b4350cc5c5f3d5483e6b269ccb387 + "813": 4f2f76604dd594c985bcc64c23b09ed4c1acfcaf5b47c8d65666740057e2a1a3fa1abf5dfff70810efd57e32089a83ce914b4f7b5b4b79ee0d5679e6a2a5f3e5 # 13370f664b61186e752ce7695b48b556e006754c + "814": f6cdf6c32ba01f2497ef833eb9514a7e43ea2f14a6cea29367041163e9cc6ecb9a165610eb4f83b0dc1c7801a5fb4f8f288bd85b810371698b8fb8eedacd59ed # 1337a68526e6df1b00013c62a7ed111abcfb12b9 + "815": e24b31314f1e696d43b03365b18f5a9536e4cbaa9538a1c88685207b6622ad861bf6ed46db4a0d56d5564a3749b117fd02d4d4323eb7f8381af83c79a6ae6055 # 13376703c430741bd1af73eb1ebe9a5986eb6015 + "816": 6e6dd035b9526a90655c6fcb755285e95541c63087380984acdb82e3ba20648c10b6917a1274f9b36612e2008625a2a5024af04fabe6daa7441e590bd3851004 # 1337f728297bbd0f165760dc17cbba0b3763fc0e + "817": 8f6587a70dca402903aea448534b77fb9ead47a874ade086e8f9e710d4d78a4d2db9f80ed4f857ba3c588fe3410b64013881942447cfd0e078ef04769b1f7dc4 # 1337f67787b366f106982d981616bdd1796a4100 + "818": 72385d1d3ee6fd978e37a626a90da567d4e5ca41ee612110a36c8a42db8da184147a4cb633d161036c52d8636f9b3eb3b45bdc7eb582336f227564c7f5f3b19c # 133708a41f75039c2f73f95819f483a6f66a4695 + "819": 7416479a23f9c601746aeabd3b6b19c9de2ce58722d350d1ff7b8854426f5cef9412beb61f2f860522b088e5913450af420c7b9c137077b0641b8c953680c124 # 133712b5b85d3a523e6b833474946c86f9a2d3be + "820": 8167b1cc2cac45dcdf7e0fa32d1e41e07bfe997c9a0609bab14f87bf1b0b78a3478edef245d39c865a7101e8fb55169d76d83ddca4e3049e3de7f21b8d7004e5 # 1337eb29f15637f3fe75d1243369bf476dc74ab9 + "821": 38fd3af7b22ed60dd670d19056f0a190219356bdc36551732aa435396583da515e61d26ba6fb1140a943be58a68629c2d3c8800f7149a459561ad67c1ce41164 # 13370d0b204846f89292f0fd6cb1fb667897362d + "822": 41e717e44bac39958d8dde9e550db6bda6ac7fa66851e86802e411e34690dec1445eee0f57e66c4e847f61b8c47052bd3d89f34b0d374bb713bb651a2be19f26 # 1337ca545786ed45f3be183f661ff8b2194a9b11 + "823": a2fea0573ec1600b5ce21fbc5bf3f235d4888902312b12c7f2151d6c5a3238e353a68b34b203c27dc07a0a9dac66dc72b97ad9e6a0cbe10a2d9b3759aa0d7af1 # 13375354c5a172e49780dd4bdcdb190a9692e981 + "824": b21ab64742f19556b78495b3df5bc5c80ccbe2fdae16060d79aa2c54e57df2cb5439957457977a38f40d4c93429107bd26e73fc43fd8af05863d50f4875f83cd # 133768fa603036019e71a60cb7450525c4bed489 + "825": b23f8888f9b8687e2a4e23d9545f1af4f0b86b38178e9aeeccc9754885623ba3ec1a7c085e0ee636eb1b2701e5dc52897edeeb037a71a8fd111eed02cdb101cb # 133748d3dfecb376ad5d105524bc94c368ec83ea + "826": 198a3f66fff1b56b33f2e430f27d00075f7d1a9131c609219e98b9f89f6c18582c7771bb5d9f51ec7cb89cb97f1ef7be965ca3bc811038e49089172a3bb17098 # 1337d6a72d68a27fe7dda301be7def4d2d2a6230 + "827": 01d842c5512643537419362ac9923b54d0d5a073b61d91013b00e6c01b9f1ced9fcec50d4be48a3dc8a31ee3d40cb576464e3a4e32665b970ec12e9f64fdd48f # 1337a188e09333f999cf23262cc73e865b5453cb + "828": 1de705ff76c60264fc56e9f2f706f873fa78408009c1b364ebe40d8842772256276fee0c3e9a5e07382ca4800e1ee28c4287647f66a4941355ac25b4eb1f34c6 # 13378e0327ced1544ef57ee3748805018b342180 + "829": a62f43a5f26562bf9cefbc8728374a653efb27df825dc1c00481390e8dd9b7892385a3108343f1c1d101d98ef78d3b0dca7c2332cb4d5d680f86c3c697787769 # 1337a3376cc9e5a16d24f9ce43e4e05893300254 + "830": 285069bc5294ec3975cc7ca3e6bf8b9eca97de9a6ad55fe499ffe7c1aa8f0f5100fb92f6d77613a33576165840ac109bf39d933674b827b160e8601c28a8d788 # 1337c1a405fcab110edc621d61efda3cb786ade1 + "831": 1403decc701f74484992f0747297d880620996c6439b39e0d66531e434eba0c2345257926c3c1049ecdc0f0d7fd6db8451180ccb6c9648832a410efd7f1bdd17 # 13371b6e6389bb96ed790874b61a9a01464e4434 + "832": a040246d0a40e6d2492326b83eb13b7b0a182d32945e2ef73250639cb42d554e22b62c59fa0a4680b73f85662bcbd07f9ed6c8be897cf6619030fd793a586d8a # 1337b45dc8573045546f5b2a2f3e63fdb1350963 + "833": dd9a0987dbcd345712c3c4246d265e67be27f185a5b4b9a9d105725a163e79fb2615e20009043be74cbb7b98870261addd4975fe43b30e8fd8aec19d564212f0 # 1337c773e7766694a340ea34687787d36dd83487 + "834": af1f0c89df6d0eba54e1379c1c9cf4fcf7451407e5fd2684b8ca4f28ef79b71eb885c607d765db45059a859655318ff33d7d62bd222738881353f93c312b9969 # 1337cf30b448a30fb0df1c2a00ed96f5b3832f53 + "835": e8c96b30d3f2e926559d2d2e7f918844b4132137d3745a8fe93534bb5cfa54b592ae21fa7d378d448f24ca1b1e01e8698ecd61a8755668639e044b44b6bba5cc # 13372d61ba94449abd690950408739041e32057c + "836": 8033be7587a7d6c282f896654e50ac0ccc9dae89446222e7e5f3375fbf03cac703e3505a10aeba54766bbc13d961ad1b20d42888d7cb95664aa4f7aff62cf6d6 # 1337a912270d409b848c7a8c688fc8ccd57ada8c + "837": 576ee471eca2ddec9f8a54ee1d94e55c2e9e759e320f51470b2fc0e5d35867c778e01364129ecf3a4273cbdc834863b720f1e7e860a6677d17e18c9170901d9c # 13374f34a88b2b121194a6d58f745aad2a631f4a + "838": 3dfff1dec6a43bbdd9bd784747c200921cd9007f21473ce1a70df929453fb59e2e19263a709013105f145cd1c31c024db8b20751afa0c5546382bd6b5754de47 # 1337338ca51b3fa0aa7ad461b49f13b4856c9926 + "839": 75b553c22ca4fe5ecb8f4388ae648b6b1a74fbbc673cad0e0a2aef842e00f3b72e8820920389056e4eaf7d4a262079afc0f7d79420c0eacaf8566c29e2d5ae6c # 1337fcb668451c61db029aba010171f91c0579fe + "840": be04791ce31b821977d1669962744edcacf042f8aef3791989f8189300407b2ba40b38fa493af967bc8826d6d16709ab5830231d1e0628afabfcba47bb952d75 # 13378b62e32bc3767a00387f634673b1229c4d1e + "841": 571121a20cf5cd1b98b46a40d3a50276c89e1ebff152179533c62b8efef1fadfd4e9f702e4375b074cbc012e62acd0e3a10b46966c566c97d1fdd8e6e3e086ab # 13372c050da46c22e45393a0b19bf73fa58cf5e3 + "842": d44c8173e6b8abd1992c626f41b9a6e561180275a98a7626822bf9391bfe8dcc03e1097e860ead569d4cc8932a6fd4b7dd334f2e770d2d9ab329ee27e6b4731d # 1337910d2817d2245b2c74e6d717fe1cd0d4c14c + "843": 0d374dcbfa7ef53eb7cc1645b5bd27ae3f4d0589480a1bab8091545b19ccda5f4398e943fbbef8cb517a23ea5857172f795bf8896f63f9d11832a3a7525e4220 # 13373adf0dcc19211e6ef91c01c3c4b51e95fe94 + "844": fde399cccfc3fd73d90305229542e783cbbc4352b53cf374d13ca23d939f3ffd4ae985605327e7fa18a04bb149244943d7793d4ce76c853dbd1a8e99ef9c010b # 13377dd9269d243ce6b77d3613868b94c8b9a2f6 + "845": 19c1afd044c58392b1232e570da48dc3c77e5f837d46322cc0ee8f8f0b3fdf149ec9d306b7026d2bbfa1447850b78f0781a1b30aaf8610184208a48fdf564186 # 1337f881432a7eee117600fbcf0377a51100ef3e + "846": 2faa9fba6424673bf8a811b74640450de1b3e3831b774815e919858f363f55a25d0c43600f2fb1540362e4a6d1bd394a1ea69a7b9ecf968bde9c0fc20e1c7483 # 1337951e72edd6f4fdfa3f1b6fb600754169adfe + "847": 6420d01e2bb051959656f6d377ba0dd17dcfaac23a384e686b6e77b18006350ff8bcf281dadc5c94a822b6bbdfa678a97462de55d1198333be6f687010deffda # 133771c736157f44db96c90c1045b0f751816035 + "848": 7340a1360c8f56d0cec3e8798c08ba4ac3e3306e7a0a6f0acf12e989ab690fc1a8bb931c4b979a6b3eb55c765e6a43ea0f4582929c716ca47ca703faa478b311 # 13374a720aaa08f7852db06829b863e1832755b8 + "849": 60a7d7443ec3e9b3f5c19be11d22619218470f0cb9be12d4fc53723623145e80306f2f1bfcbf0e48a097241e2bcef00df514050a831641311105090bed041782 # 13373909b4be093a2dc554406d7e2041869257ff + "850": 26f4c98037405cc0e7131edcea245b2fbb73fd8be6300ffb19672eae3cf58fe6c34fd48748696f85aff1f75078cbad3f9fe388b144c96f7b6328ca5afc4d5c3e # 1337e178d88424fba45706491efab72bd3bb0167 + "851": e24f23bcb34f82dd06019065c8df0da6177a395da4e36e23b72162f41774d9c8c1d738c3f210ee9ef35a6a6d0553d10d3ca62d0a46f91136ee3e0b160540c73d # 13376d0af6475566bddbe3b1e1ef683119cad5e8 + "852": c94708b0a6aba2fe6d4f27d1d74201c1031081d056b9b79663a21429d6bf57136ca055eec9fa79b6c3eddfb242772534831700f86d7e4f9915427e0fba41e371 # 1337483cb39682dbe33e6b1664c7865503e8a9a0 + "853": f6c3ecaca84f6d4711f50d7f19f236b0be1981ac766d35cf63c8a5d6b5c03995bd3ba0f29d87d6319161c94a6d9d54c073b71e024a61936c6883a269808b6f8b # 1337c4334ee5ae6933b829ca861051f8dd44f801 + "854": 2b8ee7f9bda85872d892ed11229fb0ad928bd4eca41e2dcf527aa40f7101327341a1e4d5a75066ff18d155c5dfc3172e31901ce9a08fbfbea846ed198c5095be # 1337d2f437c5521164797ad01384cbaa03cb5225 + "855": 85729c1bd5e568ec33a429b64d3e973e816a81cdd99692eb8eae702d9646235f23805e8101b11a276bbe9bf4a5c7e58ee9e0474994781da95700388fa7b37746 # 13376767fd77144e8a02f868d214722fc269f003 + "856": 4c4f026e6151950f3fd85916174913a4e422f7964d06f464ff99dc5c55f23c8ffb9e56cb5d51dc1b9b420c56fac110fbeddae5b7bdca449d0261e57f40fba1a9 # 1337c96e4a34c6aed59418852238c311e56495c6 + "857": 9165fffdda091a3d706de46395844ec47a72b66497af2719c9fae0041c2599200016c1b624fa3c57b243ef64d83b79b4fafc181684c2af7d5a1185171fe3299f # 133705796d12d6b5f9b3e7dc19593c8c91383204 + "858": 6ab24afa52309fe880ae310a07b93576723a214bded14bb15298f35c6a0f9bc68951d80ca66da93541ff20803e3bcc4d7dbc58515d8db286379e517451c650cb # 1337950a753dc34e953c603c53a5a574d2c5755d + "859": 4f32fe3bf99d3399b87e206db7740f27ee5e031642ea8e7ca102d6bd26cc88ce0771149e3548db0739f65ff6c73ab0eb4e9c5aec28334cd6fbde6490691823bc # 1337392e9831f85266c81f7861898dfa801dcf49 + "860": 9e45fe059269115916e1b1ea1272a4c0d76d511330ee07e1eba3c538f1a423782e41a6a4ea17efe6ae287a4239d3ba1b6d338f41dbc7f9313f5aae90a995a2fa # 13373a58b8f0f3d41e1d235498e4875002af94ba + "861": d2df8d8f4d4e6bfeaf99331ad90717c0926befc341265da37e002600d075fd398ba0b391e1d5a0bc9e3d37eeadefe4bc47f90fd7f001cbb2fa1da9db21d4f1f3 # 1337296d3743f6ca504f7f862d118eb105576cb9 + "862": 7a86c539f691fc89a80506a9d406034689508ec9fb94b3d4f2e5efd91987ba4ac2a6062e34f5ec2a4327ea5b94639eae9db0086dbccb479a0f7261227d5f9cc9 # 133754e3a07fa83ce95d0e9b4a1bd1b7675e2ebc + "863": d4ade5d322214d4312ace43bf723e796af426220151b4d81bdea1b40ed8a84b84baa29d8dac7f437309fb22231fe83d10e8e1521f3aee107e865a5398bce42ed # 13375c140506899f6231b2f73f5ec81f09508466 + "864": ce5eb2be1759505c243ee1fffd83a4423b89cc591ab621aa52dfbc7dc48a5b5c814cf6796f030fee8acb2a3c60cd2b48a4571cefa0710a1af115836641c2e59f # 1337185b5c9401d11dd83addfe8606f9a0ecc10a + "865": c157e218db68f58f570f0d6c3160a52287b40bdc480932b9847497d11c5a0fe8243b09f3776a4db6609697fc759d3c177eb63640414b783b5e7f7303dad039e3 # 13372d28030b3e5d6f680ae9e6ef8885c5dc920b + "866": a7d5d86b2dedf2c138e658ce9f52936a8a48c2647ceb92b1e3877964ba0a5133743955f33678eec44e7d73aa1abe3bec5e7f70cac4ed374d7ae70d5d6659e314 # 133747b8ffe33a807481b43ea488a13f016a15b1 + "867": 56961cffd0e9c872ddd9fc49f629b7a85bdc603d1bdd067022ee0f9874866d83625032f2239c1da097b4ab3f4fcef5506d8bb248d55d4a1c704031d5d9a5d42a # 1337c4201cbf362b8c36660505d67ebc1fdcc405 + "868": 678a301d652905a77363b81308dbd892a1885a99869f05996fbdf8c2641eba5ae37ec43a0f5ce35a9312051a852acbe05dddb431898f4a36abca0a9db92f95c8 # 133795e4e9b91a80807f7b3df915c786675f521c + "869": 074a2a2a13b063c5ef97f783badc098a230f02f6270d9564d3dc77a89d89eb50432f634c78c71027add52e308f1c6862e7e278d5fd8b68d06798a3ee9de07697 # 1337fdd8cb19de91c0abf02ea483a51943fd6fe4 + "870": 4f5d6ffba4ef4992865d5d9276497a87f29f6f24a90fdb010a26de15bf5cefab6d4361a4c99c2e910fd388469bee292e942a4125bda92a78d39c5dc1073fe537 # 133723a955ca67779f8991c63327d4aafbc14d0c + "871": c5775ebeb041b08c396aa3b0ad61608c4674031a04b5ba77a15e5ffed57bd888de5d27c98c87ed0813b7e6246e33f2b8368e9ff684dc521b3445e11cca12117c # 1337a74f56aa4bd0f5e76efc9efac03660a7780b + "872": 7d395ab86e053ec4eedae8879d8f7c5157f9748b844a82416e4cd03037920890ce17c83472f0a69a8f84d7ec84f7db561f3d1aff29b9f169556eb90ed1952341 # 1337545285803769cc453b334dd23ddb534e3f72 + "873": 143720038677debe5dbec76621b9676bdaec951684399665646df7ab38bc6037c4b761e1bef6eb9d6773343554c42a7693fb87615e23b98ae4c8c52ffb1a09c5 # 13377ec49c0ebf36f838840769bc0528ccc733ff + "874": c95622fe0adb6cb1562e7da5c392dd515e52af23c9c34cd548d65e91e0213c984eb48f20b79d6ec96a9128f799bb65ea5f92aec43e98a31a80b7af21ea017851 # 1337fdd934d2b7c7d051d5e403f3b2d544689858 + "875": 2c8a025aa821ff125f89a5c47dc755e54fcae953b2a421f99554b4def27f24b70fff46830ed94de08f31f82779d6d70ba6b33cb36bc26a469b92c96ec28826eb # 13376c37d478833210ec778040bc38c5b075231c + "876": 250048a2decb5e44cc27f3b1b35dcb611ca5754f3da47a07394b7c000aeb7d6af20ed376a51f9778487be9278ff79cc517658e93d3501d34a03a1d1425137677 # 133701a7944d19f3975ff281b06cb7d8f117807d + "877": eef283bbd0a4507c33d70998fab641599dbee0f2727e2fd125efd86bf5d87ef1701fda1738164afb43276ece416105cd82b73ef6598a4fb4771147a0c76301f4 # 1337ac12fcb50a485c2a288ab013ed9c8feb1f20 + "878": 34afbebd714e715f3e77ed33e1d154554965daf68ad56e724668a7ced00a205fd06efa344b6b412b5d2a9fab352d5b2bed616034407d27a0c6832e0ebb487b86 # 13372d8d844329c3827d544a1a13562528d3b25d + "879": 36d8f607296e253e90f483c4d3df59e16d4b642541105ea6192cf8ff5f541817921e14852d20f7bf51b3f4e5b5eacac9f81d8dd381a2293f4d848e18f7f7e456 # 1337773816ce20db8d629ab603275809a59cbca6 + "880": bcd14fa0eeb7783a514f8192875d68b727c1705046f2a166b59efae9fd78c82f29f861912fe0060a5d7f59054dbfc29c6ba790ac7a31e3a42e195d4aaa194159 # 1337be132e49c8ea1dee1babe40c7d9cb1b25e60 + "881": 173cac82a7682b1fe7b9d287398309a1241aac1caff05988a38f3068f73c7424a20f6f99081f9813af9af23220b16f4c84a85e881fccd8a6795ee518e2246a60 # 133780b5d64961c7351ad5ab932c81f67d03fe14 + "882": dd36a114b32b755e7ca52c79b2fa5a347b8df37a2781df0950f6f0c8862ade04eb9be38abfa718afb370587324fcee656d474123b284af89f5de23c8f894b9c3 # 1337e984a9f74a9c66bd2bcae5039787fd8fe0e2 + "883": d130b13e809a00a1e987766a649dec29f96ba68c997d1ad9409dce7f4134252f1307c1ff9a109aca6c88fc8263b65859380ee888a9299acfaa559161bdcd900f # 13378933ce961eb84aef8e4d2503ba2a39c09df4 + "884": c30ae6a1b41521373634271f9c7fb351ba2c8dd87c9690a27ecffc82c9a98e1ff262b4c7d980d36cc101673785b0daca9d39d67f582e7e75bf70ce724d4ad9c4 # 133728d2c1c57eaf856bc0db749d148c34877505 + "885": 9842b6f6908db3ba46b3cba52c638e99e0ce8c5edbf34c28ae81d0a0b11049d3ab68b535f6149ed63b0a3bf575cd31e8df9afdb6c79f1c84a20db37fc61d764a # 13376dfa07aeeb7782f6ac203899be61887c2d7c + "886": ef3ce08e70b36c767756fa2dccfa700c0cac5f151ae219fef1a6c77943c35a2396649e7d9520b3a0ac30037f0a8f477248b83b573837e518377129311a7d1331 # 1337e0c93503f1e32f5a18fec7b3495d361556c1 + "887": 7732189e305b292bbcb7312b3dcb38a062829b28cd8a1bf31f32436aa7449d42a410825ab255351af32ff303c851d9d5034e291c5bb52710ba0019073083a393 # 13378c89a7308273cd9442e450b5dd91f3434868 + "888": f52d45e5975c417cc0a1402c4724551cbebb5e05b3b3e4017057f0bab30913fdb78da672b4f298726dd5bb08d698dc66bd67d315b58b1c41901c58d37d436dff # 13379a9687b4fb4d7fd92b123b999379babdab40 + "889": aabee3dd0f340785e9bfdb1219ce31257c6e39cd0ecefbcaabdd2b3bb0c6c606b00d10c169d278ac160d44752e8ce493dabcf2c8dada896cfc6184eb25d7a7fd # 1337ee915a185c1228d2d79ef6b7a3b1078a03bd + "890": 6d41703398d7e268fbbb07af817290a202d8ca8718ea47043400a1a8e6b3818ebbeeefb078fabb9e2e5ce9eeff285cf47f5cea70f9ea7983fa69eb9677f732b3 # 1337b5b92f07a338d2bd83d091d6e8ec916c6873 + "891": fa86619ddc92ffa2061d74ef8557c61ba64d99708a73295eb5ee779bf6965d4b819813edeb372fd3831b2b9c15c765615f27e46ee25207f78e2473d95ef9fd08 # 133704fd75c111f9560aa46df3faec6fbeaacf91 + "892": 5e810ac781af2b07391b87270a1a8c073b920587293f7ac53e27780fbf7e6e440ef0bd5cd4a39445d1b422f4f81aa955e97a5aac42e519915a1c7396805d1d91 # 1337b079a44183c43cd63ae2ee3da869f663e6b4 + "893": cfa0b8fa2fb0619aca4e306228d10f1ee0678937a0fe32d23baa5c677437a1c30c07abb1d21dfb23f07816441e8dd0ed1e420b8b268a3058c023ff05827a21e6 # 1337a070cc2928b03a481a4e26e30ea63ca84876 + "894": 2665ba186ea0deb0aab42dbbc17e6e04ebae8d6552fb3a940df60d8e15098f18610ce1914ad7ab571631aae358b5263a0961b70b9fd5948e7816bd1f716155f5 # 1337c4ed9d8875b5a04d7455fb9bb0ab06a18d12 + "895": 8c10e624fea3a9aa0f62d0a05526e6021464f53552accc032912c619c85d1aedc31601738d64e76cfd73c991e677065d4dbe8c51a1a32f41b019abecad268628 # 133714fcd79f5dd0d8748aeed46a5c3c43ac6a45 + "896": e1f158576988db7c6219a8f92572e72a02745e4d4da4b2ae60c09492551452bc419c3802df97a2fb4c51c5075d0e344e07f9795c53f3e41f306b71599b98db7b # 133717e86488f5e390ebfb1eda86bfaa5c51d6db + "897": 691bc76188f145d6b119a95319f07668ec19b50f6093bf88ac6ad9dce74b31a3c30b34feed448dcae2684b42300c0ff636d871cb708f98feeb65f61c5e73b231 # 133788b3b913637bff07bfd01307c366b021ccef + "898": c9b4ca0d1b34a3ad07ccf0e681b08323b7929a44a409e5d2a66b895eb39419f4dc66d29790a6764de33d500b46223117c89a6f57cf7cf066b026ac1d0763f20e # 133783e4607222e0e692e74898188ab59dbfe3ca + "899": feed0340e0c51464023dbbf0da31cb4a1cfc4eb09d241f0126e704ea6a9bbad1136665dd6ed289afcee3ee5be74070bc32c9107b88380fbb568c3e934dfc18a5 # 13373221970faf248a37fe5a40efb6f9cfd3f8b2 + "900": b05e2d2326bd8a56ae6ff1930edb3bd652b54bb3bdb5859de10f974d12b59464b281d05df690099232e213b108147e56734f3b7aed47157f05e07e2197d0ea1b # 13370e07d77adc8d5e7442c5842f41b08f70f9ad + "901": 57fc274ca1681044e6411b741ef5d158f0842c79056ca7b56e682f7666787b8df850e5684a8abe9e86a55fa7b3524c7885d0d6240f2e8fe8fa046aa54e6e96ac # 1337cccbd2a12d70f9f780a2fa3b35f5f6a1bfdd + "902": 24825492e8689bd22d9f923138a67c5bea1857a54098ceeee3d55132c7d1b42069615a4d5d792da398ed690191858c0bbb8ec410c0b182e4c0e584b600f67916 # 133795cfff4dcb1bab58847297980947382d7c13 + "903": 801f0891b56e5c0a81e2de5b9f5707cc461d5c798dbe4b5a1860f6db0ae791fdeae513b480b6c276dc412372f70ba0463e9dac83c0a6f8b6833d10db81a32a5a # 1337627fc05fc219335ca39db7a864869f8d33d4 + "904": 36f02cf784062387e64425824ee65148d2704fff962835b574504fdd493dc5ea841e8a4fee4e7d1829349d254b9e9014cbcff3f0af90fa0f67f5852456d910f4 # 13376fa66bff5d6a31ef66d58b34d32ea2eeedc7 + "905": 2fb8e7429b103ae457b6c77c2f64d66018198aeeb995e6f2015d0d78bc7b66bb63078d664356daaaad2173f0112a5c267039dc30316cb998e5c538f89c33f57a # 13371257e5515426b2b1b25f67098bd1302f70e1 + "906": de8a5f65b7274f18a5b7bcff1e3d0b3ae708d773a30b7658be4edc328dc8d0c494d9e2b45c9ffe560d078a2db4abbf20f779c8f1a58a37eccdcf92dc659e3513 # 1337d30c46d96ac406e405274caa42d003a7d9eb + "907": 1c014e1bf8c1e4b0471cade9e41e500a7bb453689169ad9cf3dd65478ecf49de2ef966e713fd7a84a31376ff2470405ea71694507758230a6db92fd089c638f0 # 13378469fc45bd07dcadfc0a07653b5b3443f1fc + "908": 016d9fd59645154ae2bf327d66b3fd850ba7fda197765113a1b34e76fc0bfa2f623398c5eb0bd526c8ea3462839514f8dcf9ed4ef9777710c20b126b07b44297 # 13378e8458302d172fe682035b8d63d6cd6a429e + "909": 033aa7547e77e1d2faab16c5da5fe660cc40fb6dc67582d1dcdea6d5ffb4b4fb3270940dc8e977085868e054dead3d92fc48faac125b667f44d84cd7e55eeee7 # 1337af467f29b1fbda2bfb44131fbe298797c581 + "910": 04b1f2ff5c3642515452d8dae86a7fc976823a11e14dc9d43b7aae9db12ac6d34ea312ea67fbde343b6d169ce2567b4637426c8039086c059074940a99918da4 # 13370b7e2187ea0dc565aade905d8ec64562ff7d + "911": 17b65cf849854621a8ade60a78ba5745dcd3ed828725a8d9792181f8ed05097d9ecc604e71b088caf555b47951a3be9e61e2b3d1ac88ccee178d7c3477e09de6 # 133760ebd454953889c8a5a63e47e50480012549 + "912": ee72979b59c181b184ee4d6069f10577ed763f713c919d75735f632e23497d742065a4b407abc404f3450e5da401a639b7b17f2df76df556326182efeb86a5c8 # 1337be0e755d326812b269bc83365b95315768dd + "913": e52b9700ae65414f1e4d300347d9e691b5ef16e323d5439a1860a47074f52acda57d240bf258f3e9dad0fa3727dc3bdf0f6766078fad823005acba72b720bd27 # 133789fa18717ece957045dc61e187136659a6aa + "914": 2296f0e08221764586349a68f348f744d9a5dcefd0c741b7eabf7dfe8b8927c75b22a33e9086ea44638a421169a75adfd1e168b33697725e4adf8ebfad520af6 # 1337f5b8104600903661c4b8edf64f0c0f17a3a8 + "915": 8c50bdd53172da5ff6bac04cd1ca794af1a650e994791fb16b1cfedd7543ba38abd6b9f5e5b8b7cc929504f7486f5f82fa5e77d058283a38a3fbbf9302e64713 # 1337797177dca75e5c2812e3363683f94e9bbda5 + "916": 14a471494b866c1c12df7aa5b4a620855aa4f851d35d3c86c506ecf21b15877c57d5c27ff212a45eeee875c3a993e5b70834449dc904149c122bdd1de0b647ee # 13371345997856dcdf4e5dca229579bf61c521f3 + "917": 38eb7e294151067404b23fccab390677d00024f4af60e998ffaaea972b1cb7fe13d81a4c92c16d890340642d3e1cc8da9660269d56bdf9fdabd507d453e56559 # 1337d31e5b947384a2f0ff33a346d001e80b7912 + "918": da98f0a36f2d379c67847f894d9c172197c4d1e5f80a07fbeda730b4a2de674e7589dd7c31c29f30e5ce005093803aea8e1d1b92895531154cfd6ba437fa395a # 1337c84f7736d85b38863b9c2e12f27bbaea9fc2 + "919": 772f4c0579cd2ead82ff52d59d287bad412bd98f363df380939ed2e7ecd97a1329add9a7f211eb244907bcb11665523f7e6519dcd73901640bef619a619580bc # 133778dbadbf3eca5406ea67c8bc1b2dfb0815be + "920": f464c68cad1533f8aa66254738bd9da43a5318371b9b18c4341181083539b3d32e845fe34bc3515f133e0b915ba57926f8bae15778c185e3349d3dd7884ad6b9 # 133782fc2f1493b3b94a8abd84319b100ce82fc1 + "921": bb2341b67e6651851b5761f7f4bed1e3d4a08e4d37d5bdf8bf088f69c3643efab1c2a5dd97146e3b67464fd6e2a7fd1ea04e9d5da4fda932e0f7a9ac4d54d733 # 133710b166d884175c58a43a1feb940f9101bfad + "922": 75c42bd3b930bbc25aad32d34b9c378c4e322d18b2faacda9c683c46364a0737557383bbf69e0a840d86b2c189fda22ad75d654b599dbc787c6459bc9c681917 # 1337bab0ea9f5710725a9c9180d149827c66bd23 + "923": 699847524c3a4212f1b3ae14aa4aebf52302b3d3a5c6c23022a552c31b891bea59fc2090a7af3e50e28d0d1d7192ebd2575c24b4441a7b061bd9218623371b32 # 1337d7c961fc89f077e15fb0db8fedd046ff13ac + "924": 638198ed727334f6a60c6114102054b8b1668da957d7d0ac77280ce4cd4b1c9c3502cae22ed0d0c5f7d02674657d392d9e642b2a4c69a16b6d29e0629899b2fa # 1337951ad915edadbce5079779b62c9fba4e2e00 + "925": ef2bf21a6d914d09f3daf2d4b52b9f99d7a4979c3ec37503bdfe1fb8def41d322b1d9cf98930f5fad6515b771a3b49e8f4fdb942700985e044fed42a3d80b076 # 1337085790ce52f33a5e7dbd8d60c12a1c1822c9 + "926": 94cad1dea8d7d1e07b847c08f6bc93e0a65899212c918c9416ca84a0d4d51b572b5fc5d622290fe748606bdfb8bb521b9014db1910bdac97891edda1a34922e6 # 13373dc33919291c79d51042903d7ac152d28bc7 + "927": 5953209beb6e44b1b7bc12d8287e361eace8570f93d9d1f78ed17024a5930c769717d2abde99f0249963f9d09d42b8d49ec97b0d92a1863289eab5a9bd3e0ec4 # 1337cbfa8bbb69563297b848e4ad37f7e4152a86 + "928": fc7627f9dae26f973fee03b9b9eda10c7587fc36dad46331df9e327e41b7797048b9086af2560050d7eac12434df5d39df4786cdba2e7c3d11260974296dec88 # 13371789e862701298121486a500d6c8f7d581e6 + "929": fcb513ce76492abf67ce02a7d28bade1d6dd281424b7c284e4f295dc53ad3f285663f94a09f93fbb989bd101aecf47945e6044034f6b71f254557c11bec51c03 # 1337eaac1b98dde3afae955ea4747b7ed877674c + "930": b3f56138d52fa19f3df46f822c49ebacf92f18a3d00b93205b6582097fd4298270f907dc2ff8fcee09330195e4438d8908988b77c21e1e90668e41f505190a72 # 13372ff1e209882b37fb12f4b047a0c7d1ec52cf + "931": 5593451e04a8daa5e9b3c37491f7ed79ec0ca8456ccd96347790c350ef40fbedbb83a8ff31633cd0c9bee2c2dbf9b07e8e9cd9a68302daa2c05d64669ae35519 # 1337685fe1652501c66b96858156067e66487003 + "932": 06cef1b6833b40b926c868d1954e0c07a8038a3e591d42dc5d9c034f491999d3fabac821d7798812bc7648e76f30c8f44e7783e40aef205000fb7bfb5a6792ed # 13370788b852b116736f6d4ca53e0dd01dbec55a + "933": 7fa0973d056e7fa64c8ba8ac061b9bc9cb568426da5f1c4cf8b7a058cda94a9e8509ca1ebd9b9625b60bfabe97ed02baffd9879d53ebb7e40a4b1c09c8b4192c # 1337458c8de6885367ef7e28946d0c5bf96553a1 + "934": e9d5711fd3bb05f609810292331d76de93d44ada0b438db044cc5ff45f851b5cf976242c3f64a437c197ee4871d981372f2fd27751700ce7a9e4013035bee00b # 13379ba322af062e67fb8925aa6e7816c9fb4c83 + "935": 2583b056ec17cd009802c6474054876936fbe92053d46d620257fe675ff03be89d28c7a9e1e474070e1120d03ef417c5078759ac353258591104cec9931f9609 # 133782ebe743696e55e5f05dcf5648278d3fbf3b + "936": 0cca0c1d07bc7822767d4603143ab531343a5adddcbf6c950df9fce0e60f8e8bade134e27028d2d7f5e3415be48f9dc75d3d2da5d46d2a5cc473c5723f6d5b0e # 13379279d7bb9bedc51a9be2f3e53f1dfbaf1e7c + "937": f415cdb96290dc2d19384b30dad91efe1049bbf590c44ba013b445a355592f8455ce3945379e80c4a49f21c18f68e085d6e469051b6010b4ca7fc4912580d1f4 # 1337db38286430d2d519f084adecea89ec3c0074 + "938": 3d1f6797461a5ffb5e9e4425ba8d16ed62618eb68cfdd20cf2f692ec31d4a4033210b8593158b6b7153e834b4731ed54020ce0c864c9c3b82e593bab77d35a3b # 13373c4e265253d96832b3d2722ec2904ce17a92 + "939": 452937ed8ffce41320ed0343bb64390f3d022dca1177dd5bfcb73da19ff6ad10d22c42bc94c8525526d87579a53a0b2920ec8e09a8094bd575aacaa7333b032c # 1337cbbc817ac1e0c9e052da61dabd343e574f54 + "940": 2efd3aeaedbf029e09adf5d626049f834cea1a9c9875a2f535e9e1d98a1c83516fdaf9eebf459ed11028d931e79ae06592f778cbd46d8a0a7fbe7a6587746249 # 1337ce0b612f499e1bf0452ec926edf41d11517a + "941": 52a24f5411a532f79009ef59a75da072a79426290d3f93194fbb94aeb1e9be55669d03a253bfe4327d31ecd11d70eab9adb70e364f067d9db5c73c36a3130b05 # 13370f63bc620574b72f729ad4ea9c3b889937a6 + "942": 3b90f0884dd3471fc9ec048f8ac06d54c0a70a26e3cf490ed6821dbbe3892dfe26c4e1e4ad7f91eb276de75476fc6c04786397b501e75cbc3862a25f9a4dc26d # 1337c883db98f6adc1e032b5cdafee9391275836 + "943": 5e43b7580177e6f5584229cacbde460c1e0207014800d96fb8be5e91c0e7dae7894bf095c315a8892d925cf0f8204857977a04080f9ad469186f9245bf69ea1b # 13370997714ef7c2b46c930d59c4724d336c8791 + "944": e959ac0f812a522d5f702e0b02f52b6bd63bdae79ee3b7199cb87a5dc146d196446a4e34fb85b61086d67e6d1ddf4bdb9044a1c6b39bd92c5363919e794dace4 # 1337e59b142af3d79f586dee2a270641a689805f + "945": 7d150a986db85ff273a41aec57ddf70d067f3fc46e1ea72c2a3529d0145d1a1c6e06ba1df82962c49e8cdc11a72fde127dd9e3533ceca0fc25f4d78a9d55aff7 # 1337f64d0ae3cd14fd31061d219593d575f3f481 + "946": cb94950c74bc7f833e20b734c15ed342ce7771e0f2f297ae69c8f0ddf8f7b4651a0b0929bd5402e487ec47c19169b4e2a2b6e75ff26fae8ca2f6dfa08fc6a284 # 1337dc58403f0ed4aaf971ac580947dc901b81aa + "947": 698ade4c56f149c439c17f32e1ee3015a02de8746be8d644e17b6626f6157e06a322694c1298b47874b0e508c7ecc681cca353854a00253b46265e759d69b35e # 1337c7b0afae0885ec355c53026ba74b7c808967 + "948": 3f6c63beff8eb613a3e0ec9a72ae96b461fc6445514eab89fce3f164ff45ee8d1eab0fe7e83cc301b8338b9b1c40fff826feb1588486741a008163fcba4a5267 # 133750f9c98d3e5615deed27dc3122d65d594966 + "949": 74f5f43feeccf99d95799ab1041c75ef5d6645c43fd268f6ca21a34186753a699a9bc2503eb3964e1a85bb3852047bf67be9e2aa0cb1e3d35d5215322617e0f5 # 133700274c85a58854fead41340c93f290ce8279 + "950": 5f5162c634d9aa5f2201d0a48d56c6aa0ac2117c8dc576582b5eebb56944a495eee536f8a7231a99a5a3e5924b0bf613f9342d320f9bd13c3ee1c65868cec7bf # 1337af759f1eae665d463c45ecc409db1e4c03aa + "951": addcfe8bf1e9b74fb2b0aeb57488597f0b85095a61ba910eef86ed8141d023316db8da1188b5a6c577adc24913dd861ba6add1ff6a429f188fca51dd6fee5e64 # 1337b46f279424d51cdeeaf3e4fa51f113161630 + "952": d424a0596e4e579ed1a774260b9f398511a7aed3a0922083f2a8d8b9e1d7c2b66640d86cd65149a1e7d26985f20b1854f77a8bbe7e57093720beafa1e8c78b27 # 1337154cba45395d782cd4f0ac611c01bfa4b1a4 + "953": 3481d00d0b81161757f055b19295d0e3591296786ebc123eb822418cdf233b35f5975a72562e5141496bd135f3d37373d67467d77eaa98f29b35a3cf00062181 # 1337acff79221027485753b958df02dafb1c287a + "954": 7427ee77a28841f547f1e5dffbe1d1a7bc70de5a3c0fca476ebb1f450d80769c59eabe0e885d5167535e2e3346b422f0f38e1e73133ac4831f4293f5b87ce48b # 1337ae49efe0fcb10c34d7283cdac11dd03d3fe3 + "955": bc6abf08a6044a1e651ecc60b9abd82c5d05de7199314e42e116ba8e8d10c9f46be6df5ec57ae98054d234a137e6dba4bc00e204656bd7a1cecab22481dcca87 # 13370d0eb067d8b0b4c8cb3805bf5a80f999eab0 + "956": 73f9f6860dc242c4c70f64090c25b397e665d06a59c4b9c58a4efd4cb703f54a6bc543f12f26c6965a65006fc60cb4280be96911a4b9caa3afeedfb0d2914fed # 13379901ab628b31b5b7be305469e850ed27fef8 + "957": eae521284788c7e0c66a940853792d35a30ee066a1961f8031f6e2c98f44d4a8daff1eb505aa2e79ee2442da7c96788bebd6cca005241d63a1fed379a3e733b2 # 133781ef031e35ec89121c68b42d7c04c4b5f13a + "958": b2a49f048682d3f829b62ebc0e5c6f583d119c1bbe3fa3d8be5205461ad9ef4e0ee27ac2a430d32ee9b152a55fe5f68e49f42b1672d5042d57cb1354ebf626aa # 1337439fdf6e2c3fab5135ed196f3db3b78faf39 + "959": 36d19e2e77bfaac3a65723372203c2106022e7a35c600c8919268178ee7bf1fcffd230bbbb015f8547866a516faa2012ccff990ed24ff9df778f7231cdd80515 # 1337fdc43499fe4a7c014f748806e123d5a8b92e + "960": b1d135342daeded5e3cf2d71b03a5c1c4de4e8b27d9560c6b64716c605bfb7d78e391c7e2f6572219f35c4901f30df651a26422baedbd9e84f57552842595fd0 # 1337ad4ec65e19e32d38e815ec2b79251b37177e + "961": 17761541cfe42b340eeb65dfc0eb632f4769695423bae01ec98b161a64da663b4ed434364cae9915f5cdbf8528b56829b68f09fcc4721c29bc315cc068bbc399 # 1337c7b6c084e1eeb3af25100997d294c8d72915 + "962": 1aaad1d3ea4fabaa0ecadc887daad576312e61b8c18b7dd1e97b85835458280c862f86d5afb76ffffe205bbbe477d0b4e793d3b8ff171038c4809d4531a00c5c # 1337fc320397de8d27435ca5fd2e6c6d3b61a655 + "963": 8dfaf8cf0a0db37db8d17bbd66a53b2371a35d118d3538cb43527cca0f44faf4ebf8fe80f2219173cff2593d1b2969e4d3e83ebf904c6b59cae3fce537b16714 # 1337a9db69e600017ad7b455a6e88074e206505b + "964": 1b756e3626388397b5a625c3d2252a9f9565e99269ff790a0ea9135a0ea0cbc10d88581d96308b9489c17ade4d0f219086ee07f298f09860a18a8716fe54ebe3 # 1337918216272a54ee0514247d5c2ddb3853f7fe + "965": 2d1fe95f81107e4f93c087a335d0fbff5b9d2172dbe6694292c736e8d3b711f255def79e2869ccd6fd1bcfba48a4b8d3069b665582b1fa8248696765bdb2c4be # 133749190886ce3268d8771eb17a78e5df1ef8a2 + "966": cb795e2a6f7b0028d6e4156391a2c38c6a7c05401b7be33f1eb50b9eea8d15f6f1503890a1ced7968ad0d6787cb577ad4566ea49f8dc30a1c7beec29a8723b0d # 13378e941d188ef7e7d46a225af4c7b7d9c125d1 + "967": 8b82e585d3b1da754fb2327eb3a8c61e4c0c0f901aa621fbc78706080f1d339d53174e4e7c16b7c8519c3825b2932e7247ecdac7e6b7e98fbb5d04fba2c8abf0 # 1337a7d22165e458ab05904e94cc20876bcaac5e + "968": 3f4a7261bda14780ee5348d25433db52f070cca616650c74602254a4b0af9f6804f677f09a13ce8eb384a30c3ac7f9da2e92b7329f33c93cf060ff03ce245403 # 133712198ebfe0904f6156ab1ede0039dd2f3ef9 + "969": 9c56ff755a1c8de049b368b25fdc12e3dae45f38a6667a400989d7f8941cd9dc61879d1012f29a1b42e76554184bbcd77ac735cab227027a576529e43c14dc3c # 13371670eba7233d9724f32f842506d270d3d914 + "970": 3682dd4da41e78d35dc8ecd17dabbdb06ab310240bc8386d62c1ce7dea660aa35a3fe3bd873ba7e50e8183e810a8fcc282d1641f17e319f80fb25b828cd980ef # 1337726647883437fe71c205989814687aabe7c6 + "971": 9d561dea0ddfbc88f828ef8651ab2c8ca6edadaf97dc63230429d114984c8af6d1c2df41175fa312d327f1c18d96f41831149513368c893761d8a98c4a8d2c70 # 1337c65e70a174e2a46dabe689922d6bc8c31904 + "972": ddad745f1edf5f810d13036ebb0145bcb47405269cae51c40e2d40d80979f121532949b0e47817443237280861c2cac5f1095b5698462601f0b1749f63691730 # 13377ed059848bea44ce86a0190b8906a4e5445c + "973": 6ac30c03f2e7bd07891895249a3b71e26cc06809f0bb8717cd4937dad6d01b26e4efb58a1029d4a4cd1fae3bac1365572f0a90b093b7ea664f46372d42a4d9e7 # 133725c927090cbbb98982a8560ed914c031191f + "974": 71db1f6e7b5b45c1d04e0ccf984549105336b50b690e929bf8aa569e804c874c276680d4a143a5eae61ee90384ec29d24e1283d8eb487630c1a51c4f2f83256d # 1337e270ddee91ddf4a860ec6650542821636820 + "975": 4d2cdc9ac432bf8656a07b249b67a05d395ebaf41241b07bb2f6356c58e5e70ec45b41fc7836da3a8eb26b6b70504e8084a078c2547e88bc42c771b62facd425 # 13375f340439808f7254727282f62c0d36907b72 + "976": 4eb24d29268bf4c96d0a0a5f3f6288cfd3af114426c31a4cfde37db0a46f73c83d18d3acf213855dd0a4443a9ca32f521277c305f3b02681a0ad39979025094d # 13370253f417ba3d3e0e963e5bd2385d25f29993 + "977": 57ee1911892703dd17a8c714476baa964d59af4a4b00e094719ca28ed9c509117f8f9af502e0b17ef7a0f1897dc7fce6d40d033fd13f1b509541ba04f7aefbbc # 1337d5dcf116a650fc14074c0b128df4b2f4deaa + "978": 2ec49c0690eb27c9dea8a4a38ef2b7abb536ccbf13acea101dbfc0cbe2fb10c48f3e0d0bc6aa7f585daad7cabcfb60f7e81c7368bc135a9ae1bd4dc13dd5eb79 # 1337d30c149224b90f148202a5b719e5d90695a3 + "979": db8c7b5eac597e6418dd31e534f80ae829491059186d4687d25d74e07dbad9bfe5d33e7dc60458ca66f24993f6da0c9aa651aa3aca69abaee237c3a91458c1b9 # 1337e23d25a3f83c8168fe37332c45c0b05e3b69 + "980": 22e99a381ca2428d194079ff824bd16432a78eef9073efe9149061b09b14686177c13872184c57e15464372c5c11813a7f7c7e911bcabfe0e6db3c78848d6928 # 1337cfe9570719ae2d0dbc14d1cecba2f47259ae + "981": 3c84e29f078004d120bd8d3004aa6af4e9baca372176641c169c734e3a00447a5b537e0a9fd8128cc743a5b46390bad5a3347f631dc554c9e21d273469e4cb96 # 1337a6f98ec7a4945cc3c83293d0eb009ff42bf4 + "982": 225d026c7bc692fefe090741abe5540ebce073c0d13086bce017ef545ff4371c3e2ad153740a43f4319b2252ae3edb8928b541f82744167026ab6397bfc2e0a8 # 13379fec72e30f8845785cdd4674a6d6ab60f9f5 + "983": 7f6807aac9d69277ab1563eef602be04ffbc03ecca1434148dca0bccf776a7ce01eecb79ca385b643c83bf9233ad095d7664090f8ee8519bcad5fb4043f2a20d # 13374aebf7582d79e5c84bbe94e78c7dc1601114 + "984": 4ab6b617533872a3daee80f5985322885e296363089a744d780a1a50c525866f7d081cb1975bd987949bdc1f128b70de3986836aada827788ee63e181c6ece2b # 1337d4085219279daa8295ce9ac2aae5a0eb1f6a + "985": 889a511f647f86364146aa86dfc537ef14c5f2d1b64c2ed6eba71a19103b34c6596e99d77eb7343e5f5f5be8189e90e19e73334f493d7d223e45b0f6318740f7 # 1337b46bb254b5a79799f7dc1d96b43f63eead4e + "986": a5f84e519eaa7f11a1fcf936cd2d301b11605128720ac3451101405dc38056f1a49772b68d22a4de18d44d98d29508aea8dff28b866160b4669139915442c1c5 # 133773c3fb337ec31d7da9f6432e3871f42300ad + "987": fd170400da8b3dd2b8d5954d1ae3dbbc6b3ed88ca128d64ab4b89e99fc49c1f1c15d4c72f717f9b7da4bd5480ff38f0281a1bec9a98a518fb4ac1f8b2acf8037 # 13376846c42a23eab31722f9bd2399c42eb41c32 + "988": 2b14133a4fe3d8787cd11d8ca21fd2e53cf704dff0c07e855190a1cb3a548865d5190fcdceedce4eecf67f7db61f71e63adf96dde51771820b938af36ba23be3 # 1337d63708295f6ff7785b382eb582a858b78d3a + "989": 8ef3d7c8e577532f1dc81db646d4def6387f0c40d4cb8c8e9900f734b20874fae55393752c2cd6ecb85bae3ce0ddaddde14c483a97258df4c0153c4317cda8d8 # 1337d46791247ef0a365d388bcb0de43228691a7 + "990": 6f16ab79651e7d3819a1e61db56ef47febbe3530549406aab58aace8d47fca754ad1f7bbdd00b102f45ce921326231c2303fc6a85cc672d7576b0dd8eb9eab00 # 13377aaed9f014c153eb08e4c731cf026d3f95b1 + "991": beb09c76acddc2a0fd166744cec7cf616b04b0af4cb96059f63f868b695a13c46fbd63dbd8c4971e27fa34c614596b8dce07e8d7a7feab453212c622de699d6a # 13371d864fbe0bacdf8490631e6c9b5542f38730 + "992": 7beb453fda568fe953c9b6f9a4bc4eb38c45d984eabd5c2897efaa60f0c5f023690be492e60aadc7f27492772ceb12be8fb3694292769dbeab743d74b7ee4085 # 133735f8680c048eb5ab6ec6b33cc877d382951a + "993": 263e6286d1809071a59f2dfd34b7b41383df7015cd4deae9495a8832acc94e15408aa53f20c9662592b5ff880bfa1541c19efc7b3e0759d7b22b5e766531320d # 133788d3ccf1864a9ef16d20ddb5209d4293d3d0 + "994": c81038e4677d3fe519f0aa90debaa0325e19a4723e7974164695bb5a2facdd4c97e54da6f827ed393fd09a45b91490bf3abbb27fbf0f3b84ca8563c271b8fee9 # 133794ccbe1d29f66af5479a58b9b0bb91b3ead7 + "995": 47bca58debd5f0243b8cf1bc2133ef8b9befb871c094f3732f8ef742d47eca513b7483d16ca58bc7efa28dd3b90fc3fb37e1c477221af76fa2c97eaa81a7eedd # 13377797347611b41685a0151c08132feec02960 + "996": 39e4c4e762ae16e4089d84309fc283b834c3a6f307c8c1faaa3986b998863eeb584862ce99ef080cc60a4bbf64053a88e283908bc3788546b6d9445d39317993 # 13370b93070ea740e3b548e02069d69330a44618 + "997": efbf38137d2bcd5b1d34eddf8bcdb396375fd6085f90c20d98125233ce82f07f0af0c4989ab82f2faaf8a6dede0f530d4f8779dd1fe509f9bae559dafbb5011f # 1337a4fd050c40ef36809d9524c7a7163298506d + "998": f0c2f2a23e4fc424285556e199f7f415d79f84821f648de5b6ce2a4c016999dfa685db7468283b814140aedd345089577e1f12f14478bb38f82d90148237349f # 1337f50604a8058c357acd45cbfc47a516a3f20c + "999": ebf0871d8c5b898f84394b4596978829bdc58a437cdbe1f4403cccc1eb9d56194086e754e64869f84494741c924f5e2466250619e3b3d0b8d2b2e74fd561e8df # 133779559541d2b32f7720468576e399cfff3ce3 diff --git a/build/localnet/manifests/role-bindings.yaml b/build/localnet/manifests/role-bindings.yaml index 8438657ff..29c798091 100644 --- a/build/localnet/manifests/role-bindings.yaml +++ b/build/localnet/manifests/role-bindings.yaml @@ -2,7 +2,6 @@ kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: private-keys-viewer-binding - namespace: default subjects: - kind: ServiceAccount name: debug-client-account diff --git a/build/localnet/manifests/roles.yaml b/build/localnet/manifests/roles.yaml index 113aee239..5d0f4b71f 100644 --- a/build/localnet/manifests/roles.yaml +++ b/build/localnet/manifests/roles.yaml @@ -2,7 +2,6 @@ kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: name: private-keys-viewer - namespace: default rules: - apiGroups: [""] resources: ["secrets"] @@ -13,7 +12,6 @@ kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: name: services-watcher - namespace: default rules: - apiGroups: [""] resources: ["services"] diff --git a/build/localnet/manifests/service-accounts.yaml b/build/localnet/manifests/service-accounts.yaml index cec2002bf..3951ba1a2 100644 --- a/build/localnet/manifests/service-accounts.yaml +++ b/build/localnet/manifests/service-accounts.yaml @@ -2,4 +2,3 @@ apiVersion: v1 kind: ServiceAccount metadata: name: debug-client-account - namespace: default diff --git a/charts/CHANGELOG.md b/charts/CHANGELOG.md index 6f79a9ae5..043f3b28e 100644 --- a/charts/CHANGELOG.md +++ b/charts/CHANGELOG.md @@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.0.0.6] - 2023-06-06 + +- Adds fisherman and servicer configurations to the helm chart. +- Adds method of overriding localnet values in the helm chart. + ## [0.0.0.5] - 2023-05-20 - Added `ServiceMonitor` to the helm chart. diff --git a/charts/pocket/.gitignore b/charts/pocket/.gitignore new file mode 100644 index 000000000..5eb74039f --- /dev/null +++ b/charts/pocket/.gitignore @@ -0,0 +1 @@ +pocket-*-overrides.yaml diff --git a/charts/pocket/README.md b/charts/pocket/README.md index 137cf7340..3b013f409 100644 --- a/charts/pocket/README.md +++ b/charts/pocket/README.md @@ -43,6 +43,7 @@ privateKeySecretKeyRef: | config.consensus.pacemaker_config.manual | bool | `true` | | | config.consensus.pacemaker_config.timeout_msec | int | `10000` | | | config.consensus.private_key | string | `""` | | +| config.fisherman.enabled | bool | `false` | | | config.logger.format | string | `"json"` | | | config.logger.level | string | `"debug"` | | | config.p2p.hostname | string | `""` | | @@ -67,6 +68,7 @@ privateKeySecretKeyRef: | config.rpc.port | string | `"50832"` | | | config.rpc.timeout | int | `30000` | | | config.rpc.use_cors | bool | `false` | | +| config.servicer.enabled | bool | `false` | | | config.telemetry.address | string | `"0.0.0.0:9000"` | | | config.telemetry.enabled | bool | `true` | | | config.telemetry.endpoint | string | `"/metrics"` | | diff --git a/charts/pocket/values.yaml b/charts/pocket/values.yaml index 6258056e9..aa2e9118b 100644 --- a/charts/pocket/values.yaml +++ b/charts/pocket/values.yaml @@ -113,6 +113,10 @@ config: port: "50832" timeout: 30000 use_cors: false + servicer: + enabled: false + fisherman: + enabled: false genesis: preProvisionedGenesis: diff --git a/consensus/README.md b/consensus/README.md new file mode 100644 index 000000000..60e2a2e4d --- /dev/null +++ b/consensus/README.md @@ -0,0 +1,211 @@ +# Consensus Module + +This README serves as a guide to the implementation of the [1.0 Pocket's Consensus Module Specification](https://github.com/pokt-network/pocket-network-protocol/tree/main/consensus). It is designed to provide insights into the structure and design of the codebase. + +## Table of Contents + +- [Interface](#interface) +- [Consensus Processes](#consensus-processes) + - [Leader Election](#leader-election) + - [Consensus Phases](#consensus-phases) + - [Block Generation](#block-generation) + - [Block Validation](#block-validation) + - [Consensus Lifecycle](#consensus-lifecycle) + - [State Sync](#state-sync) +- [Implementation](#implementation) + - [Code Organization](#code-organization) +- [Testing](#testing) + - [Running Unit Tests](#running-unit-tests) + +## Interface + +This module adheres to the interface outlined in `pocket/shared/modules/consensus_module.go`, which is derived from the above specification. + +## Consensus Processes + +This repository features an implementation of the HotStuff consensus algorithm. It facilitates the consensus process through a series of rounds. Staked validator nodes participate in the consensus process, with one node serving as the leader and the rest as replicas. + +### Leader Election + +A dedicated submodule handles the leader election process. The current configuration employs a deterministic round-robin leader election mechanism. We are working on a randomized leader election mechanism with cryptographic sortition using Verifiable Random Functions (VRFs), see [Algorand's Whitepaper Section 5.1](https://algorandcom.cdn.prismic.io/algorandcom%2Fa26acb80-b80c-46ff-a1ab-a8121f74f3a3_p51-gilad.pdf) for detailed explanation. Upon its' completion, round-robin leader election will be + +### Consensus Phases + +The HotStuff consensus algorithm consists of three phases: `Prepare`, `Pre-Commit`, and `Commit`. It is worth to note that recently published [HotStuff 2 research paper](https://eprint.iacr.org/2023/397.pdf) proposes the updated HotStuff consensus algorithm which only needs two phases. + +In each phase of Hotstuff, the leader creates a proposal and broadcasts it to all replica nodes. + +Upon receiving the proposal, each replica node performs a block validation check. If the proposal is valid, the replica node responds to the leader with its signature as a vote. + +When the leader collects votes from more than two-thirds of the replicas, it progresses to the next consensus phase. This two-thirds rule is essential to achieve Byzantine Fault Tolerance (BFT), ensuring network resilience against faulty or malicious nodes. + +### Block Generation + +Block generation in the HotStuff consensus algorithm involves a series of interactive steps between the Leader and the Replica nodes. The steps are as follows: + +```mermaid +sequenceDiagram + participant Leader + participant Replicas + Note over Leader,Replicas: Leader Election + Leader->>Replicas: Propose(block) + Note over Replicas: Validate proposed block + Replicas-->>Leader: Prepare(block) + Note over Leader: Receives Prepare messages from a quorum of Replicas + Leader->>Replicas: Pre-Commit(block, Prepare messages) + Note over Replicas: Validate Pre-Commit message + Replicas-->>Leader: Commit(block) + Note over Leader: Receives Commit messages from a quorum of Replicas + Leader->>Replicas: Notify(block, Commit messages) + Note over Replicas: Add block to local blockchain copy + Note over Leader,Replicas: New Leader Election +``` + +### Block Validation + +Every proposal made by the leader undergo a series of validation steps during the `Prepare` phase, which are carried out by the replicas. However, during the `Pre-commit` and `Commit` phases, the replicas are solely responsible for performing signature validation. + +```mermaid +graph TD + A[Receive Block proposal from leader] + B[Perform basic validation] + C[Check Block structure] + D[Validate quorum certificate] + E[Validate optimistic threshold] + F[Block is Valid - apply block] + G[Block is Invalid - Reject the proposal] + H[Create and send vote message to the leader] + A-->B + B-->C + C-->D + D-->E + E-->F + F-->G + B-.->H + C-.->H + D-.->H + E-.->H + F-.->H +``` + +### Consensus Lifecycle + +The consensus lifecycle begins with a new round that includes leader election, proposal creation, proposal validation, vote aggregation, and block commitment. The steps are as follows: + +```mermaid +flowchart TD + A[Start New Round] --> |Elect Leader| L[Leader Election Module] + L --> D1[Leader] + L --> D2[Replica] + D1 --> E1[Create Proposals] + D2 --> E2[Validate Proposals] + E1 --> F1[Aggregate Votes] + E2 --> F2[Vote on Proposals] + F1 --> G1[Quorum and Commit Block] + F2 --> G2[Commit Block] + G1 --> J1[End Round] + G2 --> J1 + J1 --> A +``` + +### State Sync + +State synchronization is crucial to ensure all participating nodes maintain a consistent and up-to-date view of the network state. It is especially important in a dynamic and decentralized network where nodes can join, leave, or experience intermittent connectivity. For an in-depth understanding of the state sync process and its current status, please refer to our [State Sync Protocol Design Specification](https://github.com/pokt-network/pocket/blob/main/consensus/doc/PROTOCOL_STATE_SYNC.md). + +```mermaid +graph TB + A(Start testing) + A --> Z(Add new validators) + Z --> B[Trigger Next View] + + B --> C{BFT threshold satisfied?} + C -->|No| E(No new block, height is same) + E --> B1[Trigger Next View] + + C -->|Yes| D(New block, height increases) + D --> F{Are there new validators staked?} + F -->|No| J{Are syncing nodes caught up?} + + J --> |No| B2[Trigger Next View] + J --> |Yes| H[Success, new validators are synced!] + F -->|Yes| G(Wait for validators' metadata responses) + G --> B3[Trigger Next View] + + subgraph Notes + note1>NOTE: BFT requires > 2/3 validators
in the same round & height, voting for the proposal.] + note2>NOTE: Syncing validators request blocks from the network.] + end + + C --> note1 + J --> note2 +``` + + +## Implementation + +### Code Organization + +The codebase is organized as follows: + +```bash +consensus +├── doc +│ ├── CHANGELOG.md +│ ├── PROTOCOL_STATE_SYNC.md # State sync protocol definition +├── e2e_tests +│ ├── hotstuff_test.go # Hotstuff consensus tests +│ ├── pacemaker_test.go # Pacemaker module tests +│ ├── state_sync_test.go # State sync tests +│ ├── utils_test.go # test utils +├── leader_election +│ ├── sortition +│ └── sortition_test.go # Sortition tests +│ └── sortition.go # Cryptographic sortition implementation +│ ├── vrf +│ └── errors.go +│ └── vrf_test.go # VRF tests +│ └── vrf.go # VRF implementation +│ ├── module.go # Leader election module implementation +├── pacemaker +│ ├── debug.go +│ ├── module.go # Pacemaker module implementation +├── state_sync +│ ├── helpers.go +│ ├── interfaces.go +│ ├── module.go # State sync module implementation +│ ├── server.go # State sync server functions +├── telemetry +│ ├── metrics.go +├── types +│ ├── proto # Proto3 messages for generated types +│ ├── actor_mapper_test.go +│ ├── actor_mapper.go +│ ├── messages.go # Consensus message definitions +│ ├── types.go # Consensus type definitions +├── block.go +├── debugging.go # Debug function implementation +├── events.go +├── fsm_handler.go # FSM events handler implementation +├── helpers.go +├── hotstuff_handler.go +├── hotstuff_leader.go # Hotstuff message handlers for Leader +├── hotstuff_mempool_test.go # Mempool tests +├── hotstuff_mempool.go # Hotstuff transaction mempool implementation +├── hotstuff_replica.go # Hotstuff message handlers for Replica +├── messages.go # Hotstuff message helpers +├── module_consensus_debugging.go +├── module_consensus_pacemaker.go # Pacemaker module helpers +├── module_consensus_state_sync.go # State sync module helpers +├── module.go # The implementation of the Consensus Interface +├── README.md # Self link to this README +├── state_sync_handler.go # State sync message handler +``` + +## Testing +_TODO: Document the testing framework._ + +### Running Unit Tests + +```bash +make test_consensus +``` diff --git a/consensus/doc/CHANGELOG.md b/consensus/doc/CHANGELOG.md index 5d0231a84..477bfcc03 100644 --- a/consensus/doc/CHANGELOG.md +++ b/consensus/doc/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.0.0.53] - 2023-06-08 + +- Add consensus README + ## [0.0.0.52] - 2023-05-24 - Updates consensus tests to use GetBlock mock instead of Get mock @@ -29,7 +33,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [0.0.0.47] - 2023-04-17 -- Log warnings in `handleStateSyncMessage()` +- Log warnings in `handleStateSyncMessage()` ## [0.0.0.46] - 2023-04-13 diff --git a/consensus/module_consensus_state_sync.go b/consensus/module_consensus_state_sync.go index 7bdba7d75..3763c08a0 100644 --- a/consensus/module_consensus_state_sync.go +++ b/consensus/module_consensus_state_sync.go @@ -23,7 +23,7 @@ func (m *consensusModule) GetNodeAddress() string { } // TODO(#352): Implement this function, currently a placeholder. -// commitReceivedBlocks commits the blocks received from the blocksReceived channel +// blockApplicationLoop commits the blocks received from the blocksReceived channel // it is intended to be run as a background process func (m *consensusModule) blockApplicationLoop() { // runs as a background process in consensus module diff --git a/docs/demos/iteration_3_end_to_end_tx.md b/docs/demos/iteration_3_end_to_end_tx.md index b79a9f956..1ace95335 100644 --- a/docs/demos/iteration_3_end_to_end_tx.md +++ b/docs/demos/iteration_3_end_to_end_tx.md @@ -6,8 +6,8 @@ - [Features](#features) - [Shell #1: Setup LocalNet](#shell-1-setup-localnet) - [Shell #2: Setup Consensus debugger](#shell-2-setup-consensus-debugger) -- [Shell #3: Inspect the data in the database for node1](#shell-3-inspect-the-data-in-the-database-for-node1) -- [Shell #4: Inspect the data in the database for node3](#shell-4-inspect-the-data-in-the-database-for-node3) +- [Shell #3: Inspect the data in the database for validator1](#shell-3-inspect-the-data-in-the-database-for-validator1) +- [Shell #4: Inspect the data in the database for validator3](#shell-4-inspect-the-data-in-the-database-for-validator3) - [Shell #5: Trigger a send transaction from the CLI](#shell-5-trigger-a-send-transaction-from-the-cli) - [Available Commands](#available-commands) - [Accounts setup](#accounts-setup) @@ -54,7 +54,7 @@ make client_start && make client_connect # start the consensus debugger Use `TriggerNextView` and `PrintNodeState` to increment and inspect each node's `height/round/step`. -## Shell #3: Inspect the data in the database for node1 +## Shell #3: Inspect the data in the database for validator1 Connect to the SQL DB of node #1: @@ -72,10 +72,10 @@ select * from account; select * from pool; ``` -## Shell #4: Inspect the data in the database for node3 +## Shell #4: Inspect the data in the database for validator3 ```bash -psqlSchema=node3 make db_cli_node # connect to node 3 +psqlSchema=validator3 make db_cli_node # connect to node 3 ``` Query the blocks, accounts and pools from the DB: @@ -114,8 +114,8 @@ echo '"25b385b367a827eaafcdb1003bd17a25f2ecc0d10d41f138846f52ae1015aa941041a9c76 2. You can use `jq` and run these commands: ```bash -cat ./build/config/config1.json | jq '.private_key' > /tmp/val1.json -cat ./build/config/config2.json | jq '.private_key' > /tmp/val2.json +cat ./build/config/config.validator1.json | jq '.private_key' > /tmp/val1.json +cat ./build/config/config.validator2.json | jq '.private_key' > /tmp/val2.json ``` 3. You can manually copy-paste the private keys from the config files into the `/tmp/val1.json` and `/tmp/val2.json` files. Remember to keep the double quotes around the private keys ("private_key" field in the JSON). diff --git a/docs/development/FAQ.md b/docs/development/FAQ.md index 62042eab0..4d4eaf1ff 100644 --- a/docs/development/FAQ.md +++ b/docs/development/FAQ.md @@ -14,19 +14,19 @@ _NOTE: Consider turning off the `gofmt` in your IDE to prevent unexpected format - **Issue**: when trying to run `make compose_and_watch` on an operating system with SELinux, the command gives the error: ``` -Recreating node2.consensus ... done -Recreating node4.consensus ... done -Recreating node1.consensus ... done -Recreating node3.consensus ... done -Attaching to node3.consensus, node1.consensus, node2.consensus, node4.consensus -node2.consensus | /bin/sh: can't open 'build/scripts/watch.sh': Permission denied -node1.consensus | /bin/sh: can't open 'build/scripts/watch.sh': Permission denied -node3.consensus | /bin/sh: can't open 'build/scripts/watch.sh': Permission denied -node1.consensus exited with code 2 -node4.consensus | /bin/sh: can't open 'build/scripts/watch.sh': Permission denied -node2.consensus exited with code 2 -node3.consensus exited with code 2 -node4.consensus exited with code 2 +Recreating validator2 ... done +Recreating validator4 ... done +Recreating validator1 ... done +Recreating validator3 ... done +Attaching to validator3, validator1, validator2, validator4 +validator2 | /bin/sh: can't open 'build/scripts/watch.sh': Permission denied +validator1 | /bin/sh: can't open 'build/scripts/watch.sh': Permission denied +validator3 | /bin/sh: can't open 'build/scripts/watch.sh': Permission denied +validator1 exited with code 2 +validator4 | /bin/sh: can't open 'build/scripts/watch.sh': Permission denied +validator2 exited with code 2 +validator3 exited with code 2 +validator4 exited with code 2 ``` - **Solution**: A temporary fix would be to run diff --git a/docs/development/PROFILING.md b/docs/development/PROFILING.md index 9f9d5fb18..44fc47611 100644 --- a/docs/development/PROFILING.md +++ b/docs/development/PROFILING.md @@ -9,7 +9,7 @@ We pre-configured the node to expose a web server on port `6060` for the collect Because of the performance overhead, it is disabled by default. In order to enable it, you can simply add the environment variable `PPROF_ENABLED=true` to the node. -You can do that in several ways, the most obvious spot would be the `docker-compose.yml` file, in the `environment` section of the `node1.consensus` service. +You can do that in several ways, the most obvious spot would be the `docker-compose.yml` file, in the `environment` section of the `validator1` service. ```yaml environment: diff --git a/docs/development/README.md b/docs/development/README.md index 593d565ba..0aea46ad1 100644 --- a/docs/development/README.md +++ b/docs/development/README.md @@ -121,7 +121,7 @@ You can add the following function so you can run the `p1` from anywhere on your ```sh function p1 { export POCKET_WORKDIR="${HOME}/workspace/pocket/pocket/" - export CONFIG_PATH="${POCKET_WORKDIR}/build/config/config1.json" + export CONFIG_PATH="${POCKET_WORKDIR}/build/config/config.validator1.json" export GENESIS_PATH="${POCKET_WORKDIR}/build/config/genesis_localhost.json" ${POCKET_WORKDIR}/bin/p1 "$@" } @@ -133,7 +133,7 @@ Execute the following command from the root of the project to add it to your `~/ cat >> ~/.bash_aliases << FUNC function p1 { export POCKET_WORKDIR="$(pwd)" - export CONFIG_PATH="${POCKET_WORKDIR}/build/config/config1.json" + export CONFIG_PATH="${POCKET_WORKDIR}/build/config/config.validator1.json" export GENESIS_PATH="${POCKET_WORKDIR}/build/config/genesis_localhost.json" ${POCKET_WORKDIR}/bin/p1 "\$@" } diff --git a/docs/devlog/devlog8.md b/docs/devlog/devlog8.md new file mode 100644 index 000000000..4d88135af --- /dev/null +++ b/docs/devlog/devlog8.md @@ -0,0 +1,107 @@ +# Pocket V1 DevLog #8 + +**Date Published**: June 5th, 2023 + +We have kept the goals and details in this document short, but feel free to reach out to @Olshansk in the [core-dev-chat](https://discord.com/channels/553741558869131266/986789914379186226) for additional details, links & resources. + +## Table of Contents + +- [Iteration 17 Goals \& Results](#iteration-17-goals--results) + - [M1: PoS](#m1-pos) + - [M2: DoS](#m2-dos) + - [M3: RoS](#m3-ros) + - [M\*: North Start](#m-north-start) +- [Demo 💻](#demo-) +- [Contribute to V1 🧑‍💻](#contribute-to-v1-) + - [Links \& References](#links--references) +- [ScreenShots](#screenshots) + - [Iteration 17 - Completed](#iteration-17---completed) + - [Iteration 18 - Planned](#iteration-18---planned) + +## Iteration 17 Goals & Results + +**Iterate Dates**: May 17th - May 30th, 2023 + +### M1: PoS + +1. Consensus - Finish minimum viable state sync to sync state between full nodes + +- **Score**: 3/10 ± 1 +- **Notes**: + - Worked by @gokutheengineer was picked up + - Changes are being merged upstream and refactored to work asynchronously + +2. P2P - Finish minimum viable gossip to facilitate peer discovery and messages propogation + +- **Score**: 5/10 ± 2 +- **Notes**: + - A lot of progress was made by we are hitting some issues on the edges cases + - Major improvements are being made to the debugging utilities to facilitate investigation + +3. Persistence - Finish the atomic store refactor to facilitate rollbacks + +- **Score**: 6/10 ± 1 +- **Notes**: + - The largest of the 3 refactor PRs is almost ready for review + - Local components are separately implemented, but tests are failing and code needs to be cleaned up + +### M2: DoS + +4. Provide the backend and infra team visibility into DevNet (documentation, dashboarding, tooling, etc...) + +- **Score**: 5/10 ± 1 +- **Notes**: + - DevNet Workshop almost complete + - Work started on a new tool to help explore the V1 state + +### M3: RoS + +5. E2E Trustless Relay - Kickoff / POC of E2E trustless relay + +- **Score**: 7/10 ± 1 +- **Notes**: + - We kicked off the start of the implementation of E2E trustless relay + - Introduced a new member to the team: Welcome @adshmh! + +6. MVT (Minimum Viable TestNet) Feature List + +- **Score**: 8/10 ± 1 +- **Notes**: + - We documented the [list of Utility Features](https://github.com/pokt-network/pocket/blob/main/utility/doc/E2E_FEATURE_LIST.md) we plan to have in TestNet & MainNet + - The approach we will follow to implementing it can be found [here](https://github.com/pokt-network/pocket/blob/main/utility/doc/E2E_FEATURE_PATH_TEMPLATE.md) + - Bonus: We published [Relay Mining](https://arxiv.org/abs/2305.10672) with the help of @RawthiL from PoktScan on how it will be implemented + +### M\*: North Start + +7. **Bonus**: IBC & SMT! + +- **Notes**: + - With @h5law FT for the summer, we kicked of IBC implementation + - We started picking up work on our [Sparse Merkle Tree](https://github.com/pokt-network/smt) implementation + +## Demo 💻 + +There was no demo in this explicit DevLog but check out [this teaser](https://twitter.com/olshansky/status/1661886785662914561) on Twitter from @Olshansk. + +![Teaser](https://github.com/pokt-network/pocket/assets/1892194/a2fab136-9337-4926-adf8-c3299c61c1f2) + +## Contribute to V1 🧑‍💻 + +### Links & References + +- [V1 Specifications](https://github.com/pokt-network/pocket-network-protocol) +- [V1 Repo](https://github.com/pokt-network/pocket) +- [V1 Wiki](https://github.com/pokt-network/pocket/wiki) +- [V1 Project Dashboard](https://github.com/pokt-network/pocket/projects?query=is%3Aopen) + +## ScreenShots + +### Iteration 17 - Completed + +![Iteration17](https://github.com/pokt-network/pocket/assets/1892194/44763167-7165-4e6e-be9f-456c4103d089) + +### Iteration 18 - Planned + +![Iteration 18](https://github.com/pokt-network/pocket/assets/1892194/5778c180-e1f9-4e37-9ce3-48d006a290eb) + + diff --git a/docs/roadmap/README.md b/docs/roadmap/README.md index 79da39c8a..18a9cebf1 100644 --- a/docs/roadmap/README.md +++ b/docs/roadmap/README.md @@ -1,6 +1,8 @@ -# Roadmap & Milestones +# [WIP] Roadmap & Milestones -This document was last updated on 02-02-2022. +_This document was last updated on 06-05-2023._ + +IMPORTANT: Please note that with recent changes to the Pocket Network protocol team, the dates below are subject to change. With the loss of some of our key team members, our capacity is lower while we work on rebuilding the team. Though it is a temporary hurdle, and we are still doing our best to reprioritze and cut some scope, and we will update these dates as soon as we have more certainty on the new timelines! - [V1 Roadmap](#v1-roadmap) - [Milestones](#milestones) diff --git a/persistence/blockstore/block_store.go b/persistence/blockstore/block_store.go index 9ec932578..647d3e634 100644 --- a/persistence/blockstore/block_store.go +++ b/persistence/blockstore/block_store.go @@ -35,7 +35,7 @@ type blockStore struct { // NewBlockStore initializes a new blockstore with the given path. // * If "" is provided as the path, an in-memory store is used. func NewBlockStore(path string) (BlockStore, error) { - if path == "" { + if path == ":memory:" { return &blockStore{ kv: kvstore.NewMemKVStore(), }, nil diff --git a/persistence/docs/CHANGELOG.md b/persistence/docs/CHANGELOG.md index 5f8f2b7a0..0948b2792 100644 --- a/persistence/docs/CHANGELOG.md +++ b/persistence/docs/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.0.0.57] - 2023-06-06 + +- Uses ":memory:" to signify when connecting to an in-memory database + ## [0.0.0.56] - 2023-06-02 - Renamed an error used by Badger / KVStore diff --git a/persistence/docs/README.md b/persistence/docs/README.md index df80b7fd1..d29b5fab0 100644 --- a/persistence/docs/README.md +++ b/persistence/docs/README.md @@ -27,14 +27,14 @@ This document is meant to be a supplement to the living protocol specification a ## Node Configuration -The config specification can be found at [persistence_config.proto](../../runtime/configs/proto/persistence_config.proto), and an example can be found at [config1.json](../../build/config/config1.json). +The config specification can be found at [persistence_config.proto](../../runtime/configs/proto/persistence_config.proto), and an example can be found at [config.validator1.json](../../build/config/config.validator1.json). Note that the `node_schema` parameter **MUST** be unique for each node pointing to the same Postgres instance. There is currently no check or validation to guarantee this. ```json "persistence": { // ... - "node_schema": "node1", + "node_schema": "validator1", // ... }, ``` @@ -108,14 +108,14 @@ Open up a CLI to the postgres database via: ```bash make db_cli # Connect to the DB before connecting to a specific schema # OR -psqlSchema=node3 make db_cli_node # Immediately connect to the schema of node3 +psqlSchema=validator3 make db_cli_node # Immediately connect to the schema of validator3 ``` Then you can make use of the following SQL commands and explore: ```sql SELECT schema_name FROM information_schema.schemata; // View all of the schemas available -SET search_path=node1; // Set the search path to a schema `node1` +SET search_path=validator1; // Set the search path to a schema `validator1` /dt // View all available tables ``` diff --git a/persistence/indexer/indexer.go b/persistence/indexer/indexer.go index 245414667..65f56b3f9 100644 --- a/persistence/indexer/indexer.go +++ b/persistence/indexer/indexer.go @@ -52,7 +52,7 @@ type txIndexer struct { } func NewTxIndexer(databasePath string) (TxIndexer, error) { - if databasePath == "" { + if databasePath == ":memory:" { return NewMemTxIndexer() } diff --git a/persistence/state.go b/persistence/state.go index e8252d6fe..7fc6d448a 100644 --- a/persistence/state.go +++ b/persistence/state.go @@ -85,7 +85,7 @@ var merkleTreeToActorTypeName = map[merkleTree]coreTypes.ActorType{ } func newStateTrees(treesStoreDir string) (*stateTrees, error) { - if treesStoreDir == "" { + if treesStoreDir == ":memory:" { return newMemStateTrees() } diff --git a/persistence/test/setup_test.go b/persistence/test/setup_test.go index ddc2e82b1..f8d549412 100644 --- a/persistence/test/setup_test.go +++ b/persistence/test/setup_test.go @@ -99,9 +99,9 @@ func newTestPersistenceModule(databaseUrl string) modules.PersistenceModule { Persistence: &configs.PersistenceConfig{ PostgresUrl: databaseUrl, NodeSchema: testSchema, - BlockStorePath: "", - TxIndexerPath: "", - TreesStoreDir: "", + BlockStorePath: ":memory:", + TxIndexerPath: ":memory:", + TreesStoreDir: ":memory:", MaxConnsCount: 5, MinConnsCount: 1, MaxConnLifetime: "5m", diff --git a/rpc/doc/CHANGELOG.md b/rpc/doc/CHANGELOG.md index fa6b7d8a6..0e3d2dcb5 100644 --- a/rpc/doc/CHANGELOG.md +++ b/rpc/doc/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.0.0.22] - 2023-06-06 + +- Adds RPC PostV1QueryNodeRoles + ## [0.0.0.21] - 2023-06-02 - Add a few clarifying comments diff --git a/rpc/handlers.go b/rpc/handlers.go index c5964799c..c10342589 100644 --- a/rpc/handlers.go +++ b/rpc/handlers.go @@ -85,6 +85,13 @@ func (s *rpcServer) PostV1ClientGetSession(ctx echo.Context) error { // TECHDEBT: This will need to be changed when the HandleRelay function is actually implemented // because it copies data structures from v0. For example, AATs are no longer necessary in v1. func (s *rpcServer) PostV1ClientRelay(ctx echo.Context) error { + utility := s.GetBus().GetUtilityModule() + _, err := utility.GetServicerModule() + + if err != nil { + return ctx.String(http.StatusInternalServerError, "node is not a servicer") + } + var body RelayRequest if err := ctx.Bind(&body); err != nil { return ctx.String(http.StatusBadRequest, "bad request") @@ -124,7 +131,7 @@ func (s *rpcServer) PostV1ClientRelay(ctx echo.Context) error { Meta: relayMeta, } - relayResponse, err := s.GetBus().GetUtilityModule().HandleRelay(relayRequest) + relayResponse, err := utility.HandleRelay(relayRequest) if err != nil { return ctx.String(http.StatusInternalServerError, err.Error()) } diff --git a/rpc/handlers_query.go b/rpc/handlers_query.go index 40657f8ed..ed913cbeb 100644 --- a/rpc/handlers_query.go +++ b/rpc/handlers_query.go @@ -682,3 +682,12 @@ func (s *rpcServer) PostV1QueryValidators(ctx echo.Context) error { TotalPages: int64(totalPages), }) } + +func (s *rpcServer) PostV1QueryNodeRoles(ctx echo.Context) error { + actorModules := s.GetBus().GetUtilityModule().GetActorModules() + roles := make([]string, 0) + for _, m := range actorModules { + roles = append(roles, m.GetModuleName()) + } + return ctx.JSON(200, QueryNodeRolesResponse{NodeRoles: roles}) +} diff --git a/rpc/v1/openapi.yaml b/rpc/v1/openapi.yaml index da727c788..c3ccc486d 100644 --- a/rpc/v1/openapi.yaml +++ b/rpc/v1/openapi.yaml @@ -1,6 +1,8 @@ openapi: 3.0.3 servers: - url: "http://localhost:50832" + - url: "http://localhost:50836" + - url: "http://localhost:50837" info: description: >- This is the API definition Pocket Network Node RPC interface. @@ -415,7 +417,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/QueryAccountHeight' + $ref: "#/components/schemas/QueryAccountHeight" example: address: da034209758b78eaea06dd99c07909ab54c99b45 height: 99 @@ -933,6 +935,22 @@ paths: content: text/plain: example: "description of failure" + /v1/query/nodeRoles: + post: + tags: + - query + summary: Returns the type of utility actor(s) running on the node + responses: + "200": + description: A list of the node's utility actor(s) + content: + application/json: + schema: + $ref: "#/components/schemas/QueryNodeRolesResponse" + example: + node_roles: + - "validator" + - "servicer" externalDocs: description: Find out more about Pocket Network @@ -1097,7 +1115,7 @@ components: coins: type: array items: - $ref: '#/components/schemas/Coin' + $ref: "#/components/schemas/Coin" AllChainParamsResponse: type: array items: @@ -1183,7 +1201,7 @@ components: result: type: array items: - $ref: '#/components/schemas/Account' + $ref: "#/components/schemas/Account" page: type: integer format: int64 @@ -1363,6 +1381,15 @@ components: total_pages: type: integer format: int64 + QueryNodeRolesResponse: + type: object + required: + - node_roles + properties: + node_roles: + type: array + items: + type: string RelayResponse: type: object required: diff --git a/runtime/configs/config.go b/runtime/configs/config.go index c5d1d2467..d9a9791fd 100644 --- a/runtime/configs/config.go +++ b/runtime/configs/config.go @@ -3,6 +3,7 @@ package configs import ( "encoding/json" "log" + "os" "strings" "github.com/mitchellh/mapstructure" @@ -28,6 +29,9 @@ type Config struct { Logger *LoggerConfig `json:"logger"` RPC *RPCConfig `json:"rpc"` Keybase *KeybaseConfig `json:"keybase"` // Determines and configures which keybase to use, `file` or `vault`. IMPROVE(#626): See for rationale around proto design. We have proposed a better config design, but did not implement it due to viper limitations + Validator *ValidatorConfig `json:"validator"` + Servicer *ServicerConfig `json:"servicer"` + Fisherman *FishermanConfig `json:"fisherman"` } // ParseConfig parses the config file and returns a Config struct @@ -120,9 +124,6 @@ func NewDefaultConfig(options ...func(*Config)) *Config { }, }, Utility: &UtilityConfig{ - ServicerConfig: &ServicerConfig{ - Chains: []string{"0001"}, - }, MaxMempoolTransactionBytes: defaults.DefaultUtilityMaxMempoolTransactionBytes, MaxMempoolTransactions: defaults.DefaultUtilityMaxMempoolTransactions, }, @@ -155,6 +156,9 @@ func NewDefaultConfig(options ...func(*Config)) *Config { VaultToken: defaults.DefaultKeybaseVaultToken, VaultMountPath: defaults.DefaultKeybaseVaultMountPath, }, + Validator: &ValidatorConfig{}, + Servicer: &ServicerConfig{}, + Fisherman: &FishermanConfig{}, } for _, option := range options { @@ -183,3 +187,27 @@ func WithNodeSchema(schema string) func(*Config) { cfg.Persistence.NodeSchema = schema } } + +// CreateTempConfig creates a temporary config for testing purposes only +func CreateTempConfig(cfg *Config) (*Config, error) { + tmpfile, err := os.CreateTemp("", "test_config_*.json") + if err != nil { + return nil, err + } + defer os.Remove(tmpfile.Name()) + + content, err := json.Marshal(cfg) + if err != nil { + return nil, err + } + + if _, err := tmpfile.Write(content); err != nil { + return nil, err + } + + if err := tmpfile.Close(); err != nil { + return nil, err + } + + return ParseConfig(tmpfile.Name()), nil +} diff --git a/runtime/configs/proto/fisherman_config.proto b/runtime/configs/proto/fisherman_config.proto new file mode 100644 index 000000000..48efb7819 --- /dev/null +++ b/runtime/configs/proto/fisherman_config.proto @@ -0,0 +1,12 @@ + +syntax = "proto3"; + +package configs; + +option go_package = "github.com/pokt-network/pocket/runtime/configs"; + +// FishermanConfig defines the configuration for the node acting as a fisherman. Fishermen grade and enforce the quality of the Web3 access provided by Servicers +message FishermanConfig { + // Enabled defines whether or not the node is a fisherman. + bool enabled = 1; +} diff --git a/runtime/configs/proto/servicer_config.proto b/runtime/configs/proto/servicer_config.proto new file mode 100644 index 000000000..04cf41f22 --- /dev/null +++ b/runtime/configs/proto/servicer_config.proto @@ -0,0 +1,15 @@ + +syntax = "proto3"; + +package configs; + +option go_package = "github.com/pokt-network/pocket/runtime/configs"; + +// ServicerConfig defines the configuration for the node acting as a servicer. Servicers earn rewards for providing Web3 access over a function of volume and quality +message ServicerConfig { + // Enabled defines whether or not the node is a servicer. + bool enabled = 1; + string public_key = 2; + string address = 3; + repeated string chains = 4; +} diff --git a/runtime/configs/proto/utility_config.proto b/runtime/configs/proto/utility_config.proto index dbf9c6d61..ca491a54f 100644 --- a/runtime/configs/proto/utility_config.proto +++ b/runtime/configs/proto/utility_config.proto @@ -7,12 +7,4 @@ option go_package = "github.com/pokt-network/pocket/runtime/configs"; message UtilityConfig { uint64 max_mempool_transaction_bytes = 1; uint32 max_mempool_transactions = 2; - ServicerConfig servicer_config = 3; -} - -// TODO: Reevalute whether each utility actor should contain address/pubKey configs or if it should be shared -message ServicerConfig { - string public_key = 1; - string address = 2; - repeated string chains = 3; } diff --git a/runtime/configs/proto/validator_config.proto b/runtime/configs/proto/validator_config.proto new file mode 100644 index 000000000..58be76a93 --- /dev/null +++ b/runtime/configs/proto/validator_config.proto @@ -0,0 +1,12 @@ + +syntax = "proto3"; + +package configs; + +option go_package = "github.com/pokt-network/pocket/runtime/configs"; + +// ValidatorConfig defines the configuration for the node acting as a validator. A Validator is a protocol actor whose responsibility is to securely validate and process state transitions through transactions. +message ValidatorConfig { + // Enabled defines whether or not the node is a validator. + bool enabled = 1; +} diff --git a/runtime/defaults/defaults.go b/runtime/defaults/defaults.go index b2b31c530..bc1ddcca2 100644 --- a/runtime/defaults/defaults.go +++ b/runtime/defaults/defaults.go @@ -26,7 +26,7 @@ const ( DefaultRPCPort = "50832" DefaultBusBufferSize = 100 DefaultRPCHost = "localhost" - Validator1EndpointDockerCompose = "node1.consensus" + Validator1EndpointDockerCompose = "validator1" Validator1EndpointK8S = "validator-001-pocket" ) @@ -49,7 +49,6 @@ var ( DefaultPersistencePostgresURL = "postgres://postgres:postgres@pocket-db:5432/postgres" DefaultPersistenceBlockStorePath = "/var/blockstore" // p2p - DefaultUseLibp2p = false DefaultP2PPort = uint32(42069) DefaultP2PUseRainTree = true DefaultP2PConnectionType = types.ConnectionType_TCPConnection diff --git a/runtime/docs/CHANGELOG.md b/runtime/docs/CHANGELOG.md index d598351a7..0b09856bd 100644 --- a/runtime/docs/CHANGELOG.md +++ b/runtime/docs/CHANGELOG.md @@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.0.0.41] - 2023-06-06 + +- Adds fisherman and servicer proto configurations. +- Renames actor hostnames + ## [0.0.0.40] - 2023-06-01 - Add an Address field to Servicer configuration diff --git a/runtime/manager_test.go b/runtime/manager_test.go index f579d6bcb..e05a314cc 100644 --- a/runtime/manager_test.go +++ b/runtime/manager_test.go @@ -4078,7 +4078,7 @@ var expectedGenesis = &genesis.GenesisState{ Address: "00104055c00bed7c983a48aac7dc6335d7c607a7", PublicKey: "dfe357de55649e6d2ce889acf15eb77e94ab3c5756fe46d3c7538d37f27f115e", Chains: nil, - ServiceUrl: "node1.consensus:42069", + ServiceUrl: "validator1:42069", StakedAmount: "1000000000000", PausedHeight: -1, UnstakingHeight: -1, @@ -4089,7 +4089,7 @@ var expectedGenesis = &genesis.GenesisState{ Address: "00204737d2a165ebe4be3a7d5b0af905b0ea91d8", PublicKey: "eb2c78364525a210d994a83e02d18b4287ab81f6670cf4510ab6c9f51e296d91", Chains: nil, - ServiceUrl: "node2.consensus:42069", + ServiceUrl: "validator2:42069", StakedAmount: "1000000000000", PausedHeight: -1, UnstakingHeight: -1, @@ -4100,7 +4100,7 @@ var expectedGenesis = &genesis.GenesisState{ Address: "00304d0101847b37fd62e7bebfbdddecdbb7133e", PublicKey: "1041a9c76539791fef9bee5b4fcd5bf4a1a489e0790c44cbdfa776b901e13b50", Chains: nil, - ServiceUrl: "node3.consensus:42069", + ServiceUrl: "validator3:42069", StakedAmount: "1000000000000", PausedHeight: -1, UnstakingHeight: -1, @@ -4111,7 +4111,7 @@ var expectedGenesis = &genesis.GenesisState{ Address: "00404a570febd061274f72b50d0a37f611dfe339", PublicKey: "d6cea8706f6ee6672c1e013e667ec8c46231e0e7abcf97ba35d89fceb8edae45", Chains: nil, - ServiceUrl: "node4.consensus:42069", + ServiceUrl: "validator4:42069", StakedAmount: "1000000000000", PausedHeight: -1, UnstakingHeight: -1, @@ -4121,27 +4121,38 @@ var expectedGenesis = &genesis.GenesisState{ Servicers: []*types.Actor{ { ActorType: types.ActorType_ACTOR_TYPE_SERVICER, - Address: "43d9ea9d9ad9c58bb96ec41340f83cb2cabb6496", - PublicKey: "16cd0a304c38d76271f74dd3c90325144425d904ef1b9a6fbab9b201d75a998b", + Address: "00104055c00bed7c983a48aac7dc6335d7c607a7", + PublicKey: "dfe357de55649e6d2ce889acf15eb77e94ab3c5756fe46d3c7538d37f27f115e", Chains: []string{"0001"}, - ServiceUrl: "node1.consensus:42069", + ServiceUrl: "validator1:42069", StakedAmount: "1000000000000", PausedHeight: -1, UnstakingHeight: -1, - Output: "43d9ea9d9ad9c58bb96ec41340f83cb2cabb6496", + Output: "00104055c00bed7c983a48aac7dc6335d7c607a7", + }, + { + ActorType: types.ActorType_ACTOR_TYPE_SERVICER, + Address: "00604d18001a2012830b93efcc23100450e5a512", + PublicKey: "6ac62bddc541432cff818a02bab732f815ef2e6f7099e7dddc793d62d482b451", + Chains: []string{"0001"}, + ServiceUrl: "servicer1:42069", + StakedAmount: "1000000000000", + PausedHeight: -1, + UnstakingHeight: -1, + Output: "00604d18001a2012830b93efcc23100450e5a512", }, }, Fishermen: []*types.Actor{ { ActorType: types.ActorType_ACTOR_TYPE_FISH, - Address: "9ba047197ec043665ad3f81278ab1f5d3eaf6b8b", - PublicKey: "68efd26af01692fcd77dc135ca1de69ede464e8243e6832bd6c37f282db8c9cb", + Address: "00504987d4b181c1e97b1da9af42f3db733b1ff4", + PublicKey: "2777a49cdfde21867a538ddcfca05002f0115b1955a75b80e965ed63fc95f809", Chains: []string{"0001"}, - ServiceUrl: "node1.consensus:42069", + ServiceUrl: "fisherman1:42069", StakedAmount: "1000000000000", PausedHeight: -1, UnstakingHeight: -1, - Output: "9ba047197ec043665ad3f81278ab1f5d3eaf6b8b", + Output: "00504987d4b181c1e97b1da9af42f3db733b1ff4", }, }, Params: test_artifacts.DefaultParams(), @@ -4154,7 +4165,7 @@ func TestNewManagerFromReaders(t *testing.T) { options []func(*Manager) } defaultCfg := configs.NewDefaultConfig() - buildConfigBytes, err := os.ReadFile("../build/config/config1.json") + buildConfigBytes, err := os.ReadFile("../build/config/config.validator1.json") if err != nil { require.NoError(t, err) } @@ -4192,15 +4203,12 @@ func TestNewManagerFromReaders(t *testing.T) { ServerModeEnabled: true, }, Utility: &configs.UtilityConfig{ - ServicerConfig: &configs.ServicerConfig{ - Chains: []string{"0001"}, - }, MaxMempoolTransactionBytes: 1073741824, MaxMempoolTransactions: 9000, }, Persistence: &configs.PersistenceConfig{ PostgresUrl: "postgres://postgres:postgres@pocket-db:5432/postgres", - NodeSchema: "node1", + NodeSchema: "validator1", BlockStorePath: "/var/blockstore", TxIndexerPath: "/var/txindexer", TreesStoreDir: "/var/trees", @@ -4212,7 +4220,7 @@ func TestNewManagerFromReaders(t *testing.T) { }, P2P: &configs.P2PConfig{ PrivateKey: "0ca1a40ddecdab4f5b04fa0bfed1d235beaa2b8082e7554425607516f0862075dfe357de55649e6d2ce889acf15eb77e94ab3c5756fe46d3c7538d37f27f115e", - Hostname: "node1.consensus", + Hostname: "validator1", Port: defaults.DefaultP2PPort, ConnectionType: configTypes.ConnectionType_TCPConnection, MaxNonces: 1e5, @@ -4233,6 +4241,12 @@ func TestNewManagerFromReaders(t *testing.T) { UseCors: false, }, Keybase: defaultCfg.Keybase, + Servicer: &configs.ServicerConfig{ + Enabled: true, + Chains: []string{"0001"}, + }, + Validator: &configs.ValidatorConfig{Enabled: true}, + Fisherman: defaultCfg.Fisherman, }, genesisState: expectedGenesis, clock: clock.New(), @@ -4247,7 +4261,7 @@ func TestNewManagerFromReaders(t *testing.T) { args: args{ configReader: strings.NewReader(string(`{ "p2p": { - "hostname": "node1.consensus", + "hostname": "validator1", "port": 42069, "use_rain_tree": true, "is_empty_connection_type": false, @@ -4260,7 +4274,7 @@ func TestNewManagerFromReaders(t *testing.T) { config: &configs.Config{ P2P: &configs.P2PConfig{ PrivateKey: "4ff3292ff14213149446f8208942b35439cb4b2c5e819f41fb612e880b5614bdd6cea8706f6ee6672c1e013e667ec8c46231e0e7abcf97ba35d89fceb8edae45", - Hostname: "node1.consensus", + Hostname: "validator1", Port: 42069, ConnectionType: configTypes.ConnectionType_TCPConnection, MaxNonces: defaults.DefaultP2PMaxNonces, diff --git a/shared/k8s/debug.go b/shared/k8s/debug.go index 531c2ab7a..bfb966e04 100644 --- a/shared/k8s/debug.go +++ b/shared/k8s/debug.go @@ -3,8 +3,12 @@ package k8s import ( "context" + "flag" "fmt" "os" + "path/filepath" + + "k8s.io/client-go/tools/clientcmd" "github.com/pokt-network/pocket/logger" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -48,10 +52,16 @@ func FetchValidatorPrivateKeys(clientset *kubernetes.Clientset) (map[string]stri func getNamespace() (string, error) { _, err := os.Stat(kubernetesServiceAccountNamespaceFile) - if err != nil { - return defaultNamespace, nil + if err == nil { + return getNamespaceSvcAcct() } + if ns, err := getClientNamespace(); err == nil { + return ns, nil + } + return defaultNamespace, nil +} +func getNamespaceSvcAcct() (string, error) { nsBytes, err := os.ReadFile(kubernetesServiceAccountNamespaceFile) if err != nil { return "", fmt.Errorf("could not read namespace file: %v", err) @@ -59,3 +69,27 @@ func getNamespace() (string, error) { return string(nsBytes), nil } + +func getClientNamespace() (string, error) { + userHomeDir, err := os.UserHomeDir() + if err != nil { + return "", fmt.Errorf("failed to get home dir: %w", err) + } + kubeConfigPath := filepath.Join(userHomeDir, ".kube", "config") + kubeconfig := flag.String("kubeconfig", kubeConfigPath, "(optional) absolute path to the kubeconfig file") + _, err = clientcmd.BuildConfigFromFlags("", *kubeconfig) + if err != nil { + return "", fmt.Errorf("could not build config from flags: %v", err) + } + + // use the NewDefaultClientConfigLoadingRules() function to load the kubeconfig file + loadingRules := clientcmd.NewDefaultClientConfigLoadingRules() + + // use the NewNonInteractiveDeferredLoadingClientConfig() function to get the config + configOverrides := &clientcmd.ConfigOverrides{} + kubeconfigClient := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, configOverrides) + + // use the Namespace() function to get the current namespace + namespace, _, err := kubeconfigClient.Namespace() + return namespace, err +} diff --git a/shared/modules/doc/CHANGELOG.md b/shared/modules/doc/CHANGELOG.md index 0aa93f935..25c9b9f89 100644 --- a/shared/modules/doc/CHANGELOG.md +++ b/shared/modules/doc/CHANGELOG.md @@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.0.0.14] - 2023-06-06 + +- Adds fisherman, servicer, and validator modules to utility interface. +- Adds client kubectl kubeconfig as a fallback when sourcing namespace from the environment. + ## [0.0.0.13] - 2023-06-02 - Added `GetIndexedTransaction` to the `UtilityModule` interface to be able to retrieve an indexed transaction without running the underlying business logic diff --git a/shared/modules/utility_module.go b/shared/modules/utility_module.go index f8c97b53f..f89513200 100644 --- a/shared/modules/utility_module.go +++ b/shared/modules/utility_module.go @@ -44,6 +44,31 @@ type UtilityModule interface { // relay chain and geo zones using on-chain data as the source of entropy. Sessions can be returned for // any previous height or at most 1 block height into the future. GetSession(appAddr string, sessionHeight int64, relayChain string, geoZone string) (*coreTypes.Session, error) + + // GetActorModules returns the utility module's actor modules + GetActorModules() map[string]Module + + // GetFishermanModule returns the utility module's fisherman module if enabled + GetFishermanModule() (FishermanModule, error) + + // GetServicerModule returns the utility module's servicer module if enabled + GetServicerModule() (ServicerModule, error) + + // GetValidatorModule returns the utility module's validator module if enabled + GetValidatorModule() (ValidatorModule, error) +} + +type FishermanModule interface { + Module +} + +type ServicerModule interface { + Module + HandleRelay(*coreTypes.Relay) (*coreTypes.RelayResponse, error) +} + +type ValidatorModule interface { + Module } // TECHDEBT: Remove this interface from `shared/modules` and use the `Actor` protobuf type instead @@ -96,9 +121,3 @@ type LeaderUtilityUnitOfWork interface { type ReplicaUtilityUnitOfWork interface { UtilityUnitOfWork } - -type Servicer interface { - Module - - HandleRelay(*coreTypes.Relay) (*coreTypes.RelayResponse, error) -} diff --git a/utility/doc/CHANGELOG.md b/utility/doc/CHANGELOG.md index 0774d6a64..a8ee95591 100644 --- a/utility/doc/CHANGELOG.md +++ b/utility/doc/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.0.0.45] - 2023-06-06 + +- Adds servicer, fisherman, and validator utility modules + ## [0.0.0.44] - 2023-06-02 - Implemented `GetIndexedTransaction` diff --git a/utility/fisherman/module.go b/utility/fisherman/module.go new file mode 100644 index 000000000..54948d2d7 --- /dev/null +++ b/utility/fisherman/module.go @@ -0,0 +1,57 @@ +package fisherman + +import ( + "github.com/pokt-network/pocket/logger" + "github.com/pokt-network/pocket/shared/modules" + "github.com/pokt-network/pocket/shared/modules/base_modules" +) + +const ( + FishermanModuleName = "fisherman" +) + +type fisherman struct { + base_modules.IntegratableModule + logger *modules.Logger +} + +var ( + _ modules.FishermanModule = &fisherman{} +) + +func CreateFisherman(bus modules.Bus, options ...modules.ModuleOption) (modules.FishermanModule, error) { + m, err := new(fisherman).Create(bus, options...) + if err != nil { + return nil, err + } + return m.(modules.FishermanModule), nil +} + +func (*fisherman) Create(bus modules.Bus, options ...modules.ModuleOption) (modules.Module, error) { + m := &fisherman{} + + for _, option := range options { + option(m) + } + + bus.RegisterModule(m) + + m.logger = logger.Global.CreateLoggerForModule(m.GetModuleName()) + + return m, nil +} + +// TODO: implement this function +func (m *fisherman) Start() error { + m.logger.Info().Msg("🎣 Fisherman module started 🎣") + return nil +} + +func (m *fisherman) Stop() error { + m.logger.Info().Msg("🎣 Fisherman module stopped 🎣") + return nil +} + +func (m *fisherman) GetModuleName() string { + return FishermanModuleName +} diff --git a/utility/main_test.go b/utility/main_test.go index 6c1e35c92..7f3450147 100644 --- a/utility/main_test.go +++ b/utility/main_test.go @@ -94,7 +94,7 @@ func newTestRuntimeConfig( numFisherman int, genesisOpts ...test_artifacts.GenesisOption, ) *runtime.Manager { - cfg := &configs.Config{ + cfg, err := configs.CreateTempConfig(&configs.Config{ Utility: &configs.UtilityConfig{ MaxMempoolTransactionBytes: 1000000, MaxMempoolTransactions: 1000, @@ -102,15 +102,18 @@ func newTestRuntimeConfig( Persistence: &configs.PersistenceConfig{ PostgresUrl: dbURL, NodeSchema: "test_schema", - BlockStorePath: "", // in memory - TxIndexerPath: "", // in memory - TreesStoreDir: "", // in memory + BlockStorePath: ":memory:", + TxIndexerPath: ":memory:", + TreesStoreDir: ":memory:", MaxConnsCount: 50, MinConnsCount: 1, MaxConnLifetime: "5m", MaxConnIdleTime: "1m", HealthCheckPeriod: "30s", }, + }) + if err != nil { + log.Fatalf("Error creating config: %s", err) } genesisState, _ := test_artifacts.NewGenesisState( numValidators, diff --git a/utility/module.go b/utility/module.go index 05a99c769..184f8074e 100644 --- a/utility/module.go +++ b/utility/module.go @@ -1,30 +1,37 @@ package utility import ( + "errors" + "github.com/pokt-network/pocket/logger" "github.com/pokt-network/pocket/runtime/configs" "github.com/pokt-network/pocket/shared/mempool" "github.com/pokt-network/pocket/shared/modules" "github.com/pokt-network/pocket/shared/modules/base_modules" + "github.com/pokt-network/pocket/utility/fisherman" + "github.com/pokt-network/pocket/utility/servicer" "github.com/pokt-network/pocket/utility/types" + "github.com/pokt-network/pocket/utility/validator" +) + +const ( + ErrInvalidActorsEnabled = "invalid actors combination enabled" ) var ( _ modules.UtilityModule = &utilityModule{} - _ modules.Module = &utilityModule{} ) type utilityModule struct { base_modules.IntegratableModule - base_modules.InterruptableModule + + logger *modules.Logger config *configs.UtilityConfig - logger *modules.Logger mempool mempool.TXMempool - // TODO: initialize - servicer modules.Servicer + actorModules map[string]modules.Module } func Create(bus modules.Bus, options ...modules.ModuleOption) (modules.Module, error) { @@ -32,7 +39,9 @@ func Create(bus modules.Bus, options ...modules.ModuleOption) (modules.Module, e } func (*utilityModule) Create(bus modules.Bus, options ...modules.ModuleOption) (modules.Module, error) { - m := &utilityModule{} + m := &utilityModule{ + actorModules: map[string]modules.Module{}, + } for _, option := range options { option(m) @@ -47,12 +56,76 @@ func (*utilityModule) Create(bus modules.Bus, options ...modules.ModuleOption) ( m.config = utilityCfg m.mempool = types.NewTxFIFOMempool(utilityCfg.MaxMempoolTransactionBytes, utilityCfg.MaxMempoolTransactions) + m.logger = logger.Global.CreateLoggerForModule(m.GetModuleName()) + + if err := m.enableActorModules(cfg); err != nil { + return m, err + } return m, nil } +// enableActorModules enables the actor-specific modules and adds them to the utility module's actorModules to be started later. +func (u *utilityModule) enableActorModules(cfg *configs.Config) error { + fishermanCfg := cfg.Fisherman + servicerCfg := cfg.Servicer + validatorCfg := cfg.Validator + + if servicerCfg.Enabled { + s, err := servicer.CreateServicer(u.GetBus()) + if err != nil { + u.logger.Error().Err(err).Msg("failed to create servicer module") + return err + } + u.actorModules[s.GetModuleName()] = s + } + + if fishermanCfg.Enabled { + f, err := fisherman.CreateFisherman(u.GetBus()) + if err != nil { + u.logger.Error().Err(err).Msg("failed to create fisherman module") + return err + } + u.actorModules[f.GetModuleName()] = f + } + + if validatorCfg.Enabled { + v, err := validator.CreateValidator(u.GetBus()) + if err != nil { + u.logger.Error().Err(err).Msg("failed to create validator module") + return err + } + u.actorModules[v.GetModuleName()] = v + } + + if err := u.validateActorModuleExclusivity(cfg); err != nil { + return err + } + + return nil +} + func (u *utilityModule) Start() error { - u.logger = logger.Global.CreateLoggerForModule(u.GetModuleName()) + // start the actorModules + for _, actorModule := range u.actorModules { + if err := actorModule.Start(); err != nil { + u.logger.Error().Err(err).Msgf("failed to start %s", actorModule.GetModuleName()) + return err + } + } + + return nil +} + +func (u *utilityModule) Stop() error { + // stop the actorModules + for _, actorModule := range u.actorModules { + if err := actorModule.Stop(); err != nil { + u.logger.Error().Err(err).Msgf("failed to stop %s", actorModule.GetModuleName()) + return err + } + } + return nil } @@ -63,3 +136,63 @@ func (u *utilityModule) GetModuleName() string { func (u *utilityModule) GetMempool() mempool.TXMempool { return u.mempool } + +func (u *utilityModule) GetActorModules() map[string]modules.Module { + return u.actorModules +} + +func (u *utilityModule) GetServicerModule() (modules.ServicerModule, error) { + if u.actorModules[servicer.ServicerModuleName] == nil { + return nil, errors.New("servicer module not enabled") + } + if m, ok := u.actorModules[servicer.ServicerModuleName].(modules.ServicerModule); ok { + return m, nil + } + return nil, errors.New("failed to cast servicer module") +} + +func (u *utilityModule) GetFishermanModule() (modules.FishermanModule, error) { + if u.actorModules[fisherman.FishermanModuleName] == nil { + return nil, errors.New("fisherman module not enabled") + } + if m, ok := u.actorModules[fisherman.FishermanModuleName].(modules.FishermanModule); ok { + return m, nil + } + return nil, errors.New("failed to cast fisherman module") +} + +func (u *utilityModule) GetValidatorModule() (modules.ValidatorModule, error) { + if u.actorModules[validator.ValidatorModuleName] == nil { + return nil, errors.New("validator module not enabled") + } + if m, ok := u.actorModules[validator.ValidatorModuleName].(modules.ValidatorModule); ok { + return m, nil + } + return nil, errors.New("failed to cast validator module") +} + +// validateActorModuleExclusivity validates that the actor modules are enabled in a valid combination. +// TODO: There are probably more rules that need to be added here. +func (u *utilityModule) validateActorModuleExclusivity(cfg *configs.Config) error { + servicerCfg := cfg.Servicer + validatorCfg := cfg.Validator + actors := []string{} + for _, submodule := range u.actorModules { + actors = append(actors, submodule.GetModuleName()) + } + + if len(u.actorModules) > 1 { + // only case where this is allowed is if the node is a validator and a servicer + isVal := (validatorCfg != nil && validatorCfg.Enabled) + isServ := (servicerCfg != nil && servicerCfg.Enabled) + if !isVal || !isServ { + u.logger.Error().Strs("actors", actors).Msg(ErrInvalidActorsEnabled) + u.actorModules = map[string]modules.Module{} + return errors.New(ErrInvalidActorsEnabled) + } + } + + u.logger.Info().Strs("actors", actors).Msg("Node actors enabled") + + return nil +} diff --git a/utility/module_enable_actors_test.go b/utility/module_enable_actors_test.go new file mode 100644 index 000000000..b2879bd2e --- /dev/null +++ b/utility/module_enable_actors_test.go @@ -0,0 +1,100 @@ +package utility + +import ( + "testing" + + "github.com/golang/mock/gomock" + "github.com/pokt-network/pocket/runtime" + "github.com/pokt-network/pocket/runtime/configs" + "github.com/pokt-network/pocket/shared/modules" + mocks "github.com/pokt-network/pocket/shared/modules/mocks" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestEnableActorModules(t *testing.T) { + tests := []struct { + name string + config *configs.Config + expectedError string + expectedNames []string + expectedActorModules []modules.Module + expectedLogMessages []string + }{ + { + name: "servicer only", + config: &configs.Config{ + Servicer: &configs.ServicerConfig{Enabled: true}, + }, + expectedNames: []string{"servicer"}, + }, + { + name: "fisherman only", + config: &configs.Config{ + Fisherman: &configs.FishermanConfig{Enabled: true}, + }, + expectedNames: []string{"fisherman"}, + }, + { + name: "validator only", + config: &configs.Config{ + Validator: &configs.ValidatorConfig{Enabled: true}, + }, + expectedNames: []string{"validator"}, + }, + { + name: "validator and servicer", + config: &configs.Config{ + Validator: &configs.ValidatorConfig{Enabled: true}, + Servicer: &configs.ServicerConfig{Enabled: true}, + }, + expectedNames: []string{"validator", "servicer"}, + }, + { + name: "multiple actors not allowed", + config: &configs.Config{ + Validator: &configs.ValidatorConfig{Enabled: true}, + Fisherman: &configs.FishermanConfig{Enabled: true}, + }, + expectedError: ErrInvalidActorsEnabled, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + mockRunMgr := mocks.NewMockRuntimeMgr(ctrl) + cfg, err := configs.CreateTempConfig(test.config) + assert.NoError(t, err) + + mockRunMgr.EXPECT().GetConfig().Return(cfg).AnyTimes() + + bus, err := runtime.CreateBus(mockRunMgr) + assert.NoError(t, err) + + // Call enableActorModules with the test config + m, err := Create(bus) + + // Verify error output + if test.expectedError == "" { + require.NoError(t, err) + } else { + assert.EqualError(t, err, test.expectedError) + } + + um, ok := m.(modules.UtilityModule) + assert.True(t, ok) + + // Verify actor modules + for _, expectedName := range test.expectedNames { + module, err := um.GetBus().GetModulesRegistry().GetModule(expectedName) + require.NoError(t, err) + assert.NotNil(t, module) + } + assert.Equal(t, len(test.expectedNames), len(um.GetActorModules())) + + }) + } +} diff --git a/utility/service/module.go b/utility/service/module.go deleted file mode 100644 index 8ee5cd262..000000000 --- a/utility/service/module.go +++ /dev/null @@ -1,9 +0,0 @@ -package service - -import ( - "github.com/pokt-network/pocket/shared/modules" -) - -const servicerModuleName = "servicer" - -var _ modules.Module = &servicer{} diff --git a/utility/service/service.go b/utility/servicer/module.go similarity index 58% rename from utility/service/service.go rename to utility/servicer/module.go index 9decc2999..431463a0d 100644 --- a/utility/service/service.go +++ b/utility/servicer/module.go @@ -1,24 +1,26 @@ -package service +package servicer import ( "errors" "fmt" - "golang.org/x/exp/slices" - "github.com/pokt-network/pocket/logger" "github.com/pokt-network/pocket/runtime/configs" coreTypes "github.com/pokt-network/pocket/shared/core/types" - "github.com/pokt-network/pocket/shared/crypto" "github.com/pokt-network/pocket/shared/modules" "github.com/pokt-network/pocket/shared/modules/base_modules" + "golang.org/x/exp/slices" ) var ( errValidateBlockHeight = errors.New("relay failed block height validation") errValidateRelayMeta = errors.New("relay failed metadata validation") - _ modules.Servicer = &servicer{} + _ modules.ServicerModule = &servicer{} +) + +const ( + ServicerModuleName = "servicer" ) type servicer struct { @@ -29,14 +31,20 @@ type servicer struct { config *configs.ServicerConfig } -func CreateServicer(bus modules.Bus, options ...modules.ModuleOption) (modules.Module, error) { - return new(servicer).Create(bus, options...) +var ( + _ modules.ServicerModule = &servicer{} +) + +func CreateServicer(bus modules.Bus, options ...modules.ModuleOption) (modules.ServicerModule, error) { + m, err := new(servicer).Create(bus, options...) + if err != nil { + return nil, err + } + return m.(modules.ServicerModule), nil } func (*servicer) Create(bus modules.Bus, options ...modules.ModuleOption) (modules.Module, error) { - s := &servicer{ - logger: logger.Global.CreateLoggerForModule(servicerModuleName), - } + s := &servicer{} for _, option := range options { option(s) @@ -44,19 +52,27 @@ func (*servicer) Create(bus modules.Bus, options ...modules.ModuleOption) (modul bus.RegisterModule(s) + s.logger = logger.Global.CreateLoggerForModule(s.GetModuleName()) + cfg := bus.GetRuntimeMgr().GetConfig() - s.config = cfg.Utility.ServicerConfig + s.config = cfg.Servicer return s, nil } +// TODO: implement this function func (s *servicer) Start() error { - s.logger = logger.Global.CreateLoggerForModule(s.GetModuleName()) + s.logger.Info().Msg("🧬 Servicer module started 🧬") return nil } -func (*servicer) GetModuleName() string { - return servicerModuleName +func (s *servicer) Stop() error { + s.logger.Info().Msg("🧬 Servicer module stopped 🧬") + return nil +} + +func (s *servicer) GetModuleName() string { + return ServicerModuleName } // HandleRelay processes a relay after performing validation. @@ -206,147 +222,3 @@ func validateRelayBlockHeight(relayMeta *coreTypes.RelayMeta, session *coreTypes sessionStartingBlock, sessionLastBlock) } - -// TECHDEBT: These structures were copied as placeholders from v0 and need to be updated to reflect changes in v1 -// TODO: remove: use coreTypes.Relay instead -type Relay interface { - RelayPayload - RelayMeta -} - -type RelayPayload interface { - GetData() string // the actual data string for the external chain - GetMethod() string // the http CRUD method - GetHTTPPath() string // the HTTP Path - GetHeaders() map[string]string // http headers -} - -type RelayMeta interface { - GetBlockHeight() int64 // the block height when the request is made - GetServicerPublicKey() crypto.PublicKey - GetRelayChain() RelayChain - GetGeoZone() GeoZone - GetToken() AAT - GetSignature() string -} - -type RelayResponse interface { - Payload() string - ServicerSignature() string -} - -type RelayChain Identifiable -type GeoZone Identifiable - -type AAT interface { - GetVersion() string // confirm a valid AAT version - GetApplicationPublicKey() string // confirm the identity/signature of the app - GetClientPublicKey() string // confirm the identity/signature of the client - GetApplicationSignature() string // confirm the application signed the token -} - -type Identifiable interface { - Name() string - ID() string -} - -var _ Relay = &relay{} - -type relay struct{} - -// Validate a submitted relay by a client before servicing -func (r *relay) Validate() coreTypes.Error { - - // validate payload - - // validate the metadata - - // ensure the RelayChain is supported locally - - // ensure session block height is current - - // get the session context - - // get the application object from the r.AAT() - - // get session node count from that session height - - // get maximum possible relays for the application - - // ensure not over serviced - - // generate the session from seed data - - // validate self against the session - - return nil -} - -// Store a submitted relay by a client for volume tracking -func (r *relay) Store() coreTypes.Error { - - // marshal relay object into protoBytes - - // calculate the hashOf(protoBytes) - - // persist relay object, indexing under session - - return nil -} - -// Execute a submitted relay by a client after validation -func (r *relay) Execute() (RelayResponse, coreTypes.Error) { - - // retrieve the RelayChain url from the servicer's local configuration file - - // execute http request with the relay payload - - // format and digitally sign the response - - return nil, nil -} - -// Get volume metric applicable relays from store -func (r *relay) ReapStoreForHashCollision(sessionBlockHeight int64, hashEndWith string) ([]Relay, coreTypes.Error) { - - // Pull all relays whose hash collides with the revealed secret key - // It's important to note, the secret key isn't revealed by the network until the session is over - // to prevent volume based bias. The secret key is usually a pseudorandom selection using the block hash as a seed. - // (See the session protocol) - // - // Demonstrable pseudocode below: - // `SELECT * from RELAY where HashOf(relay) ends with hashEndWith AND sessionBlockHeight=sessionBlockHeight` - - // This function also signifies deleting the non-volume-applicable Relays - - return nil, nil -} - -// Report volume metric applicable relays to Fisherman -func (r *relay) ReportVolumeMetrics(fishermanServiceURL string, volumeRelays []Relay) coreTypes.Error { - - // Send all volume applicable relays to the assigned trusted Fisherman for - // a proper verification of the volume completed. Send volumeRelays to fishermanServiceURL - // through http. - - // NOTE: an alternative design is a 2 step, claim - proof lifecycle where the individual servicers - // build a merkle sum index tree from all the relays, submits a root and subsequent merkle proof to the - // network. - // - // Pros: Can report volume metrics directly to the chain in a trustless fashion - // Cons: Large chain bloat, non-trivial compute requirement for creation of claim/proof transactions and trees, - // non-trivial compute requirement to process claim / proofs during ApplyBlock() - - return nil -} - -func (r *relay) GetData() string { return "" } -func (r *relay) GetMethod() string { return "" } -func (r *relay) GetHTTPPath() string { return "" } -func (r *relay) GetHeaders() map[string]string { return nil } -func (r *relay) GetBlockHeight() int64 { return 0 } -func (r *relay) GetServicerPublicKey() crypto.PublicKey { return nil } -func (r *relay) GetRelayChain() RelayChain { return nil } -func (r *relay) GetGeoZone() GeoZone { return nil } -func (r *relay) GetToken() AAT { return nil } -func (r *relay) GetSignature() string { return "" } diff --git a/utility/service/service_test.go b/utility/servicer/module_test.go similarity index 97% rename from utility/service/service_test.go rename to utility/servicer/module_test.go index 16ef75c4c..e0833b5b1 100644 --- a/utility/service/service_test.go +++ b/utility/servicer/module_test.go @@ -1,4 +1,4 @@ -package service +package servicer import ( "errors" @@ -143,7 +143,7 @@ func testSession(editors ...sessionModifier) *coreTypes.Session { func mockBus(t *testing.T, cfg *configs.ServicerConfig, height uint64, session *coreTypes.Session) *mockModules.MockBus { ctrl := gomock.NewController(t) runtimeMgrMock := mockModules.NewMockRuntimeMgr(ctrl) - runtimeMgrMock.EXPECT().GetConfig().Return(&configs.Config{Utility: &configs.UtilityConfig{ServicerConfig: cfg}}).AnyTimes() + runtimeMgrMock.EXPECT().GetConfig().Return(&configs.Config{Servicer: cfg}).AnyTimes() consensusMock := mockModules.NewMockConsensusModule(ctrl) consensusMock.EXPECT().CurrentHeight().Return(height).AnyTimes() diff --git a/utility/servicer/relay.go b/utility/servicer/relay.go new file mode 100644 index 000000000..d72ed96ac --- /dev/null +++ b/utility/servicer/relay.go @@ -0,0 +1,151 @@ +package servicer + +import ( + "crypto" + + coreTypes "github.com/pokt-network/pocket/shared/core/types" +) + +// TECHDEBT: These structures were copied as placeholders from v0 and need to be updated to reflect changes in v1 +// TODO: remove: use coreTypes.Relay instead +type Relay interface { + RelayPayload + RelayMeta +} + +type RelayPayload interface { + GetData() string // the actual data string for the external chain + GetMethod() string // the http CRUD method + GetHTTPPath() string // the HTTP Path + GetHeaders() map[string]string // http headers +} + +type RelayMeta interface { + GetBlockHeight() int64 // the block height when the request is made + GetServicerPublicKey() crypto.PublicKey + GetRelayChain() RelayChain + GetGeoZone() GeoZone + GetToken() AAT + GetSignature() string +} + +type RelayResponse interface { + Payload() string + ServicerSignature() string +} + +type RelayChain Identifiable +type GeoZone Identifiable + +type AAT interface { + GetVersion() string // confirm a valid AAT version + GetApplicationPublicKey() string // confirm the identity/signature of the app + GetClientPublicKey() string // confirm the identity/signature of the client + GetApplicationSignature() string // confirm the application signed the token +} + +type Identifiable interface { + Name() string + ID() string +} + +var _ Relay = &relay{} + +type relay struct{} + +// Validate a submitted relay by a client before servicing +func (r *relay) Validate() coreTypes.Error { + + // validate payload + + // validate the metadata + + // ensure the RelayChain is supported locally + + // ensure session block height is current + + // get the session context + + // get the application object from the r.AAT() + + // get session node count from that session height + + // get maximum possible relays for the application + + // ensure not over serviced + + // generate the session from seed data + + // validate self against the session + + return nil +} + +// Store a submitted relay by a client for volume tracking +func (r *relay) Store() coreTypes.Error { + + // marshal relay object into protoBytes + + // calculate the hashOf(protoBytes) + + // persist relay object, indexing under session + + return nil +} + +// Execute a submitted relay by a client after validation +func (r *relay) Execute() (RelayResponse, coreTypes.Error) { + + // retrieve the RelayChain url from the servicer's local configuration file + + // execute http request with the relay payload + + // format and digitally sign the response + + return nil, nil +} + +// Get volume metric applicable relays from store +func (r *relay) ReapStoreForHashCollision(sessionBlockHeight int64, hashEndWith string) ([]Relay, coreTypes.Error) { + + // Pull all relays whose hash collides with the revealed secret key + // It's important to note, the secret key isn't revealed by the network until the session is over + // to prevent volume based bias. The secret key is usually a pseudorandom selection using the block hash as a seed. + // (See the session protocol) + // + // Demonstrable pseudocode below: + // `SELECT * from RELAY where HashOf(relay) ends with hashEndWith AND sessionBlockHeight=sessionBlockHeight` + + // This function also signifies deleting the non-volume-applicable Relays + + return nil, nil +} + +// Report volume metric applicable relays to Fisherman +func (r *relay) ReportVolumeMetrics(fishermanServiceURL string, volumeRelays []Relay) coreTypes.Error { + + // Send all volume applicable relays to the assigned trusted Fisherman for + // a proper verification of the volume completed. Send volumeRelays to fishermanServiceURL + // through http. + + // NOTE: an alternative design is a 2 step, claim - proof lifecycle where the individual servicers + // build a merkle sum index tree from all the relays, submits a root and subsequent merkle proof to the + // network. + // + // Pros: Can report volume metrics directly to the chain in a trustless fashion + // Cons: Large chain bloat, non-trivial compute requirement for creation of claim/proof transactions and trees, + // non-trivial compute requirement to process claim / proofs during ApplyBlock() + + return nil +} + +func (r *relay) GetData() string { return "" } +func (r *relay) GetMethod() string { return "" } +func (r *relay) GetHTTPPath() string { return "" } +func (r *relay) GetHeaders() map[string]string { return nil } +func (r *relay) GetBlockHeight() int64 { return 0 } +func (r *relay) GetServicerPublicKey() crypto.PublicKey { return nil } +func (r *relay) GetRelayChain() RelayChain { return nil } +func (r *relay) GetGeoZone() GeoZone { return nil } +func (r *relay) GetToken() AAT { return nil } +func (r *relay) GetSignature() string { return "" } diff --git a/utility/session.go b/utility/session.go index 58af4b997..16167e3b9 100644 --- a/utility/session.go +++ b/utility/session.go @@ -17,10 +17,11 @@ import ( // TODO: Implement this func (u *utilityModule) HandleRelay(relay *coreTypes.Relay) (*coreTypes.RelayResponse, error) { - if u.servicer == nil { - return nil, fmt.Errorf("utility module instance is not a servicer") + sm, err := u.GetServicerModule() + if err != nil { + return nil, err } - return u.servicer.HandleRelay(relay) + return sm.HandleRelay(relay) } // TODO: Implement this diff --git a/utility/unit_of_work/unit_of_work_test.go b/utility/unit_of_work/unit_of_work_test.go index a74454614..aa295d981 100644 --- a/utility/unit_of_work/unit_of_work_test.go +++ b/utility/unit_of_work/unit_of_work_test.go @@ -104,9 +104,9 @@ func newTestRuntimeConfig(databaseURL string) *runtime.Manager { Persistence: &configs.PersistenceConfig{ PostgresUrl: databaseURL, NodeSchema: testSchema, - BlockStorePath: "", // in memory - TxIndexerPath: "", // in memory - TreesStoreDir: "", // in memory + BlockStorePath: ":memory:", + TxIndexerPath: ":memory:", + TreesStoreDir: ":memory:", MaxConnsCount: 50, MinConnsCount: 1, MaxConnLifetime: "5m", diff --git a/utility/validator/module.go b/utility/validator/module.go new file mode 100644 index 000000000..818280d49 --- /dev/null +++ b/utility/validator/module.go @@ -0,0 +1,57 @@ +package validator + +import ( + "github.com/pokt-network/pocket/logger" + "github.com/pokt-network/pocket/shared/modules" + "github.com/pokt-network/pocket/shared/modules/base_modules" +) + +const ( + ValidatorModuleName = "validator" +) + +type validator struct { + base_modules.IntegratableModule + logger *modules.Logger +} + +var ( + _ modules.ValidatorModule = &validator{} +) + +func CreateValidator(bus modules.Bus, options ...modules.ModuleOption) (modules.ValidatorModule, error) { + m, err := new(validator).Create(bus, options...) + if err != nil { + return nil, err + } + return m.(modules.ValidatorModule), nil +} + +func (*validator) Create(bus modules.Bus, options ...modules.ModuleOption) (modules.Module, error) { + m := &validator{} + + for _, option := range options { + option(m) + } + + bus.RegisterModule(m) + + m.logger = logger.Global.CreateLoggerForModule(m.GetModuleName()) + + return m, nil +} + +// TODO: implement this function +func (m *validator) Start() error { + m.logger.Info().Msg("📝 Validator module started 📝") + return nil +} + +func (m *validator) Stop() error { + m.logger.Info().Msg("📝 Validator module stopped 📝") + return nil +} + +func (m *validator) GetModuleName() string { + return ValidatorModuleName +}