diff --git a/CMakeLists.txt b/CMakeLists.txt index 72dc941aa..0ede4c42c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -382,10 +382,12 @@ TARGET_SOURCES(${LIBDOGECOIN_NAME} PRIVATE src/buffer.c src/chacha20.c src/context.c + src/compact_filter.c src/cstr.c src/ctaes.c src/ecc.c src/eckey.c + src/golomb.c src/key.c src/koinu.c src/map.c @@ -458,6 +460,12 @@ ENDIF() ENDIF() TARGET_SOURCES(${LIBDOGECOIN_NAME} PUBLIC src/chainparams.c + # PUBLIC for the same reason as chainparams: these are const data + # referenced from the CLI targets, and a PRIVATE source is compiled only + # into the library. On a Windows DLL build the executables then cannot + # reach the arrays -- data symbols do not resolve across the DLL boundary + # without dllimport, and LIBDOGECOIN_API expands to nothing for consumers. + src/cf_checkpoints.c ) IF(WIN32 AND USE_TPM2) @@ -555,6 +563,8 @@ IF(USE_TESTS) test/chacha20_tests.c test/context_tests.c test/cstr_tests.c + test/compact_filter_tests.c + test/golomb_tests.c test/ecc_tests.c test/hash_tests.c test/key_tests.c @@ -685,6 +695,7 @@ IF(WITH_NET) ) TARGET_SOURCES(${LIBDOGECOIN_NAME} ${visibility} src/bip37.c + src/cfheadersdb_file.c src/headersdb_file.c src/net.c src/protocol.c @@ -701,6 +712,7 @@ IF(WITH_NET) ENDIF() IF(USE_TESTS) TARGET_SOURCES(tests ${visibility} + test/cfheadersdb_tests.c test/net_tests.c test/protocol_tests.c test/spv_tests.c diff --git a/Makefile.am b/Makefile.am index 14dc6d8ca..73457fdee 100644 --- a/Makefile.am +++ b/Makefile.am @@ -46,11 +46,14 @@ noinst_HEADERS = \ include/dogecoin/byteswap.h \ include/dogecoin/chacha20.h \ include/dogecoin/chainparams.h \ + include/dogecoin/cf_checkpoints.h \ + include/dogecoin/compact_filter.h \ include/dogecoin/common.h \ include/dogecoin/cstr.h \ include/dogecoin/ctaes.h \ include/dogecoin/ecc.h \ include/dogecoin/eckey.h \ + include/dogecoin/golomb.h \ include/dogecoin/hash.h \ include/dogecoin/key.h \ include/dogecoin/koinu.h \ @@ -108,10 +111,13 @@ libdogecoin_la_SOURCES = \ src/chacha20.c \ src/context.c \ src/chainparams.c \ + src/cf_checkpoints.c \ + src/compact_filter.c \ src/cstr.c \ src/ctaes.c \ src/ecc.c \ src/eckey.c \ + src/golomb.c \ src/key.c \ src/koinu.c \ src/map.c \ @@ -282,6 +288,8 @@ tests_SOURCES = \ test/chacha20_tests.c \ test/context_tests.c \ test/cstr_tests.c \ + test/compact_filter_tests.c \ + test/golomb_tests.c \ test/ecc_tests.c \ test/hash_tests.c \ test/key_tests.c \ @@ -410,6 +418,7 @@ endif if WITH_NET noinst_HEADERS += \ + include/dogecoin/cfheadersdb_file.h \ include/dogecoin/headersdb.h \ include/dogecoin/headersdb_file.h \ include/dogecoin/protocol.h \ @@ -418,6 +427,7 @@ noinst_HEADERS += \ include/dogecoin/spv.h libdogecoin_la_SOURCES += \ + src/cfheadersdb_file.c \ src/headersdb_file.c \ src/bip37.c \ src/net.c \ @@ -430,6 +440,7 @@ libdogecoin_la_CFLAGS += $(EVENT_CFLAGS) $(EVENT_PTHREADS_CFLAGS) if USE_TESTS tests_SOURCES += \ + test/cfheadersdb_tests.c \ test/net_tests.c \ test/protocol_tests.c \ test/spv_tests.c diff --git a/include/dogecoin/cf_checkpoints.h b/include/dogecoin/cf_checkpoints.h new file mode 100644 index 000000000..476e7f46f --- /dev/null +++ b/include/dogecoin/cf_checkpoints.h @@ -0,0 +1,69 @@ +/* + + The MIT License (MIT) + + Copyright (c) 2018 Bitcoin Core developers + Copyright (c) 2026 bluezr + Copyright (c) 2026 The Dogecoin Foundation + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES + OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + +*/ + +/** + * @file cf_checkpoints.h + * @brief BIP157 compact filter header checkpoints. + * + * Kept apart from chainparams so that several thousand lines of generated + * filter-header data do not sit in the middle of the chain parameter + * definitions, and so that adding block checkpoints and adding filter + * checkpoints touch different files. + */ + +#ifndef __LIBDOGECOIN_CF_CHECKPOINTS_H__ +#define __LIBDOGECOIN_CF_CHECKPOINTS_H__ + +#include +#include + +#include + +LIBDOGECOIN_BEGIN_DECL + +/** + * @brief BIP 157 compact filter header checkpoint. + * + * Filter header checkpoints at every CFCHECKPT_INTERVAL (1000) blocks. + */ +typedef struct dogecoin_cf_checkpoint_ { + uint32_t height; /**< Block height (multiple of CFCHECKPT_INTERVAL) */ + const char* filter_header; /**< Filter header hash as 64-char hex string */ +} dogecoin_cf_checkpoint; + +/* BIP157 compact filter header checkpoints per network. */ +extern const dogecoin_cf_checkpoint dogecoin_mainnet_cf_checkpoint_array[]; +extern const size_t dogecoin_mainnet_cf_checkpoint_count; +extern const dogecoin_cf_checkpoint dogecoin_testnet_cf_checkpoint_array[]; +extern const size_t dogecoin_testnet_cf_checkpoint_count; +extern const dogecoin_cf_checkpoint dogecoin_regtest_cf_checkpoint_array[]; +extern const size_t dogecoin_regtest_cf_checkpoint_count; + +LIBDOGECOIN_END_DECL + +#endif /* __LIBDOGECOIN_CF_CHECKPOINTS_H__ */ diff --git a/include/dogecoin/cfheadersdb_file.h b/include/dogecoin/cfheadersdb_file.h new file mode 100644 index 000000000..6c914c134 --- /dev/null +++ b/include/dogecoin/cfheadersdb_file.h @@ -0,0 +1,265 @@ +/* + + The MIT License (MIT) + + Copyright (c) 2026 bluezr + Copyright (c) 2026 The Dogecoin Foundation + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES + OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + +*/ + +/** + * @file cfheadersdb_file.h + * @brief File-backed storage for BIP157 compact filter headers. + * + * Stores compact filter headers (cfheaders) and compact filter data + * (cfilters) to disk, mirroring Dogecoin Core's filter/basic/ directory + * layout. On startup the database is loaded back into the SPV client's + * compact_filter_state, eliminating the need to re-download hundreds of + * megabytes of filter headers from peers after each restart. + * + * File layout within the data directory: + * filter/basic/cfheaders.dat — filter header chain (fixed 36-byte records) + * filter/basic/cfilters.dat — raw filter data (variable-length records) + */ + +#ifndef __LIBDOGECOIN_CFHEADERSDB_FILE_H__ +#define __LIBDOGECOIN_CFHEADERSDB_FILE_H__ + +#include + +#include +#include +#include + +LIBDOGECOIN_BEGIN_DECL + +/* ================================================================ */ +/* File format constants */ +/* ================================================================ */ + +/** + * v2 file header: 4-byte magic + 4-byte version + 32-byte genesis_filter_header = 40 bytes. + * v1 files (8-byte header, no genesis) are automatically deleted and rebuilt. + */ +#define CF_HEADERS_FILE_HDR_LEN 40 + +/** + * Fixed-size cfheaders record: height (4 LE) + filter_header (32) = 36 bytes. + * Records are appended in ascending height order. + */ +#define CF_HEADERS_FILE_REC_LEN 36 + +/** + * Variable-length cfilters record header: height (4 LE) + block_hash (32) + * + data_len (4 LE) = 40 bytes, followed by data_len bytes of filter data. + */ +#define CF_FILTERS_FILE_REC_HDR_LEN 40 + +/* ================================================================ */ +/* Compact filter headers database */ +/* ================================================================ */ + +/** + * @brief File-backed database for compact filter headers. + * + * Mirrors dogecoin_headers_db for the BIP157 filter header chain. + * When read_write is false (inmem_only mode), no file I/O is performed. + */ +typedef struct dogecoin_cfheaders_db_ { + FILE *file; /**< Open file handle (NULL when inmem_only) */ + dogecoin_bool read_write; /**< Whether file I/O is enabled */ + uint32_t tip_height; /**< Height of the last written filter header */ + uint256_t tip_header; /**< Filter header hash at tip_height */ + const dogecoin_chainparams *params; /**< Chain, selects the on-disk directory */ +} dogecoin_cfheaders_db; + +/** + * @brief File-backed database for compact filter data. + * + * Stores raw cfilter payloads keyed by block height and hash. + * SPV clients typically process and discard filter data; set + * read_write=false to skip disk I/O. + */ +typedef struct dogecoin_cfilters_db_ { + FILE *file; /**< Open file handle (NULL when inmem_only) */ + dogecoin_bool read_write; /**< Whether file I/O is enabled */ + uint32_t tip_height; /**< Height of the last written cfilter */ + const dogecoin_chainparams *params; /**< Chain, selects the on-disk directory */ +} dogecoin_cfilters_db; + +/* ================================================================ */ +/* Compact filter headers DB API */ +/* ================================================================ */ + +/** + * @brief Allocate a new compact filter headers database. + * @param inmem_only If true, no file I/O is performed (RAM-only mode). + * @return New database object, or NULL on allocation failure. + */ +LIBDOGECOIN_API dogecoin_cfheaders_db* dogecoin_cfheaders_db_new(const dogecoin_chainparams *params, dogecoin_bool inmem_only); + +/** + * @brief Free a compact filter headers database and close its file. + * @param db The database to free. + */ +LIBDOGECOIN_API void dogecoin_cfheaders_db_free(dogecoin_cfheaders_db *db); + +/** + * @brief Open (or create) the cfheaders file and load all stored headers. + * + * On success, every filter header read from disk is appended to + * @p state->filter_headers and @p state->cfheaders_tip_height is updated. + * + * @param db The database object. + * @param file_path Path to cfheaders.dat, or NULL for the default location + * (/filter/basic/cfheaders.dat). + * @param state Compact filter state to populate on load. + * @return true on success (file opened and records loaded). + */ +LIBDOGECOIN_API dogecoin_bool dogecoin_cfheaders_db_load( + dogecoin_cfheaders_db *db, + const char *file_path, + dogecoin_compact_filter_state *state); + +/** + * @brief Append one filter header record to the cfheaders file. + * + * Writes height (4 LE) + filter_header (32) and flushes to disk. + * + * @param db The database object. + * @param height Block height of the filter header. + * @param filter_header 32-byte filter header hash. + * @return true on success. + */ +LIBDOGECOIN_API dogecoin_bool dogecoin_cfheaders_db_write( + dogecoin_cfheaders_db *db, + uint32_t height, + const uint256_t filter_header); + +/** + * @brief Persist genesis_filter_header at file offset 8 (v2 format). + * + * Called once, right after the first cfheaders batch is received, to store + * the filter header that precedes the cfheaders download start height. + * Without this, cfilter validation cannot validate the first filter block. + * + * @param db The database object. + * @param genesis_filter_header 32-byte filter header for height (cfh_start - 1). + * @return true on success. + */ +LIBDOGECOIN_API dogecoin_bool dogecoin_cfheaders_db_write_genesis( + dogecoin_cfheaders_db *db, + const uint256_t genesis_filter_header); + +/** + * @brief Flush and fdatasync the cfheaders file. + * + * Call once after a bulk write loop instead of relying on per-record commits. + * + * @param db The database object. + * @return true on success. + */ +LIBDOGECOIN_API dogecoin_bool dogecoin_cfheaders_db_flush(dogecoin_cfheaders_db *db); + +/** + * @brief Truncate cfheaders.dat to the v2 header only (clears all records). + * + * Used by the cfcheckpt handler when a fresh cfheaders download is needed + * (e.g. invalid or incompatible previously-stored data). + * + * @param db The database object. + * @return true on success. + */ +LIBDOGECOIN_API dogecoin_bool dogecoin_cfheaders_db_reset(dogecoin_cfheaders_db *db); + +/* ================================================================ */ +/* Compact filters DB API */ +/* ================================================================ */ + +/** + * @brief Allocate a new compact filter data database. + * @param inmem_only If true, no file I/O is performed. + * @return New database object, or NULL on allocation failure. + */ +LIBDOGECOIN_API dogecoin_cfilters_db* dogecoin_cfilters_db_new(const dogecoin_chainparams *params, dogecoin_bool inmem_only); + +/** + * @brief Free a compact filter data database and close its file. + * @param db The database to free. + */ +LIBDOGECOIN_API void dogecoin_cfilters_db_free(dogecoin_cfilters_db *db); + +/** + * @brief Open (or create) the cfilters data file. + * + * Unlike cfheaders, filter data is not loaded back into RAM on startup; + * only the file handle is prepared for subsequent writes. + * + * @param db The database object. + * @param file_path Path to cfilters.dat, or NULL for the default location + * (/filter/basic/cfilters.dat). + * @return true on success (file opened). + */ +LIBDOGECOIN_API dogecoin_bool dogecoin_cfilters_db_load( + dogecoin_cfilters_db *db, + const char *file_path); + +/** + * @brief Append one cfilter record to the cfilters file. + * + * Writes height (4 LE) + block_hash (32) + data_len (4 LE) + data bytes, + * then flushes. + * + * @param db The database object. + * @param height Block height of this cfilter. + * @param block_hash 32-byte block hash. + * @param filter_data Raw encoded filter data. + * @return true on success. + */ +LIBDOGECOIN_API dogecoin_bool dogecoin_cfilters_db_write( + dogecoin_cfilters_db *db, + uint32_t height, + const uint256_t block_hash, + const cstring *filter_data); + +/** + * @brief Iterate over all records in the cfilters file. + * + * Rewinds the file to the first record and calls @p cb for each one. + * Iteration stops early if @p cb returns false. + * + * @param db The database object (must be loaded). + * @param cb Callback: (height, block_hash, filter_data, data_len, ctx). + * Return false to stop iteration. + * @param ctx Caller context passed through to @p cb. + * @return true if the full file was iterated (or cb stopped it early), + * false on I/O error. + */ +LIBDOGECOIN_API dogecoin_bool dogecoin_cfilters_db_iterate( + dogecoin_cfilters_db *db, + dogecoin_bool (*cb)(uint32_t height, const uint256_t block_hash, + const uint8_t *filter_data, uint32_t data_len, + void *ctx), + void *ctx); + +LIBDOGECOIN_END_DECL + +#endif /* __LIBDOGECOIN_CFHEADERSDB_FILE_H__ */ diff --git a/include/dogecoin/compact_filter.h b/include/dogecoin/compact_filter.h new file mode 100644 index 000000000..8df2f456f --- /dev/null +++ b/include/dogecoin/compact_filter.h @@ -0,0 +1,436 @@ +/* + + The MIT License (MIT) + + Copyright (c) 2018 Bitcoin Core developers + Copyright (c) 2026 bluezr + Copyright (c) 2026 The Dogecoin Foundation + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES + OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + +*/ + +/** + * @file compact_filter.h + * @brief BIP 157 Client Side Block Filtering protocol implementation. + * + * Implements the P2P protocol messages for fetching compact block filters + * (BIP 158) from full nodes, as specified in BIP 157. This enables light + * clients to download and query compact filters to efficiently determine + * which blocks contain transactions relevant to their wallet. + * + * Protocol message types: + * - getcfilters: Request a range of compact filters + * - cfilter: A single compact filter response + * - getcfheaders: Request filter headers for a range of blocks + * - cfheaders: Filter headers response + * - getcfcheckpt: Request evenly-spaced filter header checkpoints + * - cfcheckpt: Filter header checkpoints response + * + * References: + * - BIP 157: https://github.com/bitcoin/bips/blob/master/bip-0157.mediawiki + * - BIP 158: https://github.com/bitcoin/bips/blob/master/bip-0158.mediawiki + */ + +#ifndef __LIBDOGECOIN_COMPACT_FILTER_H__ +#define __LIBDOGECOIN_COMPACT_FILTER_H__ + +#include +#include +#include +#include +#include +#include +#include + +LIBDOGECOIN_BEGIN_DECL + +/* ================================================================ */ +/* BIP 157 Constants */ +/* ================================================================ */ + +/** Maximum number of filters that can be requested at once */ +#define MAX_GETCFILTERS_SIZE 1000 + +/** Maximum number of filter headers that can be requested at once */ +#define MAX_GETCFHEADERS_SIZE 2000 + +/** Checkpoint interval for cfcheckpt messages (every 1000 blocks) */ +#define CFCHECKPT_INTERVAL 1000 + +/** Interval at which filter header checkpoints are exported during full sync. + * Matches CFCHECKPT_INTERVAL so every BIP 157 checkpoint boundary is logged. */ +#define CF_EXPORT_INTERVAL CFCHECKPT_INTERVAL + +/* ================================================================ */ +/* BIP 157 Message Structures */ +/* ================================================================ */ + +/** + * @brief getcfilters request message (BIP 157). + * + * Requests compact filters for blocks in the range + * [start_height, stop_hash]. + */ +typedef struct dogecoin_getcfilters_msg_ { + uint8_t filter_type; /**< Filter type (0x00 for basic) */ + uint32_t start_height; /**< Start block height */ + uint256_t stop_hash; /**< Block hash of the last desired filter */ +} dogecoin_getcfilters_msg; + +/** + * @brief cfilter response message (BIP 157). + * + * Contains a single compact filter for one block. + */ +typedef struct dogecoin_cfilter_msg_ { + uint8_t filter_type; /**< Filter type (0x00 for basic) */ + uint256_t block_hash; /**< Block hash this filter covers */ + cstring *filter_data; /**< Raw encoded filter bytes (N || filter) */ +} dogecoin_cfilter_msg; + +/** + * @brief getcfheaders request message (BIP 157). + * + * Requests compact filter headers for blocks in the range + * [start_height, stop_hash]. + */ +typedef struct dogecoin_getcfheaders_msg_ { + uint8_t filter_type; /**< Filter type (0x00 for basic) */ + uint32_t start_height; /**< Start block height */ + uint256_t stop_hash; /**< Block hash of the last desired header */ +} dogecoin_getcfheaders_msg; + +/** + * @brief cfheaders response message (BIP 157). + * + * Contains filter headers for a range of blocks. + */ +typedef struct dogecoin_cfheaders_msg_ { + uint8_t filter_type; /**< Filter type */ + uint256_t stop_hash; /**< Block hash of the last header in the range */ + uint256_t prev_filter_header; /**< The filter header preceding the first in the range */ + vector_t *filter_hashes; /**< Vector of uint256_t* filter hashes */ +} dogecoin_cfheaders_msg; + +/** + * @brief getcfcheckpt request message (BIP 157). + * + * Requests evenly-spaced filter header checkpoints. + */ +typedef struct dogecoin_getcfcheckpt_msg_ { + uint8_t filter_type; /**< Filter type */ + uint256_t stop_hash; /**< Block hash of the last desired checkpoint */ +} dogecoin_getcfcheckpt_msg; + +/** + * @brief cfcheckpt response message (BIP 157). + * + * Contains filter header checkpoints at every CFCHECKPT_INTERVAL blocks. + */ +typedef struct dogecoin_cfcheckpt_msg_ { + uint8_t filter_type; /**< Filter type */ + uint256_t stop_hash; /**< Block hash of the last checkpoint */ + vector_t *filter_headers; /**< Vector of uint256_t* checkpoint filter headers */ +} dogecoin_cfcheckpt_msg; + +/* ================================================================ */ +/* Parallel cfilter download support structures */ +/* ================================================================ */ + +/** One buffered cfilter record held before in-order disk flush. */ +typedef struct cf_par_record_ { + uint256_t block_hash; + cstring *filter_data; /**< NULL = slot not yet received */ +} cf_par_record; + +/** In-flight getcfilters batch for one parallel worker node. */ +typedef struct cf_par_buf_ { + int node_id; /**< dogecoin_node.nodeid owning this slot; -1 = free */ + uint32_t batch_start; + uint32_t batch_end; + cf_par_record *records; /**< array[batch_end - batch_start + 1] */ + uint32_t received; /**< number of records received so far */ + dogecoin_bool complete; /**< true when received == batch size */ + int64_t assign_time; /**< unix time when this slot was last assigned */ +} cf_par_buf; + +/* ================================================================ */ +/* BIP 157 Per-Peer Compact Filter State */ +/* ================================================================ */ + +/** + * @brief Compact filter sync state for an SPV client. + * + * Tracks the progress of fetching and validating compact filters + * from peers, including checkpoints and headers-first validation. + */ +typedef struct dogecoin_compact_filter_state_ { + dogecoin_bool enabled; /**< Whether compact filter sync is active */ + uint8_t filter_type; /**< Filter type being synced */ + uint32_t cfheaders_tip_height; /**< Height of last verified cfheader */ + uint256_t cfheaders_tip_hash; /**< Filter header at cfheaders_tip_height */ + vector_t *filter_headers; /**< Vector of verified filter headers (uint256_t*) */ + vector_t *checkpoints; /**< Vector of checkpoint filter headers (uint256_t*) */ + uint32_t cfheaders_base_height; /**< Block height of filter_headers[0]; usually 1 or chainbottom_height */ + uint32_t filters_tip_height; /**< Height of last received filter */ + uint32_t cfilter_batch_end; /**< Last height expected in current getcfilters batch (re-request when filters_tip_height reaches this) */ + uint32_t pending_start_height; /**< Start of current outstanding request */ + uint256_t pending_stop_hash; /**< Stop hash of current outstanding request */ + dogecoin_bool awaiting_response; /**< Whether a request is outstanding */ + uint64_t last_request_time; /**< Timestamp of last cfilter request (for timeout) */ + uint256_t genesis_filter_header; /**< Filter header for genesis block (height 0); set from cfheaders.prev_filter_header on first batch */ + vector_t *watched_scripts; /**< ScriptPubKeys to match against filters (cstring*) */ + vector_t *matched_block_hashes; /**< Block hashes where filter matched (uint256_t*) */ + vector_t *matched_block_heights; /**< Heights corresponding to matched_block_hashes (uint32_t*) */ + uint32_t matched_blocks_fetched; /**< Number of matched blocks already received */ + dogecoin_bool cf_block_fetch_active; /**< True while fetching full blocks for BIP157 matches */ + + /* Parallel cfilter download (par_num_workers > 1 activates parallel mode). */ + uint8_t par_num_workers; /**< 0/1 = sequential; >1 = parallel worker count */ + uint32_t par_next_height; /**< Next height not yet assigned to any worker */ + uint32_t par_flush_height; /**< Next height that must be flushed to disk next */ + cf_par_buf *par_bufs; /**< Worker buffer array [par_num_workers], NULL in sequential mode */ + + /* Parallel cfheaders download (cfh_par_n > 0 activates parallel mode). + * Each worker downloads a disjoint height range; validation uses cfcheckpt + * anchors so workers are independent. When all complete, filter_headers + * is populated from cfh_par_data and the normal cfilter scan begins. */ + uint8_t cfh_par_n; /**< Number of parallel cfheader workers (0 = sequential) */ + uint8_t cfh_par_done; /**< Count of completed workers */ + uint8_t *cfh_par_data; /**< Flat 32*N_total byte array of filter headers */ + uint32_t cfh_par_base; /**< Height of first entry in cfh_par_data */ + uint32_t cfh_par_total; /**< Total number of filter headers in cfh_par_data */ + struct cfh_par_chunk_ *cfh_par_chunks; /**< Per-worker state [cfh_par_n] */ + + /* Flat filter-header array owned after parallel cfheader download completes. + * When non-NULL, cfilter validation uses this instead of the filter_headers vector. */ + uint8_t *filter_headers_flat; /**< 32*N contiguous filter headers */ + uint32_t filter_headers_flat_base; /**< Height of index 0 in filter_headers_flat */ + uint32_t filter_headers_flat_len; /**< Number of entries in filter_headers_flat */ + dogecoin_bool rescan_done; /**< True after a full cached-filter rescan; suppresses duplicate rescan in cfh_par_finish */ + uint32_t cf_scan_start_height; /**< Actual height cfilter scan began (chainbottom or 1); used for accurate progress logging */ +} dogecoin_compact_filter_state; + +/** Per-worker state for parallel cfheaders download. */ +typedef struct cfh_par_chunk_ { + int node_id; /**< dogecoin_node.nodeid; -1 = unassigned; -2 = no work */ + uint32_t start; /**< first height this worker handles */ + uint32_t end; /**< last height this worker handles */ + uint32_t req_next; /**< next height to request in a GETCFHEADERS batch */ + uint8_t prev_fh[32];/**< filter header immediately before start (cfcheckpt anchor) */ + uint32_t n_received; /**< filter headers received so far for this chunk */ + dogecoin_bool complete; +} cfh_par_chunk; + +/* ================================================================ */ +/* Message Serialization */ +/* ================================================================ */ + +/** + * @brief Serialize a getcfilters message. + * @param msg The message to serialize. + * @param out Output cstring (payload only, no P2P header). + */ +LIBDOGECOIN_API void dogecoin_p2p_msg_getcfilters_ser(const dogecoin_getcfilters_msg *msg, cstring *out); + +/** + * @brief Serialize a getcfheaders message. + * @param msg The message to serialize. + * @param out Output cstring (payload only). + */ +LIBDOGECOIN_API void dogecoin_p2p_msg_getcfheaders_ser(const dogecoin_getcfheaders_msg *msg, cstring *out); + +/** + * @brief Serialize a getcfcheckpt message. + * @param msg The message to serialize. + * @param out Output cstring (payload only). + */ +LIBDOGECOIN_API void dogecoin_p2p_msg_getcfcheckpt_ser(const dogecoin_getcfcheckpt_msg *msg, cstring *out); + +/* ================================================================ */ +/* Message Deserialization */ +/* ================================================================ */ + +/** + * @brief Deserialize a cfilter response message. + * @param msg The message to populate (filter_data will be allocated). + * @param buf Input buffer. + * @return true on success. + */ +LIBDOGECOIN_API dogecoin_bool dogecoin_p2p_msg_cfilter_deser(dogecoin_cfilter_msg *msg, struct const_buffer *buf); + +/** + * @brief Deserialize a cfheaders response message. + * @param msg The message to populate (filter_hashes will be allocated). + * @param buf Input buffer. + * @return true on success. + */ +LIBDOGECOIN_API dogecoin_bool dogecoin_p2p_msg_cfheaders_deser(dogecoin_cfheaders_msg *msg, struct const_buffer *buf); + +/** + * @brief Deserialize a cfcheckpt response message. + * @param msg The message to populate (filter_headers will be allocated). + * @param buf Input buffer. + * @return true on success. + */ +LIBDOGECOIN_API dogecoin_bool dogecoin_p2p_msg_cfcheckpt_deser(dogecoin_cfcheckpt_msg *msg, struct const_buffer *buf); + +/* ================================================================ */ +/* Message Lifecycle */ +/* ================================================================ */ + +/** + * @brief Initialize a cfilter message. + * @param msg The message to initialize. + */ +LIBDOGECOIN_API void dogecoin_cfilter_msg_init(dogecoin_cfilter_msg *msg); + +/** + * @brief Free a cfilter message's internal allocations. + * @param msg The message to free. + */ +LIBDOGECOIN_API void dogecoin_cfilter_msg_free(dogecoin_cfilter_msg *msg); + +/** + * @brief Initialize a cfheaders message. + * @param msg The message to initialize. + */ +LIBDOGECOIN_API void dogecoin_cfheaders_msg_init(dogecoin_cfheaders_msg *msg); + +/** + * @brief Free a cfheaders message's internal allocations. + * @param msg The message to free. + */ +LIBDOGECOIN_API void dogecoin_cfheaders_msg_free(dogecoin_cfheaders_msg *msg); + +/** + * @brief Initialize a cfcheckpt message. + * @param msg The message to initialize. + */ +LIBDOGECOIN_API void dogecoin_cfcheckpt_msg_init(dogecoin_cfcheckpt_msg *msg); + +/** + * @brief Free a cfcheckpt message's internal allocations. + * @param msg The message to free. + */ +LIBDOGECOIN_API void dogecoin_cfcheckpt_msg_free(dogecoin_cfcheckpt_msg *msg); + +/* ================================================================ */ +/* Compact Filter State Management */ +/* ================================================================ */ + +/** + * @brief Create a new compact filter state. + * @return Pointer to a new state, or NULL on failure. + */ +LIBDOGECOIN_API dogecoin_compact_filter_state* dogecoin_compact_filter_state_new(void); + +/** + * @brief Free a compact filter state and all associated memory. + * @param state The state to free. + */ +LIBDOGECOIN_API void dogecoin_compact_filter_state_free(dogecoin_compact_filter_state *state); + +/** + * @brief Reset the compact filter state for a fresh sync. + * @param state The state to reset. + */ +LIBDOGECOIN_API void dogecoin_compact_filter_state_reset(dogecoin_compact_filter_state *state); + +/* ================================================================ */ +/* Compact Filter Sync Helpers */ +/* ================================================================ */ + +/** + * @brief Validate a cfilter against a previously verified filter header. + * + * Computes the filter hash from the received filter data, chains it + * with the previous filter header, and compares against the expected + * filter header. + * + * @param filter_data The raw encoded filter data. + * @param prev_filter_header The filter header of the previous block. + * @param expected_filter_header The expected filter header for this block. + * @return true if the filter is valid. + */ +LIBDOGECOIN_API dogecoin_bool dogecoin_compact_filter_validate(const cstring *filter_data, const uint256_t prev_filter_header, const uint256_t expected_filter_header); + +/** + * @brief Compute a filter header from filter data and previous header. + * + * filter_header = dbl_sha256(filter_hash || prev_filter_header) + * where filter_hash = dbl_sha256(filter_data) + * + * @param filter_data The raw encoded filter data. + * @param prev_filter_header The previous filter header. + * @param header_out Output 32-byte filter header. + */ +LIBDOGECOIN_API void dogecoin_compact_filter_compute_header(const cstring *filter_data, const uint256_t prev_filter_header, uint256_t header_out); + +/* ================================================================ */ +/* BIP 157 Hardcoded Checkpoint Helpers */ +/* ================================================================ */ + +/** + * @brief Look up hardcoded cf checkpoints for a given chain. + * + * Returns the per-network array of known-good BIP 158 filter header + * checkpoints, used to validate peer-provided data and to bootstrap + * BIP 157 sync without a getcfcheckpt peer exchange. + * + * @param chain The chain params to look up. + * @param count_out Output: number of checkpoints in the returned array. + * @return Pointer to the checkpoint array, or NULL if none available. + */ +LIBDOGECOIN_API const dogecoin_cf_checkpoint* dogecoin_cf_get_checkpoints( + const dogecoin_chainparams *chain, size_t *count_out); + +/** + * @brief Validate peer-provided cfcheckpt data against hardcoded checkpoints. + * + * Compares checkpoints from a peer's cfcheckpt response with the + * hardcoded checkpoint array for the given chain. Returns true if + * all overlapping checkpoints match, or if no hardcoded checkpoints + * are available (no validation possible). + * + * @param chain The chain params. + * @param peer_checkpoints Vector of uint256_t* filter headers from peer. + * @return true if valid (or if no hardcoded data to compare against). + */ +LIBDOGECOIN_API dogecoin_bool dogecoin_cf_validate_checkpoints( + const dogecoin_chainparams *chain, const vector_t *peer_checkpoints); + +/** + * @brief Load hardcoded cf checkpoints into a compact filter state. + * + * Copies hardcoded checkpoint filter headers into the state's + * checkpoints vector, enabling cfheaders validation without + * a peer cfcheckpt exchange. + * + * @param state The compact filter state to populate. + * @param chain The chain params. + * @return Number of checkpoints loaded, or 0 if none available. + */ +LIBDOGECOIN_API size_t dogecoin_cf_load_hardcoded_checkpoints( + dogecoin_compact_filter_state *state, const dogecoin_chainparams *chain); + +LIBDOGECOIN_END_DECL + +#endif /* __LIBDOGECOIN_COMPACT_FILTER_H__ */ diff --git a/include/dogecoin/golomb.h b/include/dogecoin/golomb.h new file mode 100644 index 000000000..dfabe8412 --- /dev/null +++ b/include/dogecoin/golomb.h @@ -0,0 +1,336 @@ +/* + + The MIT License (MIT) + + Copyright (c) 2018 Bitcoin Core developers + Copyright (c) 2026 bluezr + Copyright (c) 2026 The Dogecoin Foundation + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES + OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + +*/ + +/** + * @file golomb.h + * @brief BIP 158 Golomb-Coded Set (GCS) compact block filter implementation. + * + * Implements Golomb-Rice coded sets as specified in BIP 158, enabling + * compact probabilistic set membership testing for block filtering. + * Combined with BIP 157 (client-side block filtering protocol), this + * allows light clients to efficiently determine whether a block contains + * transactions relevant to their wallet without downloading full blocks. + * + * The basic filter type (0x00) indexes all scriptPubKeys from outputs + * and all scriptPubKeys spent by inputs (prevout scripts), using + * SipHash-2-4 for hashing and Golomb-Rice coding with P=19, M=784931. + * + * References: + * - BIP 158: https://github.com/bitcoin/bips/blob/master/bip-0158.mediawiki + * - BIP 157: https://github.com/bitcoin/bips/blob/master/bip-0157.mediawiki + */ + +#ifndef __LIBDOGECOIN_GOLOMB_H__ +#define __LIBDOGECOIN_GOLOMB_H__ + +#include +#include +#include +#include +#include +#include + +LIBDOGECOIN_BEGIN_DECL + +/* ================================================================ */ +/* BIP 158 Constants */ +/* ================================================================ */ + +/** Basic filter type as defined in BIP 158 */ +#define GCS_BASIC_FILTER_TYPE 0x00 + +/** Golomb-Rice coding parameter P (19 bits) for basic filters */ +#define GCS_BASIC_FILTER_P 19 + +/** False positive rate parameter M = 1 << P * 1.497137 ≈ 784931 */ +#define GCS_BASIC_FILTER_M 784931 + +/** SipHash key size in bytes (16 bytes = 2 × uint64_t) */ +#define GCS_SIPHASH_KEY_SIZE 16 + +/* ================================================================ */ +/* Bitwriter - bit-level serialization for Golomb-Rice coding */ +/* ================================================================ */ + +/** + * @brief Bit-level writer for building Golomb-Rice encoded data. + * + * Accumulates bits into a cstring buffer, writing full bytes as + * they become available and flushing remaining bits on finalization. + */ +typedef struct gcs_bitwriter_ { + cstring *data; /**< Output buffer for serialized bits */ + uint8_t accumulator; /**< Bit accumulator for partial byte */ + int n_bits; /**< Number of valid bits in accumulator (0-7) */ +} gcs_bitwriter; + +/** + * @brief Bit-level reader for decoding Golomb-Rice encoded data. + * + * Reads bits from a const_buffer, maintaining a bit-level cursor. + */ +typedef struct gcs_bitreader_ { + struct const_buffer data; /**< Input buffer with encoded data */ + uint8_t accumulator; /**< Bit accumulator for partial byte reads */ + int n_bits; /**< Number of valid bits remaining in accumulator */ +} gcs_bitreader; + +/* ================================================================ */ +/* GCS Filter Structure */ +/* ================================================================ */ + +/** + * @brief A Golomb-Coded Set filter (BIP 158). + * + * Contains the encoded filter data along with metadata needed for + * querying. The filter is constructed from a set of data elements + * using SipHash-2-4 for hashing and Golomb-Rice coding for compression. + */ +typedef struct gcs_filter_ { + uint8_t filter_type; /**< Filter type (GCS_BASIC_FILTER_TYPE for basic) */ + uint32_t N; /**< Number of elements in the filter */ + uint64_t F; /**< Range of the filter (N * M) */ + uint8_t P; /**< Golomb-Rice coding parameter */ + uint64_t M; /**< Inverse false positive rate */ + uint8_t key[GCS_SIPHASH_KEY_SIZE]; /**< SipHash key derived from block hash */ + cstring *encoded; /**< The Golomb-Rice encoded filter data */ +} gcs_filter; + +/* ================================================================ */ +/* Bitwriter Functions */ +/* ================================================================ */ + +/** + * @brief Initialize a bitwriter with a pre-allocated output buffer. + * @param writer The bitwriter to initialize. + * @param initial_size Initial capacity hint for the output buffer. + */ +LIBDOGECOIN_API void gcs_bitwriter_init(gcs_bitwriter *writer, size_t initial_size); + +/** + * @brief Write a single bit to the bitwriter. + * @param writer The bitwriter. + * @param bit The bit value (0 or 1). + */ +LIBDOGECOIN_API void gcs_bitwriter_write_bit(gcs_bitwriter *writer, uint8_t bit); + +/** + * @brief Write multiple bits from a 64-bit value (MSB first). + * @param writer The bitwriter. + * @param value The value containing the bits to write. + * @param n_bits Number of bits to write from value (1-64). + */ +LIBDOGECOIN_API void gcs_bitwriter_write_bits_be(gcs_bitwriter *writer, uint64_t value, int n_bits); + +/** + * @brief Flush any remaining bits in the accumulator, padding with zeros. + * @param writer The bitwriter. + */ +LIBDOGECOIN_API void gcs_bitwriter_flush(gcs_bitwriter *writer); + +/* ================================================================ */ +/* Bitreader Functions */ +/* ================================================================ */ + +/** + * @brief Initialize a bitreader from encoded data. + * @param reader The bitreader to initialize. + * @param data Pointer to the encoded filter data. + * @param len Length of the encoded filter data. + */ +LIBDOGECOIN_API void gcs_bitreader_init(gcs_bitreader *reader, const void *data, size_t len); + +/** + * @brief Read a single bit from the bitreader. + * @param reader The bitreader. + * @return The bit value (0 or 1), or -1 on end-of-data. + */ +LIBDOGECOIN_API int gcs_bitreader_read_bit(gcs_bitreader *reader); + +/** + * @brief Read multiple bits and return them as a 64-bit value (MSB first). + * @param reader The bitreader. + * @param n_bits Number of bits to read (1-64). + * @param out Output value. + * @return true on success, false on end-of-data. + */ +LIBDOGECOIN_API dogecoin_bool gcs_bitreader_read_bits_be(gcs_bitreader *reader, int n_bits, uint64_t *out); + +/* ================================================================ */ +/* Golomb-Rice Coding */ +/* ================================================================ */ + +/** + * @brief Encode a value using Golomb-Rice coding. + * @param writer Bitwriter to write encoded data to. + * @param value The value to encode. + * @param P The Golomb-Rice parameter (number of remainder bits). + */ +LIBDOGECOIN_API void golomb_rice_encode(gcs_bitwriter *writer, uint64_t value, int P); + +/** + * @brief Decode a Golomb-Rice encoded value. + * @param reader Bitreader to read encoded data from. + * @param P The Golomb-Rice parameter (number of remainder bits). + * @param out Output value. + * @return true on success, false on end-of-data. + */ +LIBDOGECOIN_API dogecoin_bool golomb_rice_decode(gcs_bitreader *reader, int P, uint64_t *out); + +/* ================================================================ */ +/* GCS Filter Construction and Querying */ +/* ================================================================ */ + +/** + * @brief Derive the SipHash key from a block hash (first 16 bytes). + * + * Per BIP 158, the SipHash key is the first 16 bytes of the block hash + * in standard byte order. + * + * @param blockhash The 32-byte block hash. + * @param key Output 16-byte SipHash key. + */ +LIBDOGECOIN_API void gcs_derive_key(const uint256_t blockhash, uint8_t key[GCS_SIPHASH_KEY_SIZE]); + +/** + * @brief Hash a data element to a uint64_t value within the filter range. + * + * Uses SipHash-2-4 with the given key, then maps the result into [0, F) + * using modular reduction: (siphash(data) * F) >> 64. + * + * @param key The 16-byte SipHash key. + * @param F The filter range (N * M). + * @param data Pointer to the data element. + * @param data_len Length of the data element. + * @return The hashed value in [0, F). + */ +LIBDOGECOIN_API uint64_t gcs_hash_element(const uint8_t key[GCS_SIPHASH_KEY_SIZE], uint64_t F, const uint8_t *data, size_t data_len); + +/** + * @brief Create a new empty GCS filter. + * @return Pointer to a new gcs_filter, or NULL on allocation failure. + */ +LIBDOGECOIN_API gcs_filter* gcs_filter_new(void); + +/** + * @brief Free a GCS filter and all associated memory. + * @param filter The filter to free. + */ +LIBDOGECOIN_API void gcs_filter_free(gcs_filter *filter); + +/** + * @brief Build a GCS filter from a set of data elements. + * + * Takes a vector of raw byte elements (each element is a cstring*), + * hashes them, sorts the hashes, computes deltas, and Golomb-Rice + * encodes the result. + * + * @param filter The filter to populate (must be newly created). + * @param filter_type The filter type (GCS_BASIC_FILTER_TYPE). + * @param blockhash The block hash for key derivation. + * @param elements Vector of cstring* elements to include in the filter. + * @return true on success, false on failure. + */ +LIBDOGECOIN_API dogecoin_bool gcs_filter_build(gcs_filter *filter, uint8_t filter_type, const uint256_t blockhash, const vector_t *elements); + +/** + * @brief Check if a single element may be in the filter. + * + * @param filter The GCS filter to query. + * @param data Pointer to the element data. + * @param data_len Length of the element data. + * @return true if the element may be in the set (possible false positive), + * false if it is definitely not in the set. + */ +LIBDOGECOIN_API dogecoin_bool gcs_filter_match(const gcs_filter *filter, const uint8_t *data, size_t data_len); + +/** + * @brief Check if any element from a set may be in the filter. + * + * @param filter The GCS filter to query. + * @param elements Vector of cstring* elements to check. + * @return true if any element may be in the set, false if none match. + */ +LIBDOGECOIN_API dogecoin_bool gcs_filter_match_any(const gcs_filter *filter, const vector_t *elements); + +/** + * @brief Construct a BIP 158 basic filter for a full block. + * + * Collects all scriptPubKeys from outputs in the block's transactions + * and all scriptPubKeys being spent by inputs (from previous outputs), + * then builds a GCS filter from them. + * + * @param filter The filter to populate. + * @param blockhash The block hash. + * @param txs Vector of dogecoin_tx* (all transactions in the block). + * @param prev_output_scripts Vector of cstring* for scripts of prevouts + * spent by inputs (one per non-coinbase input). May be NULL if + * building from a node with UTXO access. For light clients + * receiving filters, this is not needed. + * @return true on success. + */ +LIBDOGECOIN_API dogecoin_bool gcs_build_basic_filter(gcs_filter *filter, const uint256_t blockhash, const vector_t *txs, const vector_t *prev_output_scripts); + +/** + * @brief Compute the filter header for a GCS filter. + * + * Per BIP 157, the filter header is: + * hash(filter_hash || prev_filter_header) + * where filter_hash = dbl-sha256(encoded_filter). + * + * @param filter The GCS filter. + * @param prev_header The previous filter header (32 bytes, zero for genesis). + * @param header_out Output 32-byte filter header. + * @return true on success. + */ +LIBDOGECOIN_API dogecoin_bool gcs_filter_compute_header(const gcs_filter *filter, const uint256_t prev_header, uint256_t header_out); + +/** + * @brief Serialize a GCS filter for wire transmission. + * + * Serializes as: N (CompactSize) || encoded_filter_data. + * + * @param filter The filter to serialize. + * @param out Output cstring. + */ +LIBDOGECOIN_API void gcs_filter_serialize(const gcs_filter *filter, cstring *out); + +/** + * @brief Deserialize a GCS filter from wire format. + * + * @param filter The filter to populate. + * @param filter_type The expected filter type. + * @param blockhash The block hash (for key derivation). + * @param buf Input buffer. + * @return true on success. + */ +LIBDOGECOIN_API dogecoin_bool gcs_filter_deserialize(gcs_filter *filter, uint8_t filter_type, const uint256_t blockhash, struct const_buffer *buf); + +LIBDOGECOIN_END_DECL + +#endif /* __LIBDOGECOIN_GOLOMB_H__ */ diff --git a/include/dogecoin/headersdb_file.h b/include/dogecoin/headersdb_file.h index cc38e8d7b..06291f7b5 100644 --- a/include/dogecoin/headersdb_file.h +++ b/include/dogecoin/headersdb_file.h @@ -55,6 +55,11 @@ typedef struct dogecoin_headers_db_ dogecoin_blockindex genesis; dogecoin_blockindex *chaintip; dogecoin_blockindex *chainbottom; + /* Sequential scan state for dogecoin_headers_db_get_block_hash_at_height. + * cfheaders batches request increasing heights; resuming from the last + * found record avoids O(N²) re-reads over a 6.2M-block file. */ + long scan_resume_pos; /**< File offset after last successful scan record */ + uint32_t scan_resume_height; /**< Block height at scan_resume_pos */ } dogecoin_headers_db; dogecoin_headers_db *dogecoin_headers_db_new(const dogecoin_chainparams* chainparams, dogecoin_bool inmem_only); @@ -68,6 +73,22 @@ dogecoin_bool dogecoin_headersdb_disconnect_tip(dogecoin_headers_db* db); dogecoin_bool dogecoin_headersdb_has_checkpoint_start(dogecoin_headers_db* db); void dogecoin_headersdb_set_checkpoint_start(dogecoin_headers_db* db, uint256_t hash, uint32_t height, arith_uint256 chainwork); +/** + * @brief Find the block hash stored at a specific height in the on-disk header file. + * + * Scans the headers.db file from its beginning, reading fixed-size records until + * the one with @p target_height is found. Falls back to walking the in-memory + * prev-chain first for blocks near the chain tip (no file I/O needed there). + * + * @param db The headers database (file handle must be open). + * @param target_height Block height to look up. + * @param hash_out Receives the 32-byte block hash on success. + * @return true if found and @p hash_out is populated. + */ +dogecoin_bool dogecoin_headers_db_open_for_scan(dogecoin_headers_db *db, const char *filename); +dogecoin_bool dogecoin_headers_db_get_block_hash_at_height(dogecoin_headers_db *db, uint32_t target_height, uint256_t hash_out); +dogecoin_bool dogecoin_headers_db_get_block_hash_at_height_seq(dogecoin_headers_db *db, uint32_t target_height, uint256_t hash_out); + /* Defined in headersdb_file.c using typed trampolines (avoids the * function-pointer-cast UB that -fsanitize=function flags). */ extern const dogecoin_headers_db_interface dogecoin_headers_db_interface_file; diff --git a/include/dogecoin/net.h b/include/dogecoin/net.h index 7592500ef..7ee38a50f 100644 --- a/include/dogecoin/net.h +++ b/include/dogecoin/net.h @@ -102,6 +102,12 @@ typedef struct dogecoin_node_ { unsigned int bestknownheight; uint32_t hints; /* can be use for user defined state */ + + /* BIP157 parallel cfilter worker state. + * cf_batch_end == 0 means no batch is assigned yet. */ + uint32_t cf_batch_start; /* first height in current getcfilters batch */ + uint32_t cf_batch_end; /* last height in current getcfilters batch */ + uint32_t cf_cur_height; /* next expected cfilter height from this node */ } dogecoin_node; /* =================================== */ diff --git a/include/dogecoin/protocol.h b/include/dogecoin/protocol.h index 8fd9a33c1..3e6f6e05c 100644 --- a/include/dogecoin/protocol.h +++ b/include/dogecoin/protocol.h @@ -106,6 +106,13 @@ static const char* DOGECOIN_MSG_SENDCMPCT = "sendcmpct"; static const char* DOGECOIN_MSG_CMPCTBLOCK = "cmpctblock"; static const char* DOGECOIN_MSG_GETBLOCKTXN = "getblocktxn"; static const char* DOGECOIN_MSG_BLOCKTXN = "blocktxn"; +/* BIP 157: Compact block filter protocol messages */ +static const char* DOGECOIN_MSG_GETCFILTERS = "getcfilters"; +static const char* DOGECOIN_MSG_CFILTER = "cfilter"; +static const char* DOGECOIN_MSG_GETCFHEADERS = "getcfheaders"; +static const char* DOGECOIN_MSG_CFHEADERS = "cfheaders"; +static const char* DOGECOIN_MSG_GETCFCHECKPT = "getcfcheckpt"; +static const char* DOGECOIN_MSG_CFCHECKPT = "cfcheckpt"; DISABLE_WARNING_POP enum DOGECOIN_INV_TYPE { diff --git a/include/dogecoin/spv.h b/include/dogecoin/spv.h index ba2bbdf49..e8a030425 100644 --- a/include/dogecoin/spv.h +++ b/include/dogecoin/spv.h @@ -31,6 +31,7 @@ #include #include +#include #include #include #include @@ -42,6 +43,7 @@ LIBDOGECOIN_BEGIN_DECL enum SPV_CLIENT_STATE { SPV_HEADER_SYNC_FLAG = (1 << 0), SPV_FULLBLOCK_SYNC_FLAG = (1 << 1), + SPV_CFILTER_SYNC_FLAG = (1 << 2), }; typedef struct spv_block_sample_ @@ -107,6 +109,39 @@ typedef struct dogecoin_spv_client_ uint256_t filtered_history_last_rerequest_txid; /* dedupe repeated tail re-requests for the same matched tx */ int32_t filtered_history_last_rerequest_height; + /* Comma-separated "host:port" strings supplied by the caller via + * dogecoin_spv_client_discover_peers(). When non-NULL, the reconnect + * callback reuses these peers instead of querying DNS seeds, so the + * client stays connected to the explicitly-named hosts only. */ + char *peer_ips; + + /* BIP157 genesis-filter support: optional read-only secondary headers DB + * used only for block-hash lookup at early heights when the primary DB is + * checkpoint-based. Populated via --filter-hash-db CLI option. */ + void *aux_hash_db_ctx; /**< Context for aux block-hash lookup DB */ + const dogecoin_headers_db_interface *aux_hash_db; /**< Interface for aux block-hash lookup DB */ + + /* When non-zero, overrides the cfheaders start height (auto default: + * chainbottom for checkpoint-based sync, 1 for genesis sync). */ + uint32_t cf_start_height; + + /* Number of parallel getcfilters workers (independent TCP connections). + * 0 or 1 means sequential (default); >1 activates parallel mode. */ + uint8_t cf_num_workers; + + /* BIP157: compact filter sync state */ + dogecoin_bool compact_filters_enabled; /**< Whether compact filter sync is active */ + dogecoin_compact_filter_state *cfilter_state; /**< BIP157 per-client compact filter state */ + struct dogecoin_cfheaders_db_ *cfheaders_db; /**< Persistent storage for BIP157 filter headers */ + struct dogecoin_cfilters_db_ *cfilters_db; /**< Persistent storage for BIP157 filter data */ + char *cfheaders_path; /**< Override path for cfheaders.dat (NULL = default datadir) */ + char *cfilters_path; /**< Override path for cfilters.dat (NULL = default datadir) */ + + /* BIP158 filter header computation during full block sync */ + uint256_t cf_prev_filter_header; /**< Running filter header chain for BIP158 */ + uint32_t cf_computed_height; /**< Last height for which a filter header was computed */ + dogecoin_bool cf_export_enabled; /**< Log filter header checkpoints during sync */ + /* callbacks */ /* ========= */ void (*header_connected)(struct dogecoin_spv_client_ *client); @@ -162,6 +197,20 @@ LIBDOGECOIN_API dogecoin_bool dogecoin_spv_client_filteradd( LIBDOGECOIN_API dogecoin_bool dogecoin_spv_client_filterclear(dogecoin_spv_client* client); +/* BIP157: enable or disable compact filter sync for this client */ +LIBDOGECOIN_API void dogecoin_spv_enable_compact_filters(dogecoin_spv_client *client, dogecoin_bool enable); + +/* BIP157: rescan all cached cfilters in cfilters.dat against watched scripts. + * Call after dogecoin_spv_client_filteradd and before dogecoin_spv_client_runloop + * to check locally-stored filters immediately without waiting for cfheaders sync. */ +LIBDOGECOIN_API void dogecoin_spv_client_rescan_cached_filters(dogecoin_spv_client *client); + + +/* BIP157: send getcfcheckpt, getcfheaders, getcfilters to a peer */ +LIBDOGECOIN_API dogecoin_bool dogecoin_spv_request_cfcheckpt(dogecoin_spv_client *client, dogecoin_node *node); +LIBDOGECOIN_API dogecoin_bool dogecoin_spv_request_cfheaders(dogecoin_spv_client *client, dogecoin_node *node, uint32_t start_height, const uint256_t stop_hash); +LIBDOGECOIN_API dogecoin_bool dogecoin_spv_request_cfilters(dogecoin_spv_client *client, dogecoin_node *node, uint32_t start_height, const uint256_t stop_hash); + LIBDOGECOIN_END_DECL #endif // __LIBDOGECOIN_SPV_H__ diff --git a/include/dogecoin/wallet.h b/include/dogecoin/wallet.h index 22f028dac..1abc0ca52 100644 --- a/include/dogecoin/wallet.h +++ b/include/dogecoin/wallet.h @@ -202,6 +202,7 @@ LIBDOGECOIN_API int dogecoin_wallet_add_hd_account_ts(dogecoin_wallet* wallet, u LIBDOGECOIN_API int dogecoin_wallet_get_address_ts(dogecoin_wallet* wallet, char* address, size_t len, uint32_t account, uint32_t index, dogecoin_bool change); LIBDOGECOIN_API dogecoin_bool dogecoin_p2pkh_address_to_wallet_pubkeyhash(const char* address_in, dogecoin_wallet_addr* addr, dogecoin_wallet* wallet); LIBDOGECOIN_API dogecoin_wallet_addr* dogecoin_p2pkh_address_to_wallet(const char* address_in, dogecoin_wallet* wallet); +LIBDOGECOIN_API dogecoin_bool dogecoin_wallet_add_watchonly_addr(dogecoin_wallet* wallet, const char* address_in); /** writes all available addresses (P2PKH) to the addr_out vector_t */ LIBDOGECOIN_API void dogecoin_wallet_get_addresses(dogecoin_wallet* wallet, vector_t* addr_out); diff --git a/src/cf_checkpoints.c b/src/cf_checkpoints.c new file mode 100644 index 000000000..638dd3e0e --- /dev/null +++ b/src/cf_checkpoints.c @@ -0,0 +1,6293 @@ +/* + + The MIT License (MIT) + + Copyright (c) 2018 Bitcoin Core developers + Copyright (c) 2026 bluezr + Copyright (c) 2026 The Dogecoin Foundation + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES + OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + +*/ + +/** + * @file cf_checkpoints.c + * @brief BIP157 compact filter header checkpoint data. + * + * One filter header per CFCHECKPT_INTERVAL (1000) blocks, used to validate a + * peer's cfcheckpt response before any filter headers are trusted. + */ + +#include + +const dogecoin_cf_checkpoint dogecoin_mainnet_cf_checkpoint_array[] = { + { 1000, "03cba6fcccc24f375efc327558d84f79c4be0aad567a11f6e251f2d647ee76c7" }, + { 2000, "a9abdca4c6f4acc3715a8c36a0429fdbec8e338059c0588ebb5e3faabab95fc7" }, + { 3000, "a019c429c39dc45913e23bef748c0b833da4262de59ab2cc1efcdc6cec6a0d20" }, + { 4000, "acc366d51d9c422bc020d8f21e19d8c57cb207b5fc8af082ddfee5d6780603d2" }, + { 5000, "305c523f4287fff9cdb266171abfca9ae2e9f1311b417255d63464d5985482e7" }, + { 6000, "d686fb009c5df70ebd2c1d789e2243a1ef16fec6aa981d10f43c7aba84e639d9" }, + { 7000, "93586f1ec916329416c26abae5129087c7a310bce39e9b6984f21eb3bd584118" }, + { 8000, "1af0e9121ead9e34fc484014dca7fe2143b29482ebc1b28a043daa265990a9ba" }, + { 9000, "9a9b396b5b4a43354ccfa87ac188d16a26fdfc6690544ad1b9a6aecf077228e2" }, + { 10000, "888a34959356ba713a435b3c196a74ed057b2101d7ebf5093164375f5c377773" }, + { 11000, "d162935ec49dffb60733dd5bed3337c2b8ca94fdb13730a5056aa264e3855d1a" }, + { 12000, "0b76ceafab9b8df1f6756ae3118de7720b8fc5aa91c3cd7f6b06d0fa972b71d5" }, + { 13000, "c736c6ee7b16fd7b16f21898216ece99b6f0cd07452fba9a06169031feb8b84f" }, + { 14000, "34fbd49d219ca87aef0a6cd5de611b59661500c9b9b20ecb314b5e98da3888cf" }, + { 15000, "08cf19e74be510a4da996bc01cc3ff6846b7be7a125af73c15571757dedb5ceb" }, + { 16000, "ed1b029f13cd667ef1019cf92b99c1b55c2c19fb659e2dc4760b78a3098b832f" }, + { 17000, "d5449b02e52c2a9f701899d56ce3903d927b937dfb5c4a366d943bec325517f2" }, + { 18000, "130d09e9243fc3ca9e6b5a9520bd2853c3e17dc97a305f2700287b87d3cdbb1d" }, + { 19000, "8b16f9b4ad48078d059c9588160644f9afc724f10a67fd5969316ec8242e8107" }, + { 20000, "72c0ec389608f5f4b7a9089f28f0d94a782c7e2347785d2601bd6ccdc1ddb704" }, + { 21000, "fb1458cc611fa008a2ad08007cc9034a2e3f0e97c57e77c690440625450f1244" }, + { 22000, "2af00182c7b6c771b97784d7429f2839725eb68c67180c9b38ba7a1f62558cde" }, + { 23000, "ea15e2fdaa962d13467c6a1a0f15d8375881daccc908fd8edc0732d1395d1388" }, + { 24000, "8934e229a01cad3634de5a509bc72132dbf75d166583ff21c1a60e2589211cc7" }, + { 25000, "fa7b514aff644d18cc24b9502046ad48c75ad25a6bc757a761c9fe944636530b" }, + { 26000, "76e71b5a083f7e412ffb7394662e1ce6e79265de88f69873fe590017fde6065d" }, + { 27000, "063a8a7357dbbbfd2dc3aaea366be674d377e0082d5d0d2c92f691ecfbe99254" }, + { 28000, "e2df6a34cafa71a254273c0738b1fef3953a10ac2afb13fcb9773067c5f010c4" }, + { 29000, "4e3be4f4bb1f9fcb24b1f4244531825718499df833174417df54928d854bbc0f" }, + { 30000, "32247ee3ae6c8c06e16f81032daef3361b81aadcaad027dc7f5d5f389518abfa" }, + { 31000, "e4eaef8453c21465bbc96d68641b2881945feb2cdb2e6c4398d49d8a67553cb0" }, + { 32000, "312313f730d5ae288259deb8d77ddab5e2716c616645e406b88f1bf7dcfc4289" }, + { 33000, "ba0dd569c517ca823d2ed6e85e54b7a82abf4e9c25f5ef0aa940ad068802fcbd" }, + { 34000, "072438d36966ab508e43406b45dd04eb577ffedb20ad39094dbdf9b4f41c5bf7" }, + { 35000, "81016e4a8540a2551e38e72dea35eb33ab3ebfe5dbea97b1b07305c0e1bfbbd0" }, + { 36000, "3f8ef3a1d4eba6235f79e22ff35f81ec77c16e47b275dadb86c2fcfcf9cd6b16" }, + { 37000, "86c762ecc63e233aa239b8f70157ade17483179e0e1fbcefd93b24497af656f2" }, + { 38000, "51a78d5f18efc5330ec8548ec9087c96f93d0527348f1cc32696c62d7d16f0be" }, + { 39000, "a3f4a02391923c3cb36a9865b6939b9f73975a16ce83249c0da3a15aa09f9733" }, + { 40000, "4d2dcaffb4fb14769abb78be6e6cc277cbdb13e9bd76683421dc63bd764f8090" }, + { 41000, "1a6bb4d0daec7ccb7a8a21b311009c03f94bc87d17f8be28c798061be715f14c" }, + { 42000, "52feab3cd806011f6e432e480fe7b31c750ab80bdaa1707b1ad80abdb680b6ca" }, + { 43000, "ff2be3e4c52989b172a13bc9ed3e60a76dfe9918ab82e796332c7292538e1736" }, + { 44000, "78be26e8070d354e482ca95e4c7a69bce5ed9a243332d2525cbcd946fe1521ac" }, + { 45000, "b6a0515ace95dbd65c6b6a4372f4070593034cc992a0fe671c01208eb798aef4" }, + { 46000, "2c3cb4fff0b1d263a08a89c2a559ad3205a54572ed6030f0cc931d408d92ece5" }, + { 47000, "f85cee229a807ad2d9359fd2a9c4a24a1f7e936962fed5c8fb33c0612d21894f" }, + { 48000, "a27189f1be9a8d43f01079a5dec988b11cfd94efd6cbb05913c56e1507e245c7" }, + { 49000, "8c4f77afbc6b7aa35580f90e816b54be4402c8bbfc68f7ebd665780e9b5835d0" }, + { 50000, "c3641a217f872db8d468eca848583fca42a48ad9ac212e566b29e3d1af6bd8db" }, + { 51000, "a34bc5740731a29b8edb335fae08ff170f66935e16fa9ed208f0eabf99a7930b" }, + { 52000, "4eb2f95935631e64df2930be875f3c15a25575a3dc9b6c58d36319f9b5622cc0" }, + { 53000, "a61db1d5d11b7383113dcca3e521e1cbdd4eb6cf140b17de9ca1cfb74f825d0c" }, + { 54000, "bae28556f5d33275dd09ee921f946b47d5773bc090d5e0cd07ca3e66d0beb4e6" }, + { 55000, "3f673a3a07fa746ff925e7eda18a15e5c13b9452ab2e0bdada828997ce02f7aa" }, + { 56000, "2f03afff65dd1375635634a5cae26a108dd5de398cb2564f7280a9af1d9e9763" }, + { 57000, "2adf548c6c32aaf9c3fbc07ba53a9dbebc353800d8b9b0b0c61caccf589c8e84" }, + { 58000, "34696ce9da0f294a80c3c247fc78a8fa85c07470e81d66084fde2302a992061a" }, + { 59000, "cf2fc8a708161662cc77275716ea4c6effb578fbfb8cf2e484e885ef865ce553" }, + { 60000, "7bcca84d61226f5da8e7994d9f549e9c697e3ef47870e5655b969366417b5f81" }, + { 61000, "3746da0b2fc2731ad6b5b939f0eba75c9d7d4901c6da5fbdda279c4ba1ba6c64" }, + { 62000, "964c3975b738b1744dd779b0e02a9a43f2c84db893c8fe7baa850d557086dfba" }, + { 63000, "e7b59a28473bafb6c90150b13747960242530e5e8265e404ebb3efbbf1a0c349" }, + { 64000, "880585429b9fa8f44597a7413276b2b4dcbab1d1c6370ff5d7135c15727aebcf" }, + { 65000, "6ad31328c3cefaf953b7f2bd9cf11e22fae7d576acf25a1231bc2d13fa6e212a" }, + { 66000, "4bd129e544562da5edec8c356313fc5e71e59b322a1403d7b16989e69a560745" }, + { 67000, "b8e814802c8011f08b4c43cd54a8f47a09eaf860243e6ddda3e6f0adb230e229" }, + { 68000, "eb20347a822a5f864259634a0de7e412ff2ff03d3258b762c5b95e16c6a9a943" }, + { 69000, "f28938b3d8e9b1cef2f3d8f35b31e6ebac34d7480b414066ea1081a5819b06f7" }, + { 70000, "1f89c9d488ba97eed360f16d18afae8ed6434bcfd414fce1e8ab86872d76ce07" }, + { 71000, "299443e579187a0c0316d979060234ce3e2e95e51bd88d3742535513236a9400" }, + { 72000, "718d3dcf171c6ece78741b0b6a98ed3115acb9fcd3d2d0f729ade693eb16767a" }, + { 73000, "c1402662f853ebf588a2d2dbfd05b15aa224c3e7f35945e4185442e721ce1692" }, + { 74000, "ecdadf32ac0e54a66b8fbc6929b4a3ae5bad8ec8a59f86767e169d080606a9e9" }, + { 75000, "92a7df7d77402059b3c5e48250885d1ed8144e4e6040418c3d30d696c38e8b32" }, + { 76000, "0728d1f97e0c1e0d041ec3e2ec6bb3b9ab18fa8d0e886c090c1eddccbb072f27" }, + { 77000, "38dc1d4a9ca5f169ae409108b07710f9762fb16cca31c44faf07abf68c4d6703" }, + { 78000, "63aef4c34867128d303ae63cdf3c20c5b51d29867d1a48a38d50a870589b7e78" }, + { 79000, "1f779091df0cf3cb911b5a19f0587f87fb347104563c40ed2cb3b871a95c88f5" }, + { 80000, "0365afc55aac6e1a2dda2e382cd85eef200d9002af5618b8335470d8b137e898" }, + { 81000, "3d9a03d6599469d07c6d9accf7e22ca991443a64ffcf4dfb5f40d7d3aba8b972" }, + { 82000, "e2475a661f39dbb4f9f9d8f6ecf2a85620a54d87efdee4e86134e4d3a1de91d2" }, + { 83000, "1bea47c29311b8a0103bb785d7d63de4f1180d0b1fbc5828b7ae33123e55d34b" }, + { 84000, "4a680c58cd4bb1457191966923f2399f0bf3a654b6bfffd8dc23df569f5114fe" }, + { 85000, "d25c2b5b5cc70d8b1b7e08c8e67b221ed337d9ff977f25c6e3292dcba1dc0312" }, + { 86000, "304931cbfe5f0816dbd1af996c85a15768d021b2222c700f2a084e9a40d67e7f" }, + { 87000, "23455ecb3dd9453b69611391f80a2c6aef1046fde7026ef8d051a120771489ee" }, + { 88000, "560a90e1a2c597cf721f11245bac1700066bea0146682c956f36eb1bfaa84601" }, + { 89000, "e88a640a71932b67d8e9d5cd3ef685e440c6fd69762308944781bb9294acda39" }, + { 90000, "14f3831f186c1e100a35d8a205a0a637fedcfae805f63545ebf0886dca8a1893" }, + { 91000, "a20ec28849ea82182ec81104cc19e0bdf755fdd99bd139352b46e5b3deedc847" }, + { 92000, "abbb536704ac86c88365f58632d551ee5738bd831de45a6f916315ac9ff38bc8" }, + { 93000, "f5e792d5780c25cbfeaf20470db541c3395be0ebf713782f9174a259f4ad364f" }, + { 94000, "2a55b22f90170d9c5ce90fd19215b4a689330113db883d4440a5518f5512ec7f" }, + { 95000, "3be753aea124a3bd8b38a9678a6c355ab9434b655dcabe272f468b362734cb09" }, + { 96000, "f38c670deb573788f4829ecc163d6469067ce01ac622718d2fa0ab7973950459" }, + { 97000, "65600c036b4c06123427e63759105cc96393a0deedfc1fd67d6e49d2917e48d0" }, + { 98000, "7b34318ec4022ba0874c1f64d698bebd0e2a661a837ab322429a193fe34a9605" }, + { 99000, "97a1ce88a4d3cf6ac79089cdc9502d59467de2afd2d46e4ea21a7692afeb608d" }, + { 100000, "040a2689d9159fdd6343db90acc55206b051e51fcee10477729d22b42e2cdc8b" }, + { 101000, "bc47f3888982374d89f86e371bbf6d2f1385621972b311da94277eee6fee0c02" }, + { 102000, "e6a949e91ec73833388090350d062e61fca84cf48416c0e285e4dd3b486cda5a" }, + { 103000, "aff08adb6890c3ce35f6ab2a9c1d13e6a60ce422946996062cd9d2415874a30e" }, + { 104000, "b203ca08981a51ca03f834fd82de87b971a7ee6d57ddc8517b5713dfc01e392e" }, + { 105000, "a1c141a974f691dd6a11afd834a85554bc7b9d88257c2679c82018035b91af78" }, + { 106000, "c53a6a066362e3f2e32c33462bda9346862da6268459ec2237f0010eb8cf07e3" }, + { 107000, "6033fa0bff49d7b94ed76f7351dfe4eb6bfde0b5ee97e25504009e516f738a91" }, + { 108000, "f533adb4b4e1ae94df0be093f92055d6106cd4ab3e8f0ca076f66c8a3a661329" }, + { 109000, "e8db028d01fd0e190d269e530d4980b74696660409eee458684a6bde3ac7b0a5" }, + { 110000, "0da5e17b5d3233a7244a6be2b224e70c07dc66d2dae8756aeac8153fe88dcd4e" }, + { 111000, "5b5cc2c8ff0f9b7c135c3be32c14de86d62c9214c541a41be3a78b53dce008ce" }, + { 112000, "81e921abe70a2da4ed1362f480f961867669bafe252f6ecdc2dde68724814122" }, + { 113000, "a7aabf294fb83e07163f35ee2249f40f38e35d4213dea50c01f1e992233c8372" }, + { 114000, "3ba7e2261dd77ca8ad2e255aaa9c17b3e2b8fbc1ac757744f1ec838c51bb7b94" }, + { 115000, "1e959473c3c5de06a65f73d56f7e1b3bdf402552f35f034a5fbf7addddb5f3e9" }, + { 116000, "2a129efbde15b406e5bbe57105373b8e4116b856b14df400c707ab4bcc680f5d" }, + { 117000, "e2eb5d17e89329fb8db4f4d235b21630506555f0929bd428fa9d5baa183144f0" }, + { 118000, "f991fb1f2820e11f1f192f4720bf104d54f10a5e075d0ec493e254482f770d7f" }, + { 119000, "034fcde84822ebcf9ebb3e1e2753c9a480f93c55273d397af9c4ad7ec1c866d0" }, + { 120000, "6163f4ade939318dbdd623ee8c2e38263efea610a1e8960f4864b18bd1932e3e" }, + { 121000, "f078b6a589460c41369de58f9bc057194e3e51b24fd5b6b78be48a156088c7ed" }, + { 122000, "e924f948f84e6f8ed42c6dc55d41ea75b1265effaddf7a6d6962e3389fa365e9" }, + { 123000, "0f748c97cf042d1622b7776fcfc5c21ad0937a094c5741cdff6d3133af1062f2" }, + { 124000, "4d926a698f69f2b4d10a5100413f2b0d5f5ade678d7818aad77cdaaf54627393" }, + { 125000, "bcb29facf3a99ce36dcabd19e54a52b9ca5f538eccd726d400db3c3d28500001" }, + { 126000, "13050960c4c421ae65e7024a2f921af6cb2a6704ca1a9eb55a81ab8501dcf2b2" }, + { 127000, "91e994e787ca1235ad0209a1ac21b2b1f6cd36f978768acd4ef675ece72b1435" }, + { 128000, "3239ef551ea7258d9d5c0de5e49cd0dfb6c7a909c23216b2e3e7297534ffbea0" }, + { 129000, "925eb0ee6240bb3df585d46696f88604a4ee10c625271f78d4339fab7d14d131" }, + { 130000, "175f2e7e23215a600b429ed712445a4b4c90eba8e9da8dcfc19c6702af9bd451" }, + { 131000, "a7102065d9def3e7c906c84d1658125fafe8ae4bcdcb25199b23b2ccf6b54eea" }, + { 132000, "93ad76336720813772efb7247c91df59abe849cbe668b9cebd7fd2d3374b7467" }, + { 133000, "5cd540f335754b74a47a0625ff971b9509873b3f239bf787f7069ddae95939f6" }, + { 134000, "b19f78a30181ed6caf9dec9566753e82c0776c8aa968f03232408a4b4583519a" }, + { 135000, "694acdb929ac9e39e9b4f4ea35baf078c7b83aa9dad9e9364bd3ee455f70a605" }, + { 136000, "ed6ccde444b85684b056f31fcb8fd21fb273c63b542de8eb115583c708053041" }, + { 137000, "7940479e1592d6c3ce3d10e6fc66917601aa06d5c643cb67045ae7d74d4cebde" }, + { 138000, "25c90f26c62cdf4228a12b5204db33b1e63a0391159b8dab0a7b000abeaa57e2" }, + { 139000, "25b384538f29056a73eb03cd3deb3b8e6cd929412596456b5887a083bb1a0a20" }, + { 140000, "92d7dcd30e1cb3ddf97e912a08123af11a8a8cf1ccf6fe3ca46825d32624dc44" }, + { 141000, "1e27b711601d806181c7ce84e393f1e790fdf72d03e8936d1966308296d7da79" }, + { 142000, "b3f5bcdcdece5733a944c27907b28b8d02b99597f0bb9f0dae82307432a14524" }, + { 143000, "57f4592a94d648ffe6695146bc76223cedffe0eceb9f9a85a2aeccfe8384017c" }, + { 144000, "a304114397eded9c2c0d36e4e28f8c46b86a76b3b063e3c2f8727308fa608dee" }, + { 145000, "8173ef41a7993f7a808b05a5c5424458a6e842af9c0e188c78b12f09a01f87b1" }, + { 146000, "f702b604b7b0e6082afdfdd7f16439bc615f13e0c24d75e1a659d4127e2534c0" }, + { 147000, "8e7812ae464ffe87e8d67a2450f4c34335b04952851b28ab13cd63d958e76361" }, + { 148000, "c4f3343419025ea082685b99954161ad7b2ff9ae8e1dfa93ea823606d80d1414" }, + { 149000, "9d4c85870b387a5c335a562fbc95bef11a0ec5a937c6944f7536debff5445137" }, + { 150000, "5efae1425a2396d37da6864f0fcb5a0517e2be0e78a2d576f9340eaf55257d9f" }, + { 151000, "9b7805f62165b97007ae486ae7b974a07c8a41f64a49ecca085d0c659a85c9c6" }, + { 152000, "f71eeeb7618815a0063c1c3b6a87d6f0fd31bd1c3842398ab25317780a490aeb" }, + { 153000, "43db191345bc42c7bf5c3773f16335128d5dcd2bd0466e462bc397964b7ff9d2" }, + { 154000, "a26670166fb1d5eed39f59b6d3476a92c275ebd1e889f7f26c5a596f04d6a942" }, + { 155000, "06cab38f0ea41524d67eb30c9018e008656d01fd8ec61d8892efdfb88a096ed1" }, + { 156000, "d740fd16e32af478cf1017579768d759093999527397a98e8a75af4730985ab6" }, + { 157000, "f11907c39d8ed8eccb0cde3ee5a556b4e7f1d405ed8da919815f45e4d7af8cfd" }, + { 158000, "60ac3f54b57031bbe9bafd91e1aa3c82d5f4d0c26cc3bfef5bd0bd6cba1112c5" }, + { 159000, "6691c171bd2263fba50a069bf70fc4d45d852e925bfee0a6fc7f4cc8a1680e6a" }, + { 160000, "2c347da0cd83838761be9d37bf97440c6bbd046d0ee9282fcd1f7ce925f01167" }, + { 161000, "7d6d0ef905e5eef81248452aa23538377d922d0d6c92b3c9da343ab8446d4cf6" }, + { 162000, "8c79901144f6a6b6ad76dcb0a061c303365e43dcec2cfb193a95a27a31cceb41" }, + { 163000, "3d78dfcf4474ceb8a5f0555fb8848e9a4045071bbf8bd346832c8b3224dba16c" }, + { 164000, "bac97e45591d3ed93be4921335983b7d3ce4b3df5d348c7ddccff1471986964f" }, + { 165000, "b48c065c67de84eecb05d048cebe8747a997024ce66f0bf12ce41112d7813e2c" }, + { 166000, "4d56b4bf7a90e128d96f47f6fbaa7fa2e7e6c65925f2a00fffc1ee13af52489b" }, + { 167000, "ffba9038ab2d31aa463be124d804be4cb4bf8469e6b363814c3081ac3f7d45b2" }, + { 168000, "1855fdfd703d66d277b5040c1f997bb4be0943ccd2d2be9492c8b7dd270d920d" }, + { 169000, "4ed3bebfba3027d248b50b706437a903ddc5a0b8acba93d9f87293dd439e8ae3" }, + { 170000, "0077b8b86a22f41e46869edef3312d6a6dc0f6ceba0d7ddddb32880c2954d691" }, + { 171000, "1f191167fce71945939d0bbe57030e1a376403e0cacf8c284b59a9c10b721d8e" }, + { 172000, "c0dba8b11d5888dd5348ba529a6bce7cfc2608a7581f2df3d6e10583231dfe16" }, + { 173000, "42ea4ea255d96a08ce4de4b20b8c06c875d9281301c0f05e4a72e3fb21a223ce" }, + { 174000, "455024bb5bfaf149f557333749821bf9cec6652f5ad0899ceb86aad7a40b2bf8" }, + { 175000, "fecd7b386e5fa53b3f00145f9134adb5da1409c57a1987384226f1a9c4d0596b" }, + { 176000, "b27469228f4c618ed9b9810874741d66fe3a39902a9c1065b6288af3d3f16969" }, + { 177000, "18635232aa3174c4e1971b930e93ebac0493ac81e7dfe9325d728a2f21b59383" }, + { 178000, "e6db842b4273bf1ec100a3c45acbb3f4bc6406b09e2cfc93591f54a93d2d5b54" }, + { 179000, "4359b8a6d671822713bbc4d3a2361c19f6f8a842a5d4b91a36aef887dc6d490e" }, + { 180000, "919d26ee5b6cbb81a01b2f709aa2c8d7caca857533ba254cc303ec1f730435f3" }, + { 181000, "d38ed767d58461f9cbb4e676350a71265bd5d3020ee675014f42d16cfe066ac1" }, + { 182000, "9f262fc7ebd239881ac4a0ed54a465dbe700c5504fcc30444dd34fbfb2cbb2f0" }, + { 183000, "4002a379de7f81ad7a19671ecf0271991f4cee44a1e04c05aa6bcafd1f74ebe9" }, + { 184000, "3ccd7a773cf32721eca7f88a0a7d3251952b6892df328608aa59eded4d1a433f" }, + { 185000, "1e95d64180c5c0c5d73f890e5db41b7cfe1ae3d3d025a3a999cd7072674902de" }, + { 186000, "b9fcee023c29eb1c985d1786be0e83278d658f6376d8eab9a7a109a268278559" }, + { 187000, "2473ecc8f887a7ed3fceed2729833ebd922a60649cc65a03a2a441cc7790c953" }, + { 188000, "413a6e45818e05224ae38a5d5a0df1c849d7ea31b25e9e8b3f8109e8acc90715" }, + { 189000, "63a54c875243a1b3544400b66e5a1c46aba6242f3903f57162ef455d92688130" }, + { 190000, "d56ed3427b26f1a53808c74064e247bb2e05052d4ca60716a722daa89d45c8e8" }, + { 191000, "cb9c10e1fc3e1c54564f04ef3401da0409d67953be7edccc7b9cd5fc8f33d2b0" }, + { 192000, "4a8da605c098cfd8224f768ff629b4e2f943887366e97aba8cef65015bc2a465" }, + { 193000, "3d1c7cca4474e83cb375423482a36e6a70ccaf4025f41d87c5110ec28ba8b111" }, + { 194000, "e9e27e3a5a9078d769bbd282f3fb4dc9bb946d9e2c1666a0bb145dd8e3ffa412" }, + { 195000, "46e3b675f82bfc88475fd50985ef8993ee9c1ec4d0d75c133cc705038271a73a" }, + { 196000, "fa1ee6520b6236799f1e502d5612d6077389c171271db72d2afff2b44fd88a2a" }, + { 197000, "d72ae985317448c5cae476b3c94cc6aa49a894e3ee9392e26ed8471ad621411b" }, + { 198000, "c43e55096f0eebd5e2a2d6435f695f2c2d211669e12c7fc28e0bc7eb78daf813" }, + { 199000, "332469ec0c679185fd73240ea07036b8ad4591dca7066577885701197f4bfd13" }, + { 200000, "439c6d6791d5d2d681fcd94e44d3cc4bb53ebeaf12b42d3fdbe13ab9cc6c2b6c" }, + { 201000, "3a6263dc9d17b7d60f3f1688cb5ee25179c14fb7617c1060da8e20eeaf9d5b02" }, + { 202000, "c39b125ce9146b54e27766fb54f63933c2d832f6c0f8c4b319d28910d52e656c" }, + { 203000, "b841ce9abb04472783a11045f464245393cef21332214b0590fb4359665ffa77" }, + { 204000, "14aa374fc02446acea5cfebc9ab6e3f1bf2a1eba7bdaf6524b15bdccdbdcd40a" }, + { 205000, "3e0eccdb3c8e136f9202b7e1a562510149652e3dd0cd4265e8fe5a7fc6e6444f" }, + { 206000, "d2800e31dd1bbd09c61bf063534cf8f9b6286487d55b8aca04d9b385f78bb4c9" }, + { 207000, "fc63051be590e1a633dfc0eb9f1ef01b1d75e50c656a0d18a403026bf07c46f6" }, + { 208000, "8499934e0c38a15a0c2a2c232a5508e7bf0ba98dcec2d10530271b0449399e26" }, + { 209000, "fd1b59bd9b527343688ed186745c70c0ebfae0f91b3358f9eaf3e0025a667b17" }, + { 210000, "110f806f132984f11a1095bbfe81bc9359ca00b78676117957df266980ebe7c1" }, + { 211000, "375a086c58c91ccbd94ca76a18d7bbecf937b1b597e62c82a2343154a0d32e43" }, + { 212000, "2e023c2ae690c303abf804677a4478aa1f0cf801cd2936fa04de308b9671e22d" }, + { 213000, "8be2e7df973249f23f9cf79fd077af3a1aaad29dcfa315513e773e3e00cf8f72" }, + { 214000, "27ce1ad8fcb3962f27b7267b71a905987f3e8d15902a6263b1552c38acf190b4" }, + { 215000, "8e5e29635549f88286647b5e227250d0cb40208dd68162cd813f98a8bf0442a0" }, + { 216000, "712f5936713951b8b3ac5dca16b8e43c070437b0ead52dde577975ba9aae877e" }, + { 217000, "6aa515d361e4ec36ff2754f9543f96b99fe586e5060525fd35f0d47e2c748f1d" }, + { 218000, "5022cc4b8a13bc788ce103822e54140ce2a832fd699051bb6c5991a7c20206ef" }, + { 219000, "28ee253863d6ecd1794927cccaba53eb0d80c81f485255f545c23e60bcd2f7f5" }, + { 220000, "a0f5006183cd193e19fb0d71f4e6b82458094ffe65f87ba879b005f81ffdf857" }, + { 221000, "bafb93e0e21a9c91bcb8b285c30a20c7a78b0995192ce2202ccf3ee51b55fbfd" }, + { 222000, "a3b8705edf4089704391724a4a3fddfc12ba3d16da6b7491910721b26c8d3954" }, + { 223000, "a71e5125778f612472db50d9e38bd160071639cc27d9697de33ad098a92fbb2d" }, + { 224000, "5d95c7ff7bc2fc63bded0b14ca0d322f5db6f23121dc467b0ef1cbe1d9774078" }, + { 225000, "4f6a06694d8f3fafc044ebf9e7cbca35821916fcc8fbf9d74bf970423ed273db" }, + { 226000, "509aa9ad5d80ce5f0889cb83086c98fb1b899b7b97650850bfdb7a9062d9449f" }, + { 227000, "6cf1170aad8528de92d19a77afbdcfeb138148adee2acd1a9ad7cd81a8c8feb0" }, + { 228000, "edf3e6312ec81b79e3a8024d2dd41f260aa2d685fb17418c0c68dca332cc83d5" }, + { 229000, "22ccd17b4c8a8d2da72b7bd19627cdce4e5f4f7171da6d75691e81e57295bef7" }, + { 230000, "107c03dd2c6d2cfb6d2e31afb31a10792fae7f3ae2015e5ea5864bcec494a5f1" }, + { 231000, "5ca9b3dcd5a986dfaea043a3dcc7e2a01efaf2502a1df629d4762747e25c9ad0" }, + { 232000, "553dcfa0df8b55bc198e72eed7a80fa2d25f8585a026b40c4d204dedf44d73da" }, + { 233000, "5922a2df21fa41d097f0ae5a0bb5e3823b2825d915c977e98d216b301c94ae7c" }, + { 234000, "b9672be2479a8ae221984013c1d828a86fa1ae382d9ddd379cde698b311b3ef4" }, + { 235000, "affabbc6719937339bee9bf09110143a363b592f54efee46c6b764b12518510f" }, + { 236000, "53686f0d22c8cbccc3405ee2c4d413fa4a1f4323a33188b9f476c183d9fa1089" }, + { 237000, "6283e32c55e98dac176426c8bf9d5667ef903fcf7d7977906c272438dccb0232" }, + { 238000, "3620b1994fb465deea8497cd6fb5eb0dc7fc9b502c91b021b548c07c67d343ad" }, + { 239000, "19657a793ea4f4b0c344d51cae1ce5b548df311fdbe7b124368774f4e8e01320" }, + { 240000, "17fb199607abc47ca0f14de1f780d664969ba8beeab9d734a0b88a65c23ac5ca" }, + { 241000, "c06f0ca4c202703b64c54c1ab9e21eda80ae1c5e6c4d03c25a69a32a0160084c" }, + { 242000, "16ae535c22f100b580217cd64b2195b1c96a10afdc51f142b6f9fd018dd8c113" }, + { 243000, "30a9c71e3a70ff395d60cba66ce1a2d8008595dc1b2e33d6c7eb88764e7a4829" }, + { 244000, "96b2d4923a31ee5fc462f141ec0c0b81d66c97015d9664477fabfc811eea26aa" }, + { 245000, "aa29b88cedce798c9041f49b264e36b6ef671b1e527a12261708b222fd6286a8" }, + { 246000, "182cd533f5e965727f0b625c3343a3591fc2932123d69d611416052588f42784" }, + { 247000, "680cbdf62ffcc7f2b9f7acf21c2b5c6ccddaa3aeb3c84b56e0f515ee8a28dfc2" }, + { 248000, "150eea23a5d2639141b9d7f5b60d994a8418bc77fa1b3f01917f0f8845ccc402" }, + { 249000, "30e83dbf9efc03d25432b7a416d07218ea8766a079e50b6046074b165ce31a36" }, + { 250000, "fabcfad39bf49f1ead5edf583dc4f5e3dfa7fe067737a4e3e2f6e3e97eb3c4bc" }, + { 251000, "86e3c712e44fde046e00d6d74bd09d9c37a16dad9598d1e278c425d48c47e3ad" }, + { 252000, "790a4dfb595f3beab13d5fc782ad19315c4ffa31c5eaeef49f0023126996010b" }, + { 253000, "79ba158b37697263f3e0b1b8db5152ba39f175b80f542517def54279095404d6" }, + { 254000, "febb056b6a6342bd7d333d7571462076c00355be6640ff128eabe0b214863026" }, + { 255000, "c93099f5aaa306b24db3aae368556c9f12597e78d8980c75580e7318239975c1" }, + { 256000, "7565c664748f24c1eb36d9730b8aec063bb13e7b3e733e0e0e1120bf2b821ee5" }, + { 257000, "c43c60435626abb32bda40fa00a316990b532a82721fbbad0fd769d05236731e" }, + { 258000, "d5f551f8e68df012d98972fda66f784eedfc4be36fcb75441264ab5762386693" }, + { 259000, "a1d99b904e5848f09a1383d4aa96488b335fe41aa71c18bab97980578e135e8d" }, + { 260000, "a5189712b41cea11c2917a7ec0e0441808f80a2da222a3ac9165d8346656ae89" }, + { 261000, "e3817284e7c72aef89482acea9eb19b1746cb5210db1e85cbbddab3e8178c7fa" }, + { 262000, "9f3aa3fe23ffc9cfbe8d646d770ad5de95f08ab7837fff81a5d29573f27c4e84" }, + { 263000, "1b2d5a6b72c30a4ed31a0f6c0755950552bbe21b5fd7052a0b0baa5c3594fb12" }, + { 264000, "863199d29c0ec6716cd458e00c420262954b3bcfe8b2fc25c6591510d549e4e6" }, + { 265000, "9ed00b8409a2bf5acd13077b2e812d32c369777b4e2e6e53296ec8b1e685c793" }, + { 266000, "f58831ae1a8c307efae54d8d18feede73a92e534085f2b1ff245e880d75fca4e" }, + { 267000, "c61c590d21085cc782af3f8c84fe5bbed65e332195cb6a8f1ea4ff837d08ab99" }, + { 268000, "0e319986cd87633061aa026df3bcbf5ce1cdc5a234c1473bb72915c92705d834" }, + { 269000, "a46571b74c9e88260d7a9b0ac0811ea5e28c0fead64b3c19f392cfb6131c9bc8" }, + { 270000, "39233313ff22b8f700675f7ea303a1858e38822bc16b09963d11a622866c7b07" }, + { 271000, "4e0caf526cd52b162cb184060fb0ea7a0684bd849256ed6d94b9da8cfbe84209" }, + { 272000, "ce6bfd398b5e7309d01b8d6e0b9bef50f1b9c61bb85304cff00347cc055e0586" }, + { 273000, "1e02c609650b1587c18f6404e8b44914a538086272ac8ff7c048b29e2c86d35d" }, + { 274000, "41c14b048ebafb5716cd34b6efa5b864265c5b463c6c4a604bb6ca1e127109b0" }, + { 275000, "37eb0799597af3301a820d59e12674d19dbbd9007eb5dddbe0468efe7711934e" }, + { 276000, "beb4048a31c2296d4c4bb740c06c88c2de9d3b6c467528f94de9cead777f80cf" }, + { 277000, "a80833b47b22b62ac121d00aa98e5262c37e0be581f3d28f44886e270e38518f" }, + { 278000, "899ba8f31a4ee014b6648f7cbb667433e581c486479449b8ed387a57d4b4e009" }, + { 279000, "07246791218cd34c6563cd4c3d464711934b3de93601b77226131f7e2aec1f01" }, + { 280000, "daf36ca7ad52bbbe496ef9b27bd13f196002f8d4c3baaade129e459ea2a5b88e" }, + { 281000, "7d5dd13fc32406566f25393754a7ae0037d31bfebebe7e3a3176a1e4bc5e77c5" }, + { 282000, "fe60f0dd7e0ebdc6db0068fc8c7ced2a3bf10c42132e64bdd25ad95de432c9d0" }, + { 283000, "ca4faadab834c70fdb54bbd9615c2714748f7b09dc7c77c609c6633f74f2bddb" }, + { 284000, "f5bea44045fd156e1bc8429adba7cf483237465677c0ff2d94c0adadc0a1f10e" }, + { 285000, "0eec9e09b1bdf4457514b39a0952a0fb746b82f301d1f6e3868680e3398c725e" }, + { 286000, "4cf3fe9ed74eeba78e7c9e7ae38204deb68ba1dd2b3244956f9358bbc5d1eb14" }, + { 287000, "bb1ddd2d67fc261facf3b8762471990f2c0f31b07a3a892ea6085db84528f351" }, + { 288000, "cd1cc0101ecafd795e29cc4d9e13165f4f5bb1138b5ba7a89d260897847544d1" }, + { 289000, "0ec331bd532155b27ca250056246b13f6a22ce126d7462204ebadf3e846d6e36" }, + { 290000, "9ff767073288b4896f31a10a3d25bfd5d607fb3d9b4caf8aef4aee8998e4af2e" }, + { 291000, "55b1caa4d674073a20b56ab7a3a84e71da8a2021fdcc61ee412d8cb96bbdeacc" }, + { 292000, "c77ddc41e41e9dff906bb00e0516cbeff5e56abd9d4bc4d0e42fdbb8a164d058" }, + { 293000, "3c2a7d2f2d0c3946cf1583868d25383d5490181943b2e4ff987d6052f8ee894a" }, + { 294000, "7f18a11bf09e007478d990683490e1d02e130d6f158bf836e2d3c4aa13e9cd25" }, + { 295000, "506779563014ff2aeddef23e88d695c43e75b9c58c308a9b427eea2cee7955c7" }, + { 296000, "2c5e516b01c750ba14a56cb04012d80c606b8fdb237d4a0d81d1ef435f8d9143" }, + { 297000, "7f6e09d40fd60c09eab69d1019ee4d85bcb944caa8d432f0f4a4ac9a6668b463" }, + { 298000, "513870ceba567cebb4dea23c654c4775cb45427890edef5856cea099d2abad57" }, + { 299000, "58abf3ef8f94c31a6f49eefdf19f9314f81ef3552889964daa484bd006276dfc" }, + { 300000, "b40e0d8b0e250b94b7e6b78b4087ad8f968cb582e231fe6de932530692b1173c" }, + { 301000, "a23b0d3d3df979e498a98d6e3b7eb90d9d3a4e191ca4b68068064c865d4a9016" }, + { 302000, "fc484a92aebe3b9a91b387a77d37857917b1236bbee93521890253a9df9bc748" }, + { 303000, "2dc579c648b3e673f0e8e67de0bc29997b8fc068f6b54b5ed8959106507e2962" }, + { 304000, "f0870051c209725191001ad529a7d7a41bb01d43220d9e714f8674ec995aa2f9" }, + { 305000, "21d4a803223d8eb76583f8a218d605aa522eb7ba0d965b335000cb1b7e31f4ab" }, + { 306000, "7ff551f87ba33ea8e7b8006a1937cefc0d117fcfc2e932aaa5fe609aacd42b17" }, + { 307000, "f9ac2480aabf28658efee04c878d80c35ae39614270ddefd6d18a2698bc9c7b7" }, + { 308000, "54b02349fb21fa4409c5415badd7915b3c95337c7b31326f1dfbf8d989c51181" }, + { 309000, "5f8727b3ee9220fd5ea212c903de195b4be4e103fb52a32c5b6d762ceb2e8241" }, + { 310000, "8e08e60855278036df4dce259955d60660257591f49dfd93cfacfa9dcd712768" }, + { 311000, "ab8af33a433b9248c6b25ef86f9f684ac85066a53e6d38fc822710a163c192f4" }, + { 312000, "fe47285c724be468d2e5ea97d17614ab1130a218cbe2bea5d757143c56046afe" }, + { 313000, "25d1a243aa30cd8383516442984a0cb1b98677b2eeae630712c009e5baa4f709" }, + { 314000, "83abb633f86c7ddbabde3ecaa49a6ac4fbef9513d1ad4c18270c1125b2bae01c" }, + { 315000, "8bc37c103e7a73a08bff230c1ad664290d2421ddd008cdca24ec798bfc40219a" }, + { 316000, "7b2725bea2d623926d61f37231c5b8ee2e9c7cf82b99c5b9e57696e21a7010aa" }, + { 317000, "bef31692d637578efedca33ac2a6d0f11b4384e4752dfbd318666c15b868efb1" }, + { 318000, "431febbbb638bbeea51987ab7ec7a7827deb4145a6aaee76a2b3a9ba642be830" }, + { 319000, "8545e9ac6fca25bccc50848341d37eab0e53625b3de48ea85be468d0efe944c5" }, + { 320000, "3bc76dcbfd3c84e214086795185b1b7298328cf653be8d7c98169bdd8429f8c2" }, + { 321000, "b0bfd04d6c3f1192c61bdef693b1878a4d87ccfeaf07af57972dd59bfa62c208" }, + { 322000, "b3a0895a78af35f48456750837556093aae8c7480df0a42782fc14f129ae6b60" }, + { 323000, "47a5b6453b64bb947d6c4a2eae9528ca9c71f076f7c37028ac34366d47f6b4d4" }, + { 324000, "35a12cfc5776654726fd2a55dcd96e8fc613a6bde1bc73984e90e7f744dd7e3d" }, + { 325000, "e8bf0ffea3a93aaa2b3511f71ba880c555547b7f39776cb7938997acb97236a1" }, + { 326000, "04cb08e460c6c6b5c4afee18c3e801e845f286c564c8042433421aaf9173e5ae" }, + { 327000, "c40741b304c60d7c92d0fbfe9879a41630baf9f219927046bf8d496e14b90132" }, + { 328000, "a585275a9e4ececed09a515991decd5f1e37bc3f556671c4c672898163f89c96" }, + { 329000, "7259a371825378bb5e12e3752e1bf43ae5a5b9099e2a36152251525c5d3eeba0" }, + { 330000, "7a251c2c4b23191653ab6e416a1a37f2862850670315ddc016612261dbe95732" }, + { 331000, "489f825bcd73faf6f1ade6192fc109af620edb5f7eb8c0f3fad52af5a843e666" }, + { 332000, "02405c1b907b2087785eb2f618396b5d5ed45b252df788edbdace0836e359655" }, + { 333000, "6c20620dd3cd037bf1b9e8102410ffefefb8669399156b1c5e1311b80edd63ac" }, + { 334000, "32ec350c05f8c8bd04e1dc9be3a202449b3bb402f3f434e7bd9a750e21757e83" }, + { 335000, "0b60bce07671bc9f2cd8dd88c83d88bc5acdd238406a4937e3f3d328b9781e2d" }, + { 336000, "5b6346d4c387f1553a95c4b5d2886d231c5e7b3b10d9eec0d24e507dd7b91a47" }, + { 337000, "6f094b8dea2493594ea9de126a0ea0c12538ab8791c31e679d271f691e3e2aa7" }, + { 338000, "4657e559b7a2db58bd846c6a8029ab4d284aac988be30d148bee95a63e43380c" }, + { 339000, "45bae03d06315f45fca79c8543b261eb3779c1168e20c800ccb5ec9dd522d6dc" }, + { 340000, "10a0f83de25e3e6cb3130895af0e2a92a303f7d0bff82462359d0986e72656f5" }, + { 341000, "089bb78ea656a94ae72ffe5981efc45fca1b479ad630cdbd9192ea0b56da2b70" }, + { 342000, "4dd0b6a502ba12cff00eae0861751aa24b2f80de932ee96a7974dce68a7d16d6" }, + { 343000, "03065c26fa63d5be4c9f9a301c8434962a9fcd5a26effa72bd57e63aa6208c81" }, + { 344000, "9fafaf05e4dc0ad6f6256756b1166f31b80b8a7cba91f868b4de42ab7ac539b0" }, + { 345000, "bbad3c55d1983230c7de3f1c0aab2138b1b0071916ed451a2619df4a687daca5" }, + { 346000, "d1faabbb8bc5209d2feb601ba599d66d8fc76a308a9c0d4d61994a2e08e7f696" }, + { 347000, "0ef14b0b8c0a35b6df80afab7b6fe97e5231805b62d76987c13563ebb99de837" }, + { 348000, "506c3f8749bd935f19ae86c7463ce9d9e0aaaca0fb868527619725af5c69316a" }, + { 349000, "c3078d7e8521ae202fd0fc04bc3374dee584a9966c73756631ffec5e5ca5a8f6" }, + { 350000, "a059c5b25772c6027e69be07ecba3be5a7d31889ab458453e656287f9e8cf77d" }, + { 351000, "0b3448a4aa525a57995892488e8c6c6e675329e30aebfeab37559c13c0c72d54" }, + { 352000, "ac1442a9cf813b4356726b6c64b2a69d37ef9066b01677e46c95a344337f22c6" }, + { 353000, "ed91a4a8d6da2c15618244d084fd2c83b7ffc3ac67f91092b9e43fe16874e48c" }, + { 354000, "ce78fb169714fd9981561c61a1acb1300b7da76d50fc50fd7f522ccaf84a69be" }, + { 355000, "2e152dc3bcb3ce3bc73b8df8560b66cc651989e02bf0556df8337b670291e0ae" }, + { 356000, "4e2b650db223a7a3d4ac9c0ecd771cc610d373428bb0ab8e70df838d7187206f" }, + { 357000, "ed17e2e0db7f6e9ae66dd731c1aaf2a0a5b6336fe52a103847ea0ff7bfefefe8" }, + { 358000, "07be2034eb8094962da3f9895ba0422221cc370ddc25dbe0401669b04b6fa180" }, + { 359000, "b61c32c23e5eb102e30016c0f8f31e73693039d8fe4305b10a04838dfd167966" }, + { 360000, "b03a13b9907ba9de09485d3b91c0ad83dd8a4d4d7986e7d5344f14cbbecbe840" }, + { 361000, "75aff59e8be5654e6cb2ae202e3af4b9534c6f169cfee18612dc4aa02d42f9ab" }, + { 362000, "0f5aac2ce15ce5f347f9c967af92a993f6e69f3e4414b8fda0b83bb5cf9302a3" }, + { 363000, "85de0961ec21459327cc5729cec69540939b6b413182be88b20ec98e1eb281bb" }, + { 364000, "e13179b2b947bcff7763593a7d852d83f9f22013ea06585e0d68fe013e26c94d" }, + { 365000, "22032538bd1deac5b5d4403e897ce3bad2f303f99ab7cdd1c2978c3bbf5b2bfb" }, + { 366000, "cfde8b3f48a5ddf4caf52b42057cecb4017e1be7a38e23d9430e7fd60a6fd462" }, + { 367000, "99d37b426c0a6b4434b471e43e3f209711f77b4b71b61cc5efe6659c2c4600ab" }, + { 368000, "a8a1bd13178184e9f09e95d08efe547921821b61a6c702400cc49950819be021" }, + { 369000, "fa0ec419045f9ce0898a4b6ab569c97c1bcf7dd68cfefd2dc1ad9dc7a8dd8fdb" }, + { 370000, "26699463c6bc6108320f9b79d57d9cf332db8415df0e00d09371a6b8350fec00" }, + { 371000, "8a92df054b9dd9cdfa9bb7d8ad72d01ce0008ef747edd88474d607b35d80e9c5" }, + { 372000, "2410ad74e1e1f29487760c3a9798b112b8aebdfb2bfa4b7a6ac7f7386d5aaa93" }, + { 373000, "f29ea67e33890e75c0759e594841280c11cf5209f197349656621a18d0094fda" }, + { 374000, "97fdac1f949ff3c40bd25aff5034b8ae85caead0a9ef72ef2ac3cd5394b05177" }, + { 375000, "396396be61337c0175d5cb8b735afab9e1a48542e77434869a598f5804dc2913" }, + { 376000, "f5f63bd5a7e04fd0d14d8f75a0aa59721813a4de98ce723a2dcd3b78dfafe182" }, + { 377000, "ad58a2968b75b6a7f975098fcf9d44e8a9630c91fcb11caaea1c97a9ad7afa9b" }, + { 378000, "9d2ba756a80a3d08978f13314dcfffc57ad660745953606efecaa2cd0937f031" }, + { 379000, "49a4d31397bc78578eaeab4b97bc0ce5bbfd2283f5051e0b4da5673c800d932e" }, + { 380000, "0c2326891ccb944bb20cc4134d125f2c3d1fdf3b60a2dd6b8f5b553d625d92e5" }, + { 381000, "fc44846230235c1acd04184844e3e9f24a50f0fea025805aa4ecae6614737f11" }, + { 382000, "09bd10f7960bbb017663a9c98d625df00c50c0b007c37d15d34c2c54fd93f126" }, + { 383000, "c1c8e705e3fb703c62fbba134f057775a9e6336943f92101f5228820e2e30172" }, + { 384000, "95d1f807e1f03720aa99cbfbccd63a3933c5aa44304079a0c565e0252d5bc8d4" }, + { 385000, "06928a8bcc1cab38e1c98ec402ea371b6a6597a995510ca56473399bdd3ecb39" }, + { 386000, "62fc9a0d0f50c7842693bd4142ce5c2b734dbc5ca653be2a751efd4543eb3079" }, + { 387000, "7ef29ed2c7c5169ca08aa14073b298aeaeb44bec2f6c868221de392f8248337a" }, + { 388000, "2c955383ac1454d75558eeac2a684e97ad4406a6369a9917475709dc90399ca1" }, + { 389000, "a9cba5fa6105a7a4e3b6073bf93c1b1c1f0f83cd3d5efa9f58f0232b105cc02e" }, + { 390000, "7fcc255693bf730900165eb8621ac1f07e4580eabadd04994ea02d7aa05c0db5" }, + { 391000, "d2e898d6f11612f5e1099c753764f178cd02fc48a459d73dd0a7df88595a8be5" }, + { 392000, "350c8b02912e779146f122f7afb7ac5535ccba87967dda6b70c6c0f113b36ab3" }, + { 393000, "2bf3d90b9bda81a34059de2fda22dc414ea768555d5702495bb1353bbe153778" }, + { 394000, "fe4c1d4c485b598c086088b8adffa52f1f40140412c3c6f73eba2becccb695df" }, + { 395000, "ded7c427ef7cc3ef0fafc2aea70ddabd9df319b3e0c9402ad30369ccf475aa04" }, + { 396000, "ce62a45a49fe650d601ada6708c76dd4a02bf10b09d58d0b471496971e16b9c4" }, + { 397000, "57dd105bf8a9dc28b1d0509f2cd2b34c3b339cf9bef6f00de5afff5a5d67c401" }, + { 398000, "3eb0c8d5f5c89e3ed24dc382150498862313915e33f5d6ce2fbb177ef2d98a21" }, + { 399000, "411272a040ed8758ace1e702ce3e8e7199dc5433d29a2b9f433c62c5a94cac77" }, + { 400000, "b4ee8fd5e0167bc9e8be82fee53dcd1f4e38c1a99467f371836c9135aa11a099" }, + { 401000, "0e5096be7f4e89811ffb2d50313ffbe8b1eb6a9887d1335b232e153989de621e" }, + { 402000, "b9a2363a2ad48c59ba4cec2f7408ea6eec40c47529aa5b5982446a9d530aa0ea" }, + { 403000, "0579dba01aec4de48d7fd4200452a4f4ac61715984e2fadb921fed7ea259d20a" }, + { 404000, "d02e5010136b85933faff759f8074111ca8f7e1a88df1256044f9af376bdd99f" }, + { 405000, "5014e0c31314cfd3f5b7ed64e63d499fcad7ac30c07cd79729575e9bbbcf1727" }, + { 406000, "b01cf2e012521f492cfff34d6e191fdb17a468da73d522419205537815487417" }, + { 407000, "69ce00b4484034287e81d6dd6f43579ed29437938ecb514f6a7d51a103932831" }, + { 408000, "ac6f3fe1bb56768b7bce1bd3868d80167f89220acfe8dcfcd2f849a1d53352d2" }, + { 409000, "711031dcd323cf279ad99c5d028a596a5de08d0e16c0b1af8718441e4acf2424" }, + { 410000, "643359122ceb9a2036201c5f645db590e2f879bf025e6cde8f39902ddbf7d87f" }, + { 411000, "1bf17d9775f8b88c75c38c4cbbafa7aaf6bfeff438f1a83ab91c8cf3f2cf09e9" }, + { 412000, "69659cadc6362345788f5a3bb02912943cdc4e094d868d718e031911ac892b87" }, + { 413000, "e422c06c24491e078527356d621fe5384ac180bdb9c2a39db10b333af25fd4ff" }, + { 414000, "9a60d61529e217da620f13d8a1ac6a63854122d12a33a0b7e5e9e76d4fc537c5" }, + { 415000, "d295d31bcc4d15d636b316854e9378f1871121b18d9fd409e89109cd131a7f63" }, + { 416000, "56a08f0c22a2db7fefdf8c7d92decee132b804090c3351c6c52af0aa4f05cad3" }, + { 417000, "ec55c820b3f725e26816e346c480b3ee89d78d2bbea90efcb1f232c7c9ccae82" }, + { 418000, "d376e3869ab224a3475f80382567135a252097da6b0d9b91276060c05472a9b8" }, + { 419000, "ffd2015c538499da0a4dd1be146b62a61c4f51dd2562ca86620023271873e63e" }, + { 420000, "51238232a61317d27e925c79476f977e3988a3416b541621532b81265049f908" }, + { 421000, "0f1b0122bcd2c31b54ba752b07f19177e704885af3342cf187c22e00ec63a1ef" }, + { 422000, "02640e2d02177cfbd395cceaf0265e5837d4a310120aab2cbec5f11f0de48303" }, + { 423000, "30ce5736491bb2d47e539ced90c7fa5db324add1e065a85a22f703f7f370adfb" }, + { 424000, "2ee29d061c3ae77d00e1b3d2dd044607c8422c612d35fb82a51b2a5b8242ecfb" }, + { 425000, "d2b42b1786d2a392f5fa5fede95784cc5b12720582f77a29da2f90d612614e1b" }, + { 426000, "c8d37c2d2fe1f09521b4ff845ff6b8eb06f74deb5a8f893a11ad4f346206c11f" }, + { 427000, "d3dae621e193c03a917eb2ee27b12bdcadd047759bab9cfa666d5f5087f4d179" }, + { 428000, "7f202601baa8fbcde851d61c4f89bc287fbd9ba9f1d093d1dd79d63a2b2658c1" }, + { 429000, "184ee1a880b2d662c7922b701c303a5972ae6e1b67727813a827112bd04fcbb5" }, + { 430000, "49f26cceac17766005f2f1256c35b7794fc1ef3f40ce55dbddee9e20a250ba41" }, + { 431000, "807ee11927656424b0200e7a0e7df15d2ec6a56a3b193372df9e664ce1bb1da0" }, + { 432000, "6e977a4a438a173abaf870aa745842f313f97b7f0b5802f540a664eb8c49ab80" }, + { 433000, "c93908b4617d200ced870186fab9abb5ce5d28bc71aa71376c07ef23c031aef9" }, + { 434000, "dbf38f6dce3a42d31338be1e24823e36204db6c07ef5e9132d82da2251a9337e" }, + { 435000, "a6a7abf831ffcddc15f37c9a3a878b7c7058622548e8a36810d080f6c6cc75b1" }, + { 436000, "8aef3c12ef36c798e3fc018b238a988c30f55f7ce02b9cdcb00def894ab03ecb" }, + { 437000, "54437345d048e3b0ef50016da64b29f4881751ea98336a858596b1c043d5e2d1" }, + { 438000, "841b4a6f9117fca17adcfd2ae61fd78a333aefce92a5a02bd5ea7ee4ebba6540" }, + { 439000, "43a7b42fefa5fda2e310f279ac9b75a00248c23c8d54a6e2edc1c4a9bc0ae1f9" }, + { 440000, "0041aba5631752b487d51f49cd7e636a8652fb6af00a6b4d864d86a2cbfd9aa7" }, + { 441000, "05cc8e2be8ffafa235e7d724a6c8156f85c0b3c3055fcdb55ec310887e3056aa" }, + { 442000, "13b3bcf7635440c5d4ef79016940989fa0e60f60ac70ece215444a0d0c921a66" }, + { 443000, "87c9fd4ee71bbbbbf144ec98ff2b4cff9c45b32b959db9ca8cfaf2161d914d05" }, + { 444000, "b683b94b8d1e4c8827cdb0ba9877e85ea428d46226e7477311a1f2b97d2d4d48" }, + { 445000, "c14b1a959ea44b5b0c46ebeaca540516ce0245944c96a18fa96146f295ad0495" }, + { 446000, "af45360de7da17ac63a997b15f881d008037691d5137fd520e57390e9245c1eb" }, + { 447000, "05e665f09d49244db7fa0360643b7ed0a95f98f0e6db9bfa30a109eabdb9b22c" }, + { 448000, "018e88e1d328ac33453e9f5fe0684f7210839e9fbc97a836fa3d98eb6dbbb207" }, + { 449000, "a677095b82df566a4ccf6dc68ca128f2b34a1343151ad1b9cbdf916756cf6a8d" }, + { 450000, "f0e8bdaf3d1ca92fb29f8d74de49529958a8eb125aaa461147b71c492d436d4e" }, + { 451000, "3db931a9d17434af65469155e3f602d7c6383ad51b2dddb766a9cc7981fc28b3" }, + { 452000, "162f168b8a118daa81ff64c4f452089b3197a4526ff45eba1e2855924e1508d4" }, + { 453000, "cc8b9557b786fc906fca4c51cb6f132f22eacffd745065da460393b2bf5886f7" }, + { 454000, "65755915fdd2657428faa891af14f88443555c5c24ab455b2850f7a8bee81b78" }, + { 455000, "1b71d6fe18a23ee5399428b5ea3f9a79954944c1a07d9e32e876399c1120503e" }, + { 456000, "9dcf389db3dfd96e6db4ffff3c5ebf0422a745ec740a035c919a12a915bb030c" }, + { 457000, "8cdee5e7f140d0f345a75b91ef5bdc1ece194104481de96fa9e7b15c3b136579" }, + { 458000, "f27da5f3c9e6784e22844366a9f889463f56bb9dc4f4c7f6a3a393906c6c770f" }, + { 459000, "60aa5dd582d183a7a5a3f89cd94ac140de900c49c4b034a31a2758f8603a7553" }, + { 460000, "9c96567227707041bb0407b3b74a7e1eb77f8ccbd5be17d5bdacce517358120c" }, + { 461000, "68a88cb2bd38270e4d576aced6e82d226d155aa8b11af4a7450f2f61a7f3295e" }, + { 462000, "a67dd08a84f7a07ba02bd4fdfc44a19702b30bc85d3cb1421001ed52d07a24d9" }, + { 463000, "1864af8a7cf550d85fba6c4f7ade1c5e34ef79f156d7fa63562bc06c23cf90b9" }, + { 464000, "37f736552e20aa9750c3c5e4d3e2a596ccc75ea42cf80776d97c073b88d6ebe7" }, + { 465000, "5fa01fe035c6621691361a7551f8482cda1fb15c6731d8abfd10dc9f09dfd969" }, + { 466000, "00ab3987a1ee066965dc7e329f988653d71f3e4064408882186b95b47456c04f" }, + { 467000, "3d3a71c22fcc83754df5a593057a705ff3418baee2107cc66739154c68b6d1e4" }, + { 468000, "a5cd0be32e2f2706c2d7cd9d4fcabe3b4efdb64746e225e13891ffeb3051d23b" }, + { 469000, "9409185b9077cf7d46195bb8da8293ae116518a024a1120e24f730196de80ff0" }, + { 470000, "1dfa6d76af562923c108866f00caf21dbb22b1996d2efd0fc6a43a55870cffbd" }, + { 471000, "5e267dad87cf16d05964d6bfa2cfee010fbc059213a2ed7463de22222e90587c" }, + { 472000, "ec7eff27fe8899f0cd2072f6bee5ec567fcd12251cac318c82e04bed7b206d64" }, + { 473000, "94b7643e518b400def6c141a187b8eecc5a40a55648b6776dbdcc8f4a103e57b" }, + { 474000, "e23a8a2288c4a9890b077066351857c387b7957c095e534cdb73293c35aa62f6" }, + { 475000, "9891f1213d10175de20658bbf3f4372bca2f1c065a470a1cbc9f88cf6f008e8e" }, + { 476000, "8ea7ba95273f26e4ff1f39f42592570a53424c8e8453dd5374189dc6a26ff147" }, + { 477000, "e7653e43904d1054ef168ebfda8c5c9a55878b695c9dea2dcbb1ce3e4fc58c30" }, + { 478000, "fec956dde2064ccb169ec1e877e366d0e8745570e86f0ec3f9ae752e678c5cd2" }, + { 479000, "4b6d1589fc1b1caf3c755f9d621862bbd662bdd2c1c4c1cff23a99b39dc1e3fd" }, + { 480000, "e6e489c310f829615192dc67505ed224ead1a92db580b1b5dd1ee7f6dd5bffbe" }, + { 481000, "91834e52e7d83288539869bfc4dacd1e667211acac77df642569d951961dd2e3" }, + { 482000, "7701dd9e44be04bc33fba84c58efcf51cf08fbad74b9da8bc5b1b7fd1b366fcf" }, + { 483000, "73bcfc7b50e023b2bcfe5744623f3066659b634375376aee75fc915be5a05387" }, + { 484000, "9c1d093759b659a5d27e8f632b01b0ebc01ba88df356e5980e9cc7aa9758416c" }, + { 485000, "270738aa23e8009e03f99a0850430be322f4a01db220d20d8f7cc12198d55c39" }, + { 486000, "a076e3c9e81d6cc2f32410134c5a5fb2389a76fc037339def9af77e477b87f67" }, + { 487000, "4fd1846180cb4cb5c8b6b9d497de82407d249954a9880411e395e6f7e8b2a0d7" }, + { 488000, "a47e318769db079e6cc200c23cec8c05db4086087eae545672c8a64f12cc19ad" }, + { 489000, "eed8f4da84b5fc96a4b0dc0f901572746e72502acc5bb7f59a93a004811b6038" }, + { 490000, "2ddb63035fa5990d4cf4143864e70c1292b958db5c164e0dc29a00b44b6292af" }, + { 491000, "2e4090d62423017dd1be57df102f76143ad191042e960f1c9d5c991cafd41e10" }, + { 492000, "de1716704ed77befc0d297096c3aa011be5007ab1da2c60aa9514373930cb700" }, + { 493000, "89eb619c597e2d4ac82766c4399ca0616e36c77405be888c7a6ed4f4f3f3ed50" }, + { 494000, "24b699d804b62012eb4f31688af0c1dc8380e2d341ec4b754ab9002423f7e4a4" }, + { 495000, "ecbdb6177e8144522771dfd6c6008c9fa1810f030f2c6f732adb5f3f909c4374" }, + { 496000, "b3f2cfabc3b2a58cec2385e2138f66fdaaccff33005dcd62906a5435f0d082b8" }, + { 497000, "2a201aa5eed81d5bc47a43739bed0f5409ce4abef6d33bd45f31d999e2a810ab" }, + { 498000, "1b2e0d93860ea71599aca5f643302a6ccc8760bcc701dc0de17949bbcf14c463" }, + { 499000, "365345cf773d97e91934faf49532aa3c2893b44f25ccd58a22cbcb55fbbb9a77" }, + { 500000, "7233cd5a0e1e5b3baa21aeed1e7263a028e2ba8d59a45cda0c08fa5dab2dfe84" }, + { 501000, "98d8f27db64a6a8ab66bb4832911ae5c0135ea64ccd18f586c2b1ee00d867400" }, + { 502000, "6c9cee6e35a92041ed959814d10ad955bf7b3aabb020fb663adcba4b70bc9e98" }, + { 503000, "84e6d39af2477a5ec82caa87cdd5bfc03749265e46baf848e44468574e2455ab" }, + { 504000, "54e573157359f02853e1d7d8260d0a21ac76451271fcf6ff726b987314b21cb5" }, + { 505000, "8b5fa4740ca9bdeaa57bd613cbfbf39900179e0a83c44ca6f52b2e63c19b4e8c" }, + { 506000, "6352c31e43bec064d9e84414f22ded89a08d68f854abed0e8099c01958f52b4e" }, + { 507000, "be615ea7861d67703dd402cf18254f4348a23e5a243340745eacf5e1506d7438" }, + { 508000, "6d3d5af7628b36df037ec68493f712f7895b1e7975d41a676b097c2ff473a3b2" }, + { 509000, "cf7c2e6f22aa1ba1f2a4100960dfdf01588bdf2d0d96af2cb673a61f52365e2a" }, + { 510000, "bef3723234334b19e1d4ecd8852a281f2c640189465e109c08d49fe95f77c1a1" }, + { 511000, "1b1df5fd57c79e23854f3377d6d062d17d60a7c12e0db79cb7ed469c0c041437" }, + { 512000, "5cb31d76b2c200f05fa922c1a1c334f3f16a545b088741d4f274e88eb94166be" }, + { 513000, "41ee509ac69c2615f142f655a83da0993ce67166099eea00aa396ed1ba66b2f6" }, + { 514000, "a5cb29f0591c9bd163e02938162e4da2eb653fc6a1f64ab47f626b40b59ff670" }, + { 515000, "e07a34c451a9696f771016e0e80046752da29f06487d63febc334ce1b778b8e8" }, + { 516000, "44e8b49db08e8dbf90c1330e3a6dda5e103832d458bb812bcf5ed095af6acbd3" }, + { 517000, "d3cbe6e727f185a1220c430771e6b0b8ee8590800c09bdedd29eadb88ad0f257" }, + { 518000, "b924a9b6f68e00d588efe7766f27e24ccb1361ee24779fc58bf6caabbf020a39" }, + { 519000, "69e664971de9a29da0a542e7e73f2c5d3add3d741a7766f9d38c88e76550f1a5" }, + { 520000, "9717b8550db36136b4b7397c5c4e13c6b87809133dddb401a6d18c9dd3eb4c97" }, + { 521000, "8edb3cb88d4b7cc87eee95409fe1a72e90620cc3c95cfee9abad26f8f3c7ae24" }, + { 522000, "81ef5d3959d229adac9a38477cd28386f9f6d68e82e42ffae7c5a15dc531f3a2" }, + { 523000, "b0f16a357cfaad26dfd085c5b1cb3df952bd138eef98fb5df10ea0e3573c33f5" }, + { 524000, "dfb54d5b885b18d411df96bb996cadba84d8734ec6f2c57dda15717cc50e4292" }, + { 525000, "fa6ff319c5f23317a4496a3e666b178d99bd0a6ab3bece251e31938dba326b51" }, + { 526000, "09db398d3a4f3ab84c28f8e741e558ca0012cb7ba9d0d0c6c43a987f02abfc6d" }, + { 527000, "3cdfa9c8736f5c1614c048edc503da6ef6f50af869f1aa4ceab6724728e1b279" }, + { 528000, "1e27079363ee5f4be3e738b011b7012c6c317ed6ab71dd73776f967fc1d86c63" }, + { 529000, "5231d99c8c564bef13b3416f353f2293633cbd0dc4e5a124d219456738d7ef55" }, + { 530000, "09ad0b944015b91dbd9794aa23e021659d06826ddb49f4311f49364fdae43f59" }, + { 531000, "f93a81752b737dc5cf90df0eb341bbfac69834cdcde54c0184e3e4c7e5692704" }, + { 532000, "7b0c9f2b060198dc7b07faa812fa6cfb5c40a3ac41c3a164d1f21d2fff99d198" }, + { 533000, "65b37d0f81a67d67e036ece72082ce0629ce353de7223f791732cbdbe242b95e" }, + { 534000, "3443454bccbb3c8dc66c6d2f70879131a3b199cfa92736a0e0b6457951a99a0c" }, + { 535000, "d2e5af1b46b221f4ec6668c6c3b0139abb9a00698b3dbbe7f1b9f0f288a45990" }, + { 536000, "9a43c2dbcdec2eb4fa94513f5d18e428a55a33715f9df23320e8474e58bee4fd" }, + { 537000, "28c4fa71f4efa96bce2292a5e82b0ab949cbd21e5097d4b1eadd192d801db045" }, + { 538000, "d9553fa7960d98fbbc7dff0c287881703f6c2c288340f9792ff46cd344f6c8f4" }, + { 539000, "6fc14c6f6b39505bbab571253dc1ab8c0e3a486dc4d9f21b4e01d4b2420da921" }, + { 540000, "a9d67690861e93a64e013a174a453ad97cfed27a69c2e4540d47c3a327121bd3" }, + { 541000, "873d37569cbd1d0031add6f00980f8e645e240238cf51c38311745079fcff7d7" }, + { 542000, "3f53d99b40da109fe3c51e06b9211cf17ddb27a3773e29ebaec0ff54d71ad395" }, + { 543000, "e1bca110915b3267bf092bd5f68cac37af90154d57988105320cacf874fdf7e7" }, + { 544000, "e60a794e9f56ae6a1af383264eb38ed5b1c6d0020989a2b767bc5f09aa10935d" }, + { 545000, "51a3ed5f6cb6794a1a812056a30c04891f2a97695558a6edccbb5ad680a24877" }, + { 546000, "8c911273c0d3ff2e8f96f107a40c0300218e5ea1a11f5abdc18c828aa485cc87" }, + { 547000, "e1604844c831196639e462d3c6dae414149c1d7b84464a0e87cc571026110569" }, + { 548000, "020dbd5f3c489d3a46a0682d1c3229b9ad1f68080f0dba887be657bc54ebad54" }, + { 549000, "840972e7cded7df0c74f46adff5b5590a516d9199db3a396bf36f7f9b49d57e9" }, + { 550000, "c42277fbde4ec6c304588903dd21cac80f5ae35f8e692473d00c17a6cd7c2df0" }, + { 551000, "69aa1396e1862d0c7fffa71a616295d82a97b8b4349ea96d25c2759e4f5fcd89" }, + { 552000, "2c2c3fa08a0c9bffd7397b5097c879e7dc86e1c6ee32ce5721ebd679adf904a2" }, + { 553000, "78c13fde46f4cc799880acb1142682cac69f7424601d78767f4cff061f1443a0" }, + { 554000, "97ad2abf703fa349ff6b6e5219c82f46135544180fec8a8a29d09eb58ae0cf10" }, + { 555000, "5ad33aec630f76fa15eaa881bbf58d0ab2ccdb28b61b704232b1fa146a006454" }, + { 556000, "002c87ded85bd86b8970b0a993eb32bf523f0d34aa46971a44f13fd754cc0ca3" }, + { 557000, "048d04938fdada82a11cf4f918172e465c2f43ef38b90f9aa55b73b273c2abf2" }, + { 558000, "8151d967881653fd4ee2750f9d93adb744f44713a3f65dc4c0d8f7af3375b849" }, + { 559000, "1bf290285a9d4e3f83907bf63b0b7f5626568d1f4ce93e8f8983349039af57ff" }, + { 560000, "eb6b652c343620196139e905136024c9d43cb62ee1b68b551898383459657252" }, + { 561000, "55d312de0a404bcdcbc14939ea74e73c780cdd3c178ab575f97b5ebcefbf38c5" }, + { 562000, "0a46580eb10ea441828c1ab4a083d70b9c9594775c07475ffa3f519ac37bd881" }, + { 563000, "dbbfd06a70ebac6ee1b34ec37f9fe6fc3a1f954c568eee2ca2ffb080047481d1" }, + { 564000, "a01c92b71d039e04538f471c77763e749030c9719b323cc75bfd46d1907ba91e" }, + { 565000, "e5bacc2229d341f975da2db074e5930ae4622b9732928f562b08525af5acdb8b" }, + { 566000, "7e6337a6013267379938b5e1d722c07e209a754dbf8db2571f62d81cc117d299" }, + { 567000, "063f2be58da9934072150ba02ffbcc713d3da715377edffc20c8e786a1e65460" }, + { 568000, "8f61cd87e481ac1314bef78d85dbdf8fcfdea1f3f652b953c2b4060579ee71c7" }, + { 569000, "412249ab464ea69c5b2511220729ebd51008c6b733a74cc79ffeb608febef7fe" }, + { 570000, "7b7f85dc577895692edcb6c65e0f517ac0707dccf62804d44ea52eb2d84aa5da" }, + { 571000, "63ee89f69266a7ae712d3028e77ea733fd23e76cd789892109bfb581949aac75" }, + { 572000, "950c8cfc972ae6b11748f7981aa4b6721927593848d8b0165fab52e3f003d523" }, + { 573000, "6d21d51530a061f7b38c6682d1842e6eb23a4ca60cade39a272059febc8157be" }, + { 574000, "8f0b035ac51399172b98738f98804596702df2588d813998bdd602dba3557e61" }, + { 575000, "06838c8f088a48c5b4530bbe3bee7e5359715f1669a806106f227b92264a2e68" }, + { 576000, "ae24f5f220a68f961fc0e4892f48c3e7c2e530a9394874db5e50608801c31866" }, + { 577000, "2430fc850b1bf7ca3c0f61d555ebb615054ba74dda38fdd4b92c5a3013cc316e" }, + { 578000, "0cbbcc63538b0ae086219420e46afd4d633d2fb063e38297fddd2f0470464ced" }, + { 579000, "566c4e63a709d915b7bce86e5580f6f7b3bc22e3bfee50264ebec355cac854ae" }, + { 580000, "5425bf4636a65343860494fc17663b8518cf85565e2f369377da3ec220e71880" }, + { 581000, "3253ddd05178bd64f9f0600dd9af2e4557bd2c958c01663425d1c492b4ca29fb" }, + { 582000, "9bb61a0407782891821efc5d24290b3615991286767230186610a1a82b2ad51f" }, + { 583000, "09194d80facb822feca911ff69657e54c05a65e72998beefff4d7cfbf7587806" }, + { 584000, "16bc50b30bd8e76f30788dd9d1128c791c78a086ce24441121c99db9e2b9b6d3" }, + { 585000, "17722cff63c1215ce06aab129a52317ae818a44722b97cb7dd7b252276bbfad2" }, + { 586000, "b5c164cb4afd97c1c234c70fac4a59d1a5197cb66ba93fbcbe298ed76ee61c50" }, + { 587000, "0d14698d9f7817a0ba0ef6cfd3e60a093264a7610a8077ae327b8058d106324a" }, + { 588000, "afff217c9bda7c0c7758dc781cae2b9f0de5f09315f7a8dcff223f15dcec702d" }, + { 589000, "0ef8ab63aae149c1c3e4228d86d15bc90ea015a6250b8f77f1cd5ed077591e7d" }, + { 590000, "a3220bf9431270f7698b171a3d9df40fa926820fbb9c19947aab1edfab84a9e2" }, + { 591000, "8dc5d1fdbc467e31ad9e8b40d84f308f51854b77c460e0801771e34b0b3f48a7" }, + { 592000, "79356891e7a410334ca060ea61ea33fe92dcc247b4ff43cd6b87955fa2c98c63" }, + { 593000, "89a5ad8b09a09ba991d89b62ce255c9ebdf01c30e35e973bb4a58e05c731022c" }, + { 594000, "588a923273598cdcb9f6d03c143ed66ead7aa05b04ab903b5e8db190edddb775" }, + { 595000, "b0c600c726537f06e503154f17f600a5507002bf7229ce3b45164dcc10205a10" }, + { 596000, "6630ef79af8733d64ed480a17da07fb4142da8b942d3a7f20c9f1ff18183cb9b" }, + { 597000, "a47bfecb3bb1ee2218507b9b1561309a86522e668a55551dff36d8d5262a1fac" }, + { 598000, "1af111b3a88fda3070da610236af77c25ba57b32c6a4736bcb05ed4b75a3c674" }, + { 599000, "d41b7e9528ae09c15359023af0436824c7abe20974b1e3092102a0aef4b7ace8" }, + { 600000, "0a1642271fc8248131ab764adb984ccb550641552ab9673cfa79fda298ea4d6f" }, + { 601000, "eed5d265afb4a36f1ab08c326776c2ce0d5846a2573305a2789715aaa44a64ee" }, + { 602000, "5f90c1c7ccc89aaadecbfabb096195ac8b5e01ea595b7c62a0c2c5395f6098d7" }, + { 603000, "4bbd255485180b5889055740c8618ce682f086fc8deee842909a54bb6885e746" }, + { 604000, "329160c511a6e8df7e54f4ab6b67d9009b0d51acd1ba43093267993313d78d2e" }, + { 605000, "10b6efdfad6520afbd8c476fe6ba79aeb4ea1ee2e32bf94fe08c871401b53d28" }, + { 606000, "27b8d67aadd4833f5cece9312dc86707857ec669c763e3f8603ea45a98ef5bff" }, + { 607000, "5c731ba7dccea5029bec963a4d25c6a1ff7df75a86c986a45281685968bcb527" }, + { 608000, "fea3a71174aa3e99dd0fa54f80931be9a2dea8a615e33dac9fdb7966f94457cf" }, + { 609000, "da7bc32fc4602ad50e7e35eaa1648a178816c5698757455a5c536946ec008c26" }, + { 610000, "9cff177efb5e28e60bc979b8ce26d8271a5a5d2bab3851b8bdc1050a46bb5a6d" }, + { 611000, "df2bb554b9575d70d6a44f6be490f6f227f2d7b791da876f6e6bd6f10c3ffe36" }, + { 612000, "38ecc3a82087b3f36540441dd5acb65d9905b546e38d5c40c2189e2dcfc3d875" }, + { 613000, "96e15990b653731e9674da8651c947b265674e3a0d78dcc2cdaeeb96c0ceed4f" }, + { 614000, "3592b6402478e27ccd2802095b65cc11b80728d2fd7daf1a986470789a20451d" }, + { 615000, "b306cfe742aa544ed4a1db22d3d0a1b63bb19328c2e3a9b568d6cc2af2787e00" }, + { 616000, "c4218e8a07efc8e228e60869f31da01e705a1feab105df0ac49f13abede54a14" }, + { 617000, "380ef40535379e69135e5a69deea4bfc8fb46828d99ac446cc8f52eb61d623a0" }, + { 618000, "20dc8713100fad43ad6196fe7ba809af87dee2d55c4090330fce925497aa52b9" }, + { 619000, "14f4bee3886bf23cd03a90d44322c3ff2f8359cc5d849c1a1d8ee848f529b0e6" }, + { 620000, "a4f9dbe5d7a4f8e9ebd6be0b1183d7b59323351035307309cbc10406282ae793" }, + { 621000, "1ca650e6ed169fa16be333e8fa1a04151a9a41b7e51cd938db1a58890906f7f9" }, + { 622000, "b31b8a8e0280dc36dec9784bf3ad6023aa7d346d2f00272ee1b9aac9fd1f5841" }, + { 623000, "25d30fb1eb547163901ec97b82ec683729badeadd474360ed2388dc188e68cc2" }, + { 624000, "0906e6b84144068b69ec12bcf028afe576b930f6e4384260b9674c293a32f3e0" }, + { 625000, "80e98c011cb151de92ebbfacfdd929fa6b4588977c5af512bf2ca10039063f9e" }, + { 626000, "ab834d59946676276890fa6f74db56e586b991e012e87ff20477fe834627db1d" }, + { 627000, "199690d7d8a87d7ec473383b8480eefd973a28fcf4897e5954e398b2eec9019b" }, + { 628000, "3ab2c95cad967484fbb843f4b82d9148f6923bbcff41614ddf92d49dc09e27d9" }, + { 629000, "c5006702bb388a79ee8be86ab72b28ab6d14ed8697011ef82ab0530d71eaff32" }, + { 630000, "7944a1150b961e8b4aa5edb39572fff3cac583b89695d63943940bae1557c853" }, + { 631000, "83583195aacd2c5c84b70f26cf632985f55f6d011a7df45cacd15d7db3bed313" }, + { 632000, "c9c495d457e47bfcf5d0ba7b7401dbcc66f93866a8965129a21c8f08280a2107" }, + { 633000, "6f84bcc5b07c76c0c5486913a7bb7582bcb0dcc002ae94d8ae2f82870ef41ca9" }, + { 634000, "920391ac8741643951dbc84353755b9598904067f76c6f8ba408a5628091bebd" }, + { 635000, "92b79d544a2227310c274bbb63a1697858862bc33139531a89886b549ce3e4bc" }, + { 636000, "9cde13b3b0181ea71d9bd8209fdefe8afad083516a5b70555f15413f425dd080" }, + { 637000, "65a2c5467b7132c6ab3c84c36735f340ac51f8e0cc491abeb493fb3b4a1b6c8a" }, + { 638000, "349d666cfbcbe3844d6abb5a7e362d3c7fa2f2cb2ef9ff270dfcaacd9a6006ff" }, + { 639000, "3b304ac2ae4b186b6e295a63e11a1c402e8435f4f9308fa6a97bcc37173767df" }, + { 640000, "2f90bd91fdce02a0e4f6a5da3ec21c77692db83b53dd6e554b9c314a91afb639" }, + { 641000, "9e64181a447c8a877f93c742a072a9b69631bf8617eb21a7c87a0f5e5ab5fb4e" }, + { 642000, "7e8a43b816e6f5e95560ccceaa93a3e6b855949839616dc5da7a6a6768838a2d" }, + { 643000, "e2de505643c759775fb73d73e19d551bc765dd6009ce833863df95e3ad4b670a" }, + { 644000, "664c7ad59bb3e3ee8b809df70701b48f9477e891858df009dc3440762e5a14e6" }, + { 645000, "b47d648b256272af0058cc5f5e23403057205abeccbe5d5fae5931c2fce526ec" }, + { 646000, "fd2f0b154169b6c3677c452c1d2c99abeb1d5fd293fe990d8ba97dea6fa6229d" }, + { 647000, "05b7cf422e9037ce00b0f4f5783d55df3322b136d0ac650505b139977f1bd6ec" }, + { 648000, "529e7ccd2d4fab8e25c0f2a49a1bfc3452f8a6202db3be1ab60247c4fb5794f2" }, + { 649000, "40b8147b2416bcc81829fd6caa310d382c5b47bf9ef88d117eff06f0d3eac085" }, + { 650000, "4c03da728b673dd46303de4300d99506ca8a77957d2676634a24c24388a9feee" }, + { 651000, "f41e00ad734b1f02b6d3d3d1d338928ec5860aa326c7e4ad0ae6d251ac1e6859" }, + { 652000, "878b02324b277c3925ab961ceeb42062889bc44c70b65d1ef50e4c63a21ef41c" }, + { 653000, "8556ae4e2b0b87953603011f4677193306b8c4cfba448aa3ea7529a12bf9d026" }, + { 654000, "2979b89bfade316bd1ea1cb76840ec396ded0078a0d3cf9c8c7a1a6dd1c0b658" }, + { 655000, "d3becf2daf90383a9d91c2d7f2b4ae87139a6ce7a1adf5710e0651ebe0a5f5aa" }, + { 656000, "4ac612d1f14ea6867f9d3c3ade3bed68c10e4a1545b463eb87dc75fe016737a1" }, + { 657000, "3bc54a4c2e45ef248fb2e41590804ddab5e5be2cd6b20b312bc5bcabee0f89bf" }, + { 658000, "8b15516d1d1ceaad8c270851a03abff237b2dcc46f7582eb244ed3432dd9aa71" }, + { 659000, "7aa5ec87094aa6a272decbe179a2395af5eb73ebdf98602346ecafa5e2af408d" }, + { 660000, "b74f796cf02360c203732146d8310a54aeb2f474d0d101fb83d9e9c1499b4fab" }, + { 661000, "7ee6fc293e43fe25adf36ca570b360715207045771141c3a7c5c3fb347d1cdf7" }, + { 662000, "c8756ebdf5507d4eaa7a75b13e8be3f08e4dda3f332e6dfcbc8134c72b29304f" }, + { 663000, "b7716ce4051289d90749f4c1fdcbf9eec918d0ba2770a1f62818b25f85161b1b" }, + { 664000, "e1cba52ba22943244e9e88a65a7f6ec78660e0d435f7580ecb2aac0fc6ccec2a" }, + { 665000, "e2bf462700ab2e268a02b9546f33c59bda796c27fbfcbb22be0035bce92fdd4a" }, + { 666000, "6fc0416de1040108b8c93f97a194c92627f40acca208294ec7b8269bc76db0f7" }, + { 667000, "4828e206e6e670ca8fce12f6b11ed8580615959280b315652a2429e30ddc227e" }, + { 668000, "a957bb3e6d1dc132f08ef62e24df323c847b2e38b2581802eb7a9d8cc317c1f3" }, + { 669000, "18fb96011c45273814e920b6dea03a38a427915e28866cb02b6210fdc4417c51" }, + { 670000, "719b444c9a4e036682dec102b26cdd28dec2e9f059c9f9fabe69a4cebb23c950" }, + { 671000, "b82051b43bc9e0259a23308a06ebf7c8f27606b5bc21708cb366b7dbf82dd777" }, + { 672000, "b4838dc3a18df5cc8d8e6ef52fe9ac534d43976e1a8862e738ef73e91aaf8553" }, + { 673000, "f7d3e88e080437f00a85cac6e74975b67db127315b59bc84880830a978a13e62" }, + { 674000, "ef8305db77ec295476e94575b776a380257682e4d9f1c0082927ed8bfcdc7cf1" }, + { 675000, "e8950f230c28687b78db9275ad6eaa9fd4e641c030fa8407714b71d774fc5537" }, + { 676000, "862ae90979a84280862756acbc56b1c20e44abbd9e6135a6e1e83e83ad4bc3e7" }, + { 677000, "038e8cd8ac4a812cff16f7dcba23dd2290b79878a2a23f03eba4e58074ea3c7a" }, + { 678000, "ccbc71933f5590c5d6ea5210e8d6047eb65cffa25fd70541ae01e2729267a377" }, + { 679000, "f4ab95939abbba68e225b6ba34ea0a66f592d41d88904e9518ec9a1f61110642" }, + { 680000, "2ff9ddf5f6b673223a2a2075107cb17fd5a280c3c604919e3a53f632a9e34799" }, + { 681000, "4c7f297182b1c586c678ef5096d721b85dfb6a5c6bcdf56ad855b91f9c1cec62" }, + { 682000, "937e8933574c611f343b1cd83ca52e9df6c5e17d86198dc1dd0e07478892f1dd" }, + { 683000, "cd779ce179c3a51cf966390416feaa6559d869e3abde31aae2bb87065615080b" }, + { 684000, "3bf7bed9d003df2d6ffb67c15536bc20bee2929cc6bcdec8658718961d4842a0" }, + { 685000, "07d5a7a9713ae98621f79117d68d7692db2d9abcb58ce4b61b85f459a412eacb" }, + { 686000, "46aa553a1063f6bfc8932d68ace9ebe2a9f225f448d2d24b45f5e3544907c49e" }, + { 687000, "64b60e6064a4e37223243e4b4bc50c2e55ace7b2a09408d11e648bb7cb81e689" }, + { 688000, "5c17402b63f7b4dfa6bcec34cad7bb43c8bc6f2bfc3cae660ca6d585e05535a4" }, + { 689000, "bae085d9362996d88245f1962b20dfd94f39efafae913d42a423bd71826add2b" }, + { 690000, "222b9acbf2019361a636fc95ca35938cf24ade3a8f519406274ac10d172dad9f" }, + { 691000, "1438e77cc70f3bb45f2baa1d585f4880b9e30c9fe5521e3d1772e258a9547725" }, + { 692000, "0608382f81532a2658078d64d414e0a01a412df1f9d6778873457af90eff822a" }, + { 693000, "77a7a3cfa815841411fe925c04ca4a6e88491c21cf7349927fbe95be1b00a390" }, + { 694000, "b5de6f88f5e9961658b2cdbe849ee9e88912edab5370e151ca95edb773bc4585" }, + { 695000, "553ed1c0c56b6628727f6beb775a2e531aad602d25faa9bbe6a09f43bfa91e1a" }, + { 696000, "ff357317c7d71ba1c2f313f86eb651e6a79952fd35e046ac745e3c0f9430a2c6" }, + { 697000, "114c7551c09e58be219acc422ac821cc2cd4a19cf70db7ce3052b9e5d730b228" }, + { 698000, "d65b32ad396cab72e83ee2afbf5b6744873694746e8dc9b807a3f02ecc2b5f43" }, + { 699000, "cd577420f429ed9766460cdba4ed748ebe38349a9e682c04a254e36503968080" }, + { 700000, "6a12fd0de1431e281f98e93251904bbdb8b9a4782f297951458f61f5b22ad673" }, + { 701000, "ac47921782acfb58bb4c19b6c92bffca38831c9bb27e4da0ad316e14ca594e57" }, + { 702000, "f1e684dbb802fe75b7b150b6a5c23d3be54aed53f3c40952739f14b70d260099" }, + { 703000, "86ee933cba04614fde65f3567b6675882f4a1cee289bf000a1b343c60d3ee6de" }, + { 704000, "bbcd7059f0c9875f778837741155044f4c917ab899a5670b5484b3e62f6caf15" }, + { 705000, "fc8a57563258ca753974b0b0adff84b170f9ec3ef50e5554d2607ff4df34cf37" }, + { 706000, "abb17afeb885343a7e08c4dc0090608ca4465ff7eb93e3d1d07f0bbc175236fe" }, + { 707000, "46e8bfd1576df114cc577b297400dcf71456851a4e0140925e537ccc75650c6c" }, + { 708000, "5773b18143bb70975301c8cb5c15fa68d36d27243531fac32506a0b37f010bc7" }, + { 709000, "1c991b9e03ffa4f3aa475aa6bb00e93a65e9b67ac2a88c9601de6f95835efef3" }, + { 710000, "74ef9e5804b13b0834bb38243b9a21136af1e36190893ba8d552eeaf3eeff1e0" }, + { 711000, "65a817d63d42693d710b242af3a041376c2474acc1666259497b262b0bfa8af0" }, + { 712000, "abe2add1e41a8e277d164f42b7bf54e3d5d167d49b850b271ac94deed0bde7dc" }, + { 713000, "4589af6ccbcc3098bce53d4149c992cfa6b2dcb07c7bea0aaa2ff746bc0572b8" }, + { 714000, "9c5936200e132cf4ddbfb5cdb131eb2acda60afcbaa509e9d3dd28adc0cf1669" }, + { 715000, "d400bdd65b64898bafce555a549c2565841ee3d4e72e66a5ab803f134560d717" }, + { 716000, "deb209eb1f9d5c30d4c378fc6aa9d06de516a93d1d0704d4a95101239cb627c8" }, + { 717000, "80bf6874f5637409fc129258d25a3e6bec7e0e1217a7c2f0d242797db6021827" }, + { 718000, "99120502e67698cdee738f70c06b0c9c27788f5607ecebce007524d75ace28e1" }, + { 719000, "c2a7fa8f078aa5d62b1d9f46ef6dc444c46d6817b3222742d919ca440b2ffc15" }, + { 720000, "5815fe8ba956c742f4e761f8ac80b2c46c881eb2bfe5db723419287b52f5db40" }, + { 721000, "a754054ff0aebf068ed6d0411e83dc485f0d3d465f2d89f53a40ec2f6b4cf170" }, + { 722000, "0ca88090380f69ed0f57d5ed418141e95f252279cd788ba02fe4488d92bdaa14" }, + { 723000, "63e11bda79636caab82ef7f39bcdc035eb5e028782c9c77035f7d54d9e8f356d" }, + { 724000, "b96a85f8325119a5fe573e58c693728b0d97eb9b35b49713ac8fb5d68718218c" }, + { 725000, "220a034316f1fa46e7071f8ffcdcaa4916c62a3fd37a0401964f0a973260029b" }, + { 726000, "9685fdc2ec5854875e7bc4945e2f3b4e71f20c50a167cd6ea08416d0e90db99f" }, + { 727000, "705217da9816a0a4ecfc3e3018efc12e8da2b52d7a4b93f48934a7b98f43f438" }, + { 728000, "3164f9470be4b9b458e8ac925d9edc7299eb740fee0e9a1c59c4239a47ef47fd" }, + { 729000, "66b93f3650c4d1861e1c657e9ebb81a22bbae94b5419561d6ff801bb759aa73e" }, + { 730000, "c94440a912f6818073e0bd0931deddfe659f297ccbbb7b20552724ade03d07b6" }, + { 731000, "dc968045735e2085faceb2aa56a7422afb281bc8fc6514740db8a4503f0a4ff4" }, + { 732000, "3f06cb91998cbd1b2205f34bc63f7a34f05c21ed51d869f02e188faf62c15f68" }, + { 733000, "f561f0cfa26b7169ed7d03687a4079968ff402070173bf296541555194ad943d" }, + { 734000, "4c961cf6ab18c31955862586db06fc0acf3b56fb2d37c9cbedc6e79267658e2e" }, + { 735000, "11b2f45144d3bde7bafc4656a0b7c09a215cfee7fd7e1ecf718da9f76345fb7f" }, + { 736000, "553c5009079053dfcc1d7937d5c351c84948753a9dc9c84a2932925e52f765df" }, + { 737000, "07f595ce150c8c4910b81358b6d4c04927198aa579c7d20c84539e4a732bcb80" }, + { 738000, "c0615e976b46b97214755a78b834430258f25374862a81656865f944fece7be7" }, + { 739000, "32761946e1135916912d848fa6dc27df83625844fb996a0242b843f55359515b" }, + { 740000, "2e1428d45ad48f9f411a4afa15bc6b705b6231112a412a08b3c126e668af35f0" }, + { 741000, "4a43f0b79c6d3e3c3a7f468f7c5fa5fa449251d8cbd0cc362f4e543856ce605d" }, + { 742000, "aa3dc353a18ede46c51c75846d0ce9421f2e29e1d72d79f93de46d50a9a6c240" }, + { 743000, "a8f9cb33a3d03a74504d7c952ee13b1b6ef5a7c7c25a353b46112e17fa91a779" }, + { 744000, "c59e669042828fc33b9fe874ecf5bf67f3a25dfbc53b95bd195dd535c4b9f90d" }, + { 745000, "cabccad06f5bd84c504338202cc6a9f796f331ec83b58f48807ad50fca9c05f8" }, + { 746000, "9354f23faf3c6cfcedd8087f8d1bd13e41d50f37219072fbf9cb4a0df2e6c8f6" }, + { 747000, "d87d3b3fa146b0af6b4d2fc8bc54064cd46da82c19e7e6dbccefb7d94e72b866" }, + { 748000, "6144cf3d90ffa3fe062b8d86659bfdd9dbd79848e703a6713a7a43fef77eb6cb" }, + { 749000, "d4c5a5929b7c24b26e160a6341d0ba793504e096fa3e4e057ac201275578384d" }, + { 750000, "41b72a5ca49e0a653066d3f0d56e9aec630bc801871333369574074b2de32f42" }, + { 751000, "fa44f02f4d17138dfcab645ff8c4337ebcebc1251af1f652651b06a5b65a7ad1" }, + { 752000, "cc776bce263e9c6aa194f13c0052dd3c304eeda9b5248224dd76de5f47a167b5" }, + { 753000, "cca2bb5ac11d08182cfb9682f2cd961808b978d31e5b98a11394961e173e12c1" }, + { 754000, "6011055a37e00655cd79e3485fb781d2587c962d635af687d73a11528b1d55ed" }, + { 755000, "2d615550b6b47956c37b7a05a11a0e3427bee0c3e6efa90acc4739da65cca357" }, + { 756000, "94fc041f3f707611103c096142d04a33b773076a1d0436db6caf1c5cc0430bc1" }, + { 757000, "f6502dbb335f3cb0f0fe88014a78efad7d41917077b0270d98c05aecb45156fb" }, + { 758000, "6ce71d6d9bdba1ecd3e3644a3444bb312828c722cd5d7dfbd79a18117c7bcdfc" }, + { 759000, "58abba22f01a01e120a864de2462557350ac57f49bf3fd55c69a6034c5a25ebd" }, + { 760000, "6b5c2392e86b056b4bcb1b31fc09e298c406ec2dbe454fa0b89d9e821d2ee47c" }, + { 761000, "974d7d54e1ce0d5a965df79dd3c1f9ec82ee3e348276e42de0e16d2122b8c779" }, + { 762000, "cdb6d89c2773a73233ca01aab1c9da920ec3ff18d41c3a0d6d2a05e44e4bcd39" }, + { 763000, "e719feadb9ea0c63574e79f7e83ad06368df176bf0beb1efcace4287e93fd4e7" }, + { 764000, "f47dd75ecb008306d2f94370d2dd1de36e611c29c4340494e1607918c3162c73" }, + { 765000, "8345ff2e69437ea1ebc978f5396659913a662047509d74953b4aedccddf614fa" }, + { 766000, "efa556cb808979931d5686fc06655e2c493e3d42715a96e8a9575016acdb0b3c" }, + { 767000, "58554b84a5de871e8b1607cacd3d367fbe1584ea1c674b6e5cb48a013168a001" }, + { 768000, "f40480a0b2c28795f4e120c068a1c7b8438f4c11aa55a1c9dc3d3d01d7223329" }, + { 769000, "4cf65229fcf09be9f4c7fb6d676df86841e52cf333a0f5601949fcc8d8317e15" }, + { 770000, "dc6804375876e4d4f60578fb8bc26dbd83429f08b3b5be7ce656e0aed6a4a7b9" }, + { 771000, "867d0567993f12877cbb91be38301a474c66a34d43bc76ba1ff0295b31544a3d" }, + { 772000, "60e540abca59b63a6c539ddf265e60c42a28e8dc0cc06c97d66e246112870c3d" }, + { 773000, "3b82396fc3121fd9561184b818288acae393483bd80d2c76089d04bfbe8169c8" }, + { 774000, "74d28bd6ebe0ba17e23f5a6afb2100824f6321ff8df6ce9a6828b961584115af" }, + { 775000, "0f21ab4671ce97304c9f4070b4381ca4d8b8821af8b36dd3375c512aa89585a2" }, + { 776000, "46863619a4c45056902a67d4a85dcca18f3e2e465e113b94b42c6ee359ea6984" }, + { 777000, "805c7aaffe4ba04bf9649e6ca712e5c1a5e75a6c6ecb57e9858ce666d3058b75" }, + { 778000, "08ed7f2fc7e41320b54eeccfbe344ad3777ce001bce7b46ce33c7828df7e51a2" }, + { 779000, "f523b40c77e2333e96f52f94dd6570a88687359d1943df9e999209b4f1b9d46f" }, + { 780000, "0b1712d6795f4b98b222e0c11dab3908608d83a583c19828a4b1d04039f734b1" }, + { 781000, "8468e6648f3d41e5eafe6387915349a3529ca2e9b9d1a30fb0e8bc21eb27a837" }, + { 782000, "5697c9adbef0c167c13ea2ad3273452df786a93ac83e0d52a1aeecf026ac0402" }, + { 783000, "9fb9185109de408da7756572dfa94eb41c37bb10dce929a0ea323d99351ee3f3" }, + { 784000, "7d8d6ce84571bed5d83b4dad4d64706aa58f832988dec83305c3de58c915b66e" }, + { 785000, "9ce01b844487f9268d923c3ca50f41aba5c6dd0ab6994fbd00427a2a26b89b4a" }, + { 786000, "76eccc0632619c3b2b546e711970ce8d04f83398350653539e57c9e7fc5b20cd" }, + { 787000, "ab2bdebd33c7c4959bcb1c48eea9926a5390dfe91b8d09732122a0c1c5c4badb" }, + { 788000, "c71c03c0df53bd983c921a6aaeb1b1faaff5f02975939d5e47852da37485f36a" }, + { 789000, "a84a39910aef093e56eb820d29ad4aae49daa08a7413ab8839b88f4f932733ca" }, + { 790000, "82a334fae5535684aa9c2e94b2d61d57a7ebafe3ac8d4d52b97e4819914629c1" }, + { 791000, "446905dec258c9c5e016fa907eb2bf29ac114a55f0894f4edfdc75790f6e9e22" }, + { 792000, "99bf27dcd7674caee26889bd26a6aac7b00d6447f1b13c22f8607d64b4e720e5" }, + { 793000, "e171721e9fbc6f10dc4d11c34810701754cf2bf438ba54975af89a9402139400" }, + { 794000, "f401ce98ad5e420e9e4af9d906bd8cac6b80312c827903777b878ba9e24f6c96" }, + { 795000, "30c9af5713124e8d6c6db327c8f64526606a55ad8ccbea3d65ed89d4b6fdc849" }, + { 796000, "077f42e830acba2f40d1b2e6eac03682b3d2a144bfa616881eba2dba0b5f7a83" }, + { 797000, "43d6972cac1f7bf501e4dfc53b0bee44731689b18fbdea5b5bfe2da0494b514d" }, + { 798000, "3bf593cc377375e5283dc22e0a0a829cd9975e7195bc734cbea0ae5c0398482b" }, + { 799000, "0268d741c1e62b73740c95b3375c420985a395ee9f2942d9d6072691efbff6ee" }, + { 800000, "06d16a11ae045e434b2e7850bf2b1d061c91d741783984bdee921decfacf0f90" }, + { 801000, "cc7ad7e7942e5e6c8e069cfba0de9db010670a91663fdafdb6044f973f91066c" }, + { 802000, "63b7f5e902cd801a4495052c620a7cae8e34b2d69ad9e5e31fecb4be7099aa37" }, + { 803000, "b14b8256f83664b8268e6a98792187e9ac719a822972865d889967ee98aed0fc" }, + { 804000, "b48eb299b4d2ed305dd09adcf593b5885f499ca41b0f12d75110b07c290c6495" }, + { 805000, "960cf47dd44321b1b6725a187fcdf4514af09b6cd0b3180140dc15f657ea12d4" }, + { 806000, "2dc652232cd7fde75130655deaeab06deb77621374f4d0a282de21b2d49ef7d3" }, + { 807000, "4eabcb29d77e13fab6b9e7fab52d13a3966e8d1051666b2e80d07f6ee09570e6" }, + { 808000, "2b890b62513b3ff1becca0a4fa61d7d95e027034cc4160f44321df0005338e06" }, + { 809000, "a16cea1ca78a7edd23546904da6fbde0f937f03f36776b6d4e8951072ccae83d" }, + { 810000, "5f65db32f349669fa9c949f9bf118c9ea91ffb028e4c71e93fbbca2c11709f7b" }, + { 811000, "21528f55f977378541ea55fd21dc295bc6ecc190043c90e8bd1269a5c1f94a3e" }, + { 812000, "aef1a381baa344247ab25b9db4557213e9d823a53e0612ba7e79ab38ffcd4154" }, + { 813000, "4e33e9c8813f9baf6eaf3b8ef7d28d70f2d8eec15fa2e5fe5ec63413945b99df" }, + { 814000, "1a8036bace8eabb9c300c47f3e75f74b3fd67641b4386defe530d6c60225623a" }, + { 815000, "825eb16ff2085d0cf893846aae162cef8a60c0309df189d9117ca397b42c819d" }, + { 816000, "845980a8942362c6d296ea9e866d8ed4223906c7b46f9194b9d3b04c7de3eda3" }, + { 817000, "d4f06681826d1d3e93b995aa24ea87d1abe7dc52a6f77e3d95d39e8f5ca02409" }, + { 818000, "edfa0e5e012741439ff763eba7e2b223f4da342375ce3dd1d51fb1088779d463" }, + { 819000, "7357366792f8c7ee439d492e36769fddf0b92fe429c3aa51e88ef817c753183e" }, + { 820000, "9e9d1866e6f5e276b2e7c9b01a39cd515ae904d7577e715b62f834517afbc4c3" }, + { 821000, "0d20326d0a5c6c6de0565fc34ad85c0f53b4768aa1f482e987e3fe788326d31c" }, + { 822000, "1e5711dac6491341ba5464b9ae303ec857087178d78632e5e9ff74d10f7f57ae" }, + { 823000, "95ef36abbfc7d5d2c9afc0ca6fa67d11fb4db72b73b1d91bad8d19d1b86416fd" }, + { 824000, "0702c31d6e3416f38bb9dd3e0fc45e8fc9b6a529faea9c12e2533e44c8974775" }, + { 825000, "97a0330e9bc25d198c80d2b6f06acacd32634774096b457cf313489edcae837b" }, + { 826000, "5fe70b6b076d72334e3eba36f5ba7847418603cc7ba27d04e4b0cd2108975404" }, + { 827000, "e3222b2ef006bd600f547f41ac0796ee86d7027c954e5a0837ca61cf3a053a69" }, + { 828000, "35549ccd76df94733df96e6f29de7ebae951fd8646df57ca23ce01ae4b96413d" }, + { 829000, "e8c8a7648c3c0796e9d2466b512e581b6ac412f65deac72e00d3569ec6901d35" }, + { 830000, "824058b3310fa5ff3cfb72c2f533ea907e026b36289fad545abf1ca09cbd3551" }, + { 831000, "c440b4a198982c5f857a9eff673e7cffb7262ca8b9a28186d38099d744645126" }, + { 832000, "79f54a9b7455824de4d5a5747b10c1caba415aacd92cd5739d8c0c9d290e6e6e" }, + { 833000, "755020044019735c2ff4ea4c31bce2ea46373f10275a0c06e2122c702b6e8b88" }, + { 834000, "ac2dc947c9954c8b4cea55a6ead7e344d6d0f478814c530567533c66c8be581d" }, + { 835000, "75e879c6c10d198b70473d2b5ac95307fabc395c4a87b8a00b20627d77bba486" }, + { 836000, "3e744d549ea0b10b973bb5a352afa7bdfb236a8c3e734a25d33e866b130e3e06" }, + { 837000, "0fa9a2672edd3795bdf393f73261310f539a7eef97769ec55be2568e67881c29" }, + { 838000, "76d21ec0f3764fb0357a956ec8a53721d5e56447f874e3cfdf7549e8100c1c51" }, + { 839000, "b77c5cfd482b34c3e5a1cadb070eb312fee6fa7bd233180e6348fbc3d3cb3145" }, + { 840000, "ab89e030bcbabc24caeafd857de2e6e8feef129832ade049c0a5cf7722f6178c" }, + { 841000, "7c3b2fee14438efb207850c3493026653d46cb3f8bef9a27a686d4ae12027c76" }, + { 842000, "b54e11fb070f59067532e7eee0c3f34d83593262006f78848288c3b5169a0410" }, + { 843000, "d244c7109e3164a00493a469f22e39107aec950b012e1257fda209a44dc86353" }, + { 844000, "472b934286edf8a7b233c3de48660a5100fea6c6c16efa168021d67dbb7c01c6" }, + { 845000, "2c5cb2c048ec972c78b286f411afac8a9017b381cb36f9b19167ea37ede154e0" }, + { 846000, "15cc5f1adb5fed3a1326fa40bc5e8d7259b4ef97b95d9ffda0744a52c9c0baf3" }, + { 847000, "f56c815b68d271ca6896d3d86baed2763e497336856a90f262a3600318d5d9f4" }, + { 848000, "fa909aaea0da6d6e44811ee55e1873abb4d756c427afc7a6e0f05e96905d35e6" }, + { 849000, "62534444cd4d84f10238c72c2f0088b61c8e30c10b23c4308997f7534c4c2895" }, + { 850000, "d502abd527f2fbd1e8eb66f769c11da8e58de366130b228f6c9842465497fcb4" }, + { 851000, "8359a0901c975f86e3406227d0d9516903424dc4f0e5002aa83e0b0180b3821b" }, + { 852000, "707b9c6efb2826bccdefc1bbacf192be950dc8ee4674d4a036da2a63a4db12ca" }, + { 853000, "90df3d239b7302483a4a9c6862607ec64f5a3a08f7f3cd0dc0ffaa9d952ba3d3" }, + { 854000, "773c7b6177dd18e4bbab0d56b3a81ccac35c7d5a8cbca48a6ffd7d8c6a144517" }, + { 855000, "897723b0122b5cdb8856224f297d742338d657a47b1dfc1f372a7187fe7d3202" }, + { 856000, "0a525fe51ea196fbabd7bfc2e3042254ac6ecb90527078ea9bcf6a6c616d8bb4" }, + { 857000, "491da4dc8dba1d9431ba6b47e7ba4b0536124819799410679ee51f10462bf3a3" }, + { 858000, "a4fcef5cc6cf45f5c81831733be094dc7a836435e5d7ac87236d50fdaf3a22e2" }, + { 859000, "26779554c1e05f7388fa5b3119055c365b2198e22e53770b1c73a51cdc23945d" }, + { 860000, "19b2189ce285ee6cd5cb96412141e5f55355b616e37e55c0f30f0ea953878c37" }, + { 861000, "28d02d85ed33a0578add5843c723d97a420092b4ea6fb68a824b90a1473eb30d" }, + { 862000, "3641da94ed41ae3981035388e2096b9e8b8cab22c2cef807949c4eade0ce530f" }, + { 863000, "86b944f8899181e38690fa01bf9ed93d62a108ec999ac8f533040e7b64a7f25a" }, + { 864000, "957a83592c5278288cc185dc96aa36825f8c72d990cd0644fd756f9f8f4d6bea" }, + { 865000, "99bf6efdc6f0bf334eef4cffac07b8aced6e74b46d3bae3ebade4861ba137c34" }, + { 866000, "3c746c6f070a03438ee64eb77b308dae05d71cf6b67e571ae98f1c35b727a9f9" }, + { 867000, "a873dce39fb2f98bd07ffe3c59c4ead065a67c9011fe6d694023cb97fcae1fcd" }, + { 868000, "9598e4859543d94774c63cb5b63689e888bbdcf848ea2836b87a26cf9ea9799d" }, + { 869000, "690a3494f38409d19c8b2e90bdf5e6a2bf63dd322547d16fd5ad59a752324416" }, + { 870000, "cee5e1cadf2db8b05fb38a527d13de072c0bea89446949a9891983e6bf498ae2" }, + { 871000, "fd52d8c4e170d109d6a68655b6cfd4e4868ef3bdf9206e33c21518b6e9009e84" }, + { 872000, "157ddc4bf2b1801270b19d64c545f6ecb009c8ae71fc406e38f55064e85a1c63" }, + { 873000, "679feb939bcfcf4ee5d854b74a8659b8bdf57f347676700a7bdf99228d678371" }, + { 874000, "11d2cb9dc36e4685d27b9c135919760c612bcdf64a173829cdd01f6ed62a90e7" }, + { 875000, "1b15b46fbe39e32f0d4297bf52687e71dc3af5a6fa02e02d57ff957faee63aa9" }, + { 876000, "c60bfc79f20c4f9145a06584059d84b74873d5ffca23438258cee8431485a635" }, + { 877000, "82a898fda08b4dd641161030b94236f8655823409d3efe920e228ee54aff76eb" }, + { 878000, "62ca04200d7aa567a3b22d99bc780b9aa3dc445417e8c55850586b8da21b06fa" }, + { 879000, "27d484baef7e4a44d400e86469b928709d62b5c849fd1f86793bf0e421fa53d2" }, + { 880000, "3d78d6526e953377f8eefe45f51ac74932abf1f1ac5308e053ce699633ed4171" }, + { 881000, "d5be12ef1da11ada16ba1f3dde50985e809b4345a215fb178f9e5d526d561c68" }, + { 882000, "99bbba16761ca1a60d82ed971d755d2e22202cae502a5025d4d2d23b030c28ee" }, + { 883000, "c9088a08e2dcf2e7dfc41f3c873410bbe6c4a5d9910af6e3667997ab7d62203e" }, + { 884000, "d4773f4fbfe985d58be07e1d29d3a7e710e4ce7f1b575365f4bb6f7b82c98425" }, + { 885000, "0b4b862b392bb24a623568c471d18adb76e4b14911335ebbc3d94936ab9ff6cf" }, + { 886000, "0827e2447015aa7dda645aab4ffb7cfc930e110a718ac7140114e94e96da2de8" }, + { 887000, "6966fc68d04066d61b3bae3384fb1a765f0d2485d53b2cd3aea7bb9d0e12ff02" }, + { 888000, "62b71bd9125a3efc3dbfecd5dfde1482e12109456c32cb3df7ec8623a24aa984" }, + { 889000, "6aa8cc6db2496142c60c8bf71c54266b40d9c5002295cc2ac94209acc59c6295" }, + { 890000, "be1bee6699f377345ec5c42200f76943897440d9617c8ef22ac1d606d3721f76" }, + { 891000, "e0d52345381ec4d0fbbb4a81a4fda0f217d5b39b21adb599e6bb40d2f6e55f67" }, + { 892000, "874449c43e57b0bfd6cffe63ff9338b386b832fc1f6e7417491ab458a260147e" }, + { 893000, "a1a74d3d1014e2d2f2f02c240cd62acc0fbcf6cfc64e62255f6e40f28ff85e31" }, + { 894000, "6725b03c2887c60b0dc9b06e332c089f925419c8f712cb9ae4892f36e81f8b23" }, + { 895000, "9823d67fdf27834b59cd87f6040d26b435448f5f5ea1813aedefa9f40d84a4ee" }, + { 896000, "4c4e50cb12106d42a8729ca28da964e66ba392a8c53aabc3dc182e36aa9bbab0" }, + { 897000, "2610e0dc9d3cb1a96156866c946767d58b0513a32f39322792fe67585a0cc899" }, + { 898000, "e98994827c2125f847068c3b5c16665a33fd13815a8952b7140e94bf29c259b9" }, + { 899000, "28776cf3190a1491a6a76641235373fe94ce26b1ed735e6a04d5d72eeb4acb68" }, + { 900000, "58f8b3e1380ceaaeec03f23bcb3549fc385ab154b35c2015ebdf25435786dd33" }, + { 901000, "3cf14cf3efec669ac73312f308984469219b131af53743d190ac7c5b70cacc25" }, + { 902000, "51b410d195d96c8ffd62f696257629f6a03134bf29bb74e29f6b9fa5e2d0f05b" }, + { 903000, "291d8edd5a31909758307bef754d8471ff782b70d6578a16d2c9a1507f6fe8e3" }, + { 904000, "12eb81c75e44ac5b6f0389165adfe5c94c300b3f07f63bd033899d74801617b4" }, + { 905000, "7d7fb8e2baa04765e1b6421f2fb83e1df0afcdccc0f715698a6fb343758b6f06" }, + { 906000, "593154f6a5a63cbac28454c8172e510cd361404e55ef42c8e53bf2cf56c5e653" }, + { 907000, "f02371cafcd132e45bba713c08cd6f74a1e057d048723337fabe7f9232930189" }, + { 908000, "67ede623b3ea3ccf88918dad27deb9cab92f64202a0754a805c66c575bfb4c5c" }, + { 909000, "7b881937b6457f3a31ec445410ceb02f0fb26c30a6ad6432df4483bb5131fc89" }, + { 910000, "3bf72daac195ad0e197f691d959168602a1777a3e038fdabebc068507b540e7d" }, + { 911000, "2bf3d2903f6a3a2ea12e985c1a23b473604c9ea0f0bb387982c80a6b315c5f52" }, + { 912000, "9e10cce384bc33d2a4fdb7c20ce3b72798e12567b1616e71ff192740cc48503f" }, + { 913000, "e6bc78ec6d566782861dbdc0412da969dad82cb60082624cf6f9bc089d4bd825" }, + { 914000, "e4e5eab870e4af4597bed3989fe72adf43efd664037b35fc0816a0e58eb7dee7" }, + { 915000, "1e9871513ebcf71f6fb7ac155b3a1c7e26af38b6b06a40f2fd7c0b1c525ec1d0" }, + { 916000, "efeba5938ff11520108490b5df59fc6928e51be07a9ddde6600572d5d6a36fee" }, + { 917000, "579a635f0c94c9af81df9bebf7fc1e754c75e8aa06ed2bb0254d89a6a947dcee" }, + { 918000, "d3d5d2c7952e58e74d070693b927b4733375dff0a6f48edfc96a774ad17efd1f" }, + { 919000, "555800aea2614ef48758ad74dfe26583d2f5f02e4dfe8174f6a6c4ed5000dad0" }, + { 920000, "d604b16fb37f253f917acbb5222dc5e63d08ef2f6c39ecbb645a8f72234292ec" }, + { 921000, "460a9bab701ccb00de6925c95a276f5942bc4c005a5db57cf04d9f92d3e6963a" }, + { 922000, "745e6e698800b832500bfc536e2d2716bcb58ee652c81bccf84bdc928ca4b1eb" }, + { 923000, "9e2ac6096d8d5c5757d7230fbe2307bf680d62bdc9d780faf9f79b4bacc6706e" }, + { 924000, "8a6f041f191224cdc65153cbcc548d33c0276ad05c68d34804038f225cd2e029" }, + { 925000, "1912056d67e9eddedad4451dc719c4b6d96c5a8d1a1a9e45df712f4148bae47d" }, + { 926000, "660542d4cad2cc6370a091198f353a9da09cae5c4ccd7ab2cd47847c3062b0a5" }, + { 927000, "bad2168f6e819b99705ce1393d7e826da1a05e3cff8ee7ac079fc37eb50d4c96" }, + { 928000, "3de9c7b530ec8568eb6ce15fc1406f8e672b0e81759887754e6d0b6243ab11bf" }, + { 929000, "d82bd05495ef8910b349b09b10ac79edc22377ac5143daabdc681592892d898a" }, + { 930000, "604cb3c70ec02b59afdd177a8b47f23024c84cfc6c6d1e5680f4fdd682e2b299" }, + { 931000, "2f5311e454c527f721d9aa3ad52960163cc4b4dff7b855234f5cd0e61b12b7a0" }, + { 932000, "3eb2c7d788172f0c32731fc8b2a73d00421c4f333b94234d6a127cfcc4431366" }, + { 933000, "99fc18730095ebfdec14192e53d0aee550de29a9cfec0328144d3981903dde67" }, + { 934000, "9e4798425767efcf3e230363e68961da0eae251705a0b8937080b3ea4e0409c7" }, + { 935000, "a635df6c7d03fcb0d0b05e097648cf04e6b43f5166e81abd13e9b77e4b8cbd2d" }, + { 936000, "2a38d62dcc82ff2f2a4acb1065e4a5117e49c7591ee6ba88e5fd9547cbf503f2" }, + { 937000, "40d15515a2c272b717dae53517550a4506e1a21099ec56604c5a051abc418d8e" }, + { 938000, "1a0cdc37669aef276fd40411da69ef1ed6e483c165c72d0eadae4abdc16af9e6" }, + { 939000, "517fdc221bc994dc24f5052a269b0344f1dec771580887a4f4eea2b03d8fd35f" }, + { 940000, "0cc493e454a95f4a1de695c441084767279fbfec4be484242ba2e9e13f957b13" }, + { 941000, "bbbec9d77aa33c19baeabd8061693a2a2b4379cbc89bf939a8963f4fc08c8b1f" }, + { 942000, "80b4ce9bf828fcb3cc4e58bb8f2b8003c92ef58af543ded445ca680056848c3a" }, + { 943000, "8b552dd3e1f5d2a828bf61fd0cb9d4c5a415fba08773de6826010f0abe6afa0e" }, + { 944000, "3740e7a0c9883bd8385bab8c4539e3a3b771994b38a1c9d6b94aa3ab93849c59" }, + { 945000, "5f5f0f1251fdee7145790cfaf2ac723cf3c40e36f49928f0beba0f66563ef315" }, + { 946000, "39f66239f1cdb5caea4d36d1df7bea828a0c7dc8c46a71a55ed01b2f04e97c34" }, + { 947000, "84f1419a40a6f25f137b4d5c1f35a56aeedb3e6251b171facd2a0974906ef3c9" }, + { 948000, "9d7c02988908bb906942c7b56c018c0a6e1b06f972bf34fc2cda4b85c109735b" }, + { 949000, "17cb0f0b54be3859f1a04e36329d0d8203d55961424114127990d02ec86619de" }, + { 950000, "477234eda8abb563e050d4a9d6a08454dc486463cb7ff1f06b777bf0ca928573" }, + { 951000, "248e9d71ff64dd8bee7448fbad53aa30788627d95f9e23802d943b1696a8fe36" }, + { 952000, "07593c3c2c5348196d9cc704ea18e33f8e966ee05f9882b69cefaa04cb7566a4" }, + { 953000, "9d1b97ef02d4b5a5a94146b60267059b25d226a80ee7718678402fe888cf3f24" }, + { 954000, "a797bf0c6b1286df321c641bb1cc0f31c963d0502cd180b1a5e46e3c73ba3722" }, + { 955000, "4495a86f0a479e2be209a45217be590e2a4dd1e296de7144a03ea4e3e9c8fb8c" }, + { 956000, "5dd5317ba5c7b14d882df6e156e7fd9ba60ee1afc141cbdd4cca435265ff1691" }, + { 957000, "88baa81ea2e5705e9775e1acfcc98d2bcc9501d372b7813cb1c7160d41755778" }, + { 958000, "d5fdc276a66f04857013a1112491944327509b01cd3a425993f0878163cf4fc3" }, + { 959000, "42509479ade85010e24221fdf24c17b30aeaa75cf72135dde771b2a3a15243fd" }, + { 960000, "8e7c38a1957a1a644c260a411e2c6e081321bd36d3810ed78fd8f8c5192f953a" }, + { 961000, "918614104df543277d82d0f19a9e354a6c6df5cb45a90ef150ad87c9769b0b06" }, + { 962000, "8ed9f12c3d512b4e0ea1a468247779be13d087caca2f590f50ab614d8b37cfb6" }, + { 963000, "11a3f554274bc33a3a2bc162c62e11957d9daba97d95def41dd2c14e43d59984" }, + { 964000, "65f44675bd5801f41da787aa32256a0ec8bc7420c34992ff5d43bb464feccda0" }, + { 965000, "389a3dbfc1fcd60fa74e67a256df43305e128c50cd063abf5942b6a45d1f8e23" }, + { 966000, "cabd56e4b742c8fd9634f7e9fafae620fc68b662097487fe8867a20f9f84c161" }, + { 967000, "4b125731da659d92796242263e25decfba5688016c1b8398825c7c43dda5c08f" }, + { 968000, "f2185ec76ec83b30a8190d930f6ee2b58d2567dc253720e70b5a002baf118e99" }, + { 969000, "cd5093f0e7c96cd048ccc3064947d4a8c98e16eb9ea52c6b0011b2c9013260d2" }, + { 970000, "f6ea7b2214e2a6c77351841dee65bc2bcb593c3629ff10707821eaf24021ffdd" }, + { 971000, "aa0a56adcb410be39c68d5f92c805d09ab0eef2896d69c804a915cb17fc8ec32" }, + { 972000, "912a5f39cc3901ba97993eaab3784c3b5d32f757a0b8bf9c65076c7322094ab2" }, + { 973000, "650a4ea855db02041887becd650e380a821c1a13420be43b4598fdf27b692959" }, + { 974000, "1b65d6287b60da4066b7f8f662110f342380ae9a824c01ea1837382c6122d6e9" }, + { 975000, "ac807048f8012db0c3a8546a516e6bcf5071a598fd49e2737acbdf98543f9eda" }, + { 976000, "e5deca78768ae18a02ad614000a0f5fef65a13dc4ce41d977fed2d53c159cec0" }, + { 977000, "c6e8c3eab718ae02b77d95ea85523b55cb0fc70fdcf4f9523b600bcee8bd6251" }, + { 978000, "0e388ed09fbfe4e97096b39fdf663d1e30721d058f00d2640a31b418ac24f6f0" }, + { 979000, "e622296143e4f9cab81c47dd395bdc2768abae2262a4876d67cc7a2652eb3d3a" }, + { 980000, "e727b48c76f19f03fd06a90ec1851cab4c6eea85d66305c99608ae21979c2354" }, + { 981000, "128539656c292118e509a4cac0b241d9abe6404c53e629aa038b3d4cd0f3fa7b" }, + { 982000, "9b385af2f11ea40bc662f6e7cdfda8794ead4f6ac85bb35ec41174ec4e14bb8c" }, + { 983000, "299a5956578250362cd4a19777d2d740df89cfc6582ceb9b00300f01c30a7c32" }, + { 984000, "f3e49150a45c25614d4342d4800b3b7a625e5ca39cf09e1b5501eba63b1f76e7" }, + { 985000, "e6f58de182b0daccd2a3c1043bb31a07da6cfadcfb1041f86dbfc57b3d5698b1" }, + { 986000, "7c1c967b82d7fbc9f1856b9dbe6168e0d52e758837103cf23346f4d96390ea62" }, + { 987000, "a921cec755105497469f4cd4f269ffc45f0604d257fc463d6fbe07f7f7470e3e" }, + { 988000, "a283269ada4545687d17824f89bec75a02e9e8253e2827b041dae0bb48410fbe" }, + { 989000, "a9c708e9773e9e01eceda62d06460f37cfef5d21bfae9fbea16d2f7a793b8bd0" }, + { 990000, "8f8975991fbba371629facb060ba63f6628a71f162df3f7d6f21701fed0d5efd" }, + { 991000, "279f2bb6f8688e48dfccd459bc4d102cbb61878c95a5adc7b36b943c2359ba3d" }, + { 992000, "ec989d3bd3bc9362db0d4bca21b1e0da47c7d56c39d48aadefe825b0c35d6f4b" }, + { 993000, "d5b25b35a99e618b19c2b36ab86ca07a986c905ccdbbde402142720d4e306014" }, + { 994000, "992187fb61a6741779c1279cf1a071748cd48b2dee5d87300cd3561cf66d4744" }, + { 995000, "a43ff96cf72728c33247662f43e30fcf3af7396e1d8ecc5ef20b5e19287416cf" }, + { 996000, "a3f6f2958193a6ffe70faab0604fda60f1a910cae601b33aa0cb8e1412848ace" }, + { 997000, "7a06da51089f322b9250fcdf327f5f04e4177ea5b7942a79dde3b16b57bd3585" }, + { 998000, "8c651fdf1cc99198cb1f2897a12f7044ab0b39c247e634dcd42ea0a21fcf52ce" }, + { 999000, "c2d921ae5ecdc1cb4bb47bd984c78cb062b44752b7247e16e77e1533675b2ac1" }, + { 1000000, "4f099b5a86e0a5621e4904e74041c6259f7df346a5ff331234f92432e1debee8" }, + { 1001000, "d5fc33efb8a96714229f520a18b7e16276ee34efbdd841414dd4ef52256dc995" }, + { 1002000, "20a159ba648daf1318050197d5a9f2ac141e8da3c16bd3adc6a8891b141d0b1d" }, + { 1003000, "469540c686216108dba10801fd61a26b8f6ef1f54223939cd1ee32febd26cb79" }, + { 1004000, "d2d2b41c2411bf71e9ef9f99006706d471e03921179ecca5253caa8beb262d40" }, + { 1005000, "32078d5956301600dbde3991bf8fed68bedf22169c3e63861cf0f6a870141e8b" }, + { 1006000, "661297c2b97c6ed7b0e7d491ad80b213890c3fa8675c5b2c7049912216505ab3" }, + { 1007000, "b51c76c404b22d987d833a2938ae3fdf572e00c52bff17ba25056089da953a0a" }, + { 1008000, "f0b1a9d24669a19c0f7cdb30245ffd6e4d1f4cbc5da903799840d142935930c3" }, + { 1009000, "679d568acc88ffe3e6dbf49b8b4dc54dac16889e0592a394b7ced4b6c43837bf" }, + { 1010000, "5b49eddfcaadda9d0425272486dd0df64bb97be92d589f9ff7ebad940bcc313b" }, + { 1011000, "56fb66adc9d88ee630150b985d2cdeb5cdf5490e869078fdfdd6920f554cfa23" }, + { 1012000, "ed1fcee7cb2c2c1a9fdbd1824e30fe261707ed919e440bf31ee1a4623e23f0fe" }, + { 1013000, "d672f1b779f3caad8ae25bd71edeb577a35703b009646ef32d87785ad0d30fc2" }, + { 1014000, "ae01804a692097c944cf0be28b365ce1cf3caa94fb80dd3495067752fb10e2e5" }, + { 1015000, "791fd5a46bd13818e9e38b7cb5bca8c3446cac28327718675319c6ef8c3c40a5" }, + { 1016000, "8563a35a1fb36bd5540256ab4b1c22b9cafcd8c8d24881ed82970c60babad21e" }, + { 1017000, "0d79ae91dc8e4de796ed4c7c3efe383d82f2f30d4d935a4a8a373dbcd19921c9" }, + { 1018000, "2e495c883276f8ea451d8162568c981a9574a8d24771798086375bbcc18a627c" }, + { 1019000, "06f2e7fb06649f42b511a5c1e36681655f2557f3dc952780cf67c191fed323b4" }, + { 1020000, "7adc26d5e3baac1f257a28bfaec1217dc7986a319874476d3efa4a6bf7f31a36" }, + { 1021000, "b1b6782647c698a741e8611e7a739ae165d9dab56901856336f461857dd9aa7b" }, + { 1022000, "e9249a69c2a7d7d239e70f8a81028cef0f9eddd57bc3ebb12825493f698a11a4" }, + { 1023000, "0386e28bcf863f714f25240f7bb51f33354825ed39154142f1807d16e698d9b0" }, + { 1024000, "7b52b000ce74f57f40a8fbea6a73e554299cde29bb545b40c63cc47e792e8b95" }, + { 1025000, "8f71a7f2846d20779d1b84fa41da4835ec438abbe67ce9c1bab894a77ad12205" }, + { 1026000, "5e0a7af99591a7be36234d52b748f74506b599280d91a0ea13d153c2e7261706" }, + { 1027000, "1f25c959450da5c258b9494d76ea4baf798525ba207c9186221dfe2a33efb2b5" }, + { 1028000, "714cad9ebca5818f8c81fe1ac328bdc6a698a10b1eb7643cd85e2546ce1a635a" }, + { 1029000, "66a69df671a49187362c0be4a3fa3b45c15d5fcb4ce4b1176decd14bf458a731" }, + { 1030000, "1c57bb99d6d35a01a0fba24efaec2dc8e07a049cadf79137ad456d4523eb8dfa" }, + { 1031000, "4fc052d7b1783e6d918b94c907be1b12b2186ca1f0a3ab060f0b39ab8997e4b9" }, + { 1032000, "13316f770bc7c7c4438b4531185f28a8d1bbac919daba6e2964af054800fdddb" }, + { 1033000, "e93948b94e9e27ffbbdb367fe7fb6f0b82631a414d6f04681dc6445db855e067" }, + { 1034000, "a4e28d0e86698f4b4b55caf4f0af30a1aa27bea0431f3df14e91dc79274798aa" }, + { 1035000, "44ba594401be04a51c0ab20ab21fb07fac27f6eee83a330e80c5ac3a0b7cc45b" }, + { 1036000, "9764ad49d7f68e6b559d0901dafd2100a6209ca5635a18b1c60423a3ece2f9e2" }, + { 1037000, "232ca662cfe1a6d8d2d160e875be34bb0954100dd4c2753eabb1aede421ba074" }, + { 1038000, "9fc8e45f54711cd03ed2a0d9ca6a84fa2043ac7325890cbbd4f14403c397901f" }, + { 1039000, "eefa68017cd32a1e79ca4160e910f72e8995917ffa44e1fd43882768dffaf71f" }, + { 1040000, "f7af93d783243f12e251f5fed50f610202517841b0de87b9e261c0057fdb3268" }, + { 1041000, "a3576f7b5c468edf6ed036909f634ac6117f8ce5e54af48ba629d1db6f76fe9a" }, + { 1042000, "5ebf592d6f144c7f9abfec22809ae28fbed201eb2015ed7a9b2f1f496a25071a" }, + { 1043000, "952229bb2924f70d3ba31626121e959288cae35ae0e3b76586e4395e24c7d7f3" }, + { 1044000, "d0ad7c4f9c80753e128f04ad9c04c41f76b9321e07d062fd934f0870290fca55" }, + { 1045000, "77b7408ae359c35244f9368e744909a9210af730cb88d62e878ba3919c3759c0" }, + { 1046000, "82cd9c6440379b5e81b927fb2b25ec350c5a99d12a63ba88a27caa05ad200e5d" }, + { 1047000, "7bc40ffd09485de5cd1e604571df15e7a0aba7ffc7e85928d389377a0af4d06c" }, + { 1048000, "4271318836fe33288c1a15c1fe798e5b4a89841fc01abbd1df2547d4631caf7a" }, + { 1049000, "85828834e2dc951ebb48dee7d75814674a5e48c57cc98d6f986f94cfe6e22e6d" }, + { 1050000, "00503cad1a91958f222f278b56f600411045f06c336e48984b562d9fea07aa76" }, + { 1051000, "d2642c10b486717249c7a9ed8bef2500ee2412d0ba61cf9ab742abb865d7b336" }, + { 1052000, "3ffb4e4164a032d82d19ae8ec61986d06538aa01191907f4a1fa246e5ada6e4c" }, + { 1053000, "e4ed8ee7e44fda5aab91123934f3a802f789a06c078f11d2c613acf12d5dfe91" }, + { 1054000, "1b518bbe7f6b430aff4586fe8d682de24c54b43c90b28370eedfb6b8d524cc9b" }, + { 1055000, "7235d996401925aba3d9cecfe2b446a6ec6703dd6a4ecbad4ba42a4b49a3b8f1" }, + { 1056000, "66063667f073771d543fcae3273797e22e549b1215872e7dc971dcea11f45c32" }, + { 1057000, "547e961ac6f4389196ca5b1af4f49d6aaa0f32c1c07b1314d51bf1089a7346f9" }, + { 1058000, "ed06043ecdff6c0d9d88037bf92cfbcad5794b85de73321600cd84e4f287dbaf" }, + { 1059000, "2bf56e384de81d2a19a5950e425b1bc18572a14bff0ce191b06c4307257f1b07" }, + { 1060000, "03d5483cfe51be839fa7b1b132a49d9efb70e9dc97dccd7013883d6f681151bb" }, + { 1061000, "c267b0e07d9698b18f8248f03be745474752a691a1ac100724cea1ae48e303da" }, + { 1062000, "bf71d5ddab000042e17e85edbfea9b3b84a027a928093a9df73cc8787809cd5d" }, + { 1063000, "9dd896bab71970444cbb93daadf4bd0a31bc444106bcc4e56fcce5f4cb2e7846" }, + { 1064000, "32c022246463b6d9038b42550bfd34fad56850db0b3d0152ca4fb74274665108" }, + { 1065000, "3709946594144b17a26fb697c2b6de949fbef934352324238c58f9848e9a00ac" }, + { 1066000, "711759b853622a4433b5ce2bd04f25ee33bb57b884d9164fdd7ecfd0a74ac0fd" }, + { 1067000, "f878558fd4316462b6cc94794abeb292a65676f3892e7150490e9506096fd2ca" }, + { 1068000, "6d676432e0849e8eb0a6f5a26db7a96aa0969badaab0715a2cb82f0de7fcc934" }, + { 1069000, "ed63c9723398dac01372d67608ce091e0b9fc9add62d8e795bca7a6d05592a8d" }, + { 1070000, "d89062eb495f87fa276fce07e9cba469a8a23c86213c54217997a9279d749c66" }, + { 1071000, "1a0e256e0f6624fc31dbf5c48262fb7a161bbddc80efa492c794779e02a799d6" }, + { 1072000, "15d88eec528355d088a7119a0557a1445a4d9289e14fc5e53f95e7986c016a6c" }, + { 1073000, "6ebadf3a854801bab84efb43f2630db232be9b1ef20379df0fd0effc05bf5127" }, + { 1074000, "f69501bad5de736f42cf69a62ae6f9ad826852a5523da06c6b5738cf7983c035" }, + { 1075000, "a4d5ff592bb9ed2fad5df26daf81b10b1af3f609e3cf8ef22421996f42f9d445" }, + { 1076000, "1c6e045c5cb6d851c3258e5bcf19083fefc680c8cef48cd278af20b175674e4b" }, + { 1077000, "669a2c8c394960860c6389e7d49532b7ec7e683b06329793194462d0aa413abb" }, + { 1078000, "ed6b0711a10eb6838df407226453148a5c7e6ba4531b3da59adb1b8377be6a5c" }, + { 1079000, "deb48efae8671c48c46a07326ad85b75ab54bb49b6ed912a5e2c34320c4238b7" }, + { 1080000, "edb3bca271fad3c4a1ddb565284e0f422aa1e5b85966346e54bd5fba687edc1c" }, + { 1081000, "f3b3f3641a7ad11417d7e1f1891f95a3b0f0968c76c504ebc015179e6a53f343" }, + { 1082000, "6f601d63bfc74714a33a0f989923aa05f9c6d32284a4816088b1c423f3a72823" }, + { 1083000, "c71c32500d6b2d01682feab1368e671474d4078741db43dafa8b33534ce36989" }, + { 1084000, "b5888ebe08fa6f5949dc852336371bce5d031a957fe65bac267ad0ef9430dc5f" }, + { 1085000, "ad0ed802602bfa9af9ac8b078f2d8d04e014d0239a76f34f15825fabc4d7cbf1" }, + { 1086000, "edfb1329572fee9b090a59f6f2b1babef52a86b09de233d1b05dc2abbaf3ae99" }, + { 1087000, "c189119a7c38de1156c187194c7b053e1900b0839036ad64b58cd4ba1f9b7120" }, + { 1088000, "2925fd72851fd17160fb023a1167f6c3d8301c712acd6f4626dbf47a4748e8dd" }, + { 1089000, "eec5d98835b2c9b5f2de2e0d7a9f11d741af1493b95d11f4c5c447fba681e940" }, + { 1090000, "825f3eaca88356d6f4e0cb7b631216fa446a3cecb0b451939839f6ee1638f633" }, + { 1091000, "501427cf66d51cf5ff3e2b9fd03a78470a6ec971079941e4256cbd5ba5cd7eb4" }, + { 1092000, "5e85c1fcbd8eaa316870bb8f4b7faaae95654b20949b96eb1c62ede1444cbaab" }, + { 1093000, "cc5f3ea06a8382afa25dd06e77a3ed95beb041808d253facba5b08697ee0bc7d" }, + { 1094000, "4006fe030aad40a438ad8954e439941e2e5d473fe5bc2ff9bfb62edf369a83f1" }, + { 1095000, "948373c37e32b54f021bd7bde8f82c42ce12f0b3b61df8cf62451a4f0df3e493" }, + { 1096000, "e27e297f5837ecf7a93a62373dc6d3eeb2512df69412ef6f7e33abf097c0ab62" }, + { 1097000, "e440337fec18737d63fa4d91d1d4453701488b05b67876df95d8a67e03b6780e" }, + { 1098000, "3a1e2e66a24cebc02155aa8cb691283918a00b171e6c2dea0ab7f65d316d0600" }, + { 1099000, "4aae8dfdb0c1ac9f86b43b9337601cf8344e287cbd471af1097b45f4bc8473ea" }, + { 1100000, "fdd95f56fcb7f3686ef4c6b3f77f58b8710bef58de74c1b42ea9b7d5483a32e1" }, + { 1101000, "3f9bff2fd4e4edeadc653392463cead672694a72025f65604d18717fcd9d034e" }, + { 1102000, "2fb0b239343e3f089d0618986887bbd5feb599521288b14a52eff867f4493ea3" }, + { 1103000, "066a980cadb19024b3bad108e045d211b9a878f9ff4fd84c580b958480e534bf" }, + { 1104000, "8aedd5efc641e03be48c14afa73696b8027daafa349703d31cb21aad21cab199" }, + { 1105000, "ab793572d974e5940c0d1eee71a33b8d40e3855eaf86b8abbaeeeba50797e3de" }, + { 1106000, "893cd44d5566c8507132ea40cdc98c79ba41727b7feb343f5fd4e4b99bd2fdf2" }, + { 1107000, "73de9c6d0ef3f93ae8d56915f1de8c513ea1508acb2c88adbd42ee40f0049116" }, + { 1108000, "5b3d3d75fa490a9c927d644ebf1665ef4fb63376fe7adaf3f1420716ef443908" }, + { 1109000, "6a811537ab39b0a73acaf2a1ee34f41745c259284324ca54b16a417a5b98adc0" }, + { 1110000, "dd49bb37dff2aeea04fe672e020a61ccf2dd357bb50ca236e15c87f69abcaba9" }, + { 1111000, "1cb5731efaea9c1e9be8d07cee8ffa0b3cb4249da75df0721dfce08f8ceb0dc6" }, + { 1112000, "577100792ef97543108e77e40893131134e08c1ce914500238f36bcfe6c0644a" }, + { 1113000, "249ed1383d823dd671eb1ddd912de41d620e1cbf5770aedbdee7ebc6f7ea1d34" }, + { 1114000, "f94aa296bf166595e5e731df71d8e508bb3ec2796d45b576acc1aa93ed223c93" }, + { 1115000, "a8a00920a1e30ae8e359b0f933ddb19506fe76405016c609830fd0932c61fc3b" }, + { 1116000, "1d595a0c3b67ff996a6e1bf8444826af7b7796ef9a8fde1860929e98558d8e84" }, + { 1117000, "384201791ab8cf1858856153d71d0a5348b0b2cdfcb4506f747130709e476156" }, + { 1118000, "c48d237641c5d74620735ea715b75229f88d1c14b94cb7c226552c497dc49e59" }, + { 1119000, "43d2f819dbac7a4fb663800eb98c4a6a128048ce4ab9e87b8932662b74b6554f" }, + { 1120000, "9da1bef03f9acb2f9b4669267387711d1302ab2e709d1b1de71baea8e93c46cd" }, + { 1121000, "cae707f607283090c6649d74d6a43e52a1272ee3d71a274d330d08a53c0646e8" }, + { 1122000, "4d8dee90b862e78a95252c76245d6146505025429ee73e488f7e6bf7097e0160" }, + { 1123000, "e258edb03f064364c8cd5f6909aecc654a5b02596f0d1f0e9559939bd2f394c0" }, + { 1124000, "43d6ba6eea008cd4f0c316343dcbaf331bcfaac340bd790e2487ea416151d88c" }, + { 1125000, "8c32a6ac22b35466cc65827f86a8eb358940ea8b781e0c0f78ebde49faf86b33" }, + { 1126000, "2ebf2f53cc461811404ee4543f5062cf26a6a3eee5e42c3d5f337ab6e40a042c" }, + { 1127000, "856c16d56e5e3e08ba7ac2a5dd1430386bbdc6084b4023c61c5a15ec8b9c5c36" }, + { 1128000, "ed8ed9a31c5c0c2f92aaab1228f86ae18be374a1e47ba127241164da098a05fd" }, + { 1129000, "004875dd3104209f52000a7a61775c2c94ab7ba63f12367bc4fd9df3643da32c" }, + { 1130000, "bf5f6644df4c5ec98d6b8aac52aa0856fb2d6daab06da7b160723dbd8c55200d" }, + { 1131000, "1d09500b43d1a10934a3937602fe35319008bb9d5350cfe6e856aaf7dbd7afc0" }, + { 1132000, "928db4fa5f7f44d8bb2c991dd470e9ea9b694720ec0706911ea30ed8cbd17bb4" }, + { 1133000, "4dbe4821b38fe70cdd76aa406859696d1ea81369e3f3f9ad900bb3044af43468" }, + { 1134000, "80a8c66e121852b0452cb18b4a0a832b5eb951299b91df360e6f524e352a267e" }, + { 1135000, "cc042ca322db43449e7826d66e98b496c5ecfeac51fadbd02bc7bdd6b874d858" }, + { 1136000, "fa526e25239ee09c2f38c5eec6660f3d1f97ad270b16d2e6236b5e970df41d27" }, + { 1137000, "547c4691ee41ceb00e9418704bfa249bccd9356621b38ec3135fcfe604dc0d07" }, + { 1138000, "604e3928a56acfb7752f728422461dc03844ab557d0a85e93d2fae11dc874add" }, + { 1139000, "cc818ddff286387c0a4d911488b22cb4dea6c73a42839bd1e2db760816438da3" }, + { 1140000, "9e15884ba513530448253fa27c85304cfa97b61f0719ad821abad07bd4be6468" }, + { 1141000, "e3b2686343d1ff24f2c546161407547e20008cf087677db745c270811c4bf331" }, + { 1142000, "82eca719a4cefa853d24ffb33ac9222c9876e2bfeb501fd3e62e3d572676dc4c" }, + { 1143000, "b3ec53a89b5c97c57d6c9c06448ed62145bbdb329da3049bf714a0dd371068d9" }, + { 1144000, "5678fa841ef4fc0cafee9e5b63a610af7bdd5c6461fd5171c0b7a0ef76ed0cd4" }, + { 1145000, "501c4e96c71c5fbbbb51a3cb999e59a2d9997efb463d71061f18366e1c56fed7" }, + { 1146000, "ebfddf010e9f66e5fd17f21076cbee71b71a0d61285d9161a1bbd804c95f7d67" }, + { 1147000, "98b4be6fbd3f3b29db58b72dc3de6cfaf2959c3f9668ddb59201db0c20e5a545" }, + { 1148000, "93d192a33e438f66536b01e650ae76e7f4f4fbb47c28999f21cda32f7d909859" }, + { 1149000, "7d367c678e6189527441c41411044c587c9165e6f78c09303f0039daaf26ce63" }, + { 1150000, "3dfaf9c4a6c8c3095b8889c65062d35543d069471ab7e64a47ffa83fca26bf58" }, + { 1151000, "a7800a6e6557c0be07a24d927f80afb04b667dad4adce0e51de52cb119e9220d" }, + { 1152000, "8412eaa71b89e4af55e50df54ae08734ec98e1252be43636320ddbd23f532b5c" }, + { 1153000, "1a65a8efbf72f8838eaec8c733bff6b89dff7e5a4c5c93d6db8f1cd9309c529e" }, + { 1154000, "8995494bd104d9979ff22a2a1f91c871d6d686ef4cc5ffdb5367b0ad593ba481" }, + { 1155000, "ca61d77bd2d193bb695d9f261c697607ef4c4d3b7a97fe9423142ab484f48b29" }, + { 1156000, "ad3406a57107eb85d5f0df361ff793adda8e03845a1e8ccf429246f7e02b7686" }, + { 1157000, "c3c7c675dbe992c16b43c9366cd460521cada70041c455f9c192f8b5b1f273ac" }, + { 1158000, "3b935604b78b6c9b9c5d554f28e406752e950f0cbc3b066b0ef13bb002b8d084" }, + { 1159000, "55d4410800b7feb1e2414596839501e771c3b4e1b7a64a10388f8c836d989f15" }, + { 1160000, "882fe4bd4373bdb0cd7b43d49de52b5b8db937aba4b3e28928d4295047f1eed4" }, + { 1161000, "e0800c6f6a3bc19df5c9bd3c4413d13a7040b085c28f9347d4523f2b6370137d" }, + { 1162000, "286d27b74c8329149e722d1b58e443290afbf454cc73971a3b9bd63104a92076" }, + { 1163000, "b65e43ebed3499fdbc951ae6fc17abbf322bb7ff57cd3e3bbfc4eae3704e452f" }, + { 1164000, "183e82b6803ba35c7f4596dbc5844cb62f1b89d4a91c499396c1aeecb350c49c" }, + { 1165000, "0044b2bbda3f1c71b11739cbadbb2804e17559012545a842347062eefbc10e9d" }, + { 1166000, "ec40f2beb67060756422b440f6cfbeeab1f497d6e043841d6613cf14e4b4926c" }, + { 1167000, "dc45fd4d5b7196477d64436de26129eb65040ddf3c8a3f476dec0bd8f66a8baa" }, + { 1168000, "578794f9f8e9863a461e1a04f9dbdac13da8cdf9ff3e6538c139290a66b90312" }, + { 1169000, "ce8fd02c86a55044a14b5ea55d0f107f972c0373e630d039251f87a3a6e68dde" }, + { 1170000, "9893b8320a81522861ac4c7d800af4af915699a7618c1318e6b675fa46001040" }, + { 1171000, "b67254489bf4f1023a34b3bcd86284c78b04906d3a86552f1256ceac8429ebd7" }, + { 1172000, "1a48d677cb347718b3b0f5fce020ea7652572f1dc5bf0cec42a6805c248b58b0" }, + { 1173000, "e1428da3311f38e801986a39a9f32e5a3378f9736a5c213ee5cec5f9af77358c" }, + { 1174000, "45ba0c3676cbfd11d331e713c9fe4735fd01cd7f277cfacc40f496a319aa4a19" }, + { 1175000, "23ad3ead4ffc11613892a82193c94267a4411621da8088662be8e1e49e99ea95" }, + { 1176000, "26b133c2dabf4f829a393d88f860ea2a862ca274370dbf7fe2db5910a46392e6" }, + { 1177000, "302dde247f1e656bfb1c77fdb029567fdec7ad58fa646e59b92aa89db67c0f91" }, + { 1178000, "e191828859c030e1b07291bf74669361bb99a7d970ffe22b39346f42f7708e3f" }, + { 1179000, "f844c926d22e3a4aca3c595df092d7db8f5a030db32beee28e88195360611395" }, + { 1180000, "5d21d7ae3f446c4cc10b5b6fdd553178c1834cf12b9d5055245de65cc0eec3b6" }, + { 1181000, "bb7f349e3edb1b287d2f75b37c9f0d9bb44eb0379611683cd0465f8a7fca3bc9" }, + { 1182000, "fad6c4e61c8ed53966d265ca8df10bf4683907e5b4c23f456f868fd1ccfc83cd" }, + { 1183000, "67be0d8a814af615b53623fe506c4e6a1f7f67731087414d01385962bfb7556a" }, + { 1184000, "6499d31a6d8ffa972efb0d116af8ffa5b63314562e59cc24cd1a37151fb3a6c8" }, + { 1185000, "8a129ba3140c75cf6d057e0785327517efcd5a9cbdb16b6183c1cfb064a8aecc" }, + { 1186000, "8f09a4ccccebbc58a762785d2bf0ebb19f6bae879613b0fa4f375870ffb0f439" }, + { 1187000, "ab110ef36b36fa8fd8fbf200937446ca5f5f8d2cce8d6e28a8e23abafa45499a" }, + { 1188000, "d835e73fd89cb34be412b76663067df1c8274c6105ce7204149041f56fc155d0" }, + { 1189000, "2620c6014359323b1bdb419433702cc96ed5846de632cac3a665b4740e43c595" }, + { 1190000, "fb21810174d545dfb933d5be0d8dd74910642e38a31a096d0defa78b8205f899" }, + { 1191000, "4180a3d33eb5e288dcb8887885923c8f0ef2bdb89702e2168e8a93791da1dfeb" }, + { 1192000, "6cf5311c3994ee4cae34e03012359868b328c0d79d69bd846f925bdc354e5ba7" }, + { 1193000, "dd44cb5743c5789d6828bd7d298c68a0b5f4bd0c7514a9b2fecf518556d6d23d" }, + { 1194000, "f3143942fa81a2fc6bc60a3df671b480ca61f8b197a15c10da51f0b49214a31d" }, + { 1195000, "2ddd3bedc6eeec8af20c734e6c389949e7cbc2fa9c56b626f0fcffdec48900ed" }, + { 1196000, "c2118afecef2947216cd8de04e41fd413d5e78267126a30b22e1722503fb82e2" }, + { 1197000, "dc2abe3701d71c61ae53fee4293a384bd196d831a27288fa86f530da30b59a96" }, + { 1198000, "8372f309455b027f3231d48cfecc25066b1b930710be95a96129725267a28af7" }, + { 1199000, "419cf4f7b3d1dd17e9f277de9f257fe9f4a85c43055a63c07650c4d82c74976b" }, + { 1200000, "df186174b3ecb38a32a7eab321db821c3c09b9b95e299868b97379973632c1a9" }, + { 1201000, "2a145ad77fc8ddd2deb99b82e6e30cb99ea9ddc4171219b82443d0dccff27e19" }, + { 1202000, "dba1c08a042e026c22d45146428988cd68debb5af60d90c6b03ccd4929e8691c" }, + { 1203000, "be8781502272c5676a89456c90f89dca0c86b318fdbe07c0e6bf4a235651360c" }, + { 1204000, "fcb8ab6671a1604176e53cf90c3c01a4249cf4b7345b06a1eb050bd6d9d33e49" }, + { 1205000, "2105814d416391f2251f8958e75290b82f0dc16208904311d0bd0dcd702992ad" }, + { 1206000, "83e13fa7b125c2ba982ea351f4b8ac80088f14043322b02aa22de70582d59052" }, + { 1207000, "0765d476466c9cbeaccc828e9f94a17dbcea07e647b6fcbf929df23d9635edb6" }, + { 1208000, "e9c48fc390b2f437cfbe3b4f385a8c03006eeb73681269a0493e149e3c244064" }, + { 1209000, "57030e06de915b3327839d7d8cf7d8a2a40b92d8a20a76876d5c94b07ff208b0" }, + { 1210000, "821326ad5df39d0fc28f617bb7f6b9835cf496289879e117a5733cb5f7ca3248" }, + { 1211000, "f765fc24b827360fc35ec3ee3edc1691ffd752c19bbeeb66a18d6f04b90bbccd" }, + { 1212000, "9807eef59c5b38366e04a83a3b6f92eeabccc91e1421b9db87bc01eae197535b" }, + { 1213000, "9e031db9eb75a910dad2dde297005fd89e31326a737d49232aad03243253d28b" }, + { 1214000, "30b9ef8ad8be57266fd2d982a5f24a1c9d987550831e678044d168b8fbf8c6d7" }, + { 1215000, "6b8e616b74fdf5d3d5cc70c215206f35d73bc8987f03660a36db3be8c3cba461" }, + { 1216000, "026f2d5cca27e2eb5ef6e717e54b2f1468fde6648af3b910a54e4326d8f60f3d" }, + { 1217000, "fb004f7164a7d70751b35dbea2f546f097e7ae7c6bb8ec99506f2d3f3a4375e8" }, + { 1218000, "3f2eb8835b36538f5a5a4e782c6a0f661c0d63407bc949b02f85afbbf6545eee" }, + { 1219000, "9c25fa1706b3cf579ee2596491abcb358fe888123fcc8664a89d4ec1e57bc7fd" }, + { 1220000, "ca8952b36d09765ced6d6126e7baa42f6ffd7f4e0219de6ea8768b71392384c9" }, + { 1221000, "9d30ed1c78ad4846919f8004abf81017d9c74645d8af7f91822ac049e4dc274d" }, + { 1222000, "5f9570419cc57d6c5ce339b7b37c563f6d1ec7952e9b2a00b4a3f725eb749474" }, + { 1223000, "4aa16f6202964f9db025e003d54e15e7596656f71fd361e8e281359aacf4dece" }, + { 1224000, "216b810253c5e850292b16e25097f494b364cc3134a7bb12b70e7ebb08872bcc" }, + { 1225000, "fbf3d04584809878580120ffafd76637d148dae3c16e3f351f5270dedd4f7fe9" }, + { 1226000, "6812ea26946762d386a724cb3be0f9bb8bea59b212ba31b10640e9a23b71a096" }, + { 1227000, "adfaeb458fbdc6d01d36d455aa66c1c7cd0f23644dd9bcd1233b0058713dd489" }, + { 1228000, "d3738ed4aeb322f153c53926b86286079a2a7075672bcd0524d6292b0f7641c4" }, + { 1229000, "6269cf72ccb5dfe5a575c553bb050b05098259fef2556df976a4ed38263dd13d" }, + { 1230000, "c9bdce8d1ad69b04e9148c4d63a39b3ee5ff313c9a09bd039ae8df6e16548a99" }, + { 1231000, "5115c8a6622e8d672895a10c909a8d0f23e4f2478095c89038c2a8d5226c1eb1" }, + { 1232000, "17456a6ce73265c634ffb1a7944d23ca1e278e253be81cb1ad9febc6e71ac654" }, + { 1233000, "7b422634c424ed5ac449ba43d009cd8d9a7c6f652ebbe30beb139e4d04d3a3b0" }, + { 1234000, "05a28614d8f8c5016ce3a02221cf12f1170566b07a41323d5d23b066e1b840dc" }, + { 1235000, "3cfdc68a96525a0ca3ed6c1ba4bf1a708c598d9f596ca1f914f76857480339a7" }, + { 1236000, "4b7fcef514079816aae64ee6baf0bc9f6e0aa47779505ef763c161ea3849e2ed" }, + { 1237000, "80b7f844feee6379432c0e4835dc2dc0bf79f2946129178e3aa90e90a6f3ba0a" }, + { 1238000, "a8384a9daf85d380814be9f251bec362646b42a96eed42dc59eccc0e409999b7" }, + { 1239000, "5ae3f40b33b3b524b6a1bda8db518060d59766f8e58188e0377778d888e940f0" }, + { 1240000, "c17a198622a6959260661b8f05acea215d445f6195916b78fe36233fd5539c63" }, + { 1241000, "a9fb56b102047127c431a355ea24f4210c268ac758fff5a2a3e8bc566cb087a4" }, + { 1242000, "5231d8a470d9ac3410ce24656047606e65c996162c9365b5befe2003228c0ce0" }, + { 1243000, "0c0376f022b483a36e5391b3b5ad5003d9cb7f1845f33161ebc2615c5d7fe58f" }, + { 1244000, "b226f47e2a52f8a52d8f66c5dbbff54df34c2474fb653dae3742f35fbb0fbc95" }, + { 1245000, "623f965a667c8fb0b4095b1810ab7e153d8cad2b559f9b2e4830176158175305" }, + { 1246000, "d6f4e291648053f55be0e4648bb944864a4110047c71a0efa47af5c06b468e2a" }, + { 1247000, "9a5e9d3d6edd0316a11496a5d0f2921d39797c64fe815910037c3fa41c2f705a" }, + { 1248000, "8253c7b37de8e067481db34a1d1ea2e2214e55654de12175f3ac94812b0b3511" }, + { 1249000, "8105ddb9c66a777de9fea274b026cb50b1dd27023fc49f315495c685746a67f7" }, + { 1250000, "750b6a3ab3f7c839a84705bedebd208ebad3362a4882ba12e0a2e673d40303aa" }, + { 1251000, "7893c2a09dec0dd73f397a7fdf2875554bdae4c696e17fdeea23b0c9dc82677c" }, + { 1252000, "54b03487bcaf1156e3fb026b30bd792215372e0c00ad9aa6cbe42ba6928ec4b1" }, + { 1253000, "c0e63f21eda478bcd239ea6b20bbdcaa5527d775c675a465e31c739693a24b2c" }, + { 1254000, "d24a0b669cebc8d9e967c60a61e2af3796fd4deb99a89bf93d2fd28791fe0e04" }, + { 1255000, "ba8d02757953c0034a99f55dbc21e1b89c839f434894a802ae1bff573f7e8363" }, + { 1256000, "6d9e4559f3a6148bd398f70f244337b8ed1c5564a0295cecb239aa819fb9769f" }, + { 1257000, "65530bc83464635ea06424f3b9ea142a0cd40a7e4dd926d45f1347bb3579f45f" }, + { 1258000, "87c0f921e0c0a79f27da012d439b29c4db41baa65efdacb72eb94c63997e2c0a" }, + { 1259000, "a50b8de6b1aa5f383871cf00b749520534befec34ab2eadd0b2d7ec08d0eba6a" }, + { 1260000, "6740c0253b56ffc27509ba3925e88e1e248e53fc48ace3a692ae28b50a837f69" }, + { 1261000, "0043acb16b96a46021dd812c3f2b3d913873f41e18f76844eba6ce952ff927d8" }, + { 1262000, "6117ea981f8b15fe0f7e535dceb94200138cd5b4c287ba95b2296078dd9036f7" }, + { 1263000, "93214be5fd76a4dbcad950f3c2b30e65a80b11a43221879624d7f4c414db9883" }, + { 1264000, "d5bdd602b61bac26b6f6fe8b04c2ec1f5d7074d44f9ec218049c0f81bff52aa2" }, + { 1265000, "b5a4c0710cec4f0b3f6eec825aa341a4d5499c30627b7edae447bb7350f96b4b" }, + { 1266000, "d5cb9b3d1ca815175b2a3b64f4358e45fe6f1ce1a7f9714658ed24c08232348e" }, + { 1267000, "0c995c65eeeeec7f0f18d9ac20a14e84120a042f51a12edd5b1d4c9be8ca45b8" }, + { 1268000, "01ff6ab8351b0d392ce6173ab250e63170c962bb024c115a8e4259d55073f4ac" }, + { 1269000, "60e0d7c20a84956f4705a01ad49f152a72fcb883fadf0eaa1068a49a5fbdd098" }, + { 1270000, "affedc6c613c932bdc4629a3d1347b8419c8a14a0aa61964a15885cb366f464d" }, + { 1271000, "c02c3680c4bc9568715ba0766385c123136a8f5e8d3b8f2155c9a7041ba826cb" }, + { 1272000, "89557bf31e4c36aff118d6942c90c56b8d592b5526d5838e89417643c195bbff" }, + { 1273000, "273a510e88787c0aff0b1007c6a89330eda416e85f825b6a6c9c7fabd7aed15c" }, + { 1274000, "e162e0e097073f802f171ae6c0549e892eb6f8d9939981a1e8c9bebc2505d1ff" }, + { 1275000, "dcf2888ba663564f24c26c3c7173027dd17468c537b6580f9b4aff31b37bbd3a" }, + { 1276000, "5b3ff5b2991c8e32b8b1b799a96afdffe280f9f9d22fbcf6135f7e05802cb7c0" }, + { 1277000, "742958d80d9701e48d5afe2c9b7db9d076476c929238f3d71b84cb321327a535" }, + { 1278000, "e3c25b144d64e33c4a2f679a596b6af429eedbca98490f12abda5c3c11969521" }, + { 1279000, "c15e44791c5c121d7a6bc0f47f80c6bc1a3d433655553d23c4bd2acf53a4200e" }, + { 1280000, "16879a01476038bd69edc125dd8c9bdfc65d1f2e470e6163b511425b7ed753c1" }, + { 1281000, "16830774e4111703f40f2d3185f4c6fa1ca6dc5df63e30734934ec78c0ba2301" }, + { 1282000, "c52a8e974853b44565e49aec4d516989e3a12f44b588b2fec57fafa449d5c733" }, + { 1283000, "af263414d79e05d938bfccc3ae261ec7a4cd0a685c4c414d7809467e7c213b99" }, + { 1284000, "ee40e3c227a25a3ed7182c6920bc9ba101da3a67bdb5ac27a3d93453a0b45639" }, + { 1285000, "3255786d03a632dad1947318372ec8f18e08ec74015269cdc5b382f38395cfe5" }, + { 1286000, "f047b46dcd35118ef0aff662d22009f121a96840b9dd170f3932ec76c21f394f" }, + { 1287000, "117360deb3a139177022b43000544ddd0066047e04da9c0f3d18b3c2d646141b" }, + { 1288000, "ec6810098a2804f2775a25495866993acdc71aa8d59e4d07e6cc33a72ca543e1" }, + { 1289000, "65cdde847657a7f19f862fa8b3060002daaf297581f8a87c342d39e48c53fc68" }, + { 1290000, "ea621881acc6635210c225d60a4e6e00d88d1a9f37221d8a4c81abc26d056a59" }, + { 1291000, "ee4c1837a9ee3532b75178ce5e980483051da0599cc3de01f7fc6307eb431153" }, + { 1292000, "22e10bfcbc6cb5a54880b673a10c6ef23041093b2c19a0de17396eb610346cdd" }, + { 1293000, "48f1f82fbbdd840b8eab4bab54c0487fb385f531086c1c49873f0072801831ba" }, + { 1294000, "8e0897d5d7254ec11f7490bbfa8bb0ed02f539e1d9c5015bfbf593c291e773c3" }, + { 1295000, "b678a75d63b32c98a3007d992dd86526fa78e28e8dccdb3d277452c69b9b3d8d" }, + { 1296000, "4f59d132d7d49ec8b253d4be2ecd785a447a072602b23bb9c0418b2b61a20e3d" }, + { 1297000, "5523b14389127e76cdba21a82644b3d67dd8f4d31076584af3d2673c899e25bf" }, + { 1298000, "e44313424e89043e8d135f50b4837e8f45968dcd82cce692155dd30ef7b6038a" }, + { 1299000, "73169a049a14bcf7a52d7075eadfc2207bb2f427f7c838291ab5424205007578" }, + { 1300000, "4e4ee4581b585d488a77fddfa21c77b9f97779ee3eea2733516a8cbe8897220e" }, + { 1301000, "d4b2a872e053f19fcde2118b45799d3917250d3d8595875efa359f007b5fbd15" }, + { 1302000, "2a7c03757dbf12bd438413c76d127708436f925fc6d3331e07332b4fc990f806" }, + { 1303000, "d6e31e1f07e3d5ff9f24a0db9494c57cd50a7b6f7ed1d329566f0687cd1f54c8" }, + { 1304000, "7a6670d9481a07d8efc097fa08068d08b29ddbbcfff3c12f44caa718b0b40ad0" }, + { 1305000, "51c4a766548023875c4ccc5e16351a4af4ddab551f6ef67399dd1201f5c59a54" }, + { 1306000, "8ea61192714dbc5d2d63b85beb7ab8374ef72e2ceae6c527892bb54ad809640a" }, + { 1307000, "4a01b8557f957b36d1fd49bbe8ba4054d34dc9f226a056f6d277ec1b745756b7" }, + { 1308000, "01b0b9e8736ab6b83696a1c01189dd2f7b1cafd20eeafa5c8ff4e37073c6ece0" }, + { 1309000, "c1a02fe8e81e872da001a0e7e5700d2d739a89cd1597dcbd2a06081692b87d2a" }, + { 1310000, "00631aeb531a7a4f60ccc3805e140f2bb41d293deb97687d2c1d8795a95e2cda" }, + { 1311000, "c2b7b05a4b623979bdb8977e0f39603fe0446753746e9c7c34bdb3fc1678eaa8" }, + { 1312000, "bca46ec8c7e325a481a4fb055d6526ddb744ed122fbcacf8b614be2bc431233e" }, + { 1313000, "0467cc8f76a72b03e2bed858fb03b757ceed5eb0d6e6e7badd0c1a5cf5f262e6" }, + { 1314000, "7cec84f752a496abc1a31eed45f8f84715c3c492fa1060e3882bfe07d6d32437" }, + { 1315000, "6a2adaa84e47380f98fa16a6e5336068328a6d04d399d2f18d6752edbdc78420" }, + { 1316000, "6b9a28a8c61bb06ad6ce73d207b79f4abc425d9395f2529a4db45d713b13f38b" }, + { 1317000, "cf5f15927f0434c26ac7dddc89a2ff1be775f3cf1a02b35bb1532761094ec21d" }, + { 1318000, "37aac969ae1e296b3507b2756fae91a5a70b0ac7cac3e5ca0a2ef4be3b92fac6" }, + { 1319000, "79cd350927fc048909678b8d664735e4d44ae9aeba6e5f28cd0c32c73c64528e" }, + { 1320000, "5be4a99382478f3e19795d858668afef82bc1965540a2d40d82edd85ac0e4a6f" }, + { 1321000, "dd610413f42d9325e50e0a5293f1e02c15e5a78b0a1dba5c3db1a3608eccd7e6" }, + { 1322000, "33b3d71867dabab8730f344290ce595bc89cd21bab71cc1f7fac141f12d66668" }, + { 1323000, "d260cf4dd7235af17a6b23324f959d58969c23cfd746213471186d4ad25bab0c" }, + { 1324000, "0e791e29096e2ad9da9d07831d610f8d8cf9ada3cd624837eac711e1ac36bb6c" }, + { 1325000, "24b1d2f0d6c8d5f5ace2b42b37b16fcc4e33e8a18337329a9e54f9b6149dd389" }, + { 1326000, "e65f9d9a01b6c5ebd57e837975f89ccfa09b7b79f76919c0f8830f2cfb669e65" }, + { 1327000, "10ddbae17e8ec6cb718ed9a4da6746f46525976098a6b3de5ddcbd0e325ae165" }, + { 1328000, "5f07ba1570a84436694233492e8819da95bf52a60d9fb35ba0c6cae090605f40" }, + { 1329000, "6176abefae9651604d2fe5b86609a78c93801515572c1c8e6be2c64439688ce1" }, + { 1330000, "f57181c22fe65df41c9efbc65916eedce32e47c1de955d84f1abee22e5a885b2" }, + { 1331000, "be2cfd197078b7374e074a04d03cc37e359715ef26455186b0fde46ec95a42b8" }, + { 1332000, "8bcf55d7c57d3f34dc72aba7128404760b3a8a7a37a9cc43c0efd5549911e8e7" }, + { 1333000, "1a61b094bd1dab1dc0cdd06cc9a85484916a3ee48cac98c7f53814beed553d5f" }, + { 1334000, "064a586041fcd5426c4d770dbb92c6a1c12458c478fb72dd317e21b8542c0f07" }, + { 1335000, "177fa6473f4c86edf5d459d79ec8f9330deb9ff8650ceafeffc61a82fa8cbab1" }, + { 1336000, "8f5bc3bc699de8cd03e18e024bf69667333d666b9e4c8f4ee1d91a9bcc439d57" }, + { 1337000, "dd08fbed87a3599696555fc7a7054cee7aa0eea39d46a70bf1900371682ad35d" }, + { 1338000, "ebd21d00a648e97334e803322a7ffc2d0b4810085c0155a3c259121fc1f62fcd" }, + { 1339000, "568943a2b7a85d3ed75940993e1c839b07c20155f715fbc74e52fa3f9a132001" }, + { 1340000, "37ad07d883a45315c7f44f92fdb813b27d2efcde30d538543685a81c7f4aaca2" }, + { 1341000, "19b3e16a0afbe69cbc02c28e4c48eab1e9e9f05880cfefc1590cd63169061423" }, + { 1342000, "4070b83eece8b4e2be081d87f75021172eed71789fe8b452411e700d45b0de79" }, + { 1343000, "df89e0fd44b812d545093d8afed73fb0f6421d7275bea038d95db0482259ea7b" }, + { 1344000, "c89c2f80168074672a7de252fa6bb02c1a4d518b79dc53a4de0dede7cba7bf06" }, + { 1345000, "9dbdc97565efd315f51dc959821d869598f792758b083b2f77ab269f407a374c" }, + { 1346000, "9021ed7897247bafe90db2b56575e9e6b132d6f7035e9bcb387e2d29b76f6d90" }, + { 1347000, "62bef90f65a9cab8d0f29ca272535f3646deef1f56af2e18c9e45381afb223ee" }, + { 1348000, "c14353453744853fd1cebff63a12b52b4f145254d850a5adbd90c5a0fd7ef3f6" }, + { 1349000, "2550490e34d5bdf028151dd75c6be7fdff1198428ae153e37c93224be93ecb68" }, + { 1350000, "a75578ef2aeb22eea3c78427202dcc778661902453ee31693fa9bf47a1c4c419" }, + { 1351000, "1a90b56c1635ee219e215a9085e40e819ca4654d315cae7bb5e3fe1b64bd0aee" }, + { 1352000, "eba090e5ad2b6ce54818569be457ab70223b82cddcec926d55719fb1e251f44c" }, + { 1353000, "6d7194cf2d529ebd3297a3618e18d3968b21e54f8a27f42641f9d17f03dd6567" }, + { 1354000, "85c839894a02f9f37074c54d940a1a65600fba3c20b7ebeed35c4f40faeaf028" }, + { 1355000, "16bb6bfc57a6a75a45ffc2089af312280d9b6e5ab0a0fcc00c85fe636a965723" }, + { 1356000, "9377df26c865d0c3c1844af35c31c8d2e54792a4a4264aaea2778b854195278c" }, + { 1357000, "14a01a910b60ad873592bd4978f10443f8e9859dcb5f91fa96295e90d5afa35f" }, + { 1358000, "8c0648dcc5d091061e169607be0fbad0f4a8a21e9128fb8a5168d766a16fab43" }, + { 1359000, "be45fce0b9e26106c717fd4a9d71e2f6b0b9d45664b163cc997cfe6ce023e17e" }, + { 1360000, "7253c536df51181c225060d0296e954a3a5753fa0cc16ca67b80c4ff55f3b31c" }, + { 1361000, "1b0c05b3db34140b2e7eb068cb4e87d7fef2c665c196a3adafe60ade749c5333" }, + { 1362000, "c492ef836131196d3ea6f032bf3530628c8d36fe388bb1bda74f3b2aed753b6e" }, + { 1363000, "aaeb6e09b92c1f1d8990b72281b09dd5640a3478f5d03a80f0b42d15239e868e" }, + { 1364000, "ae9b0d35e87f788b9c6b150077c993538e58dcf9b336d16f107068a9f56c2dbe" }, + { 1365000, "811dd06b265fb9766288b73818fec30040c7a06cfdf06813561f06a7eb468ede" }, + { 1366000, "0586b5cad75219158e75c5bd8d4710387a59cd887fc43ee6f2c41d3c6edbbc4b" }, + { 1367000, "bece3881412281fbfe3b96816b1969fc9b226f2a4765f519231a5bb29d29f6d2" }, + { 1368000, "a6cac822367f9d9ade889e781e66540241b06f03229837dbdd3689046d935142" }, + { 1369000, "a8509b7e67bfd3034fa1937a7aaf3ff7f21c15460ad8de4ab8bd479d8d993543" }, + { 1370000, "cbc35ae2acde6c3159ee626b9808b925022776b6a3944791e09b5c9a3cbab010" }, + { 1371000, "e9668378bdadc336a637314b3492cbe82c68d0416bc1a74fd79132bc5b820e5d" }, + { 1372000, "1d9ddc3d60a845b108d607f274369dc1d91316189568ca95b0a36746dfebf448" }, + { 1373000, "2a8404a8ef1fdcc4b89485cdaf04f10457938c291df780133531b6470360d372" }, + { 1374000, "7bf211ea370484559fc11f5eced3193e465ac43b10e8a442a3385a344b824df9" }, + { 1375000, "650f112c2d8913373fd0e8337adb5418a662135d2cabbb197f567d3502d8d9a8" }, + { 1376000, "cf95535c166db3590db7cc6b27833c29a55a9579852f8c2eb4225b28876ae2bc" }, + { 1377000, "a5ec5d13522563a08c4a8e5ccdae14b2fda74910cd254f6f79045fce1313f77f" }, + { 1378000, "81b16e7832bc01bbd14c100c83579eb596ef52ebbc4dfadcddff6cdd7904bfe9" }, + { 1379000, "99839db729acdc96a4711df3900f9c2f09aaff3ec4382e585fa27df7a7095e77" }, + { 1380000, "f6b9ef1d000f0d71f40fe972418a7533f9a6ca14b1f8c9d0ee02dcd4f649f88e" }, + { 1381000, "fb72375f87a25a718a5fa98735df46889c2c5bfee08b5a3123ebca696cb1f524" }, + { 1382000, "e81372ec2a00e87ab7c6a18071e70e5c2541a3e5a982904ac2f4d82a9c10f7fd" }, + { 1383000, "a5dbec9a552eac70e331485a6299c70a60c19936442713c12b4e91fe3095cf3c" }, + { 1384000, "54c837cfa579eafa7944bb2dd08e6520dfa36c1d7b554edfc7450f5c6e4900c5" }, + { 1385000, "ee0120b70ca365c6b4267abd612ba0ab2f6a4d8564ed8a6c47445dec45d07527" }, + { 1386000, "7fa722f1e010ab731c99d4832cc0a96fe4f5fef35fa6e43af2f550dcb479fc5c" }, + { 1387000, "f9f62f8d5ddad69354debcd2465c351bd6be5174dc27efb3f17994fb609c87b2" }, + { 1388000, "2b19d9feebc06a9fac85fe9d4ccda3d1890544d92374ac016ea99fc73d3a0961" }, + { 1389000, "bbeaecba1b8db37f122738533c23983b7a7b12eba0f2145c2624482b279fd1c7" }, + { 1390000, "715867c229f598201296dbc2bf2506095342e6d711811c6f55cbb51b83e8f011" }, + { 1391000, "9e603e216166b74a1ebe769ebe668c33bd4638d3b8a8c1f22fc5a55cd6f73fe5" }, + { 1392000, "f8f04913bdd7ee8f8472977928de0af2a236cfba2921f4392bf712cc8454b10b" }, + { 1393000, "d60b87ede317d58995aacc77df329f009d3b84fbafe5fc6be4190d7e676fdc63" }, + { 1394000, "5eb1886e95549b6c8e325fdc4b6615c46ef2129fb6a88650433c36c309defe09" }, + { 1395000, "2d11fa6c9ca419fe124f649e820d2da9e1c53b2a96d9edc97fff14b0c0574b77" }, + { 1396000, "7f221e354d34ca1f8cbe3d6c690a79b5037588db55ac952990dc403a9f2d2128" }, + { 1397000, "d148e6731841bd5ad70aee244c99c39585c068e84da6b3fb1d2e06b824b3e2ac" }, + { 1398000, "d692325acc80ea8f92913fc43c233823c217457dadf8fcd93692dcde5fb73a14" }, + { 1399000, "15d960162c70569c11bd2414b20f2ca6335a57b5463faf2b14e7ca8f03cf7325" }, + { 1400000, "c5bbdefba706c0c34447d9c490565b40d2b1c675316ff0df339499369f7b900c" }, + { 1401000, "4d4471301789e7a87ff1c4c5a3c3a75e3bce883c5623c4d5eacbd3338e6ff418" }, + { 1402000, "55a29f4ecbe3a556ea580b1563bf3034e04eb4c5277e2a5fb95fabd73d671671" }, + { 1403000, "42d387ef2ab556f213d81fbe9e95a1e3e75f8adbe8fb0d2441a0e92a83681314" }, + { 1404000, "b448342579f5bb2f6133e2e2cb8d3a15d210e8374247219d542dca7734039951" }, + { 1405000, "aed0c622ef9e5ab6c4eea8e3dba818de3d69bafe2fa98fa4f572ebe6aba32514" }, + { 1406000, "cdee3ec89db30618cf51fa480d3212580a81d7f6ac33c66a276e55990da11dc1" }, + { 1407000, "cc453bf16a05645515f360a6879575e35907eaa0a3f04482bc065b4ec364bdbd" }, + { 1408000, "cfd2e7da8d12df882daf9012a47fd2aaa0d927bf4c033887432298176e89f261" }, + { 1409000, "41122160c7729308fa1dd09333d9aacee1d88769526d15227d8ba7176807e735" }, + { 1410000, "5c1ed6852cceb97aa478a022fb6d29b0dbdd05ec4c0b50eb0fd29ffd6d19b218" }, + { 1411000, "008e6c3881d2ffd14cadf931d246c08ee094e959c6d0a5d925e48a4b248a80fc" }, + { 1412000, "df55d308c6e05ead07ceaf96b285da50c8363dfe7c3eeff58e6fef9443ee1d96" }, + { 1413000, "fda81287705d3aa80db7e9a7240cd13e00d96263a90993f4ad9a82236d64591f" }, + { 1414000, "ef13b667b16507285d3e86cc119ce3c1edd8f1ae5e76772532f7f9036c899716" }, + { 1415000, "883365ac310df18b9337b4e57f59d4720a2310822e771aa67cec9ccabc46395d" }, + { 1416000, "8e4c4b0644d3542a9a18af4f4eb785d5d15d15a7ac15d9d369339f8b3d2c760c" }, + { 1417000, "9bf465a3942c7ea2ef6fed3f141df01af0efcb4743244e6bbaa7d821ca77a07c" }, + { 1418000, "fadf44ce0998bc4a2b0247ac0b225f0f8642739946d3292214fa2a14e4b2aff2" }, + { 1419000, "9bbecff2153ceeb0388fe1a903e9eca9efc0f32efaef922f27c0ca208a85f304" }, + { 1420000, "555a6b4f7dafbb6e2ad34011276fdb77238921b5a4eba7e2ce61b2064cae7eb8" }, + { 1421000, "eb762b389446bd4c838fb4513ac255ebe1e5ffec6a80b0eebb8549a896ec8900" }, + { 1422000, "231a9089b335967702880bc7daf0e4adf9346b5d8ee8ef552d5a51f466ab8bbc" }, + { 1423000, "6a2c3e8df9e00385f35b0e6a24b86d80b888573f1db64e005bcc28fa37d8f736" }, + { 1424000, "4a4236334c1861ee97d11a529d1529664c05c57e494dabba06305d9f88b7099f" }, + { 1425000, "2d11783b65337e249214aa806035dd1923bc3d3973b7c7cf88e5bd8d52b7ea1b" }, + { 1426000, "e51cfd7ebce3878a554f5427d2ea4f764e0b2477926ee5b35b471aa1c291e555" }, + { 1427000, "9561c7e7377065181fcca02f94b1e32a6524e39e77903bcf3431666975734e34" }, + { 1428000, "54f64ac78ae9d9421a5482a0b6ec591cf30206d32600eec005a01c19097cf646" }, + { 1429000, "eda7c77630ed2a5599c290df45b53f83059c0688d7456862b859be2fb336deb9" }, + { 1430000, "878328c9586d4bfcfea66372f7f80f711e39c069d5737b3d45bd9345d6d287a5" }, + { 1431000, "f1437f0613f5b796b696e061a8a4acf1f3166ae20adeff943d7c41c13652d58e" }, + { 1432000, "12e270e78c35ee46b8a47526c03d7cdf2c77e2956a1ec9b5447804902779da81" }, + { 1433000, "f786cf7a58118ee99102ebdc5990f0f20a8522cd2dfaeaa2f5d2c8883736102d" }, + { 1434000, "8d4520d87d76b3910698a4618886a2c5f6ba2db7ca56bcfb5870075b0c0c2ee5" }, + { 1435000, "ec120e9d45526f73bb8df2df52d3db771d17fe6d74c81f630fd19fde953c9ac6" }, + { 1436000, "00aa9a6c4a70d5ad334e7b9142afbeace8e4cf51b46a518be6d7ed2f9f6b36de" }, + { 1437000, "0d0bbe275980c44809fc95fc7a8a5a4d9774f66ef6cd11a014c0186e08000e7d" }, + { 1438000, "836f96f688b3fbdc3c85e30c2aa2f27e44c38ffa4402b8e6e3ea3b1f62c0cc28" }, + { 1439000, "821aa48b044a7fa32ca09bb9222db630d51cab4d59e61a393b9324720afc1632" }, + { 1440000, "2fe32c357bc938645a5fef5ce96762e31b07f863f5c263fde5ce14797c6b85f3" }, + { 1441000, "09b818bf0be1b474c8881cda27e0d79b497314ff8005f420cedea995f5f4a08e" }, + { 1442000, "1fbf610635be8ac92428548bcf3477121a4b831603e6c606d2dce76351852fdf" }, + { 1443000, "7d90ae6fa7da7e500b764401def5e5136b4931e067b2acd6df57ffc4c792a9a0" }, + { 1444000, "d574f07d5220196edfd28e988e92eb83e30598cd91b71138f5dd30ebf8c5b35c" }, + { 1445000, "7fffe9490f9a3918a4d83269f8010aed55ab648c96d5d83ab90ba759c1e4224e" }, + { 1446000, "60efe25d6c1d25975b2548a85de3e169c373977344054238be7fd6cdb1d69641" }, + { 1447000, "867cdfff28e2699a17563979bb5bcb521b36a4128283a9690a68f67a1d1e641b" }, + { 1448000, "62de815c57521e0c809f0b201a5150fba306ffef3d56eae9d00b28b6aa6807db" }, + { 1449000, "fc24c70ceb7421e42edfb680b1667cb3339b4b015df88284a0b04fd1352dc43c" }, + { 1450000, "a6c9ed7bdd85364fccb76b55b2d1d9267642d8978d910b1407896d9bada0f655" }, + { 1451000, "3f9e87843e86717b9f77aa76d0907708f9e4098811a355952b4f62e19f527f1f" }, + { 1452000, "11f4bb9fa9d639ccec7b30e275a880a9762927e4e91cbbac87a790d923045c9c" }, + { 1453000, "bfd0ebaa224c21fa479edee262c71cc228512d4daa2e191c99b293a67d8c7e5d" }, + { 1454000, "3501d441f85417f77843a64e1ebd2ea68efc0ba62eae12680b0732d5d1f62a05" }, + { 1455000, "796318ff21e08d53ff805c37803eabc949c1622714e7d49c91a9ae7bde78a63b" }, + { 1456000, "5854e4745051327e145f1e10663df3b57a04ed60105da7eff10931992f3b1011" }, + { 1457000, "087f2044d377ef436d8a1fbc2ecf3258b28beeb71a6589eda15bfc57dcc937ba" }, + { 1458000, "bad9d4425d4d016e3fd30ab0d83ff324959c406e27c47dc8dd6cf5b6cb220087" }, + { 1459000, "c25281694d83cf09bfcee2124d5dcfe39e2c7f9ad279d52532fce057609ce55e" }, + { 1460000, "7992932a5603e135464be42e2642adba52710f4f8c14737fde0afdfe5aa5b631" }, + { 1461000, "47cb919a45617de2adab7de8a4299c5387697ecc0f214c26002844af36462eb1" }, + { 1462000, "f200197bbfb5881964330c4caa833fa18142479e2f3023b11aed7ba6b6ba28ed" }, + { 1463000, "a4d125b24657cab7317405693b8258375ffe2d438647e1845691584566ae4474" }, + { 1464000, "2e1a8824f4e89f88c0cb2dc14a990bda283bd0d0e2d468f1a019eebcdb470d94" }, + { 1465000, "4243babd289b8e9ef2a549c37305d51da125ad2530912f83ff76dda50a2f89c6" }, + { 1466000, "607347af926f8ba25571079196728e56e89eba53357641331c42c8822c3a0b19" }, + { 1467000, "fd8937ae60b6e96589cb9284d82c255aff6579a7c5685019560e5104ba58954b" }, + { 1468000, "fd3ccbf4a0dbeb8f3f2e7e5023ac3ad48d46e3935d84865355615e2ea9b6acde" }, + { 1469000, "57c68017e207b3857d62cea8b2207037a42c958ce67ab0d00b02f32acb40ce4e" }, + { 1470000, "1a8a94876f8ab921602b846c051b121711c2d9d2e257e441b3a11551e5ab4f6b" }, + { 1471000, "237c90ef0484b27f19bdf8ee5e94f7040c0b3be72224ae32c48cd534d224e0b4" }, + { 1472000, "4dbb6b608a59e43b0df2a78ac85f0fe66f21aec87aa5c0ed041e8b6b338ccb77" }, + { 1473000, "77722a8dc6d31e802f52ccf2185efc85ac47ace518e98a7e6b0e917918b8dedd" }, + { 1474000, "c8e5f32d7415710364607d9165d63a252e8b4e5a51a3af72b3255592c3f63cd7" }, + { 1475000, "58d31532c5f5c8f97b6fddff488fbf7bae4f3fc57b6df7380125e888d39f74d9" }, + { 1476000, "4c70e6767a4704a22563996add44189edc14fa8a339bc6cd4007bd73ac74b952" }, + { 1477000, "e49dd987525b06376c8b5267492b381b4b3f7c64942935f81af5a69f9e6bf488" }, + { 1478000, "19cb361aea594472903a5ff39169e61f2afe0d61927864d485e37f32607f196e" }, + { 1479000, "1583f0a3cab694363fce33d673cf180128ca7cbc0b1b1fc82094e1631751b47a" }, + { 1480000, "ca672e9cd23d3023cac4d81d35e798b83c515a5527b375b03942179035c46c50" }, + { 1481000, "821db689d9b65a6c5c5a7f471f8994b63b93e4bcc0963a9ba84dfbcb6d5240af" }, + { 1482000, "441a78cdf7b011616a9baafcb344e2e2f189336b89b10576fe809a9545414cc0" }, + { 1483000, "5e21404592e17da944394001ca5243af2b6dff791377ab17ffc923e14c36b4e2" }, + { 1484000, "7ca5a20a754aa936c38b302976d87af7437f6c20aa391a703c56adefead49cc5" }, + { 1485000, "30a740fc6a78185dad033de75fa81b18f53b764f2fbdf575ad660ad2e8ffa4a7" }, + { 1486000, "388b7edc1e9e35ab3c63d1baa62a0075f0e3d72149dcf86cf8ad73b7d3841ceb" }, + { 1487000, "4e62850bc789348903535ee49039dc27a35efb33d61f2dc3c707653b99ed3d83" }, + { 1488000, "870c571723d9039c82901c2215c951e4181b25b12167f033ac363214caf5bb25" }, + { 1489000, "fc64d2c4d0a3f45e7c048b15ceaf1fb2ae71531feecc444f513781145fe2450b" }, + { 1490000, "a78038b44384bc5efbe2154a78e66b06e02abf49c5c0128f904c3aed6ebca6cc" }, + { 1491000, "3eefd3ebeb2701085bfa556dd0057294864819956448b50671812cee0b5af18e" }, + { 1492000, "fd79441c5d870897c387eb9f70619a054fa4a5e8df0c48936f94471980f28f24" }, + { 1493000, "7697a45b6cd471aa0d845654b06f153aa344cfaa5f3b2f2bdcd05474386f25f0" }, + { 1494000, "13fa0f129ae7d2d0e475a0fb3403db586f51e951f3a0f70b8722e9fa26e94cd7" }, + { 1495000, "f449d92a4c4d4e35a001997fc2768472bbb2612f031d9c81ff17fdf4e3a852da" }, + { 1496000, "16ad7aaf59f2418d8b21794749865d8a59e2a756ab18cafb30a6ccd48b305dc3" }, + { 1497000, "1f381f702baacea49a8c18fe836239800bbe8eca62636a6a002ef32c8476177c" }, + { 1498000, "a7d28112d56d8525f26fa6e919e4c419353551c62a5bf0bf7753941b2fe345fb" }, + { 1499000, "a1f63a9723b82cf9fde4fe8f43b6affe3d0371e2a576b4e42d44547b98d58adf" }, + { 1500000, "3b078229890780a2ae09633866921534c0effbac3a8e20cfc64a0de302b1056c" }, + { 1501000, "45a76e414634a4aa0dac124ce6c96e8b576af95a863de5347fe96e0880aa9921" }, + { 1502000, "c9506b7bd9ec9208f9026fa5d2e65d4b3c542adad4eba39e5059bde4d0216ec5" }, + { 1503000, "a5cbf2f23ae6e5b40ddede1683666569751ffcae69bfdcefd965c3a9613cbfc7" }, + { 1504000, "84fa6a0339110c26042411b3a1db8473225eb9db45994a8b50f1f5812921539d" }, + { 1505000, "567a7759910eeaa569382f040445fbfb2ca344e2121812807e0b639c25890dc0" }, + { 1506000, "8ce9c2438eec0f4dd77c06b6e618efa3056a665814caaea91830fa04a3d01745" }, + { 1507000, "b2a736fbd20020d84d135cee2409a5492acd342085c480cef30bede2a9e79628" }, + { 1508000, "e5f1df0c5d2ec750fc7de94c72b4049e41356aeb436f98565df5badc798c0896" }, + { 1509000, "1c526179b6519007255a565fc8dbf2219e064dae00672de9bb58386fa4ca3c28" }, + { 1510000, "74be9f5c1ad5cf89d992497991dd1ddea4a80ba8c389c9283e27fb22adb73b70" }, + { 1511000, "0984e7280927a7f27e4f208e6ed1d4e8aad9be0a8c12b4b070c8404f4676e375" }, + { 1512000, "f122f795ea8a493b71c1f4aea99a1512eace6e86a3c843c444581f94e9e5df82" }, + { 1513000, "a8b6270d0a1a4ee27a98b0c03fa3b7ee8b101bf3fe460d640ba40eab2a807573" }, + { 1514000, "975b5cd7d04c7cba1d066b6f486a5c6e3b7b2bf2ea8a588de34d8a01d7389857" }, + { 1515000, "eecc57ce9803ed52dcce0ddde40647a1102f17a1bac31d4988d74a2ca04fa43d" }, + { 1516000, "c83d3beff2fc2e302cadd1580cdf1d3fc684421dbd5f77c78e66ec8c6db3b858" }, + { 1517000, "d36bc94baab179f2b2bade02b5a1d57dc86e0c9f0122e0590745161a3a68d367" }, + { 1518000, "aa2c35ab54a29a19f71f59d5cda76eb3320a5e6b22a9b2786de6066570b13e2d" }, + { 1519000, "7501ed65af91690d071fe7cae2ae98153a9533fc4933c3f852fa34f405d09876" }, + { 1520000, "2d63037a4ba7449a5300dd7abfac425037ba6402e4492e0de2d2111ba7042da7" }, + { 1521000, "8fc0e1aafa2f28cb21735c615238b5342d1b117b11206cfb30fa3426a48b97b5" }, + { 1522000, "a8a7887fd5d4d9b40202873e11cf8c63644ab474855231f8fa9c5af05dac4975" }, + { 1523000, "e6e676fadc4450cdacd9b1657da19d3d50e2442ded2dea78e09e2db3feebb35a" }, + { 1524000, "4593144999e83ca2c23d19d7e0aaabd5b0dc2d6210e8302d2f445206dfb371ee" }, + { 1525000, "5614371ea6454554a5eb77c0aa81011195ff4915cf5cbedf746b06246ef53ee6" }, + { 1526000, "e2b7a06c91c096c8b40b5bc617d9c14578e3fe046b89d0e0f9cac04915cdb916" }, + { 1527000, "931a9e43227993cd6ab38ec1e1ce4d3f533242a51eeea1396693a9d10e144871" }, + { 1528000, "d7868fc56743ad872c8aa7e5fbd36dc0a2971439903c77e7d8f5a0503d74f514" }, + { 1529000, "e6994c12574e5c78c55bf55c8ab7836485635dba8b235775093cda1f8df62388" }, + { 1530000, "4c7d5725374a76ec0cd2e9ef1b5ddb68ee209404a968606f414caf49d287673e" }, + { 1531000, "e55795f9ed4c448836081e5b7a39b9169be4fe7a12a0d602a396dcaed5ceb854" }, + { 1532000, "b200fe4f95a3e1f57b1cfbc717cfdf8b83cba50721fe413baf52275aaa67f3f6" }, + { 1533000, "f947ca0613849a00af7d5f74e6830287fce2743f125e1e427509a8ad04dadf4c" }, + { 1534000, "ccf398df16f7bc8c053810843c5e0a50b2070f5f77da1de10a21a0db718377a4" }, + { 1535000, "b4c8a1779d42965fe338d8ecb7454c565e579c2aa580d190940209248bbc4650" }, + { 1536000, "997b7fab711ad4b2b69b68104dbdbdfc0ebdfcce98b71719d29099dea91fc3b2" }, + { 1537000, "e1607a76c3f7bf92c13b172235ea0d1cb57e602a483f4528888b3fe194b9f1c0" }, + { 1538000, "5d554b75b95a4d170f79e4fe5bb1edb6c3bb0d04897d948122628467c8400918" }, + { 1539000, "ed80e2be0ecb14bfaf1362bd80665ea017dfa4867dcc2d23c1892fe040400164" }, + { 1540000, "616a0661b13963fbb2589c70c4dbd8e3f27c8b0e7493425e48cdd9be7a8c2d93" }, + { 1541000, "6b60ee97af0dfd3effd902a7cafbd9e70b030a83e76e7d1b42f9d8facbf9e935" }, + { 1542000, "98e623e8783864cbe8b73016107d2ac7368e762c13c5fe400c5d055a63e76bc3" }, + { 1543000, "4840658cbd2f0afccea693d15f3132f7852b283d19add21d363cb50f7c3de990" }, + { 1544000, "121da7dd8a5252150510cfb5807bbda18ea5f1cc09295457b9cfe19258fd8b67" }, + { 1545000, "d041bd4302f2bd3c9c15a4756ef1bce57dd7d3708f1eeb693dd4a5568622e0ee" }, + { 1546000, "7e23f96a27cd12af1c9fd13331886fc92703662aa34a8619ca37f65d64685c1b" }, + { 1547000, "43802042b6e474b11731133ecebe17c2ede4087241b76c6d3bd6e6ce5089508d" }, + { 1548000, "405eb2cce8339882eea029e5c5b53760baf58747859f3f855d4b77bd2b79a9de" }, + { 1549000, "52d18348fe4aacf4273a1ae8bd2a8b41e94ae80f3c58c2f2dd7a3cb4bbf40649" }, + { 1550000, "651a254443cb26bfccc7ec4229fc32276960028c0cf89909f94f7c8e8004d70a" }, + { 1551000, "4e9b34936eea5e7ced6562a889ada43c14becac46cb6be82dc3969ca8e574557" }, + { 1552000, "321ab80ace7fcfa806e1a973eecefc1c5c654032e26fe00564b69c96c8966c6b" }, + { 1553000, "b46e1173d0278ddfcc8f89a5576d7ac245e7ffb59ea16b9adc6302eb63f33c07" }, + { 1554000, "c0da6c8c54ac5012f0613962ec493ae23a8c7f94578d08b0cc947c171f07f94a" }, + { 1555000, "aa6119dba813e8826da1ae7df2f52de5e06032b2c581bde2a91159213934aeaa" }, + { 1556000, "5fc8c077d61f99e98c46a3d9040f46e0ff9ea385e6daed318f36060d1d8dfdb5" }, + { 1557000, "9d67f4331b80fb04032793c3f0edfdff613e41b104c544a4e97b6ffbab07f6e7" }, + { 1558000, "fb3deffc3cf52a36395506fb069a1cf3bf5cd5970848d0e774296d42a358f55f" }, + { 1559000, "a407ce1732c2447fa534368f63edc06a7fa4b704f8b19051ff160b59a9bfdec2" }, + { 1560000, "02d2255cf679abaa124435fe4413c25a6f8f8967165cf9584527a5c2f0621daf" }, + { 1561000, "587a44e7478bb8d8a83e1c4a0debc146c3592201c7fbd7f52e5ebfe2e0d4303b" }, + { 1562000, "72f1d81cea5e6676079ccf2fa9bc75f59aafce7e9bbcf15662e75059eefe1da9" }, + { 1563000, "9939d6202c636e18889025e3be64b9b2f84980d8684dc08d584ee18d2728132f" }, + { 1564000, "3e5dfe946041d1705b245d848bc0ac6124708b46dcf3cf287fee85e64cfed12a" }, + { 1565000, "4262731b0418e78a533e54773b7520b62c137785bd223d127d841e44ef7c66bb" }, + { 1566000, "480e8f69b37e1ef81bc382594e54803fc343b215858d9c7c905bededeb53c29c" }, + { 1567000, "a84428fc72785e8044489386ba8128617febd7ec0c237f8ed49a6c915e281d1f" }, + { 1568000, "7d9b53dfcb250d7c795a022132fcbd5698202372e22c78385fc2984a32c8e018" }, + { 1569000, "567ff98c646f5f3532a26c3af70626b4c13f4de72bb4214becde5bf4cc9d2c30" }, + { 1570000, "37ecc8782e7b3fb21b883f8961a6c75c61db279be5475ac8e0540a335c75cd2b" }, + { 1571000, "dbe6f476b05ed4367f44ea8fdcfc36c5e4bf44183c026590f21cbb682f028ea6" }, + { 1572000, "64b7a0b28fc4073529439c58b5dc4f9827ac7a0f8766dfc152b54ca9addb04a8" }, + { 1573000, "6f5827f182d92040199db1706a9036caa2ac46cba76278222f52dc719f3051d3" }, + { 1574000, "579fbc209ae3ae711b9adbac028d569f33c8813e0a7293928cac7f30bd97a422" }, + { 1575000, "eb9c52988b766ea0fc8b1d1ebd6b2b35fcd75e83a53b4e66eb5b5ca85fe1b5b6" }, + { 1576000, "5640ea49d0be699410e8eb0cc6d50168439c9ccae5b4ec96446abafb3fab1633" }, + { 1577000, "4986f0433e6ccd1c453104fa3b621c8bf146a99d4100c61e0325ce6f6db0e1ed" }, + { 1578000, "0455821ffca0042c55b7da443ecd316847cf5cb6e5aa41f402a03758daf9df69" }, + { 1579000, "dcfbf728652116a4a0f92be21b2d832b6de63e9a1b9a2ca7a528770b8fa9c571" }, + { 1580000, "bf89ee8f8de38cebb9998cdabfc80c113e9cdaaf0e5163c63b2bff2877bdf5d2" }, + { 1581000, "469b4f41deb08ff1e9aaf67598ca4f0cd877d04969831427b20a9b93d269efc6" }, + { 1582000, "efd14758a90d155c2b24644bbbc6fd04eb800364d4873101289908b299b011b9" }, + { 1583000, "d9535cee77aa64539110e354374fb3587693da6efd19629e274dcd5afba462e1" }, + { 1584000, "e6f937199af56586f01782f0ac574311d656b433972c91dbfd3ea267201ffc76" }, + { 1585000, "3413c241d25b7ebf748e78c4dc5ac35225e30598365187ac0678319c5523a0df" }, + { 1586000, "00237315a9a0c0b764e7c2b5c95900aab04eda3f52a117e21dac2c1c123b1458" }, + { 1587000, "bfc573531e75f2f78ae2f74ff9c273fc6cc5297bceb3ad93034f6b48986af4e9" }, + { 1588000, "422b37a9ac0030b710be2f4bd0322d474a15414d9b3891b9afe30de875c0d57f" }, + { 1589000, "184441687bc69dbf7fd78460352a5ca7ce1d2d9af5499d71d38bc65ccf0267c8" }, + { 1590000, "35a6fd188e472c32090f505532cd7da0a0f3b3a784e3a99dba8bfda32a2866ad" }, + { 1591000, "09c01f6c42af638aa798f45434674f45aba8c76531025b6b4649e953a74b03ed" }, + { 1592000, "e057af872f30586df210d931619747bb0ac847948c875ad6f87497b2417fcf22" }, + { 1593000, "0ccd428d1bb874151de38dfe0201d2edd5a54279ab483b89277218aff071ef70" }, + { 1594000, "7d7fde4cf1bcc083efa9635f381a5cfa5e6dd9c959f9b77f635eee08be68f1cc" }, + { 1595000, "e1e3b888b1338f7b6e9d6b656445b427cf9912471e93b3eb4f59f817b8acd418" }, + { 1596000, "3a0579aca5bc2fc8c2813a74096c5aaf608503010b3dae03f2e0b4ba0f2ee354" }, + { 1597000, "84e16c8197b9cbaf267f30b64eee9af788c45e66cc49d5867296ae2103158482" }, + { 1598000, "aaaf752c3d70083c51e9d041dac6fb4bbfa6243fd3903ca83cc6d14338d5adf4" }, + { 1599000, "67c61fb96cf7f3845b9e6fccf33d913f3153f4e748a8b07558ef4e2659ff6231" }, + { 1600000, "9a45661e35b559aa2e0330e8154fb2ec463699e218092f1f58fa43e8d66f026e" }, + { 1601000, "3eb2dcbd316a326f1a14249df07785ddf248c3120e7f8a157e8fc857fc3b3c51" }, + { 1602000, "7e95953e680ecacf9c2d82f4d37a9a75378a5523ef62903f213da3a75050a786" }, + { 1603000, "e856fa12808267646c272c355afa40917fb22552701d26fced2e63b465d697e8" }, + { 1604000, "02c83acd3b42556433a5233d7c70b76a2c312c8cdfc89c3e8456b95be815271a" }, + { 1605000, "14710fe8566a084e0864a76e92fd42136e407f028e34fe142f8360e9bac42cfd" }, + { 1606000, "afbd681de1470f14178bdb060e557e1101699cea53d2a32d720352fa0415e7c3" }, + { 1607000, "1a0d122e28760b6d1b6948bd534038beb24c3070b942f44845272935a355fa81" }, + { 1608000, "89842368877f4bb0784dadc77cd0b8c8b33453b162fd5b4030d510952c6a7b42" }, + { 1609000, "905f9059be9b3271733426bb274b9bc2591f302a9eedf6127daecd287ae3722b" }, + { 1610000, "a5bb5a9ffe7b4e009c6a6e21731f4c85d54a4867d45711e11d774392c684760c" }, + { 1611000, "eca551ca8e47f7b8f55bc1338deef8b3db0e55dfc746bb8fda0fa524da818bb7" }, + { 1612000, "74163195187562462fe20405362bb19547d72a093fedc20240fdd458c6ec49fa" }, + { 1613000, "dd7af9515f49cdc659dc42c6b7a4ad5d15a7c731f9fcb745f4408cfad17d4787" }, + { 1614000, "45a1f617d5c79d5304400140874e5b3f8a8710e8da29c77a3fe9fc6b3229e96a" }, + { 1615000, "b3b0fe03e57af7ebcacc544f34b6b2ea56276832af7087a9a5fa8a1b7a3fee37" }, + { 1616000, "8e761b1cf3181d6f9a2216c54f06445e59dc12cec99ab7c84a7a38245d485407" }, + { 1617000, "96dd5f7e0b98fd48bb39ae31b1cd123325988dd10743268ee2d125ad705ac00e" }, + { 1618000, "346a87804588b244a452d489bafe2bf085dad5e9b42e243a9a25f0d09e41d3ab" }, + { 1619000, "42f978f44b43df7d693023d18c88f26a507c4b69fb35af25ce68a2278e408047" }, + { 1620000, "5148c07c509a14ca4e1c4510a8cbf48ddf9811a1361e65863eed46664c9b669d" }, + { 1621000, "2c79cccd0ca96f4b3003867ef8a5fe4501d812960d5cece309f990aa9386b655" }, + { 1622000, "95fb21c58bff5c088137da6aeb9a859a43a1a2ca5781d90e85bd5f2b156ad0ba" }, + { 1623000, "43bf893c1c2b4d9a20253ec73a7133cf289d8ef0904d88ca0bc54c7ba7986857" }, + { 1624000, "5ebe1b993eaf2322a068d0ba635db2ca3a5f3efec23bbfb9d0b06debb1bc693a" }, + { 1625000, "c296ea319dd0f81df9c35742ece9853595fbc2a33d16df8a3d756b8e85f3d409" }, + { 1626000, "1b6ec527dc5281fe68e0f4c4d6c3d6ffa08c71eab377b10371e70636d404f00f" }, + { 1627000, "298ce3175604d2753f5e44c9fa3053f0d19da1314081471a6cd2e89b1b4a0cae" }, + { 1628000, "3b3cb17f393f69952aa0a48dedb224b8eae838f7926bf55511c7e6d961fb68a7" }, + { 1629000, "4fec637f3297029e39b6396165aeb62e4dd948d0e66e5f64d88ae260f1fd5771" }, + { 1630000, "7b7447bc265f63449debba34fee237b16e2c8902370396f97dd3e1eb97e668a9" }, + { 1631000, "f2c1f8fda8e36d8ff992abc7341e5ebac47d815a632cef1f37fa412b7010a9bf" }, + { 1632000, "f50e066f2640ff1e7a1e967da5461a593c331dba24daedfc986bb987686060cc" }, + { 1633000, "c27fbfbf0669f198887c2c8b4ddd5acc0de4b225073374639373a3198a80ffd8" }, + { 1634000, "f5fe981a0beb65c133679fa6284e1d8c7af6c04cfcbf3d9c207bc612ef254feb" }, + { 1635000, "a74c536b8b8f1c14c5af10a1cb567259e4ce5233727d593338ebc48eaabf0993" }, + { 1636000, "980a8ecec085ff5aac2c07f21a450cc35d62782f37940e0e0856099a579817a9" }, + { 1637000, "e974ad3258a19a4c4615d4ec86f50dacade0d0d6f6c0427a9cf22de734fdaf66" }, + { 1638000, "13446b8d1f3472e8bc56ec77f6adb93d1dc8854d19ba6034409fbc2e5dee4904" }, + { 1639000, "838fdf3cf7ead2f25e9849aa76681ffc750209c8bc263eb4f8a56484e572024d" }, + { 1640000, "7bc6b0962bfb421423ef1fe0b1b12cfbd13ac42dc27fdaf9f042547b78150799" }, + { 1641000, "a64c97a53dc4465e6ceca562ced384e3773e2816b60973d28310b1af68cd65d7" }, + { 1642000, "90a7907d931a0a2102ad07a5492b9cc1ad9fa3df629636b9477ac00f3564e5ca" }, + { 1643000, "c1d3b87b8e83c42937f76731f98795b92ad4df6aa593182dffa1636826015c9f" }, + { 1644000, "26b0dfeb8382341ad1943d0984d2be5791eee959e7283730855b718c0c010cba" }, + { 1645000, "6e93d52aa9b3951bc7d8dbcc5a77b45cc03cab0839d1e950d255757e36093026" }, + { 1646000, "69e2c917788aa11480029a73a3ff5a24a5a6ff3fd8900784e5f76fc6fb9de9dd" }, + { 1647000, "a3f71994dff114d38b39c18eff366aca9cfb0acaabf5353aec13df6b35f2fcf1" }, + { 1648000, "4e84579002166fd8ef9b051c7804698a9070ff1fdcf5d0e0603a710689c0c7ad" }, + { 1649000, "7b30d6170c82bfe876d11aa65dc13bbb0129b3c82b7462e6d3312c14b889a1e9" }, + { 1650000, "3a79c8e7c0c7bd797cde27a61d093e43f697b2ed754d010f26dd8eb09dc72d2f" }, + { 1651000, "01c9958188b05b2b31751870a3a1caa7c4aeed538fd344bc4346e93736032e54" }, + { 1652000, "e3e9989df38fa2e41e0d88158d9e44076bc982e6c182fc8329636d5a81fca191" }, + { 1653000, "5bb0363db30fa4ae6676690ea9fc6d856654e5156c5a33cbb92e443544210c43" }, + { 1654000, "86ff3de6b7385f8c92ab980a92669fa9be08249c742d3d009c1e24f584113bf7" }, + { 1655000, "bb70e059f7db6f6abc914da96e6f786333f6667f736bd5c08c9e033727aa37c5" }, + { 1656000, "e67ffc581b8bd3b85aa6be02f98b8c313e26a1b9f4219d490d31db6e6ee442e9" }, + { 1657000, "67c26a89be72d5ca522d758e98fecaf9618f3a8f609eb903e1f530a2471d1da9" }, + { 1658000, "ec97b177e235c6b223c30938ba539528678b95bb07713aa5d1c714f3bb29139f" }, + { 1659000, "212d991576c14169eb8db2b39ea10d6b0e4f508fc896f12e7e3d9b81ad72a370" }, + { 1660000, "47e379a9ccb96c759d484d9acf04e6c6928109edecafacb06dc0e041ae5747e1" }, + { 1661000, "13c169665928dd42bafbe5d7522f2099bb780557c8a9bca2314bd631fe20be85" }, + { 1662000, "958633da99cf1339bddaa82283a9b9dfa1d788b6c72423c25785c1248305f5e5" }, + { 1663000, "cbab5ee090382f75ed6d1e5b2e28825cc73d64a455361e4d011c45f3ba0a61aa" }, + { 1664000, "0f7e168b057560dd02502e6bfeab3163fabd9b5a26f302a1946e54a82ec06030" }, + { 1665000, "b2d896c388c7b094b295237366de2d53dff32872febc333af554a509bcf7ba71" }, + { 1666000, "4eb1ba938c0afbef128fc1cdb3551765b245da6b05376e5a23cbe51e5afeeaf9" }, + { 1667000, "e731127e5fe00b4b08d78890cf1e50d88f04bd9061cda7dfe9e732e9c074f3a8" }, + { 1668000, "3e5f6ab3d1f806debdc350866531b016052ecfd2c46c3e8ca48bbcad4c6f3df3" }, + { 1669000, "44d98814c745ef2643e8f6582db7dc4991f2e61ca8148287c45d14b4ff6c3480" }, + { 1670000, "40af79432056385687b429d7d47f0ed9e42bc496698e64ba9408cdb97e2860cf" }, + { 1671000, "14a7e4884af4b0f9f2ff8e2f8e557ede1dcc7f2d93db364bf9eff30ea33d9f75" }, + { 1672000, "85a7fa1f23b95b03e44f22d92e63af5334559ddfdf2eb63310cca72e548456fb" }, + { 1673000, "a03ecd4501f3f5957df91c530b54444cb9ca47029c3e682317b11bda712b063e" }, + { 1674000, "64d1492d51dd7ea9345d8cea052e3dce7e1820d7a5a1ce77fdb7242085f58fd6" }, + { 1675000, "c0d76771c0092007ff90dae3c567799a661216a68adcf9955beb4f4404ec06b3" }, + { 1676000, "77361ce8ad04040387b3cd8e7a74b71fb13285a4f3da374de7cb4d6068372eeb" }, + { 1677000, "9b69591227df86e2b2571c0b5b9b652fab0327b83bbded311fe11dc59b40422f" }, + { 1678000, "b27116f4fd95b5479ff6a0f24b7826541af54c830ef7e1a0e799fd14bade19b4" }, + { 1679000, "24cbcd6870f2671faebf724f8764f318eb21750309184643cca9bac853be30cf" }, + { 1680000, "3aac58f6da568638264068f59dc9856b4bfd7b1219b5b9458cccd74e65199ef6" }, + { 1681000, "49a890170444eec299c9ad462208aacdc62237aacfa644e5bcae62de414f8a81" }, + { 1682000, "a4ee5e6c3f08723d2bd9bedfcb99a12bf0b3a82c68e5c744f762b4204a0c9ce5" }, + { 1683000, "60cd9fd2724eac3ddaa89e8cea6672b7d9a20ff2ab03add41ae6f40afdf1c54a" }, + { 1684000, "50af868fa42181d63400099bf6e1ca5a14debdfee8f6f3efb6f54ab94137fa28" }, + { 1685000, "5c57963127ff137412d8ba97e7ed5198dc08d50e6e19d3d22d0d5789dad1bcdb" }, + { 1686000, "a5533970ac0bcf1d547ac414876118330a155d909c090e788d187b0fb1e6af2f" }, + { 1687000, "9f8ead495f777f1dac5235ad9532271144f92def6937c73873a2c164d6be1a34" }, + { 1688000, "0bf385d62325a58296344ab889be9c15aaf4ae1a83f006fa6da3900a8245eb7a" }, + { 1689000, "826cc89ef9aeaece9ccb53dd44f92132e8501a9a67c98b16fcf02c68f9dae1ab" }, + { 1690000, "5674948567b07548016d3db3a6ddd4383f8d95985fc0c89443b3bbfe874fc959" }, + { 1691000, "7971ed907b97a9f49523a461554a2a739cf73b16e1b2c634216fe884f63f0d04" }, + { 1692000, "cf696b6f80de291d83c82f2e36d98016ae28c82f3ee97a7a265cad95ffb5208e" }, + { 1693000, "0411e0aed75774e8dea7c0d4248d7f5de0c053cdf2075e9b0e104996887148f3" }, + { 1694000, "f855f0f57d32bf2fbe0b56c825d333954cebb8becfbcf970648da742b47c5933" }, + { 1695000, "97ba4be0fa1608cd633486b873bfdac5b0fc72a3efb2fe6ca7e6e03164f1c349" }, + { 1696000, "3024bfae502cc6128783bf518595ff6f3b41f6e48cf935bb3896ce9af7c002c8" }, + { 1697000, "4c4822532c951de854a5ac0d762c4a3559e85f27271cc7ec1d763310edce9684" }, + { 1698000, "c26c6984dfe51f3f583b9255c23adb59e3417f20a2da1ed5b4e7030fabce2c9e" }, + { 1699000, "f627a1a54b68afa3d23cc466df4c114a6e7ea379b3929c1eab88889ac2e86994" }, + { 1700000, "df5af84682500c5fe8f44707cae0ed38daf8f67d8a239abe0157be4191eed4f9" }, + { 1701000, "508fee53808e2e73bb866a5c4ee14d502a4c6688f4d29e71331c19bad1483c03" }, + { 1702000, "bc5b5803f85bae244987ce65ab727d52ce1a4f95adaa0791bb4f5d17f715bf26" }, + { 1703000, "e5db768073cb78bb168fe6b513be0259069c2b02580387e020374e68db370eac" }, + { 1704000, "938caa321eeb2bba55f066e7273daf7af1ca02007cf55b99c5f00600b3985091" }, + { 1705000, "72fc44d72b470386264f6a5c9633e0c0a5d17df039368e98cdf0201e3b6fead7" }, + { 1706000, "7f697b46f9c6793f799aeb620e3e833653227b68876c3339e61a03a0c39c49ab" }, + { 1707000, "9f55fdbcca73236fe629c05a399effa86773bcbc9898521b25882ed7e53fe4ce" }, + { 1708000, "5430b7902c70e43a4bdee02f14a9a8ad1d183ecd7b4d584757e32fd2db8de4c5" }, + { 1709000, "01ab6a9bd77fd9174ba570aaacf609acd5d3d4df526f4074093fd09d34a1996e" }, + { 1710000, "eddf37b7c00ceae24e3740adb4e3199a32d44763a3fdeb10735439dccb59973d" }, + { 1711000, "124fbae062b83fe99dd1848ec9d2ddb2e3db69bb9652163fb9e9adb284dc781a" }, + { 1712000, "7f0980c7bee127907a235819563f0c5131b4e001c955d3a4bc8947de3abf13da" }, + { 1713000, "19302a1b696909c01c49cb92a57acabc8ffb7bbf9760f516b6e9abc58e9f3b63" }, + { 1714000, "e140368db4ea2c5fd4252d1c4430ffd09a919911685f68f46470697405534c1c" }, + { 1715000, "3ab50319cd2a917d2553f4329aba8a0b77829a521508fe70e47ea51a1c818eb2" }, + { 1716000, "e707b0cf97d779e2f331b233042495bd745b22a8b67e9b123c6d34fb37e7ffdc" }, + { 1717000, "9c7014cbfaaa75f4c1bf6c3ed85cb68106d52d89c31c1f3821d9591fbdb20092" }, + { 1718000, "a63ead6047017c3391048c6d6445e7727ba3cadcec6ecdace030bf4ded571073" }, + { 1719000, "7837f4f0fb4f5128990bcddda9f8fca4a32359d4f7f39b973eb177a92acfba0f" }, + { 1720000, "bd5b3cdd7cb1e4d03e62599eacac6d4e5745d21383ba7a98c49445db4e4569be" }, + { 1721000, "bed1f200d36919974320b068e9fec1129f758bec2b1068b7fa02fdbf61562e2b" }, + { 1722000, "2a298acfabb688004f3a23444f5626537dbb942d59be020f2b0257635278b4d1" }, + { 1723000, "056944c88bffbb77eb69bb8782914941f6d12fb6fea17cbb33bdede3428e67fa" }, + { 1724000, "78e9836539323cd1429ac588611aecc90bec1c1a8f63853532fe4659afd18a0e" }, + { 1725000, "fe17de40b424aca5864a471f390c52b6148580fcad1eab62cd79bbac84f2aa5d" }, + { 1726000, "f5d2733f4efb44c38888cec5f84e315c51b9de55c871b0538125b7c2e1464a9e" }, + { 1727000, "859bf3c63f4ed42b2098551ceadc9fe63fa4e0c6214b1fa0467b77cd58755320" }, + { 1728000, "933e3d0bd6537182f2d9474bd8efc86fdb22e711f72234255f5fd05cfd77e028" }, + { 1729000, "9dea971d400780e5471557275e26ba392486d5367573c1513354dfc60a67b57f" }, + { 1730000, "250af199172d41148f2320e42ab0a38833bbcf4919984a4c65ea9c615698ff82" }, + { 1731000, "85c9071b8eca0fb364bf50824d59b52a499741010f60e06beb34c4b1fa18533f" }, + { 1732000, "bf4a6bd4682775dd98c573ebe3c0b8edf9878de9ccda41c768ec9e85fffaeb24" }, + { 1733000, "469238ddffa27afcec00ca23b36085506f345257dd9be2d06cffcb6a007b6b74" }, + { 1734000, "c10ea13eb103a917dc17c84b66b1a10fc0327b2478183edfa3645c0aaf238c32" }, + { 1735000, "d34c0606f18644a8208e97341674ecfb0c5f3d5a242f6afdb0eccd2c8c098019" }, + { 1736000, "af77d597fec0b96a3ea2e616116f5ec7b0bc8b1a56e89668e994ad676192e527" }, + { 1737000, "c6a869ec9cb73ce96ee1620b1803516b466d47cde5ef78edac8b8ec595cc171f" }, + { 1738000, "3b69b8a388ad69c84f3e345199440024996bbfe00a59b933f81959b6724576f0" }, + { 1739000, "b64af79e91f8f6a5967f1bfc1ec567dad1e24d38b89ea20a9fbc1b3e8ee9c4b8" }, + { 1740000, "1e78856c1f5a775fdace5e6b331005011e309825a44043738512be9f39a45320" }, + { 1741000, "817d330a7bfd7dce9fe38f5d8806a8b5c5ad4bfc5c977722ea4653c13fb0d281" }, + { 1742000, "adf32030b702a9705e864471ad59983210df4288db92e5c24fc4885b4ba2284f" }, + { 1743000, "e1257e0ac3b2dd3cb93ab66a3ec0a9ce5e619454919c9f093ae968c95b7364cc" }, + { 1744000, "a58589d821afbd93699e80a38f2376116fe00eb85a8fd1ef80993192f34c1409" }, + { 1745000, "b9bacc5848228228aa741d96fbac4bec395d6e9857cfe75c0c9d6e18b2c02e66" }, + { 1746000, "2200e20d4ac99a9172622c9202d24446a95aa6fcbe35f2dd745cdb4ec1220cc4" }, + { 1747000, "d19975ef01e0e8c7b836202485f17314a559822bda7611b973f65ed300f4800c" }, + { 1748000, "f99d70c8702104a9a0380b517dd142604ae8d9f7cc479205a20b7f4b9a21c405" }, + { 1749000, "df986855bc9ffc4491429b6e57c693c3690dc1dc2dd6e2f0e2db2e253dcac955" }, + { 1750000, "be9a1079d72365e8830591897d8225e26d3310b581e25b5ea29fdfc0ded7c9ac" }, + { 1751000, "89f8490e4d61306c439c0df4d6cd0e63124f021a901ba5c84f5013ce2b576b0e" }, + { 1752000, "28960c73a947317b8e7a8dce75c24166f0870071d8b6222b43c3fb91d0dcad30" }, + { 1753000, "3fb1f97a5cd3d4180e309dcb64463613beb967123fafe01f4e9cf456a38e1fdc" }, + { 1754000, "c4d6878195f227aad71dc1d88995d570b61af4e66a3adc14dc5d584aab2cf393" }, + { 1755000, "a571474c5d3ba96fe8ba32ea6f3f8d7d24e6a1c5dc37bf831aceae5b9eb93dbd" }, + { 1756000, "c483179ce58677cc42734749c4de23aa0b6ec3f9a943283050cc8e8169a415eb" }, + { 1757000, "12aee1f833dd2531e5203c153fe8fc1550585831cb9546e4ab7fd2ba8d8448f8" }, + { 1758000, "328a6ab17fe0b580e489bab2926155986624f78a4034b50d0f77bfec9bd8f020" }, + { 1759000, "e5c949d3fc601e2109d550f0496be60c24e6fc117235daaaee520bb9cdc8f67e" }, + { 1760000, "4493cc9915b240c0f776a70c664bacf28cd0540c52b20c323b23524792f66dbe" }, + { 1761000, "cbe14802387a21a9baf30d04d92edca3449fab121db0f301c52067cd60665b19" }, + { 1762000, "9ac8d7f9f00d6a805a31e83928340f4b91631dda1d0990090634f9c8e391d4c7" }, + { 1763000, "9bed376e7736e79f23e0a01ed1989a697ab77f2f81586962e3e2851397a106ab" }, + { 1764000, "ddf8d658ecc74a4189fe591143a6821c6f601d26ec6081fce358b82acc2d805d" }, + { 1765000, "c87bc4fd3e2d5f028b934c4c2a464b9954e5cf6b5b4c4f96b235aa181575dba1" }, + { 1766000, "ecb3fdcafb7a4a1a0eb9a2074baad7bddf108beb7ae77c0f0f24f8614e55e2b6" }, + { 1767000, "811f5548a7b507fe14e5c006a5bcf12501eebfa421acdf94b4148831fd187427" }, + { 1768000, "97e7f70fb01d0a9386c40f3315e8d7d80c4e303745f01ef9295f8f6e49f525d0" }, + { 1769000, "f3d18b620c3a92272cec0ed2e308e77cc1f3d614a88498d0fa33fcfa0baf108b" }, + { 1770000, "c974599761f9bb57f37faba6630b625a721053a629d1161ed2a56c98d1e4c6c4" }, + { 1771000, "e2ee30991088a115f879f75fec89e96d325293788be7a0158dc86769a299dc78" }, + { 1772000, "b6fd7380be3063d793fb76c9bfae71e7169de2e2d21afc3a24f657eb041d7c01" }, + { 1773000, "da5136d96250c30f5b6e6c91fe3a7359f63f04004d1078bfa52b57a623c4e55a" }, + { 1774000, "f71e3cd4f1b9dd9053e6991290102e4ae5191c740454c7982490024aff43329c" }, + { 1775000, "52f1c5bfdbecdb7fb4cd00915891c2ec21dd1629e035485e96593d218c8fd0bb" }, + { 1776000, "b8e9d8b6d6a031fbac807116d7580c345b8148fda5a988c7151e734d490c25ad" }, + { 1777000, "4347cf0ce5547ffe0b883e888363ea0b535e6e1da33bf4d7a740f13590ef5d68" }, + { 1778000, "044ea4a4bf0b77ee4f415173af5048fd7658c03347d5571e70e2999fef64b094" }, + { 1779000, "d5fc5b65a30c637315a10e4c82a2026b91d897e20f63f898aa45fcb872c6fb5a" }, + { 1780000, "be7e3fb82d0398d85d151a105b407f6c8858a2335e1bd6ae3458107c4b198e8e" }, + { 1781000, "06fba26696dbca4b5241f7f950f39b59a07f48ea747816810b00a6897c242faf" }, + { 1782000, "229db79d538c7ed959bcdbcc0a8543c2b46ba97f1ab1bd2b60e47d92af651fa1" }, + { 1783000, "f34019cdd068190666aa2e485edd7819f280e8b7325e7c3e423c550b81bd0c04" }, + { 1784000, "1a57c43a0049f1b3d4e7d37ccdc8be605cba794f2fb56b9382f2318a672ca157" }, + { 1785000, "becd1a52adc255bf5128c9ba5a55257fd0418a6752c46c77615e830fe679e8f5" }, + { 1786000, "e05a06a428a5bbfcf7e2d42c2b5dd32364ec91f7692e92f4f3553ca28daf90e5" }, + { 1787000, "5f2c238540f2fdd45fd104d53f9e83a08f06fadf9b74cb937711012baa8ae83a" }, + { 1788000, "5dedd54f919fdb209c6babb1a96c149e111ec5b888561ec4bc2879881130a7d4" }, + { 1789000, "dfdab38c3bd5ccb81947d5829fe61e8f54f2f141172181473447d17450d858f6" }, + { 1790000, "8ecb5a666a6847d4eb3f02240a3116b24fdc0f17ba03d926af579ffc665c683a" }, + { 1791000, "b9bf2df98691f0ff35ae5b1f9e3fbff0bf09c2ce7225a4e7949ad44b1070c8b6" }, + { 1792000, "878cc61fffefb9906983c3ace2048d494a70a7ba8dc92e11973213b4e8f7160e" }, + { 1793000, "78eb9b979331d3dc8612634a117d5daf1fa0bcd06aacdf7e37813f170102ac55" }, + { 1794000, "e6bbb95909ecb68288fbec0b10494a916ac66cf6b170282e70f7d6d4939b007b" }, + { 1795000, "fa913dd8697e1a75f21a8106c03781faef46a57667d96601c27edaa4f768db36" }, + { 1796000, "053a4b331752a2ea3c4fe401bb587e2e094e4dbf678db7c58a6e8895d8271391" }, + { 1797000, "5fa8f171676fca5592feb950c6412945d3d359a78a118b2f8f7c9217c09b23bf" }, + { 1798000, "ccb1731c506366ac8994efdd689535e18139c5f809ea5d1c172251313c55dcd6" }, + { 1799000, "7f998c74eb334bc95ecff223d530fdeceaf9390bc4ebf9ccc10aefee3404a473" }, + { 1800000, "bab155179e9049f9d6fc2a001ffee601361ff3f9d6cb2baa8f796318526664fe" }, + { 1801000, "068ed5e812ce10a33957c2a9bd3d842d84e7210c8768adb0cff6222ac4132c89" }, + { 1802000, "0341bd17cb0031e1d43afa653f984fad3d5172a0bb7eb85d9533d7ce9aadc4c3" }, + { 1803000, "cba79b0cde23e90fab39bed5f5ac0a7a2c8e6e0a3663b1b596b6bfa8f6a5a4f5" }, + { 1804000, "7e7e8c67e8a4056276eeace82b0c32a9bf53054b6763bc1b35ef2053efc375f6" }, + { 1805000, "506348c62b04b94b7b1614ad195e070eab00009b71bdf105096047d7ead23b7e" }, + { 1806000, "b22832a4af387cd012135be0e25a5d32289f75d8f2fa7049ff2d22a0dc36a163" }, + { 1807000, "b42a5fb2ed8148d8b50f5ba96b5a163d2f6358cd2314765135ddbc915be3aad8" }, + { 1808000, "c658aa8123eb3c781446bcaa0f202268ee8066ac1ddba50d2f4d363b2e374b6a" }, + { 1809000, "1927d9fa9a7d2c0e7b72352a7c442b60acfa5d22ec8f3ff4495feea047df5927" }, + { 1810000, "45452f73a1c59c6d4b628c18beb9bfd407b2238dba27ecc22bb74cffae29d2dd" }, + { 1811000, "10db9105ee04d65340e4bb5bd9c519b526c68198cf1978666c150c5591fb5298" }, + { 1812000, "48004db1699897f2c1e15b3ba22f98833598d61c3e1cebffee1a2764f2f4ee4b" }, + { 1813000, "a05ab99d820324878be97775e7de4e95026062b61ce4eb4256f8929fad5cbfec" }, + { 1814000, "a1498c4a7630d236ca694e8534b188100154f9ccfefd2559d5bd60b1bb4d2411" }, + { 1815000, "00bb7004cfe768db90bb349c059b272b81c53bd196b8f4f7a687ef007d1500ef" }, + { 1816000, "d2d31d8bd9d8ed91700edae0cd3f88c5ab0ba255d0119527277824db02f9a764" }, + { 1817000, "6619a68e2e31a4ce4b5edcd57ac62d5562c539164dc985bf0fd38996842e5bde" }, + { 1818000, "1590c190a7ada5825e90f7becef0a80213f34b3b31f2a953e9b19fff2ff07183" }, + { 1819000, "e1c52bdeb5a8cab64395dcaa44d30d352c53f63ac25f9bb01731e9ccf7890a82" }, + { 1820000, "d242bbb73f784587fa4505f393d16eb8c0a8470dce321564a70bd79e39fb6bfa" }, + { 1821000, "c0530c1f9ddbf66f83d136472ca673dc482267d2916c921dad91ac2f28149edf" }, + { 1822000, "01711ec5784defaf8c7f09e4dd7f8cca4aec07aed1d15d61a5076e55464d4b8c" }, + { 1823000, "75a6bfcec2fd31e9557ce38745666745dea865504b0e41a90a82e299201ab42a" }, + { 1824000, "b971fad64eec2f04c1c060c34909644788c4281f058e9c191c303a1d8e1598d4" }, + { 1825000, "e0c88c25d1408de5ad91709ccaea42c7c7b61116c26e0474b44e71fb822be7ea" }, + { 1826000, "2b27f37780b4075806208b4265e6e378525e609db5c82c760cc3a8b6972c8a0d" }, + { 1827000, "cdf1031d412d5cf5ca40da2153d41273a050d2f6f613345c9a888419f025a367" }, + { 1828000, "67c8d608f59763b1f9a90c20bc4bd8c5105c820a2e445ecf0b4001141812a7d2" }, + { 1829000, "264ab8d66338b6c0f159f67c171466ed1dc5efe10bfe1999f0b70035c44badd9" }, + { 1830000, "8feb3d30971a59d53bbc7b18d8d2b035f62e9fb35a5aebb514f104e7d0487b81" }, + { 1831000, "a307218c72849762202e3c174fbad8e35a344bfc1f7317d975844ea0b2b3bd63" }, + { 1832000, "28022c322aa8a1809a53ccaf34cf80e71a92b4a6f4597236e2524da30f7cbadf" }, + { 1833000, "5c5c819a50f2c8a1d9278e44f82e4e52d3385e77619513543b1b07bf2f015627" }, + { 1834000, "3e470ccde982faf31035b4030e0b933f51b5408fd6784a4ee7131a74f9f5221c" }, + { 1835000, "7b11778228e3834a682647c87b69c24cc1218138ab98e0b2a28bcd7ab9811064" }, + { 1836000, "7452675a12c8cce4995520e5f3b5884ea001e97aa85652300c429a7d9efb3fa1" }, + { 1837000, "d11bc7eee8b5a0161e1e27646f7fa3e6269c1be6712a69e200db17ee4f1b289d" }, + { 1838000, "2d8c5772d758938aecf8da7d81cec33cacc386019e777c06323b7afd68b80e43" }, + { 1839000, "afc99834df7c814ecc320c750eaa656b1555010613a1dc0f8d36523da759f3df" }, + { 1840000, "acef6c2e281f2480b831aa3952448a3764601fc610a13c59892970fbf0c66ab3" }, + { 1841000, "6dbc6d956ca04b90331f0afa32872a08bc197b1980b1fd1cf4e2a1a106564ec3" }, + { 1842000, "35271660df6691cfd65b1ae2c4070cbe3affdcf4e7e596bcdb29d76885c6c11b" }, + { 1843000, "16684ff5df85a58b082e3db420039329c5c74433f8dba0b0a9e39f11ce07d5c3" }, + { 1844000, "594a4bf577e8c74e98994d7e165a09837b87c835fa36f8d6f63fb87af509b345" }, + { 1845000, "0bf13dbf5f8ae787530744e8cd4bdb97067fd7f0c578864585c206145ff5d81a" }, + { 1846000, "54a1f8b2dcba4b4c8205e84a6206aed90a93376fd86320542270f47c94688d0e" }, + { 1847000, "ffb9758accbcd403861774605073ab6d39474cf3c45855e14f16b8a28a8acdea" }, + { 1848000, "3e36ce5a16558ddfe74a55b155f753d4e23ab75c72b366380e4c4ec2aaaebb0c" }, + { 1849000, "ccb9b5e2be94a33bc9966f65023419bef7e7b2c0253ca4e6edac80075d841e27" }, + { 1850000, "a79217e362a3377c67a87c368d081b8e866c6178e67d13fe994f40b66f8e328b" }, + { 1851000, "572617c950459eb84d69d41bd8ef42f48d3e72d76dcc75a2faae7ae6dfa306b3" }, + { 1852000, "f446684923cb09e60824bd4c41fe46afb2b4036a0622787de3fdadcf51e00231" }, + { 1853000, "3dfcbab264976d79dc20800b066123155c98740783d1ace7ec58fb9d393ea4ee" }, + { 1854000, "9deea119677b0a8000584a98dd4ba9d6a5c406982cdcfd2200fecf3414833267" }, + { 1855000, "f89fdb0f802ac2a7133287295dc384615015afa908c21723915eef452c2456e4" }, + { 1856000, "252245d44fba6a3d60259a0d25919b85795995e5f67e6060d0127b5bc9828703" }, + { 1857000, "97d4c7362d5c1bdf09dc0556d215cc6d72982f1664fd3e4a5ee5c4237dffb028" }, + { 1858000, "d89e6f7dee558e07af9743858352a844a8c8b91901e914183acab7615e7c3811" }, + { 1859000, "ef6685475fe204feb592938b936a59b6dace9ee226d0ff1cac72b8a4d0e63a7b" }, + { 1860000, "d2f43d09f1f756b46fbbce2ba5679d4a180e68ee02c9b18e9d123eaa049442cd" }, + { 1861000, "112a63a1c64bee14cda7a3f5184639e2f063180f4eae5dc003b552c9bd150d8c" }, + { 1862000, "d4e03421ee7555ebec44b8fa54a389406efd615d9e9dea5ec0f00170baf4f154" }, + { 1863000, "a6c4836086e46597d507edc2cbef85fbbc3dff906bb7a778a720c384dbf678a0" }, + { 1864000, "bbf7d94e80a0223d7cb50745fd9d83fe3d29a15181151f8ae4d244e72d84de34" }, + { 1865000, "d695f4db220141608a0cc228d5c5a9fd98d0b5d2a278528e03c38bb1ae74b041" }, + { 1866000, "a49b063d680bd618d85aba3c3b04441a013133b41e6337ba4bd8c9ca40c8e9af" }, + { 1867000, "d173b5ad5b7c6bf470de78364841836f04e2f55e90e9a18ff2a909db059890f8" }, + { 1868000, "0f3f6b0ab16d27db3390f17ff40bc1631377f76c8ede69dab344bf4b7117502a" }, + { 1869000, "2ea160c71d008b80455040326ddc9b1fbc5a2737914188d2c196cfe2f1c45f5e" }, + { 1870000, "a551a5b81e161b82e5b682bf1bccebd964eb2deb5daae69fa84427512d10a875" }, + { 1871000, "ac7461a8b98f0c3925f4501cae0694860621e671fede37ff6bf6729b7f8f3e1d" }, + { 1872000, "16557e3a2353a592ef8f7a4d8b503348fb1b5789e0beba29f1f7005c29ef83b5" }, + { 1873000, "aaca37bdcebcd128c25a34e9a9bf2db007b3b40e719513f39c04a5c8ca2ded11" }, + { 1874000, "0f2f0c17cda1ea1f09ab9158b1b5779047b9e759c59394ba1df0c3b98b732372" }, + { 1875000, "e787b0315779945458bc9dd6bfa38b1f1313b1f00c0386cee91a007135c1cbc2" }, + { 1876000, "e6e3ea9563a57a82153e03e28476e93d01d9d154ecc19acd448af41141181b12" }, + { 1877000, "1ef67d234ffdd2b2f204aa5981219d1a86ae3af7392bbf3baa0d11c57a973498" }, + { 1878000, "1d826ede84b33859ff076cc8885e45778d15270b5922421792190450f27ac5b0" }, + { 1879000, "ffb0bcfdf1215f24c83df718f86e0ee6616b71c39a3494eb5e3b897f99bba20c" }, + { 1880000, "680f33655fa69ce7c2fe5d13678141e1acf2f3016dc4c96be2fd963fe70b51ed" }, + { 1881000, "c21ac4d7892e6e5a92d02ad252ce4b156309a04cda735d760456edb655380eb9" }, + { 1882000, "bb7f10d5c62faf8db1a9b17d815e332b24d9a02c453bf7761e22cc7cbf50fe82" }, + { 1883000, "72100d265e8d670d4c8ba26cfe604b4b4b3ad8e52a4aceb2eeaf8559f8dcb0fb" }, + { 1884000, "42987d18a1b20a7866b1406badc46525015ba3a4b311fbb24585181e88562777" }, + { 1885000, "1918afd5199ae1871d967df49847d68992bc2dace6b65dd11a84ab64614822ba" }, + { 1886000, "d2b9826f1f70e6bd7e79e8c627158d7bd40df79ed986f5285e4436465c81fd3d" }, + { 1887000, "5c8bf949e88bf21ee3174af2a039f094801ec48e6bbab1f49d6330da268f38c9" }, + { 1888000, "d43bcb7005fea71ef89ffcfe1072e96b7f03a54ee2c3fcfa07aa7194321380ff" }, + { 1889000, "95ddce43625771498ed56ec05b3e2a94e661c3b9493e372a54cc8a213aabd08f" }, + { 1890000, "eb283d6104bcc058fbcd64d5ae5c7712154877fec37c4fa34d9a2d50930728dd" }, + { 1891000, "10b74e3df4cbf368f49216af901f4e380af1505386d034a01edb15018b3dd19c" }, + { 1892000, "513c8dae893c17a4eca74713ea9f6658a3656233a66b140f850452a698897c99" }, + { 1893000, "7ddc0f7d2eb4d11bbbdbe82ec09f7c96b85883ee34b0d1f610688777d7ee68d7" }, + { 1894000, "47b114575c9ee9870344231a7c62983f526bc24b2e526098c32eb3859669dfc5" }, + { 1895000, "9251bddc9c6f9bbafe32f44aa9d72795f7d124e9ea5fcf06166e6222931cd133" }, + { 1896000, "79d7af703c0e825176219285240440a6457de75941bb73ac1d1b186002e0070c" }, + { 1897000, "00567e0e8449c29ed9c9cbe130ac4360d6e72fbecc3aebf29824b94921aa19b9" }, + { 1898000, "7aa40d404b7299d10fd58f69a5fba4c7a3a7f6885f604f586a06a8882366b8ad" }, + { 1899000, "671c56de195b253a1a8ea6977ab3762b1222ca2ca931213b2e0dc98dbab0e547" }, + { 1900000, "377d439a17bbf27b41e9c965e5586fc7321fa73a82a428052e749949566f73b2" }, + { 1901000, "7a5006833b16c01efa4bf2ecfc251286d610b7cc0308e415ea88ab25bce08b69" }, + { 1902000, "1650b54d4fb59bd5a9f4dd034d6594e391606bce69faa75f2d25e3a7fe2119e4" }, + { 1903000, "c0c6de991dc2235fc2bf2166094300ce62d7a2227e65b302ee04a7950202fff2" }, + { 1904000, "6123d44df9bcc9770fe50a2b041ca571341012a2ee9b3560895f1225abea5380" }, + { 1905000, "4f1f881a5c135d37130b839e56a65e90f1a991acc8562575f6b73af3651c7fc7" }, + { 1906000, "0ae084daadd67e8cf0a4a91701c43a16d91a29bb1b0cb9ace509ce846b6a8852" }, + { 1907000, "cf04613a6afd7315fdea3d75cef66f0d59646890fa1cd0f93dceb9c2bd0eb0ab" }, + { 1908000, "1f19c986ad10992affa2a9c06037bd28e26f22a7cc4f68dd5b6ef063f957ea48" }, + { 1909000, "4f50f4f42c7bf234c37bef15c90a6295873c2f003884b65d22ee08d38b0d6a10" }, + { 1910000, "1141fab871d851e38f668a938b1291231aae7c9f5ba93a900aa2a8e7b26c65df" }, + { 1911000, "156db2380b5dec8243e196f48f842dbe77acb8afd034cc2872bd27194d818588" }, + { 1912000, "ae8df7ad3dfccf265d9d5e82a30dd2971d8341c7be23e1e18dd25c52e2da1528" }, + { 1913000, "3bc078ce75e6a0b59e6d6c3d6567e255b436b242aaab97f93f1e651df5bd7e07" }, + { 1914000, "10c2dc159c1e74acb191d8affc9c420aae58b72d962553fcb345a1d8a8fd108b" }, + { 1915000, "0e9a6d5ce965f91946bb40e6823d21685f869ffdab01491419fb3feded835c01" }, + { 1916000, "60b41a8d449a39be6bb5078f27ae8b57ec5421e18a5e4a2a53319f5c801b4c67" }, + { 1917000, "10e2cedb84877d7b480bbed6f42f02f42a91ee1bb2aff1454ad53b6a95a4506b" }, + { 1918000, "a9a650fa216162eab7846ff3a9f048793f0965a9231e75d0b27ae1a239b6e9de" }, + { 1919000, "3b641d02f4f3feefd972f672f9414d0941d741f187a3303cb37edc911c920d4d" }, + { 1920000, "3b6d0b89aae6ab15a75c75f5e529a81d41120661d48ac0a9470c21ecfc85a5cd" }, + { 1921000, "43feb7f69f41e7f1d64edaae333e1f3d0f7caadfaa5c75244a463d66799db75b" }, + { 1922000, "fc77e1a9320e2a03f0dfa4f2cf8f444af95c7b7f9fbecbbae98defe16659cd8f" }, + { 1923000, "2cedce0c95a240ce8fbd985229759e9c329f0954243cacb9bc4e486dc60999db" }, + { 1924000, "099b95ddf6d32595076615ad508dceeff20f8673bacb68c5ceba7784d0655c40" }, + { 1925000, "019a1349c2db57aaf8c7c96d6a0fc9db5ff19cee3fbecde0314b1354e6ad0862" }, + { 1926000, "48d84e00025081f149cd6f4017e75267c34fd0469ad3e4daed52c3b1b3545127" }, + { 1927000, "505ec5d3d387d52ce10d9fe10fe5a26f7462b4c632004ef090414c3fe98b148d" }, + { 1928000, "3a62e55db0a02a6c90722ecbde3b35f024d920f48ebeba495cd0ed7854961d3e" }, + { 1929000, "690e70b0d7f2eef52582e90e31507292cb8753d9e825208b69aea300cf915cbd" }, + { 1930000, "c3065e12de2272b5fedd91ce624ce6ba115fc7e9051c7641ad36099d5885c322" }, + { 1931000, "7c61f2d6b5503b615cebf68933e8cb8d2fd8c1e75a4c7b01fda6461ea3ac9ee6" }, + { 1932000, "67f23b0acd3a427eb556a8c99a19cfa04e39c2655849acdb1bfdab27898ec4d3" }, + { 1933000, "b7522683f9b87d4f08de643564f01f99914e7608cb54cb4692893aa2136f0eb9" }, + { 1934000, "03c6eacbcbbc3b8c716a88b2197c490e9033b56878cedcfc87db3629b9cf2e0f" }, + { 1935000, "d4cf9ddcaabcf67c0c148b61a940b994959e7098701b0ab1af5f5d8c00a5ceee" }, + { 1936000, "17c9db2ff563251af6e1b041c420497ba7f4809b5d9dbdb3b332323b3c0a2595" }, + { 1937000, "e31bb3fc2a767bc6d8cd8f045f6234a4148b2631a35d3b7c13a0905cfc9e96fc" }, + { 1938000, "50400879b1859eda8d847efe576ddf23589f6e7edc21b864671d2bad4aac5fc8" }, + { 1939000, "9adc4a182011b7132689c070ccad2b3d95d876d2d0268f312b3c46953403b17c" }, + { 1940000, "bff23a3fb969755b558df592f7a6a0e920e7118ac2ad74ac2e0886ac206ab485" }, + { 1941000, "4814c3c6feb7d5d946e9ee48b970fb854f5f2328026e4075966955808c1ca83b" }, + { 1942000, "ca615ee1ffc543b5f8197fdea78bfe1bf06ed462e4549c62bc6ced22126d8a86" }, + { 1943000, "f2050d9dbd6a1476a4d7bfd8b7be75a6ddad465baa0ad70a841f87bd58c6fc39" }, + { 1944000, "57c204ccb1d7f7c44c396116e983257c80b8150f5b776f0d768c72744ae124bd" }, + { 1945000, "51afd148913136d9c746e79982144c4718fe5758e09fe62487bcfff03ed22ff4" }, + { 1946000, "58e845f4ec67c1658bf7556af7825010be69b9fa426a2a0317285a5a438f4455" }, + { 1947000, "896dd713df7633601c72e9f5bd59effbd2a69b89ab4a5ced2f5462a5cbcc3c6b" }, + { 1948000, "2108cc8419c5963a2e37f07a53cb793e7bafe2e324a6810c866b5a0a0c347f5d" }, + { 1949000, "cc0a3bc455022aa9af797d94a97d0b93033301c97e3992ac7be6055d3b1c926c" }, + { 1950000, "79cf71ed3634245ac407c4e10cb519cc748f6a786fa93061875ede7e0a2f08e8" }, + { 1951000, "444dd6b60b3006068cdd655ea040aaa986322650b7f69ec6ea545f006c7fc421" }, + { 1952000, "2017b61238d3ada51df5411ff8dd6f25528886791884a0426ac97313bd2f5d9e" }, + { 1953000, "a036a63374697b93ddb2ad2fd6171bbcd9b151bcff90dea72ea0e131072cb2d0" }, + { 1954000, "dc94e8f613394249daefa453e171275297226da9fa20905aa932796cabebb3ec" }, + { 1955000, "754e1b2f1b74c14f6ba858f74122eb4bf4495e1c64ab696c6e7dfaade148b681" }, + { 1956000, "c2baccc1ce3519b85fd495f4c67a1d55a37fb05be37d1db95d8d72eea386c77e" }, + { 1957000, "2fcc058700a2deda2d8bf23b1752b1709b49bc636ee7414fec5fc51c7a764b36" }, + { 1958000, "686971e94808702c0357bbbf5854cb6b234ee692ca34886542f5d5a454c5ac7f" }, + { 1959000, "03ee3218f445db7ce4dc8a4f6fde3b6dbb3dd8308596a5a95c2f7b91940197de" }, + { 1960000, "c0bcae2a889565bf9395d3baf734465766d664a51098c7d9d97899554a67870e" }, + { 1961000, "bb359b4aa1f496cc547bfaab6cac62a64cdfaffd65ed3fd46b5e27653f704724" }, + { 1962000, "9550c77ffd130bd997d024b85f6c5bbb86395d39cbd590635243a045bdeb81a8" }, + { 1963000, "4c80f0ce0260f9c6531cf96613e86ffce77e41dd1b89a35ce25cdb24b09ff37a" }, + { 1964000, "8fa4e717dbac56a13a7c34a981d77240fa603ac25dd60dbdd6ab9de1c5194455" }, + { 1965000, "7d76bc3ddd35be144291984859ab0fc3df19d6112c9279d902bd6969600832b9" }, + { 1966000, "a1fb10471be96dbf183d5ea61e70493f6d04b88c938772cb37c8bfcddf019bae" }, + { 1967000, "fe8399ca2014cc6a867cbe6e35d99ef55913ec64aa67a799dbb40c9f31c5be9f" }, + { 1968000, "09f1f4afb884c4aa4df8a7fef8c1c41d1d10f1e446c1f76c36658ad9a21579f2" }, + { 1969000, "2566de0a4efbd0dcec61c3672e33875c97ea5bb91a9b9c6dd666065f7aa80bf6" }, + { 1970000, "a915878874d13a1c7d3b140e663172a77bfc0717446250a20ec0f38165648217" }, + { 1971000, "edf1cc6cd9cc481ed4943764fa1fd2073c50a0a9d2cbeb9b885dbb377fd0079a" }, + { 1972000, "7f4a5da87495600fecf5173ff08a98cc2471af0ed6b6cb219651fb01f87c6863" }, + { 1973000, "6ea7b032515e16d20d47a421e29575c5f0919a5017b7bd7a12cb7220d3f617b3" }, + { 1974000, "ea1f5cb8095b243f7e4172bd5773c281ff2650cba6dc6704a3cbc6bd27084b36" }, + { 1975000, "690d298a08d834c6372bf774c820af4fcb997775fae0f920c487d49c136be572" }, + { 1976000, "2862779a7a2d2db78ef17920300cbeb78b1920bf40d8a331094aa7e5a580aa90" }, + { 1977000, "4454dfeaa0c339dfaa483998ef43200cff2b613bcc077d58c4bf31ae52f844ae" }, + { 1978000, "649d34f38dadcf4110857256ca193de3ab3a251ebf32cee5ffd0910f5b26654f" }, + { 1979000, "27d0d8da744d5a6ea02a9214fbb88b739b493739cade081ac6ac1d742f40bb1c" }, + { 1980000, "86da5931ee68bb9726b0eb0c909f51593d5b2a91556ca6307c5bb6d569588423" }, + { 1981000, "6b3c621ef1658fb842814ac6a15799ab966f677d7e865f04b32223af7363124f" }, + { 1982000, "75ece9ad8da8c07b82a4daa57600cdd32056535ba0af4a44205c9ac382fc4e06" }, + { 1983000, "b3319b75a7449238f51afff797e5d6ff3f55c994cbbdeb554d3142df2cd078c1" }, + { 1984000, "2c8de080cc5aff927a03c07875ff96c34f2e8dc13e93614a5d3c0507e4a01e13" }, + { 1985000, "46e751eeb7fe6ef8b455aec2bcea3bb9e7a1aedf6df6f68bc107fcc125d76e8f" }, + { 1986000, "6b2b163abf7e91756ea4e3a1b94e67502386a50383df3916f260def49552c7b1" }, + { 1987000, "5fad2562eb5111f6e15f535e01d304aa1c1f6e1f5b376a663d255c38d56b74e8" }, + { 1988000, "585206e35d341bbcfa5d002a228d3185bac3253377784b6a63980217195d3f5c" }, + { 1989000, "d5744d5f7056059ec7fb68e7156751ed6cf7184a11e44fba46bbdfbb67cdf3c1" }, + { 1990000, "2aa2fbe1e4d0632a1dbae90e6085c197afa9b5d3c09b09c2079460f2472c5ebd" }, + { 1991000, "6260a032124713e375ee18b0432a61065d68520705b040ff4491354bed1ca787" }, + { 1992000, "d9efee7d4a7b71188b74d7665969c8977f501c828b51968ec1257b9318447030" }, + { 1993000, "53a8918ea2aa73aea163e4c07f2e7a3b5b4efe425eda21621d64fe6e1659e64d" }, + { 1994000, "cedd12360deb216e7f7e98b9a875e7b10ae0ac8f1c8b1d27d3884145b8d9d9b5" }, + { 1995000, "8935cbb89d786887ce5332feb0ebf9887048d79a2de0c6e4e4d74ee967bafdab" }, + { 1996000, "5ea833c1fcdba69c1528f7fa7f9eaef17b785201328c3eaefd2d26099f68ce0e" }, + { 1997000, "a7103d078d8b69da49224c9b7548e8df57cf96deb092ef3cf1a15ce84df5d7f5" }, + { 1998000, "d6be50f46d3a98d829856f7d907ca8c03412cb7b2b13a55bd62f524a2460b91b" }, + { 1999000, "7b42f2c7924bf715b59b770e430f9496ddac6b55f569929f82009787d8659830" }, + { 2000000, "a90d79cbde562d72fd9510f1316c94f52752a33466b69bcb90426ee6edab9db5" }, + { 2001000, "fdb0dcc0f37556f345e3f2033dbe4b68d747bf16338dd1e5bd861937031f650c" }, + { 2002000, "8da0641930176362f85c86d4fb185f26fe118e8dc5f12eb97dcdef16799b3dc0" }, + { 2003000, "5e90ecc0be98381cab639f1a41e8c34c9fc688d6cf533498d3730f8e0589c65c" }, + { 2004000, "24d984f3ea91626faf12c21c0bb55678aa893f9e357c406d45c2e924559ad1f5" }, + { 2005000, "0a9ea722647cfd82de3e28bf35e8cb729bfbd5b87c3faeca5ca7b259d6a025d1" }, + { 2006000, "58f614dae3d63dc5ba302fb2ae15e5b5df14c618ee7ca8c164f855655a8f9476" }, + { 2007000, "10d4471e871d14312b7b9fe11a8674282623691c93734ebfd41339be927fe455" }, + { 2008000, "886dce7949d6189b0cf381332b39db84355498b6fa554e18b44080a5139ba847" }, + { 2009000, "3182f06bede9b65fb30addaaa907ad7773072dc166055a688021edf11e75a16f" }, + { 2010000, "17812eab013d0cb587f601fbe3fd1f3b6a6d87eab3a6b5f6abe187e2f21f25da" }, + { 2011000, "1039787d13f78ece126469b608db9cf1aa584b64c128d197f780142424d0662a" }, + { 2012000, "036d8b8d359b710cd22b2086e29d8072e52b7345c560c44bb3fb1339f9bf2bcc" }, + { 2013000, "b17400470a4b291715c49bd51cf6dfb7cf296b6fd429b900e1c015d79c575b74" }, + { 2014000, "220ce88d634fd5f948ad570ebb602e9c83b8cca19fcf84d7cf25bf919b18038a" }, + { 2015000, "365840d951e1a0eabab029710e0bf18eb5d6d102bcec736d801aeb1a16da2fee" }, + { 2016000, "bb2764f04e7f94f064f5f1bdf8e18aae824539e1983b1a9b5632ebb98c7a642e" }, + { 2017000, "1e067cf029d1b84828f248da7643ddfb9286d1614debd0423b12d4a87165192d" }, + { 2018000, "faac4cb9f5fe6ec14a74729a87b7515b100e5b3fab711c018104cb1981ec6d54" }, + { 2019000, "c279a0b8b6be1c85bcbf72606435cd981f561a69d3c8e56ddf6df6d0835f7149" }, + { 2020000, "8b1de891543c535d8ec084ba579e1077ee44f052af24866dc7979cda29658475" }, + { 2021000, "a16ba954ab2f4c77cac09fda31f960febc01a9dd2f9c5536ddd18019d246fa98" }, + { 2022000, "38789a4f136cb0dddb26440e90208a84c1f4e1bf3bc2b51b39209a21ede61a49" }, + { 2023000, "313d026df85cb50a92976429d0286d8362d59ef1b38935ce7b08c981a43754cb" }, + { 2024000, "b669dd5e1e24eeae8586b454083c7d2a690ad94ab82212f3eb8bea13f85480b8" }, + { 2025000, "ecb0134deefdba3026083926b6f2a4c0342336f09532b1f4ae0c30855f1ed3c2" }, + { 2026000, "6117484c2c3da568ee408309f9ae8b604a46b4af6fc3504fe7da8dd0329ff6a7" }, + { 2027000, "03614844c397fa77550c80d4ab7139c93dfffadee70b278c446a8bf8c8ab77a9" }, + { 2028000, "9e82014a80ada3d0e5486c0cca7f1182f6fa2049152812438652802df557c678" }, + { 2029000, "41c4344b2fb053a5f434c4277582f5870f7a62742dd0d876fabf28624f63e691" }, + { 2030000, "d351927bc2d4247ba150855aa20da55c880eefc904202dc9d39ce901eeeb6903" }, + { 2031000, "443d0be0f22451bffa7524f25c5179d11877963de86f1fc771b7f8df748aac5f" }, + { 2032000, "9c664540c41304571e8156bb179d5d9b2f157ae8b3bd4888603aecf04f4ad752" }, + { 2033000, "dbebf59be9f9d4c94e393ae4c466e86689b331ae5c55c2ea10332841be04874c" }, + { 2034000, "c8e786f1d28f9c412b51b1221d22285719e65674e4d1f63d3027b005c52bc801" }, + { 2035000, "70e5208175f41c2ac7554dd052cc7d85e27301a3da4fe5806f62c6a9507ce137" }, + { 2036000, "27715bff95e0b75e9efcdc6539e6b3766888396d717d4d2829fc515eefc9af26" }, + { 2037000, "95bcc7fb3624ed33970350892b423b765d1466efd425de8f29f0ba22149dd162" }, + { 2038000, "3ea715e1c3591e5fbfbb11ccf391fbee7b27947d8c97d5e7e4c25f685b66e4a3" }, + { 2039000, "e8466f885cfdcc50cf85dbd2bf4b78fe1522f40f0330f5ecd7f556be40ad3eee" }, + { 2040000, "248ee7acda6c0c58cafd2f3e53ce69515e19941082a1e9620fb273e935ec5048" }, + { 2041000, "6657a3f38e63fbfb0c128112c3ef7897b14c55f6a88aa12eeffdbc7bc3f72e9e" }, + { 2042000, "a799d464ff47ac37d0102d74f9665237c57240f09efde7448d214f06fb93c02f" }, + { 2043000, "00570dd2a1ae3221dc380e17983c02e2cc43396f4804e2888ce8ba0996928fab" }, + { 2044000, "db0db0686018cb23c0bffda0f8ad8c8603216fa55264dee18393a006b1a13741" }, + { 2045000, "001827dceb842fe62b8aaac484448cb5bc44a5844254120a9c86214e82cc12a5" }, + { 2046000, "e4aad908ab98e9d42c912772d66a9438828705034dfd8163a143cc4108fee5ac" }, + { 2047000, "ca4ba73c81421d3bc7c37e435db329b860a543e62907aec8451200634ca4f27b" }, + { 2048000, "a7880f2ea8437825855af2934689ccbaffce19c70e0a5b42de24e6f7a82c086c" }, + { 2049000, "596108316abeb8e9dfe294c0e9d09ccf6b62f18cc4f0754c393301d394693e6e" }, + { 2050000, "5780eb85ffdcd94cd2aa40296e997d856868a7745b6fea1d599d068f353c19c5" }, + { 2051000, "9a6e1d82933ef1c66d7b005c41fa31916cb3ed8ec060fe4031be87d116af520a" }, + { 2052000, "180c02f681fc3314f40f02c0fb349add492c791ad558f959c57a68e60882a29e" }, + { 2053000, "f2d3862a6b4cae8022a2886123bd7ffec964c8e421c13937d3b6c95c6c84b62e" }, + { 2054000, "3fe4a46d0eb5672dddf5c514fc1876e01a1d994da65a993a94844ea97969cbd2" }, + { 2055000, "3003a6c18362fe6ff76858e7cf61b511e16d99ae706a49eb1b71a0c03700956c" }, + { 2056000, "336aa0a97f3a10fc650ac9a7888720eea019335768466a3dc8512392e8c20282" }, + { 2057000, "5f4f1413dd0d4382f4a9e8728d18bf8e63f4c965a13658fe405ae49256f70680" }, + { 2058000, "1563939333dad2855068799fdc58150047e90899eab63d1cd24820a9a76335d9" }, + { 2059000, "ad27991697d5d837a397d7a39e707a2d52b48f4604c840642924f3a3a0b7fb86" }, + { 2060000, "c7117410e4b67af1cba39644290d6418f006b7649ba666653b4c03347dc8ff04" }, + { 2061000, "e10593df9c803b711ff7484b4da4ccd1d2a1abb8b039730ed39d8b73e9aac5cd" }, + { 2062000, "1c3a1e307fa6ec0129f6aa709e76314fb53e2cd4f2c3c78da2d1efb645c83455" }, + { 2063000, "f913c26cd72d6b19fbea2aff446ec3e16043537da91d43942d07e1ae1b27c6e5" }, + { 2064000, "839a7f92793e720567bfc37980afc32b01352d308ccdf6a2e9abe3797879da00" }, + { 2065000, "660144bf5c6ae8c65330cae4106a8272ca14adcf920a586e260f7346a9a4bc20" }, + { 2066000, "046a58af08d0a87ed7ecd27ee871fada186a4f1aa871ff7de4f11bc74d07bbbd" }, + { 2067000, "c0d6b277e69c8c828cff9d71563f8578eb9564d4f427071b929d691804a6fdbd" }, + { 2068000, "5afadd160d09ab4225c693f0bd4c23420db52ff0913a3c4d9cd008454d1af2b3" }, + { 2069000, "a851058317669522c733c8b2944890682a0029f1a7a7ecd77da5c8c166e9a20d" }, + { 2070000, "6d61abdb47faa8f8c1999f0d2aad4ad2c7d292757bfcdff19792a7a3ff8df760" }, + { 2071000, "94442fb86fd3886dc319463c78c4710da65043f5a95f047b30aa53d3a2bc4494" }, + { 2072000, "820e4be009831c631f38c2572e5f95a3be8360b914de1ce4187391d0e25971b5" }, + { 2073000, "f440ef07a3cbb6c0f3741fd2776e177a9047b82c579db7e4fe4ae4aeea988ca4" }, + { 2074000, "019e58920d364345dad6e43f4ebb28e869e02504eabac8211c428ee350b8e4ce" }, + { 2075000, "ff37df145ab6ebded1448d90e30039064ac6903712d376b2e39e30057078023f" }, + { 2076000, "b219112e3af6e40e0c954c4275fa47d92fbf8dbd429bbf07e8708c40c2d09daf" }, + { 2077000, "a68779dfbf649640006bec6a8f90f593f0e777421adc1147913b0cc3c552d1d3" }, + { 2078000, "7a962d04437e134be1297c2421842d6138e293541912bebdfbbd00ced93a03bf" }, + { 2079000, "650be9eabf0f472b4c3ababaec3ba6db3a4d31c072aa1f26e9ead52fa0802775" }, + { 2080000, "cc3e6a9ae141369db1e02012db3897855ed2f6a1ec2e5fe1aee00135b2d61717" }, + { 2081000, "184080d759094b3f75ad788245b0a4bfcfaeb014bc7b8415380a55ca48e74192" }, + { 2082000, "cf035e31215d380695bbbf0f16fc37bf73acd70089e44a76bad1efbef234474c" }, + { 2083000, "2adf0a993b5557c6733f32e00987f14d81e11d89cefdd99328c0f5f4eb3ac475" }, + { 2084000, "c4fc1ebe8704a6b63754bc61550e94e264d15b083abc39fb4a9683d1afcb947c" }, + { 2085000, "fa22c8182de4fef7318eaeadc27a6a95a96bfc6df3d5027643d6e7889f8f2452" }, + { 2086000, "62c9b1b33f653fd91c936ddf8d6b315e8b61793a52548364f951400d10a4670b" }, + { 2087000, "733239b5e5f16fd4935c9ab20256c9893ebec468f1291d45d1fda2730210f2f5" }, + { 2088000, "c64d73be9437d76a3426d82a861d9b7a5985487b53b276a5dfb022b9f57add95" }, + { 2089000, "2da2445636ef901b39b02a4a1cfe34f7a062b84528b88b94b1101cd269184508" }, + { 2090000, "24d3a03b86991aba123e5411cb7c1b61980534956bd17924818be115a93eb672" }, + { 2091000, "d81880ff30121189d64a8da4fbfd9c76b092d7b1011fd6ef8ee76dce2910b005" }, + { 2092000, "9aa0b3d813500842dbe35a8755fad66e5d526fac4258ee1e2049aba79426e20c" }, + { 2093000, "532d726b0f82cb92cda07df936cfb41f4321e5a55d18c30ad9e9abd89bc694cd" }, + { 2094000, "7d6b18f7b9ae1c54e4e335697e6f4811f51ea52cc67ed93a4f3e4abcc16f3fd2" }, + { 2095000, "2373d503d4abf9e4f46dd37b4d4db86f6e2146b032f65525a10d15ba41d4823d" }, + { 2096000, "d581c9789bf8fd99a2295818204100db70db60a31f26d0f7fbe1b5394a464cef" }, + { 2097000, "2b90c6ed224aa86ccc6cfd6d0de2e4d40009ee51b6aff043429d837e2d15de47" }, + { 2098000, "14988118799a8f7a3e9c8758a2e2533a51ddba18c12563e1673e3eb8f357c684" }, + { 2099000, "538fdf7a7bdd9045dfd5a36221bdda8f345100ae9ad465f419c983a26ba67ae6" }, + { 2100000, "affbe34e0e3a8eb133929aa70043243034e69e4cd29e572e37f4b3ae77a3ce3d" }, + { 2101000, "449c02fab4fb3a2072369a3ffa6d7c2d72011ab324d6bc9f8ae89663571026b7" }, + { 2102000, "86734a1e9e6aabfdde9e3e46b470a1e6cc2de4c135558639ad0fe0ddda4d142f" }, + { 2103000, "ce37575a3b442b389a11fcd6bb124e406016fb430ab185b91607080798b6b7f5" }, + { 2104000, "2af1ec17e7d7921a42d6befd4b7f05a0fe91fc49ce064b78beeffaa178c9b4b7" }, + { 2105000, "651f47e5816c013251fe173341be110c871ba54afbe8714cd8d2ef559a92a24b" }, + { 2106000, "d7772ff150f50e19161d7f3d6bb32626c168c04210457b6e52255fa069b84e6e" }, + { 2107000, "b33b5b7acd526a957a474fa8d2009bdd9f607bde7ae3ff1c1a2ab3c4d909be01" }, + { 2108000, "26fa3ea83837f275b11a8ab35262ce7dd827338b66711ce7eeb3b06fcef574c6" }, + { 2109000, "73a7890f913e2361215026f9e76ce52fdc34e5b321dabc70cb7deebe837c409b" }, + { 2110000, "2305398c068679d95ab41d80725611d5ef8d91b948c48df5fc7caf2171487d64" }, + { 2111000, "76fab55eb7ea7d94e6be4cd7d8b79732ffd3d4d313d2facb86b225d572237cbc" }, + { 2112000, "e1348710ce04ce2dc92e4765729d37745d29e815d7c1e0634de777fda255f601" }, + { 2113000, "c5bf0d1d55037bbb1a3f0321057b09b714c4a233b9c4bf3a797beb8abcddf4e7" }, + { 2114000, "b155483239c89982261f586d493afd9174d46ef418ca673777cb6e075025a161" }, + { 2115000, "9e0c350a10bdf25b73caf022be4bc731dfa95a2333233815e14e661c917c55a9" }, + { 2116000, "0eb7c421011d47fc2b01cea23c76ede950234cb463be94de9f56f693ec01229a" }, + { 2117000, "04c154fc0d7386b734d2740d725ee4755c01f00fd3c79fa23b5a937c51d2f935" }, + { 2118000, "7da7fc2d2562247befa055bac270a65b79b00c82c3e9ed02dd8b425e516632d3" }, + { 2119000, "9cdea9c7b2ffa063c9fb7ae63431ec6f5f314f682e2caee0e3f40acfc08ddd17" }, + { 2120000, "7d2540603d40fc92a56044060df4118ea4c8f191c5d52a077f33c60f37ddc4de" }, + { 2121000, "64bcaebd1d7b8915bea43ce2e332b124a73982c81928eb723e7bddb4b7c28e16" }, + { 2122000, "b51725acfb249cee76547174dca6c695f0504ac169664789fc249850a3ed6ea2" }, + { 2123000, "d63f032e504d010fe97eb746af331346d362b98b04a4a5d6e16aad0e999a5809" }, + { 2124000, "698cb32a3f1ed4a6b436b883482c91b5ba17cdae3968bcd0c23e24b6095f4fe1" }, + { 2125000, "436160f9f5991d027a270db5aeec584862dacdac984fdb0762237a272b8c2293" }, + { 2126000, "3b74f31837f6f24b1ee030caf1b2f2ad91fa8c105081adcff080dda60b36a864" }, + { 2127000, "9bc2c42678c1ae42fcc65fbbe038565014ceab527cdca4987a26d6b34481d874" }, + { 2128000, "a2ca3ba8f193e29f10d23c1d3cdda8cd949c27cbd41b5d1ee5dce8be5848eed3" }, + { 2129000, "01aa86894382d10d0319165915b8d2dba8ba64260a2704affd2d55ca6ac0b20f" }, + { 2130000, "24a0a11720366c8f85fbd5a63c9e2cb119c2e83a95bbcd1c87e94365a81902e6" }, + { 2131000, "4c13b463209792e378840ec332c5de23260a602bd232d15c1578c79906334455" }, + { 2132000, "4f687f0205035f09cddb889dbd1072d1ace4b7edcadfcb51c6bca44e7f5bc651" }, + { 2133000, "1b19db58c5d7852008695bab94f5de38bbae4c844d139eb4efcef3538d5f3729" }, + { 2134000, "8137131d94fcfa2e311cae34116dcf4e2698eea6f83d6abd98d6439cf860d722" }, + { 2135000, "e66ea675382adbba36fd92f5cf40d942b63063f6b5ac02387c33b3afc643d84d" }, + { 2136000, "8fdd76b214cc077b58bc823b8ce2ec119c7711cf08c1efb48a2ca3f4f779b18d" }, + { 2137000, "30ab7584f31200806e9382756e887da880db36427790cad841fc054274e200e4" }, + { 2138000, "1e27ad33bc6c0803b7ecfe271a498dcbc37fdaea3b0c39283267a43075cc415a" }, + { 2139000, "a25b5450cfac1b6ff9fcf346d88bb3b00628c0c08e9f7f50fc8a4c80b1fd1b17" }, + { 2140000, "4af501f18a7ced7fa8ed85e54772ee59b4823c2728124bfba159b85a3233440f" }, + { 2141000, "254d29fc59d4b1a29dd60e8e1c80ae9cf64fc31f59a718b0d1fdc590e65c395f" }, + { 2142000, "447144e764fe7e512b6db7a1e07f2a01da7eb7b5abd1a7eadc016f5a01cf0661" }, + { 2143000, "77394b6266b81b0603ef18ab2cb7a2d75ddea139905eed4c48e959cc083f9ab4" }, + { 2144000, "3b4255ba9efd556828f0cf204ca2caf792797a4d35fa2e05861a01525b2bc2b7" }, + { 2145000, "ca02a47fd10166d45678d9079930f0588f7250c7b712a368e3c0840a297030e8" }, + { 2146000, "fa719cd05919ebd2300bd22733ea4cb934178554882ceff44afb0cc006a20f09" }, + { 2147000, "758093d2ed99087a5712e76f81e224c7fa6da3a7af38bc66396d371d128d9ac3" }, + { 2148000, "baa77d343f47c59da6957f5441397c9be7a83c20cef837cf7c87ba649c617852" }, + { 2149000, "1d5d0dfc2eb00656c37714afc2428d81749e4b40100b674872f8d78f6b602a45" }, + { 2150000, "9ba1a3eeaec42ec5116a9e53cf3aeedde4dfe6c52848888470fb83c81e18553c" }, + { 2151000, "6524d3ab3f870fea241e4dd42091b65763dfeae1d69c2ea23b27971c90154e8c" }, + { 2152000, "f8530f17583e810964b14d58da62555bec2f42f230067c169069b6cd532827af" }, + { 2153000, "8e2099e43516a110ef42d62ceba058ca437dbc4455d1590e4490836be0abe778" }, + { 2154000, "87e6e76e10d285e135d2f8a63984be3a8883133000ede485ef91b3dd4b0393a0" }, + { 2155000, "3fd425fe78d301503fd3badc49088ca3f18fa95c96641ebf3aac847702b2a60d" }, + { 2156000, "590cd1cfeaa44445322bf80f46e4737276af34dc105856dbd773962af5547449" }, + { 2157000, "1819caf34517003528c28bded873b54767d9c0c49f41da17775650dbb4650667" }, + { 2158000, "d47798e294dd90b540fdebb9ae2c11cfffcd99e26edb989b9e46c6f501eed0af" }, + { 2159000, "6d7eb22a5d7c999ae3090d5159d6910a7ca9a9d64e76d8bc287e6a11893217ed" }, + { 2160000, "b7086e10bc39b5cec783e07adb9a0389d8e1a644230a4271cbca5a84306559a6" }, + { 2161000, "6784c440ba2ef830625fe20b615fb6167aca91265e8cd5e569df50f827601800" }, + { 2162000, "631706cdd92ef0cb64d7e573efca99e50e544a0ba3be02e4024f72baa06745ce" }, + { 2163000, "636cab9c29d6ceb713f51f454a7906f0e997389c5029057b535a4459ea449607" }, + { 2164000, "c22b0eadd83b956aff1adb64048fcafd642c765a4a47dd4b08ebda2eba233a48" }, + { 2165000, "2025ebaa5a5dfc2544e59e365fa43e675128eb4849527f601368d093f07007af" }, + { 2166000, "4ead2fb3bdf10d052e91b13dd35b7d2610406d4216be331ff21ff24b7a89caf7" }, + { 2167000, "a2c753f146afff71e6e07ab0327fe9376d6bc6956c3e9f46e27e40fd7dcd6276" }, + { 2168000, "a459996824d7636c953b217da724a42da4b105a79bb002749fdcc004583bdd52" }, + { 2169000, "eb1f314e34b1d55e52d0da81226824daa0c1e2f993efef7b68b93a7c000c8a8d" }, + { 2170000, "3205e12692d7f6c1902a4931307f2f37c3b98160065fc7a32e285bfec2e54ab9" }, + { 2171000, "d61f9acd8b100fee82a76e7a0c955bdede9cc5ee447c95c10b44d0de6c9f9112" }, + { 2172000, "da34f84dda951540df42bb4c375d8e6eb07b9e2298097367f2bc92a21ee4c610" }, + { 2173000, "1ada0ee6c2cf9113026c49926a194eab4f0ba25fc714e44b3863545817456041" }, + { 2174000, "e94871c2a2b5ae3e16f9d945491dae4d9f1eda14d83d3091ab60893561f19130" }, + { 2175000, "5873dd1597b6123aa01e7f6cd38b986b3432d845b27763399a670a4c49e5b068" }, + { 2176000, "47cf1fd022dd685f431aab3c39054a7c30eb57176ad0f9bc32db7b7c5aa8fcfa" }, + { 2177000, "c0514ce93525e3c735118434ffc7cd7294aeec6c827199fc4339cde0a9f5128c" }, + { 2178000, "c40562c6c9175961db908dfee44423f98ed48b479246385d8a634113ad7e5a92" }, + { 2179000, "4799eb15ecdbb726270dd3eff1c1348d4adb8b66d4d4727bb5bb7e7b5af31f4c" }, + { 2180000, "5beb3fae4856a4bfc0a7616ecacff0a2b80c92d93271c503d448e42f9b44b823" }, + { 2181000, "e13fb4cc17388703af41eaaadeb151d76ae547884617d6b42b644a8d3671c648" }, + { 2182000, "642aa060a213e6d953df08cbb0c19bcf4a920749918302b6945d3e6eb9de7bb1" }, + { 2183000, "fb97875d2b363c5d59114e3f4115c24c0a9de333aa013e8d2158aad18522caa0" }, + { 2184000, "50b9ca2d85ae3336300d3170b58d40aa3e963e0c7898798957341edb9dc1380e" }, + { 2185000, "0c3820112a3574d4b3ecdd236df17f182431c79b0270dff70126b4587fa6154c" }, + { 2186000, "52a55664d933e23b630363c264002e501f5a3f0f51dad0f3e6e5d6ef981e0248" }, + { 2187000, "4249009f9cebcd236c15fe743dd8fc44b31db5069f4e73e146cf49cf62219d74" }, + { 2188000, "1a3279322422ff8dd01cc65d50418e6901016a8755df51e1c6899a567ac78812" }, + { 2189000, "af510af2d906544485eb00d85269da5201e9ed61cc3943ecde9dc53f0096052a" }, + { 2190000, "d12e9936cd2e0b0e863498949ff2dd7c85ceb5427bd551cae36b2bb726dd0dcf" }, + { 2191000, "0867375fb3a5c7d5a3c30425b09608f2744589c3b0dc30dfcbb62798cece87a4" }, + { 2192000, "108453aa3e117b0322eb9e947f4f0732688b8664d9da1e04068512c8ca1cbdc7" }, + { 2193000, "e4fa198812790f8d5089ba17451c9b81fe2c3220591068ce602fee1c678cdc0d" }, + { 2194000, "a25bdaa6bd059c73eedad5f0771dd1fb29b58cbd6dd2a05f27df9abef9a3993d" }, + { 2195000, "13c5dc49fa185569341e98167feb323d8243d00d173f700d6398c5845c4d2533" }, + { 2196000, "bbb31288f9c5917b693e44679fe7d71329435b4df16a20ca660358fd31791047" }, + { 2197000, "47007f5503c011ff06c469d8935208a0676f00a36e1501ce475555a9c5387f21" }, + { 2198000, "5f2662e817a54f09c73bbd115299892839b961305773f03422a7274bbce8b579" }, + { 2199000, "8d86a796e1f7ba42b3953f3772b2b9b47bf144edc3c9ff8b53397ea347d195ad" }, + { 2200000, "7b75666b0c743d7c7bf9e6de9256e0e90dbe668f05c1736fbe90dea40e2ea2fe" }, + { 2201000, "c334ed5d0574943f25517ac154011a9eaac32d9e1528d1abcde88d0f14693e3c" }, + { 2202000, "8b69fd156b4f02e3aae17b409f34603a6c5506e2bb4b725770bc91c1913c95c9" }, + { 2203000, "c86aed5c54dc9dd23d547fe543aab8e691636b435136191b944b9b84d81aa1a6" }, + { 2204000, "4bdb78d2386d375e3956f042570587d109cd953afbc5212f91e88f49cada4787" }, + { 2205000, "3df20398d9a377ba6e88121900d1a3077157ad1dff81dd9ba62b260f08bd2a16" }, + { 2206000, "eec1915a092b38583c7495f8b6a1cd5f49ad57daefdc32757ca1444369650754" }, + { 2207000, "ac9339edd07edb0f049d49c62d4cf5ccb85e2ac86d9053f0270588fd7944fd91" }, + { 2208000, "a200047c346addb3560bfa31c8aa7e0d098e332a8bdf842f72ed2ab2dbb7a379" }, + { 2209000, "db70233321a72633f2d4d5a2b9e9277ab9d9ee530f9044e7ec3f06b18ee32b4b" }, + { 2210000, "9c38c3bff9ab0b9ef0f811b9043185266d1f35bbb958250476d0c3bd27000d9d" }, + { 2211000, "181d02d1e62a52e529fa01a0fd8ea2e905922e30f987b0ecf0596c93c7741603" }, + { 2212000, "d6bc1af53495bb9ee3dd0abe99a40aa1765ae62063515cf8a40415a75f1f45d3" }, + { 2213000, "32dfe1bb67bfa31d0446d35925f55fd53d0782fb81fcd4e1ad3195d29e505cb9" }, + { 2214000, "aca9fa8c195da5d56dbfa9c50b1a55a0d18d858553da29cca878c5c9dced6965" }, + { 2215000, "21dccc0b29993e7292cb3273484354e05c341e6808b02a2ea32a9c4aa527ea44" }, + { 2216000, "5a34923c885a6adeed00aa905cac95560b91ca7225dbc4b8ba535c7d1d7b7e7f" }, + { 2217000, "3a09f94b995439b5f27264f7868bcef30e991b214f15b697b3e43bda919cc555" }, + { 2218000, "8aefaf343689fcd9a862b23652fae22d482582bca3bff4f732db1df93d6b5217" }, + { 2219000, "ee2dbd935dab6a5b429494acb7f178e1c4477754a4dddf83f8dbeb6e28a27af1" }, + { 2220000, "70475415184d51f0386e4493c6255adfa89777677dc73daa45870cc395ad2dca" }, + { 2221000, "2ee1c6e10335893099a2ffdad1a1bf4e781b1bf888b1eb54e7146079fb084b27" }, + { 2222000, "d8ea4e0ca93e4c90d3a9ed53724856e0330142df5fa4db78db202396af4da050" }, + { 2223000, "d89ac0391552b66c81f416a272e21f3c854583567f94501617b24fdfd47383c0" }, + { 2224000, "9a30ef63b852a77f4a4c61bc119cae6807e2c6d1bd776f7ff16492a1085105a7" }, + { 2225000, "d9d7326f394f7ba41f8a089b95a69235960a2b0aae1293909a02238c4db34a52" }, + { 2226000, "963ba35e17303d4395120b48f0edd343f287e78e90a39c14d6373ceb1da8ab07" }, + { 2227000, "082270c5d088583511665670b9c21614a250387e8baf4d7a9de0b7f7456312d0" }, + { 2228000, "e8c4a0b28b2d696538b1648a06637b9a2a413f171708869e4d3986208eb7d193" }, + { 2229000, "94918ed945e05aa512aeeecddd29364d6f4a16f502196f4a4fe889e091b5e8e8" }, + { 2230000, "3733acb6ade0a07dd056afeb522ee6a37f276f68939dd9908d79c477bc6b53d6" }, + { 2231000, "e4cfa3baca1f00eeda3da57970a64c8811a59ed2d4dfe60ee4879499e1693383" }, + { 2232000, "2cafe814570a40fc82ba035c99e494a81c26e85ecf78bf47236737af844a44c8" }, + { 2233000, "0844b20c3a6070660096fb79eb675faad26b07c9c387fae58a6c231f9e707c64" }, + { 2234000, "7a0ef4c987021aec12dc0a4eb18608f0a195b0aea0371aeee356c8cf132fd113" }, + { 2235000, "43e251bfcccf23409ab212a5b18a2b0c49a2ca56eaa94436ea9e0256ac9b8dca" }, + { 2236000, "ea5fe254780228d19d8a27f6985407f88b549e9df1dc2f2280c50ea5f42e63b2" }, + { 2237000, "0dd0607f072062dd4184a34f3294e67f5a8ad14ce949af6e0c0a84cda650c6b6" }, + { 2238000, "ae7f1063082e3a1f71d817cd2f47e7de5b2707cabfe0e9efcf9c9def4e4d2dea" }, + { 2239000, "bf62b9020a182432b5aa44fd9ea00e2d60ee66f6f38f7754028e2c41a425457e" }, + { 2240000, "c1ae7585d61296b8b016b909c2e0273680bf700e30d172c8310f939924468371" }, + { 2241000, "a157b62256dde76ac2d5781096673df96f41e18e47b17d3982c483904b99a4be" }, + { 2242000, "755f582a80abc6561f97d8ffac21634252257f65c118a39e0a8c023d621c7775" }, + { 2243000, "8189de82f67b2886ddc55566abbf0daa7c1df1b36b73dd48a6e081486623e785" }, + { 2244000, "160473063ddd5e03ec5eee54137c48233787497da862970280bcee3ec20d171c" }, + { 2245000, "bd68e842759879aec30b198ef0df8e17958d40f374350b2d2221527448e58d75" }, + { 2246000, "7a4dcb47c71cf7118e11bdf5c1dd49e9f50908ce0044423a0e4ed782a4a50a26" }, + { 2247000, "53d761b43ccced5297f12b58f2af0a7979327c4570a19ab2a7657d9cc6132bde" }, + { 2248000, "0fed5484767e09df2cbc76e98ef1ca9865d9b5c9eb1b5f442a090f8d63d70c0d" }, + { 2249000, "ba483519ee63112d6f188027cf353bade93ae061fa049cf1e093cf4210bad628" }, + { 2250000, "daa4b44006bcee51edd9263ae4fe512c4b3ea1e8f46737b8acc6dbdb380a619f" }, + { 2251000, "baa7a96f0bbdf57d7313e5d4e9cfefa1ab784c5e5c038c84a43a51bcd736ad83" }, + { 2252000, "e354404ef9606863602a865eae21b99600607c21b818e4c6746db3455fc3f920" }, + { 2253000, "27068a24b5b60c5ec045a09ab781a884f66505f490fcc9be2d0d66344ca4f3a1" }, + { 2254000, "e034a2066a53a366ca41f17a7f5ffaf2b6fa31c7cd916d8108926d0c4eb7216a" }, + { 2255000, "2b5b1547c2dff5cb64b6ff7accee9f1bd4d4db319ce4463f8c3572d7663260c7" }, + { 2256000, "e21a19565a44ee5428376a1f6afad5c06971ea400f6cd7dadbf89b34ff68a072" }, + { 2257000, "de0c0aed5fdf3e36810c915373117d533dca74ab4094610abc0f08d795506cc7" }, + { 2258000, "5d474cd7103c8047b278b74219e41a395a8d979cc1d99f1052d5f9a7ae6c79fa" }, + { 2259000, "4a5573dbc5c8ebb01a8495096068ca6f31a23a58b4e67b1616ee52274240ba6e" }, + { 2260000, "ffb34fe002416c5bbd603b31fdd5738dba32037de3c66782decd10b73c9db828" }, + { 2261000, "79bc9f2e98103cce54dc3ba3c265a7c555ca456753e6a4fee7c5c4994719af96" }, + { 2262000, "977e594ec352bae9e19532cafc273b49e529bf939d4f9baa2da88daeb7e51e8e" }, + { 2263000, "e3bcbd1ff0892259d79944b7d4cee59c6b81c7f450d89b70087d47962a95c3ca" }, + { 2264000, "505323d6948934b33ea1c1094012cc85ea7544b3017549456bd14901205bc88d" }, + { 2265000, "7543e67f132377416de1a67fe5aa7a80576031de52cd7af110266fd5abfd875c" }, + { 2266000, "ec1fce7805db0d54618445612de62d1959849c26e92689eae1913923a2d0126c" }, + { 2267000, "427e6650c9371fbcda64cd902b42207a4c781d88bafd7f2a80e138a10cf6b802" }, + { 2268000, "fb396e0443159917ebad0a08a78a190dd1d90a97d440bba20d14165d88c3795e" }, + { 2269000, "e9770f3f5a3427cfef141982e79cd6ce2f4bfe8c2ff8861182cec97242c8bd3d" }, + { 2270000, "0b4317950eb50d049414e400a6f488c530d9f93875b62ec6e3f3896c96a88224" }, + { 2271000, "bbe32e8aa6e29cbd98647796acafdf02168d9d1ed943e04529d1fbfc0a7bb17c" }, + { 2272000, "947e9614d040eb97978fbd1482bafae47962e27ddead68150a1328563e15fb4e" }, + { 2273000, "a2611479ec9e2e623cc4dd59bc3161af44f12fd4fe01d897c1465accf9ce93b8" }, + { 2274000, "e76a6a528860db1ab29eaf73529277fad6af434df6247417366b72caa8bc89d0" }, + { 2275000, "b0e2a07494e186c5e4ba0e7d1fced62ed7fb352860e96cb3220c7991568179cf" }, + { 2276000, "c9a5852a070cded44bb25975962ab279916992cf8097810005713ad6f9425143" }, + { 2277000, "1d1ea83df25cb4046811ac55babb4318370696f26ee0b928afcaeccd1d8b91b5" }, + { 2278000, "3dc0d4924f06775dc17b09a4c053218a8785d05682395a00107106c40e9fb47d" }, + { 2279000, "7e5afd6d9fd5157dfa1e1eb2ed237811f34d24fdbdfd53af9e08a1972434fc6a" }, + { 2280000, "3c90e2c9bd14a35d3b47e36b609adca49d7c8d11e4ca244b3c590f925484670d" }, + { 2281000, "33725b02810c87b23a561671b8cc88266869617eff8722a61d294360c6800ac0" }, + { 2282000, "aeb73ba4e0224fbf5de9624db4423b8634d92993e6b08718be092960cae8dbf1" }, + { 2283000, "ed442690ab025dbeb768e72b39461d10e5b4d76c2b2cc111534b9b362b23e86b" }, + { 2284000, "7ed5a064954b24d5357ac66924d5ff786d6207655e9c494fa588c19af4e029eb" }, + { 2285000, "6b7ef1927f93040de5f5af4e54ceeec1741b36cab2c7bcfcd698966e9bebe10e" }, + { 2286000, "ea239c8c967ff7200dda0ace6a1a8f4343d5a3d782120fda9123c09e44496a94" }, + { 2287000, "b33785fe1656beca2a54a7b33d60908dc2f384332958a3fa25d59c0fcb1ac240" }, + { 2288000, "ca6e2c409864101b76db5c2af8dcc728172f97271b4c0cf92a3574e4a3ff194b" }, + { 2289000, "87ae1c42b2724fd037fab4ec9087619fb6efc546b84dff1db84f2fc308c8f28f" }, + { 2290000, "0c5a006caad2b37533f6d138e86aa88658495ea866398e719cac45188d7f128f" }, + { 2291000, "8f47a88442bd270af71687bc67c4d827c93345a313923d5ac2be0ca11f1c353a" }, + { 2292000, "350de82718fcb71c3e1ca07cd5fb697d4a30dfe5dc49ca144f0a39f484e71749" }, + { 2293000, "70081e64addcd8cf2f82a8cfd025a0e2617ee38bf131abfebdab76d75eba5b96" }, + { 2294000, "9b10b43d4f7fd56cdebf0bc4a4a972d5657e68b9d142fb203271c037fcbce4d0" }, + { 2295000, "5a21d694dba7aa81abb208d4dcf20e2551e7417cf73b0cad44d549f6e32e33a2" }, + { 2296000, "c6e64234bf4276308a29bff81e279889b44522055f3f25278e9dba81e76c5988" }, + { 2297000, "a15905eecd42a33b8d1f4cc320364c45cc5316ab917e01fe31543620d141393c" }, + { 2298000, "38c33c729b06d995f063d80698a14dabb72e294ec91da91f731096fd5c470231" }, + { 2299000, "a7828cfb15aeeba9884c4a0573b60795bd9ad9ba2b2e82833c7ef69194555097" }, + { 2300000, "fb81383ac4efe25ec29995f8e85e1d9a16140373b31ef3ffdb193d691315e0ca" }, + { 2301000, "65c98e237a6b3890318d62e7be2b4abc019d98b05fc6cfd593ca9128c2e11e86" }, + { 2302000, "7750f44d03ab314e1abaab04b82be84059d20c64177eb4b4a3746feb812550be" }, + { 2303000, "842ec42f1b93ce5c61c56fabc609e7d4225d402ea8efd38bc57561796a06fd4b" }, + { 2304000, "e4c7de93fd6596ff699b3a284974c55f389372f0d53dfee2e5d955fd958fc7c8" }, + { 2305000, "6a14a12bd8eac29df964ea8cdf559b3f686571088c26c9f1066bb7954479255b" }, + { 2306000, "38e6dd10f352425ac307d5702e1ef0ecef7ec5c2ecdbbe35750c5d31233786ee" }, + { 2307000, "86e0384f8fc9f3e93748c1524c3da8fa39821808f17a2a1ecc07aaabab31502b" }, + { 2308000, "f3dc242cd337acbd65def8eb7a203bde2ee9db0fe9cc6d3643c06751d573ce5d" }, + { 2309000, "80c25c6d72d10410118a170098cbb601e483a123666539915be02063a9a5759e" }, + { 2310000, "6158193921a37e325d232ab6b34eb58ef087e171025589b9ad69c8b1360d4e8e" }, + { 2311000, "900f162e676c4512c6c7937411bcabe04b49719eb036e864c263804469703a44" }, + { 2312000, "fa9aabfc9da426487346a13035b48407bb0deac06c46e24d53d8df9261123837" }, + { 2313000, "11750c5126c15857631ecf5c4c6fe7ceb7ac58c73ce25c2ba45488c0d64e1d72" }, + { 2314000, "4b19cf58bca9ed1ed254dd13187762716384f01c8b939a9b3c5185950062a089" }, + { 2315000, "1213ce12fd90e0727ac52d8458ed87ee6d8c63eab6c395bb1942ec8d8bdac575" }, + { 2316000, "d98f5606f9ffe1bfb3e172d7da017179cb9cca7f4ab6bc9f71c14161edff7fbe" }, + { 2317000, "7c3dc0e15446330d92656bc9b4babfa0a1e819a8a0d5acbfc17196adb8d6d2e2" }, + { 2318000, "3edbaaac7f8edd02477d4be0faff408935d804bcb8f360cbfe231f02e088cb27" }, + { 2319000, "91f5b6d26f0e08deb2d8f19310566324d0574e84cc8f27fd9106e3e3380c962c" }, + { 2320000, "51fab90ed2af5a6dc4eb18ae3d5b591529ab8cfd7d49da2b2b4408dada68745b" }, + { 2321000, "c855fce103663cad7bbce39c5df77ec6a474bf999a111d90b884987b5e26fc1b" }, + { 2322000, "42a602344b180e1c15f01f991b56320e7490187aabe49df8fb765058069cd304" }, + { 2323000, "ecaa36b93f25b51a1ad07ff959386ef255a3cbd8b4e3850efeb54a51c83edf62" }, + { 2324000, "b76e5c05e0f2445e4601f3c418d4a9ae4bc073795dd442d8040df8b0ba790220" }, + { 2325000, "0834f8a68a5ceb81387440eeaba75c67e6a811eb62c5079785b72921ef0e8897" }, + { 2326000, "6ce00af357920fc07c30e2f14bb0a89b4ab61068354b4e27ef335a41ca885b71" }, + { 2327000, "20f1e0b25e71b5c32b7bbbc294f4d30ffb416d6bc49ab7ec2c3a3af6797d009d" }, + { 2328000, "5734baa189f470c3229d31d764cda5abee0f1b93e2bfbbd09b244959287279ed" }, + { 2329000, "69640e868fb4b7fc6b4ea9e32c8994271816f161faeb88c62242803f1d4fcf8f" }, + { 2330000, "f5fd093b69a744f366b44eac37228e10040ed1993078f70344c9c52bb999fa77" }, + { 2331000, "955b0d1b0810e9c57b7709090edb865b66c2c4f384be28c0118edb863e3f76a9" }, + { 2332000, "6fa1fb264c37ff092bb6fe380d4cb3d3cba00772ccc78b2c30da5de235211979" }, + { 2333000, "8f85e52d863515c296622f7520237bf28c8402544b636f9fb24cb1be2eacb973" }, + { 2334000, "b043676fc6c0f9075965624f8678c9fbc84cd117c21dabfda15ab753ddc20c0c" }, + { 2335000, "2d628fb8d51b978f15706dc76e68ead7577714ba0554e752bb5da96644f3865f" }, + { 2336000, "eea1c0aec958031a7a767d02d394fd0e6dea5fa55306ff91d60d122f91039568" }, + { 2337000, "06b78c8c80942e27dac1f1bd275b72a0ed57e71295cb9c35a9ef0ab67638b2d8" }, + { 2338000, "477579230e2f2a243231c73b92f0df400bc2692b828d87e232b9b63d2126ae7f" }, + { 2339000, "5960c7aef04b9ba9c6ba88f5dbe8c45c328eecd19c6bb998c896a6fe2824e504" }, + { 2340000, "6c6fc49cd2c244d383c4ff959c1cc8e60dcab33e0b09bbfb13c63437aefb121e" }, + { 2341000, "24ce0eb54da3766177e426407797b75a3397afc6efa7ae30bb667bf86e5db509" }, + { 2342000, "db07bf1c73c1713efa74f0224a59c3ce3e7b437fab09c83507849640156b0ad1" }, + { 2343000, "039498f2516040eef8b4c26281009a9dd342535a4c6d4c243e0b2b251a816f51" }, + { 2344000, "f645ebf1873ffb5b463ad6b8012976b99baf32ec13e899effc4ba528d559b5af" }, + { 2345000, "4302c7a2f4c96e1e92c0a00451972b8d048cdc83538c1dae6718e01a8bf6c0cc" }, + { 2346000, "31d8bd979c51ca22a4908159c87a7e7a70e8083efdbfb574a59041cae57e6147" }, + { 2347000, "7e2337b84a39061c9258cac1c99a7af45771339d8021afb322a9e0569cffae1c" }, + { 2348000, "364c66eca080e3ce32ad7595d4337050289b7afa64a689f8579aa8b31a5f7af6" }, + { 2349000, "0318342c3f6fdf8f868a976575f8f588fcb4ebd981505f38ade43df181c24091" }, + { 2350000, "95c1d1b431674edcf3b15fc63ea14f5364011b17da6658b218e1a98a7e36322d" }, + { 2351000, "77312483f000f7b6b7d01d03aaf274b858d7e39542c6b06fbba828780ed2cf09" }, + { 2352000, "82891a17c0b41b2d8d083fe8ae66d533a59313e11c527f7a9c2a32794d1667de" }, + { 2353000, "3726fb793dbd4f231b7a78bef8e4dcf3e198704835a3e07b15f4f73fc809225e" }, + { 2354000, "5e859c973a0e4acc9e99ee5a2fcfd4d5d022d509ec5ce8c95e3ed21d89dea485" }, + { 2355000, "63e1ea81fcbd32ea0950b99fa0655c21544926fc607a445d726d8d855c3c407b" }, + { 2356000, "f456c49943ef738a4592c4a5b92ced08f74980d029e74d981b7051fbadf21b24" }, + { 2357000, "babe39e804074ff7cdd42dcafdadc640716ae6a1551fc2e3d3c71cca0a9610b2" }, + { 2358000, "69fd062b16d9423d339da5d7558317065fd679a4dfcedd4c7128ce4fffe40cc3" }, + { 2359000, "828f28a0f4e134a8d39bc75f992c7011682586c60c61cd2b8337a010e4ed15c4" }, + { 2360000, "70793daa730b7f4d43b3e76318f1f4fc91a161995cba16b004ffa0494703b53f" }, + { 2361000, "22f7c42b662da9444418b681c64eef9a992b3b0c09360bf62deee7728c71ec16" }, + { 2362000, "3dfcc653f09b192208af101e635aa8d3b66211ec5f8ab5acdc7712c7fbae2ab8" }, + { 2363000, "ecdfa7dd8d2cc37f201cbc5187824d1a242d2bfdf7c928c1721f8f32303f2711" }, + { 2364000, "237a5f1be0aa783b377ccac8dca08f5ec95e12318eba178572a0bc5a3c95fbd6" }, + { 2365000, "493d694bb0471b91383762e550cebd8e2f3bfbf81b1ef61b566af5d52615077a" }, + { 2366000, "5849b8ee1c13f85275e55523f0e2c49b6a559b5ea9c125b235707a36ec474c26" }, + { 2367000, "2c569ccda156046fda97a7e4466e48ce0da3c11a70ca48fa92e821040abfdd37" }, + { 2368000, "bdc61755bb8f83fa43f08c350a8b21dd299ca04918253bdb1496afb27d6c2693" }, + { 2369000, "11743bf15707a5663b7d570b88182fe13c4a7fbef4683846fe4c47ec979390c1" }, + { 2370000, "b881289834ea18b012d0790f9c9394cb76b6adde004d3aa01213a1e41a43d189" }, + { 2371000, "6f64441868c1a79b981f88509f508a2dcf8f538e59d8b7b2cc4becd523f0b24f" }, + { 2372000, "36bc1608c70389f4c365e482c0b7fe4884a11ce5c97897a97f9089296654a2f8" }, + { 2373000, "95873f87491b1bb65b0077a79b544b7f06aecae7c094c2f7fcaece9ad917fa1d" }, + { 2374000, "a5baa65d9ab17008e9d1afeca221fccf1fd3414b04a9ae72e95df43d3d7a34cf" }, + { 2375000, "35a4fe1b0c54af77436bb7d843a0818189f0aa006dbb254e894fb28b27e6ddf6" }, + { 2376000, "1456522b371113d86f4dc4792487de70e7de3706a2d8704a9c293f08433bf25d" }, + { 2377000, "ced96f60077c8a074b6d4e685d9bdbfc3127383fe574d7a9b8350fb8851798b6" }, + { 2378000, "245d03edfe82147f661c44b74543eaf229666689d6b04a6c475b4bc139df79d5" }, + { 2379000, "bb2a3b8ee3231ea68ee6d1e48468d365b12461f83952d2bd803ceed777920143" }, + { 2380000, "5750dec9daf6d568e166c57831d878c63f298cf1e45c612d9d7ff8a7969a00ca" }, + { 2381000, "5914a5808e7b55491ddce732018b6a8b77a5fbc46a5b0a27ffe293cb13a57001" }, + { 2382000, "a2f780ba07668c71c4ad2b1d48955f4135ea4ac4b2d099e61e8275662edcd915" }, + { 2383000, "513cbb9e445c393db56f8eaf6638d29a34da8ac22b3a721980495081995f1bc2" }, + { 2384000, "34d7f5759a30a4e97214bd8f82b303d77c22a281d5b5401faab8581f4f2c2370" }, + { 2385000, "259b0ea9a5e7ab8999ff1c51399ce3f511c2284440da9a92e558bd05eb062155" }, + { 2386000, "fff0148187a9b0c9391cc70d103f5f8089692119e4d9443e3d0df3d27ffc879d" }, + { 2387000, "c2cd40033acdf616c2cadbcc5494cfe954ef904ed6d566962a845ba4ed7ce28e" }, + { 2388000, "d2168519d4e163aa189f0d06845e3d832f46c3efd225a5a9a5c83edf042287c2" }, + { 2389000, "138e22dae92b39c151f125f181240f97e635657032ddde3a22ddd3d1f722cdf5" }, + { 2390000, "063dc484965a1cf0ba6fb3275b0ef6173e3d02791e88fd209e1d1219acbbb468" }, + { 2391000, "7f00f5a7188c38f3eb15a95b737a0b9835d49d3c2407a4176ce463a547cebc94" }, + { 2392000, "d3dba1f49b7b254e7f52170de135b9fbf315598e2a7c940ee3990a6cd0fa7838" }, + { 2393000, "eae39f2510aac595a4192f247d473ea030288bfe09ba1a5bf97b3a1487ba4697" }, + { 2394000, "b83ad56609b0ee1fa3a2bda28e6a83b7d95ba359b3fbdf6391ced48c327a4c44" }, + { 2395000, "c471716d7c3a04f6c9ccf578d28b4a4d4b6ba14d648c33f88de8978a0218668c" }, + { 2396000, "45dea3ee1ccb6c67b7856d8c4b8177576caccf18c4917891e5d0c934b04a7f3b" }, + { 2397000, "9e91abe80a9670f87ea8f519ec3e192815848ab3097863ae7281b11648928e65" }, + { 2398000, "81e8090c4e2aa560af428a75b9bb724cff3859b234db010914564c78d2047513" }, + { 2399000, "24f39f075ae8447a2a84e43fce45b02bf8910ddabf1cac0bae8c11fa942117f3" }, + { 2400000, "a7612655d0ef19c15687876d1b826bfa678e53c9c7956c586dcac8c438911d33" }, + { 2401000, "f58e1b07bf4f33b4cba183701a22b5d1004694ce8b0c22b68bb91ef50e17cb21" }, + { 2402000, "0546d3147e8863c96f92310d5bf9694630419823f278685180e8243c6a92a71b" }, + { 2403000, "ed2204750a97e9ffc3b45ea5b0d0fd94e2c61c581ce8d9e7ecefc5c66d07b580" }, + { 2404000, "16355ad1178350dd6fef4a0afbbeaf1cccaa3ba8a4ee9583bc2c2c5ae0f5a262" }, + { 2405000, "795c2165f1412e65875021681bbc453fd5d71f453bd6576d42e0e260db6f393d" }, + { 2406000, "2ba5cb57e81fe96b6337294246a186bc6c45b5034ee4ff4c7b4bda82defc67ca" }, + { 2407000, "7ba78fe69f7b2e259a0c7679f3276e04b4d0b39b287b88b1b91a67e22c1964e8" }, + { 2408000, "982e4b8ae903b992e6fb161ee8af8a71268b572acfda4efaa9f13897587e7dcd" }, + { 2409000, "7c5df636f8aa0a13e927c3d1d767daa7825ad18ab3e025765ed94c281d83fb23" }, + { 2410000, "d40f3d16b233354642f864f82dd1e661f5227b326a82e0361db666af31c2ac11" }, + { 2411000, "214461bb2d7ac22c38861c4a195345cdcddcccc743354bd54569384ce16aa3e7" }, + { 2412000, "bb2c80722973edfe1e043aee436de427c54abb31b053ba97d5ce8854f3711add" }, + { 2413000, "86b4fdc0e68ab24034652b0056b0f134e52dc9360762f95031cd80799f7d9521" }, + { 2414000, "d59afac1ee35f54daf208b7b06ef495f5a152bad535e8c09f88957cdbd28b192" }, + { 2415000, "d5a5b8ebb6f621a6f4bf0cfa8aa5cb07dce6eb5cfe52272944c21e86a4c15d80" }, + { 2416000, "9890d3d491bda6453dd0933caa971f6b6f17684337474e30ce87ed2a3bec47a7" }, + { 2417000, "c062d22f44d27f41544341dac2ef153ac8fba753cd76a7445e1a54c942281ad6" }, + { 2418000, "0f0781f011315b1636c152f88d364e60e9f533055ca8055cc0cdbdd83517001e" }, + { 2419000, "13b24eb6e85259434ddeb750828965b5a7aa02ebceef19848fc6e581ba6277d7" }, + { 2420000, "24635677a9cba39f794b9e1569b5fbf5a31661104c4d0ea68bba32784729e6f3" }, + { 2421000, "3456ed34613c048798fc0daedc44a8ab6fb5ff6f7b86a96f20477c14f4dfacea" }, + { 2422000, "1592ffc260faca97f91ea548a74f0eabf6220e3eb15118a97e3afb6604055e18" }, + { 2423000, "902cc66a97b285bbe01310d55f5a05886c07d4dbc35c0eddb2c5c821ab23a0af" }, + { 2424000, "ba2f5df32f95d4c2052ca3d54e2af7221a14cf75cc9a350ef7eaeb80d4193f2b" }, + { 2425000, "75d32cde27abe58e0ad3d2d26349cf378a94d454a24dfad215b52a336a8f2c83" }, + { 2426000, "baf5e136da80135ea6c70ee314f78b40b53ec21a010c5012983f0aa81f448cf6" }, + { 2427000, "7f685c054c12483562f8709a75a45d7164141a4bd89807e81457f8694b465243" }, + { 2428000, "0416ee23bd6d5d021a53cbb91c82e79c5e5c2063901d3e31a82d05ae34ad08b6" }, + { 2429000, "a2e14237320b9ff876ef2e2860b3fd2d5ef555558639d93695a2911125a2fbc9" }, + { 2430000, "c43f0b5bf14dbef830d0f2ad530e12948356a0f4ac07655b3b5fcebea997d6ba" }, + { 2431000, "d792e54f13e36c534f8ef5e00e96831b989769b0052afa05988036aa007769a4" }, + { 2432000, "e6714f851fe45eb0ec6b7fc5088572c2ffbb13e2f760ca1ec6d506604f850336" }, + { 2433000, "56375727c855874b63f7da265abb2ba4dabb21b9e5a4faa1d182069d6fe498a5" }, + { 2434000, "3a0ac14f168c18460b937aff4ec5ad75001925754e62a539c2ca7d35fe40f0cf" }, + { 2435000, "cf422d5e431376090e6d7f75638b283399c39ad3439c069f020f29b08f84de32" }, + { 2436000, "fe34c442ba06df667f07c2ddb2cb7c0dfc8f93e90275707df1cf9204ab56b190" }, + { 2437000, "6f7805b04731d0b2b2e902fd37c8ddd5210746ee5d99d1df4680e44ebfd327d1" }, + { 2438000, "180be0a9e6b5c1d6d96874661202dd5ce7a8cb9d0b4705ce434ea0e455dfc4e9" }, + { 2439000, "5e1b67c4fcc8db5ad3c84319316238eb54296a897740762f9f85df18b8afd2de" }, + { 2440000, "645d9c0d8ed5cfd2b8ee8534be67fa2fc0d95e7b38198a9c005cb16e0b6c0d3f" }, + { 2441000, "d1eb6a4afdeea9d45f7e33ec2ef8e11b42c99b52e80ba254054aad2f185f354e" }, + { 2442000, "31a2e87d1090afc45849cf7feb7e680c01318255a67bad40d0e07dbe60806524" }, + { 2443000, "65c53ef01de68934e77bf5d6fd4191fa622ce8dfec5aff77b0a8bf0937f3e733" }, + { 2444000, "4fa7b7d7909ec50e0bd6d412149850190e0a9ae45932f6d3a97a09adad07c245" }, + { 2445000, "56719482cb117fd613c310083d16c4a1d1420aed316f593d72480f3b8f6acbd8" }, + { 2446000, "844df7d3f37b3ae30cc08b91bb6db7fca47b836f438ab9a1ceb4c158220d75b3" }, + { 2447000, "8616d22aca850dc7ae4fdfb1b56bea94b16851434831916f54731a4d65ea6697" }, + { 2448000, "e68853d43870b6667d60fcdf06f5476eccedd7cfd43663df56eddcf0ee75fa53" }, + { 2449000, "56e483205ad54c420c66c611e5ac8bde866872f3734588a424709a52af595ab3" }, + { 2450000, "6eb296e948fe64caaef1f3f03e39fe59b888b80fbf3a2355dd27ce261f96768f" }, + { 2451000, "2eedf6926c6068bb9542163d08863112445c2f863109d7a49595fc8d111a973e" }, + { 2452000, "d9926779aac9f89e8f18301e8161aeac6ca3d8823e9d19809e919af9bb7a1630" }, + { 2453000, "41a9d0f45894c66e49c6a26555a953dc09fd1be8d029965e8d9403d65e794cdb" }, + { 2454000, "0b51fe2d0829f760dfa35f7ed43f6358ff82b34507317a0ba4652bac3a8ede32" }, + { 2455000, "e7b944f2aea293e84dd51c78c43711aa6c2538a62fe25796a4454be4df7667d8" }, + { 2456000, "a9de869f67f25828e87da9917d0ab9d8ea7c72a5a8a37a5de02919564f75012e" }, + { 2457000, "ac325ca6a6e873bfee16b1a1d79917a38b4a46ea0f5feaabc9adedac251000f5" }, + { 2458000, "a091a963c9793a41533bbe8f96d50c6aa1562c50ed2b086a369ee3832fc9afcb" }, + { 2459000, "7b25d7d3b1aec6e569a9775383a000368cc4819cc007ff1e36940f56a2692643" }, + { 2460000, "43674412db8a96e93d10c9b3585eba99dabf81a89db8bb0242e9237bb7d57508" }, + { 2461000, "9090cb815cdc4c608b7a466ff2ba801f550e48074963ff72d774f9af12e635f1" }, + { 2462000, "6ccbbd2d9fa00615932b52310d197ef3efd7a12c8c299b810561dfc95d44397a" }, + { 2463000, "04ca064ddfaa26aebaa8983844dbb4f861fa4295e8f7a56397353fb81b32874d" }, + { 2464000, "59db9fa192ce7b21146bd4621802a8d94426d6ba31a41913cd359b03683ba5b3" }, + { 2465000, "8c05079ddcd4abffdc285162cf8685bbfeaf46ec25ee55592c64546b94351abe" }, + { 2466000, "a88912d963d0b59f9aae476639f20e9830f8b8ebd51277f04558e61f76065af8" }, + { 2467000, "c33e45b7aa0ecb68a61a35701b9373897e7789fcde32251573cbbb1d504877d9" }, + { 2468000, "f5f5a699b88a7d26a936520329333f9b23653a4893e12e853f2a9458e7b0837b" }, + { 2469000, "ec49a37e8b557f252005ed28a191294efecdc2e354147c49b47d858547d388f8" }, + { 2470000, "ab4aadb9a628c0208a5296af3626cc71068fe06b6fc8f0d6944f3f4471a649ca" }, + { 2471000, "189da104aee7d93b7dbadc56d01e556659632cc79ddfee644a4da438bb763e9a" }, + { 2472000, "06c4174c43ea62f4e7d2a7b627c1e68f2d75b69b7705f4ec073ce32ce2913d31" }, + { 2473000, "7ed94dc9b77882da0766389eb207d46fae1bc84bd91d609c1d3a2cef0fb71b03" }, + { 2474000, "08319dba56921b8aaba22caac54238aaeb032df3bf9bc58e0f91b5824741101a" }, + { 2475000, "f4549a5638ee91ed111929da4b6dbe75201ddc6bf96d1d3ed16bed8c86efbc5b" }, + { 2476000, "82aff9fcbef0d7d7cb255c69f4433bf19aecde07300b3e8854f413eed8dd1419" }, + { 2477000, "2cacab8fb7ace412ce537e07ee3ac72bffb43f14a2c492de55782101dd370691" }, + { 2478000, "17f181cf7fb735d2c0703c0e6c21f22ee127f58ccf181a1b9d31a88349990701" }, + { 2479000, "df0f9d85bd92597f54d6fa387c8f65b0e886baad91f45d5f5f8e319530447f41" }, + { 2480000, "4224dff3aac240443c1a4f2eca7f88e33c6dc02168945007cc335cbaa4206d6e" }, + { 2481000, "c4d58e11553bbbd5b16b82d18a28e06b79498d2732b1e56490eb71f76d5d4213" }, + { 2482000, "c31d9e58a645f50f72e95babd7bce031c483ff69c53f68336b60a1810026e3f8" }, + { 2483000, "f67548f64bcbf5adf3994df4f629247f2d7fbe06ae69a61eb2921ad3445d3095" }, + { 2484000, "07aa458e3035d9e68e106084bce941aaf7503348ddb163e0e70b17e4573c9ef0" }, + { 2485000, "110cb5bb28c5e24b3898b70c231895d65d46b75da849e4c2104d9518a8ddcbe0" }, + { 2486000, "2842280334391742c410c9077085e275941bacd7db61c76ab3605c19f07b52f8" }, + { 2487000, "1632a1207f4ed3e580f9c9de91d18c4a953c6dc7de3aaec3b2caf9bd7c78a12b" }, + { 2488000, "b39a4eb4cdfd0f938134cc1a8aa5f239edcfa87adbc5440ad2e3c3d66adcb0e1" }, + { 2489000, "e381d072bd5b1cbdd1f979b33d9b8ad2f3e18c55be6eb1bb007fdcb59dd920a3" }, + { 2490000, "bea12b3d2bc2bf246b0d8acb06e096303064642edd3cbfb25aff46b28f7ffbcc" }, + { 2491000, "bf61ca3ec32256233817d08ead8c3946a185169d3445f26c9e33fa932284f7a4" }, + { 2492000, "f91e7ebf2997ae429418b6721f94ac01318fba4868cb9f623bfbb63b2fa143f4" }, + { 2493000, "c6c230f3e25ea33e5dc2fc1598774f06921df636e6955ea93a3e9e707e05fd4e" }, + { 2494000, "1cb1eb12fba06c401754c79f334db23b5b3ec0d9af570d430b9e9b9f1615a0aa" }, + { 2495000, "d74f1a10bfa6087a0718206fcd76811a329b3d02982d800682ad96ef9c98c1d4" }, + { 2496000, "ad9bd623e39abd8df57055ceaa9dab446a61343f6d1ca769623401a6c8daef75" }, + { 2497000, "0a24a07c5c6f2df0ddb73c82f0210828904399f4e8f25ba7f84b03ca8b4c2954" }, + { 2498000, "35b370e5c1a548209ea5ce9fe22b8d69331226ffdcf1e4749af48e44946da215" }, + { 2499000, "112356bd71a78bc130f72c1ad0afaedbe0b06698f41e02ec941db0ab0bcb4c7d" }, + { 2500000, "218a07b75622c0035acf653764bf66ef3e4f6a20d1a3e51f0997fcd697a9ffa5" }, + { 2501000, "1c9553e3873a251baa45e70f717f918d46f9e0b63a6ea8c3b1e54c8e5a717268" }, + { 2502000, "a0f30879976de53ab9a756396c70d1602ac2010083a956e648d9a7ad50d5a4d7" }, + { 2503000, "78b3ee8c1685a0abe575a0a57a8a730ceb12856d907ec52bfe5a3c87a9fd21ee" }, + { 2504000, "f57e367bcb136a9efe9113349ddf59b32d21756fd0ea7d44d9f93102d4e9fd05" }, + { 2505000, "6b098f0da6bf2bd5d37b31db9746bb4cc6bae05b1e85026971ba55f68eece0ea" }, + { 2506000, "9ee83d4e6b14046a1152df6045dc039adac9e61e15d377f240bc8b626204e4ba" }, + { 2507000, "ba710d30a04352962968c301643f0dafd390b7848610f7ccf186a90afc5d4893" }, + { 2508000, "a9819a251e67365a68a7810516b83fa5c3bc353cb73afa65f99d60d6ecd4aa49" }, + { 2509000, "8ebc86b6405c1f087cf33cd7b87f96ae999873af22c393b5cac48b518a9ab08f" }, + { 2510000, "bb934a66ec9e88395f597a79410a81f7379258e4e8ba71570a481b182784d0b8" }, + { 2511000, "7dbdc9a2871abd0c5c82d2c4c5187016cc41d056406d5a5e5bf7cb0e0a396def" }, + { 2512000, "1c45dcd5da0d5bd31695b9f9f120753020635a9271f3913ef425d519b3722e5b" }, + { 2513000, "714294c61262473b73db23175b022a8d478fd38530f77ccaef6b587e1d9773c5" }, + { 2514000, "cfab8d546bd8befb974a4596e1cf993df4f625b1485cdcc32213f9a6fd1999a2" }, + { 2515000, "d88d953e8f043c9d3ac8bc6cdbfa6d008e108fabf95c75c71c616fbaee865a09" }, + { 2516000, "edac1ced0a6082cedebb84d24d11f634c7353d1edb9315b63386ef3986438675" }, + { 2517000, "a658ebd912967172574507d4ffa71ad029808981a48038676c779a1815bd9df3" }, + { 2518000, "dea5e365685b4fe2d3c246881340aa88880f7360b77e7f34e239dd17f5bd3349" }, + { 2519000, "4a4c71fde2edea7c0793fbc2690125615469673abefbcbe4212ea79ad193e97f" }, + { 2520000, "dd014533429ee5621354ea753754fe9aec82978e5111f18b3581d41e6f885015" }, + { 2521000, "3ea4453e165b579e903e8c5d3c48f94dcd688237caf8bd9e33f998245ae36495" }, + { 2522000, "9e3af48faeb2a7369e22b48835cbae0b336e38ed437a41a73a425e6f60bb860e" }, + { 2523000, "4a9a8bfc69c927fbe9e222a736848a1674c27a9594d29f3722f2e2c312f16446" }, + { 2524000, "14e9953f0d4a7a2e97c848c2e229a7755da13fc28cf0fcbe6cd966f20ffd94ba" }, + { 2525000, "d0ab98eb5f85393cf274d4d841f3cdf5188f250f6e6049cccbb8207d4292bd78" }, + { 2526000, "fceebbc703ecf4deb998fcb55631b91d3ce7751cfa88bc5fbf36ea55f13a6ecb" }, + { 2527000, "8e95fc2d719aa891ef1e47e7e1a51729e812f504f1b72ec08fada962ccc81686" }, + { 2528000, "4cd72e62ec0b847964071ab57636c3eb987fe10ec9f59da978a272559c980234" }, + { 2529000, "d64b49c4671171cc6fa839c8562a4d8623dec171497251cd0500f2a1f29b95c8" }, + { 2530000, "0afc22056c896496b33d25117766d772002169584e2f8079f17338758395b8b8" }, + { 2531000, "883d8fbdde15b17155f638a975bc208963b803d153cdf72cc2b2dd547190e9d1" }, + { 2532000, "f2fbdb38a6275f07357fa79a4e5ec786293a536de7cfde395c70faf7afd46c59" }, + { 2533000, "5fa1721360552c53e5ab00fc619147cccf7a5f31b49a81760d80c309044c1616" }, + { 2534000, "6b076616b6067beda857477764ac8f6eb5028c585787a32b6ea6629aeebbf68a" }, + { 2535000, "27b1c0f7c912d9f919a4b637c17dcc3609e3739e7d856dc1bc1f9a30ff396088" }, + { 2536000, "9eb033ce23ce6250cd497a1d69a6da5ed3cc5112984c7486a4ac81a8e7010019" }, + { 2537000, "e08fd45bc041b2f7f0f48ea05517e1ecf0f2a14865f001a75830d010cd0a0f01" }, + { 2538000, "bcc4058a3873cc757d24c2abf3751b7d5851ca0b037d333b4cf71584ca6115af" }, + { 2539000, "3e6c84abcfe7b94ec705fd89ab22c3bd72fe2660071cb77fe3b265f9f9bdadb0" }, + { 2540000, "920f2163f0f7fef5d5337b9b1186f7baa58e34e121d9bd72f15d9596d8cddc74" }, + { 2541000, "bc9d93655e0e29737f318a1389f52c85cc318d9daeae98cb0de5bb494795392d" }, + { 2542000, "b2047b8905a93bee9e806ba981daa028427fd225127ec42e44aea9c30a03e519" }, + { 2543000, "53c3c0204921c196f191763188e24f82f7c9aef1e8f3deec6f41968f2cebabeb" }, + { 2544000, "0c6a4e045448a5cf992cd5b7062000a55c2eeb253cad6c5003af54f618f39d61" }, + { 2545000, "58b0d39fa9c88d6dab8f72d643f9f0378fdbe55a501ca28007d37cd0c595c175" }, + { 2546000, "04e963be21eb0b968d43d9be6d5c1bdd1937730abafca4372083dd52762eb744" }, + { 2547000, "11a78cb596058d8b9e40f860ebecf8216b71c9a4cca64412837d71c554cbe3ec" }, + { 2548000, "61681f2aadf77625d19f801f81771942c8b7ee3a8bd2e2fd634c6106edd4bf08" }, + { 2549000, "9706d7e53893471e9aa9f129308711c7681a4cf2983a83244de5b94f2632c531" }, + { 2550000, "6a3b73e40227fdd14526385691ba145a0b287fd3d11a5cb135b9fceb6183bcb5" }, + { 2551000, "707202fb7ef9eaece8a2b86f6a0913c77dd300ae26f38fd7dbe2c3ff11099961" }, + { 2552000, "f8213498d8fa8b6eccdd1ce0bc9770b5cf6209249f98d7375c9bd69df7657498" }, + { 2553000, "1377e6698c40df0958c6395adfc6f5454d679ba3d6c366dfe2230b40ba477726" }, + { 2554000, "1df29783ea0b392c5c80b56e9d7180bf77c4b5f8a9e40acca30d7d51e58ad29c" }, + { 2555000, "a00dbb2c3ad22b0be700648262f05758450e4eed71d99e17bd94b354eb460c5f" }, + { 2556000, "c692e27541b0de4b629bd68e1a0d8593d615536d53e6659436c04b124acbccc5" }, + { 2557000, "7e87316dcba5603d6f4ff70126590262b09a55515e7f51781af158202579bd20" }, + { 2558000, "178e2434f471c8b0226bbcbf6a75256f49344f74999a9fab91fbcc55c58e93a5" }, + { 2559000, "4f932f90ac93bb59c5dce4ec7f186b3d77bc19be9a1fc3d1769a0c9ceb1da047" }, + { 2560000, "5b3378fd0477b643913cbfaee927a5a446b4a1d3d1e2593f479ad66ad9d1fe3d" }, + { 2561000, "557991edf98e5ad215f216c86b16b1844cbb64cdb173bfd83f7bf2d8a5bd711b" }, + { 2562000, "2bd3aa98303f7ebc73e9c7eb21627c78ea33c09be27f7aa196763b9f52bd7bbd" }, + { 2563000, "5cff108741c473dce074476def0e86a22f941ada9547a03575b0025c24e7c167" }, + { 2564000, "498c3a9c7c67a6f5bc3c9dd0961801225c7d3b2dc8fc407aec89fb70ee2ca927" }, + { 2565000, "b84073a2f7f6145e0087f008a775a87a09b120270ac8de97ab696525b59d9ca7" }, + { 2566000, "bb0358e2625ee8d860baba534a3cc7238fd9d858826c003b368a7be87dc51472" }, + { 2567000, "3fa6487949ba2811f3df269343d63a60f0dd8d145c898cb51757a7ee97092119" }, + { 2568000, "38cd8f74b4f66540575b18b8b06f69d1e1123ab02895d0552a8defe94ec709c8" }, + { 2569000, "3b1e31fcd6d4cb3b3d051ee3b902a98d01eef2da5e9b7c34c88fa3d5ebdf1bc0" }, + { 2570000, "6bc47e4bfae9b88d73f06f5e94afa22bfd3c1cba9357850b0dd033ea17d59bfb" }, + { 2571000, "641277bec32bbf19a41888e670d70bf4b54b4e2368a77eb66b21169568330b28" }, + { 2572000, "b8ef73e007268f7b25a0a11b6e2598c679ef9c162fb6bbb5b72727cdbb698817" }, + { 2573000, "da8b8e60b8e26f28e920fe1155301538a8fbecee8e00efb511198b950f8ff8a5" }, + { 2574000, "2fb24ffa70232dbee36546f2476ee2f1ac3f8c1f2a81c872e212729f9d37a743" }, + { 2575000, "915d770df7c058f98edc56954a50d053380d7e83742b01745188abe0fd211ada" }, + { 2576000, "b5d656c47a021e22c4d44938fea36f36c736468f2a1be98abc050f6bab0578a8" }, + { 2577000, "aaf739e0cfaee9c1f9912d768fe5142bedce9e752cfd36263afc46312def7d85" }, + { 2578000, "0cdd24cfdab43b0a3b2315a1c2eba4c9602e82d66602c41f2258cfe707848245" }, + { 2579000, "715753f3bc17947a72dde9e3ec6d729fdf9480941e0a162f69298bd0fc91f79c" }, + { 2580000, "43b3f24df077a3bf63c8bcb4b3351048d753e86cdbde821ea71a32cfd08a390c" }, + { 2581000, "eefaad449c10bf9c29cccb27db5f555e4ad9b70454b934618b915ca2a7c22381" }, + { 2582000, "666356d5f8ed7a5439e49798b37ae6fe3c970256f14e9be7a349168b357304c6" }, + { 2583000, "b6b316a90d0346955a6b108b9b32319d365576f8500fb4f0f79a1618932b797a" }, + { 2584000, "c2b5c5918bb0189fe6037158f18a678d7bbaa5dc517b4896d984ee90fa69209d" }, + { 2585000, "c2605ce042429a9d6d3becb77acbcfa3410a4a868f09c03e4034d50b5f0939f9" }, + { 2586000, "444fe9ecc2c93fef576ef89af7d381eb99b15e28c6eee2fe696eadf57ef286fe" }, + { 2587000, "78ead7051fa31e0cd086b8ca0c5010bce433ee430b3c4f2391cb400388dc55bb" }, + { 2588000, "208dc2c70cdc7128b716231b4432f6c6d1fd7272831a04cf96daa216098d491d" }, + { 2589000, "6a98bd2742d965f4df165ba4c1fd4dddb06551353cdf52a427761188cae238a1" }, + { 2590000, "72e45b01727a72751cf6988e72dd0abfad11f8344a9ea068ad47d26e0ad20470" }, + { 2591000, "3ac55fb5911f731b067adf1392d4073f544d21186cb0404a676042e4a3327684" }, + { 2592000, "b104ceacba1a2ec3b4303b7c341ce77c8e32d0a5fa11ae802e41eedb7682fde3" }, + { 2593000, "d7b71782a5a976cd61ca7ffd12b88fbde51b04a822e7a7f16eb4dc51288daea1" }, + { 2594000, "4d78734cd3a297f639bb9cd008728e0562670134f88e6c283d3a680efc29b47f" }, + { 2595000, "5047bc8f1380c13da0bf37cc15832bf18fde6e756154ae259d595560cc5d1d41" }, + { 2596000, "1bbd24a837d0ae6da9b003d87ac87ca37835ed70301c85533bf74f770c6a42a7" }, + { 2597000, "6cf5a8de6da9196c2a7785f75704144ec4c093fd029d664f9bde980abd146521" }, + { 2598000, "1acd6c5ab75b3012eceb706f0a4edb11c4e4831c5785e430949672799ce21d27" }, + { 2599000, "cd2dcf74ae4fe6e4de64e8f84fc1cc2423dc3c0b700c0a26311f2c72e79bde1c" }, + { 2600000, "4395215c5cff2f3d451d715e71a50dc7ea9209f4237221e8cdd941181af6e672" }, + { 2601000, "7bff3ee737ab03d1a395711b87b898ac1412ccc77f21d9f66e8e73f5beb863f7" }, + { 2602000, "f1aa0f730644f2ed55f1825ccc98228d06a209adb90845aa4251895d5534ad1d" }, + { 2603000, "5e19fe595224e57e9f31cb2028b1e036a2759447d1621d603afa5cdf5f3dddc4" }, + { 2604000, "0dd383aeddccfe6c06576318625261c31551ba07fa26e4c31ac2821cebeba667" }, + { 2605000, "87da6cc075bb501097d0fbaa0bebaef49476e5f50ef077bd87040f8cb10aa6ed" }, + { 2606000, "cb61c4042418d5456bb1119a45833208c1dea6650440ce1d58f02026dd1b6793" }, + { 2607000, "9dd5b183590b418c4c63304417736ce28dda54670a081215cc7f487ecdd8e03f" }, + { 2608000, "4053f2fca8f9f9ef870dcae08c64c33ccab65793cdf65eb20e9ffda9d9301a58" }, + { 2609000, "71ff8a0a3eb0985f44dd8e5311c35bd8f2ba57e6163360e019a851b38b83b4b6" }, + { 2610000, "74e6e67e441d6514affc61cc838aae00da5063a4e03d57de759c843183e28faf" }, + { 2611000, "769b08dd1d8107fd0da62a0f36820cf2c52941bea09b0bc3e229b9134c68dbab" }, + { 2612000, "5745dd68a42cbad344203e54f3e4f508224000634891a3d393ab54462ae12a50" }, + { 2613000, "0ec263072ea5b053250b1774f5654fb5101a2e2acd483031c5ccacaaa6d5fc07" }, + { 2614000, "27d0d3f55929ab8b40b63adff9e8bda7707117d690e1b964920c98c59e4b2a11" }, + { 2615000, "d6a07c04b02e03bb6eab201eb30679bad2b1829ea96b37a4865f7d74dad0c00c" }, + { 2616000, "ff936675c71cd2801dcc40501f6ce051ba1ab5aaebcf9653aaff16f1cfecf651" }, + { 2617000, "5ccf82ce1e19e0380ac65cc2005b35aab7ff3cb13ab90f7f67b6b39161bb38e8" }, + { 2618000, "96f33ba6e8e167343a98be40894d3f2d36dc0c2eacced3bb068020f3e935c58c" }, + { 2619000, "3affa55e9ed14428ea4e16d74afea1be60992cc54eeecb0b16ab9d7a6f52071c" }, + { 2620000, "6529d2e9b34b5ff4800012deb23f6c4f8cd9356db91c10ff67afcef60823bae9" }, + { 2621000, "e9024ad4d9b0b98fa003b5b27a127323c0022bd525bc7e7e36161fa43fb3b200" }, + { 2622000, "b322d9fd19a372b454e37958f18d3c5f988a2905548817d4f4ad8d5aeec830e7" }, + { 2623000, "d2b0fc8379fcc7e8a172f691547ada4e8a06e4fbe81bf734b7b535dad774a64a" }, + { 2624000, "4310b727bc63687c4fce7ca86d15c888bfe61fd573d932889410be0c6628a49d" }, + { 2625000, "581bca659f183447e347ac02bfd14c1a8cfcb40afb1ca599db3555f8a997941e" }, + { 2626000, "427cfce7b6f9de9541ae5b47c8b2e5bb155eff96dc70088ddca1e9520892a5f1" }, + { 2627000, "db1d6b939dec79c4b4a49b98f661ae8bf4ba34a7f569bf4d478440fa15d654ae" }, + { 2628000, "2672c28bf7850a0c0cba645e871be230c54e959e8f675183e91a441df8487667" }, + { 2629000, "c0f9060bb20e58ddf2ac24561540fabf2ea43b2e203347a389e41ac79a079eb8" }, + { 2630000, "09a91d41ac61b924b883b439bfa7a716c16bbf239f8655e8aed1d1d852176cb4" }, + { 2631000, "8e0f6115c061a2c701014c92e1380a81868e381beee4052755056df2f33d9c8c" }, + { 2632000, "a2c4e76f1a34150c8ab8cb7992d2822edafb193b22358fbf86470e91f80093c8" }, + { 2633000, "a0c586ea5edc1f8e7b7dd565d64a05b4d379a08d9317c3dcb63d2c45af798590" }, + { 2634000, "ef907bfcea0f34910e3d76905f14358206f3753fccb5f2dd9ab518dd7eb6c54f" }, + { 2635000, "5463a54f839a0ef76ab69043efd3665046698ff70d9ccf47d02c53a77931e4c9" }, + { 2636000, "e8ad7d81c14aac2970839fb0317a354152e871efbe9d64d9285a16b6f5937b9e" }, + { 2637000, "5ce1913641e3dd2c902331e87297842e72683cbdcb3a12367d3dd8ad80573937" }, + { 2638000, "b7591c7857947285c765bcad140d9596c0b17bcc9049d9bb345f55ce99e845b9" }, + { 2639000, "617703eed11ebe008bc621d62237d7ec0c0bf6fbf1879bb464049b2b5ed8f920" }, + { 2640000, "561794742d1af48846dbf4d7adfecfd99541375955ec0721ec1f88729f89db68" }, + { 2641000, "83bc6c73e481ee79d07222ded32e8262dc5608a490b14b755d2735d31626df86" }, + { 2642000, "f43afa84c6326b5ea006f2e78281401a52273c4214b0168f434437e2524bce7a" }, + { 2643000, "4bf917f0088a1e92c4650f06f23687a4518cd11b653ff9672d0c4b5430d329ec" }, + { 2644000, "a4d104fe84f89fba231ca42a21c2983d52e48754b4a26767936da685d8c37db4" }, + { 2645000, "ad2170cac76ba7f09a989cbd818630a61ee2cbe80fa6057b32f309c2b244e463" }, + { 2646000, "bfeb953c7d5cca64892b7816e0f704e85a8e7aa31d8ec324c7951f83ee9349e6" }, + { 2647000, "db2793466bef7441cdd1f11dc68d6e8fd33c5d30f3a9bed6a338d4fc6a9f8416" }, + { 2648000, "85412b44aac985a80af6630fbd44ee6665356b43b4ae7c03c708c6fd919bdff7" }, + { 2649000, "474afc32865ba7df38b3e0902b64efab4ab2aa73b262f61109466defc812ea64" }, + { 2650000, "315d90d8ece68063872b9237745a4061e7dc8a490d867d12d879d9037446f13e" }, + { 2651000, "3a3ec3e077acf368b68475d66fd76af30ee0c4815567f1222ddb9cc696c5b17e" }, + { 2652000, "064acce76f6c4d8860443c295325078ac8b7681590d3ab8b6273baedfc7c5487" }, + { 2653000, "15db50281303ff1e60a46aec6dfe65fca79f71f91b042759abf2dd2130a880e4" }, + { 2654000, "dace8f3d47d1cff46a0913f95490912347f2df0bdfe4249350328562c3a6d590" }, + { 2655000, "c194be77a56b88220c0d1d6d493f6bad84ddb0cb3730c05f6e545c801ad98f95" }, + { 2656000, "798896cf66b603b12e396cc37ac8bdd6af2c6fb5eec1bfcf8aa530e620ae39d0" }, + { 2657000, "fb8b160bee5d782318bd1abe86c292d3a4bc8e7f3e73b75457d996e3dc6ada51" }, + { 2658000, "f9a97de26cd7d95f477cb0b5236d5aee837bc5dc24eb0e1dec3425d145d0ec25" }, + { 2659000, "3b906e7921bfd4390af995672be6d74187cad4dbe3313aa1d2b3236077da07a7" }, + { 2660000, "9613d1b1566674d9b6796c10fb115d808797066546559b7eea7451be978bb65b" }, + { 2661000, "720a2f467e511674ea83a94e9156d23ebdb54ce8fe8caa5fd2135ada9ca91643" }, + { 2662000, "ba57e6fb77063ff44321af53d2a550c1cfc4afbb7b936419e9dea26878078bd8" }, + { 2663000, "da01b0ed602da2b4943e1595619cbb906d3c2b43597fafa9dbddd6f2e7379dd4" }, + { 2664000, "dfda91de1801cbfda2aca54fd33422fbb37e9d3b07f9e8f4d2111dda70a8be7d" }, + { 2665000, "191fe44cc4d096be8c8cd78fb05b51ae55f00d192ce22bcfcf4d1f81faa3a347" }, + { 2666000, "b88a86d866c3b42dd59ffd599997911e4dda9c4f4d112f2438a139f9885f5070" }, + { 2667000, "fe0d19ac9e7b5ff2e69181535a68015f4175cabcef09488c35f67e6d00da9fc7" }, + { 2668000, "31c7e7a8a1de86959e3d9982fd9c597d1a7f567e1f9b7c13e46d8399406732fb" }, + { 2669000, "1046bd45fe309d594c08868ce34b5bda8b665ba7cc45d65b3955a9ace486dcdc" }, + { 2670000, "e58f08ce7e3628842bcd51390bab64655553fe69ab022ed85e53719cc064c135" }, + { 2671000, "1cc0f98b2ca289d7ff5e0e85d158eb218d4be87cb58299a112f0ddc87acba052" }, + { 2672000, "c64a3c0b63ba0a60429bdf0b67f8019be9386ba0c195a892a70d3ebf269b1a72" }, + { 2673000, "fb0566a59c9715b64eff662cc3659f0a0318956a28930165c83dc185780eb4f9" }, + { 2674000, "99c52380173643ac5253f34f784016758fe4c6c3078eb2f47ba90d3a7f6b2248" }, + { 2675000, "ac70b46a5e0a35c7e02b014310f40aa3c665a9453a85fbdd71c63bb614357456" }, + { 2676000, "072271d6fe1bf7c09b32b4acf88ae95fed7af5e49883b16bc3659b110a626217" }, + { 2677000, "9983f3f7bcca134c5494946ce75f26ca4c69ecc2fb0590ad0c7b7f60f5a573d1" }, + { 2678000, "09504c3d1b1716cdbc4c0e115e5907460dc10f29bceee493bfcac02de034fae0" }, + { 2679000, "699fd32b2267e4b2217316951c9df23b75928572f6462de61df2028238849a70" }, + { 2680000, "32370a4b966ca8adbdcf84e830ad17f5e1cdf1f5a1664d7ca9d472faedce407e" }, + { 2681000, "03fed835e7ac9f3c3f25491b45cf92340226157a61816a4712325287ae477234" }, + { 2682000, "e3bb18e92184189cd6e22dd8fbc5fa3b577b4bcf2cc874dcbe3c6340c277543e" }, + { 2683000, "103b00628a466bb1707275d860b30eded1323d6daa4bd4edd447507aecd6d82b" }, + { 2684000, "b352108114e66033b5d900d7da553b162fb8c643a1dabe2b4e56e19f13580720" }, + { 2685000, "6e835cccd3eb950bfc86e9bde6b045f8f1ae486c4f2085fcd3094b3e5dc68e40" }, + { 2686000, "b0e8ae4ce7e73aa071306fc66af8b3cce87fc753beafac66de5716b507aabead" }, + { 2687000, "9b968e8ecfe194f402f4854531221b30af986d758bdde9dc7ca76591d1c6ae26" }, + { 2688000, "4a11c953ae60d539b33bcbae551592dd3f7b36ee62056e3ed917a96ea6a2e212" }, + { 2689000, "dd7ee218beb42b80f0971bc7fad0b4ba3f8240470c81c5631410360565b60fb0" }, + { 2690000, "210f81a1442ae6d3fa768cc3c06c2e991f8e9ee0c76b3f24d2ae45929d211f8b" }, + { 2691000, "8218513fbb2a8357783b710844c0d82d63b0ef56db04cb03b099a309c0635a6f" }, + { 2692000, "bb2c54e454c76c2b23126cb54084d157f1b92944eb851a4daaffc149b4eaad79" }, + { 2693000, "02785ffd29b4b4625eae4852c62c15a7a2026070fed1437628413ea251a69718" }, + { 2694000, "2f6313d57210fff2d487a9fffb779424faa41fa7118d8c8ee9a2bf96edaa2065" }, + { 2695000, "c6bd26623c837d50c8175bc9b656f75aa22405119d2dc038dd1aed33e3716c63" }, + { 2696000, "700998a9b9ab739a763b62036aafb7cd71000cd336fac2ad4f3ad4c6ee95794a" }, + { 2697000, "9d267615012b2cb5d2483ddad6a23a66a87da379a9603d8f0b098cff517c601a" }, + { 2698000, "fc35032bcd0f1aa79a9392ab9e63469319fdc129cc2f704d60ecac70ae4ef226" }, + { 2699000, "bafbac2b50cc7911d6c7f819dbfc56a4f79d5ae817e71deae1d622dc9edb8821" }, + { 2700000, "6fd9c21dec58c8ea506b65ab7abde2e3848f126f2d1b16e1961fa671960b116d" }, + { 2701000, "69b87bfb1e4130e30ddded144c1d9f3d937075f0a09ed1a5d43492e2b7894528" }, + { 2702000, "ee6fa8fdd8806b2166bc22a8e7dfbc4e9ec397b23974c9918d4601169c39f8cc" }, + { 2703000, "11916585c27dd4a32f997f595fbe4d53628f29a63a90854c074ce14abf21b5c0" }, + { 2704000, "f26eb952d7fd8080e3e6e07f4a21564e3770320a7d6d37c8f12af9b327a2153f" }, + { 2705000, "508d62eb3a12727ee7dc1921037e8c593c366eda52095c0ba56b0bafaa1fe13e" }, + { 2706000, "879c03d4cbdc1cd22c2815b76279c6a35a8ef5db13dc021b86e2e015bb0d911f" }, + { 2707000, "72c05006b1d43e6002dc4011a72fb0669b73c78905595e9f457eb6856f41cc65" }, + { 2708000, "87a7f27fd7ad5feda56d6e9d70146a38d602c13da04128ed7012f2525d72cad7" }, + { 2709000, "17da8851fd157f1a2a0ab11e808a1653b586f54090d2940c6675a342bec42478" }, + { 2710000, "194d910d2630b9399dc195057398766007c9b0f9c2160da1dee0a68f3e2280ac" }, + { 2711000, "9671987cab9a5b088f7b589fcf8111bc586af9245632bbcaf14770698d1faa86" }, + { 2712000, "df4ab1638d4070cd500d229a2ccc63043c75584f86a930a26d49818b33055e26" }, + { 2713000, "cbd91b07cdd69967ff95e23d4c26a1b941230d06e7b178744889e557376945bb" }, + { 2714000, "11224f117e2403ba5417c9b6fe5da7ab4ed1c970e27b7295f1628c0124e36af1" }, + { 2715000, "4c9f480f28b931b5a7d4c925a5b9e73a5599e8cfd20b8d6452fbb5021f289858" }, + { 2716000, "60a14478d6c9171f0210812e2a93412c142109dc84afa8b1c11845297002ae60" }, + { 2717000, "913be98ae1b560c38c6ce70e3571928c81c86a22e4128f976783ef4a145af097" }, + { 2718000, "c2328c70c15693df18e6ea4a992874be15e6b6c94c01f91a566368d3366dad59" }, + { 2719000, "b2ef3fce80e6e445752e75907fd2478ddb0a2866fa82ae9472ada922b51bc29a" }, + { 2720000, "1a01291a2affdf903afe01fa36c9df48b432a5bc79473d7e63406e1401008e8b" }, + { 2721000, "cb77a27f4d516776600d9b3d82c34b80b56af3819685cff675a1867416ab6a64" }, + { 2722000, "3e566c7715d74b47fa99d7c872ea98338a014ed3d4c4b0a0a1731e7af51b2d49" }, + { 2723000, "267187f2402a62b1496e51ba54a5bdc7499f034975151d93ffb2ccb04d7b322d" }, + { 2724000, "4797a346a4870428f41645ac732f907af13c3ea1c2d68112c6259a7117f94add" }, + { 2725000, "54c373f4626cf3b1a47fcfb60dfe2a57d6fa692c5dcc3879029c2b17e80dfe70" }, + { 2726000, "b664c2cd50386c39005c70a5d8684feff664ebcde522bda360873d779fa308ad" }, + { 2727000, "acae34990e9e5ae74cf06fbedec3dabee5f4902b4cdface6ff738eb65cd730ed" }, + { 2728000, "83b90b4de8f97c96b9aa66e7b10e942153cb9e1b3840a0bb4f6140dbeca6baec" }, + { 2729000, "f31a4605317e4fe832b516e69cd8bd6f334d25aef52f281bb740d619891718f5" }, + { 2730000, "f09e36f674df80000b07642b2d695a81a42ab497443fdc05e9b71359b03cd0b1" }, + { 2731000, "57621acb52189c5f4e1bdaa6c8cbd5d84549c610f9584a67cee08612a46d05ce" }, + { 2732000, "4e6b6fca5dd64bf9aa4ec5efcfa29ca7a194106b585c205b8ab45cfd08c0b127" }, + { 2733000, "3d4b968742557cc2401cd093bf8810cb0286052336ffe7ad3b3f20b12776cec2" }, + { 2734000, "d16dd35a1576fe4f8ac97283f61750ecaa1632cb248f1f63ab2c62b5b2cdca73" }, + { 2735000, "a9ae20a808a922fcb0feaf13457f566fdeba807d1f1e3a62735eab64b8e79f4b" }, + { 2736000, "e5248c78ee3ea0f23a8cceb9efdc4b7189afec02258bb2fa9917982d7e1e3f2d" }, + { 2737000, "528a0e5db6b6dbc03c62719eae8bc7f8eace18af1e380a34e13c7e2d14c3c996" }, + { 2738000, "178c41abca94554ba53bdfabc9c75ea69df2901f0f39e3998962431f76b2ecf8" }, + { 2739000, "ca491a0946477c238506e171470eae73fbabf482c73c375c65a39fe6f2af4f00" }, + { 2740000, "68dc00f5faaa3f03881e108a0a0f343323bc554880af9d00a2e7a7bab5ce15c2" }, + { 2741000, "e407b8e3cc20d68df31c47ee3c4bd2a474ff793b767c15b79859d228a0ce3a1d" }, + { 2742000, "1456e9bc851c8ec5ecf3b04a30cc50932511846b27e433a13e54e9ef38c264a1" }, + { 2743000, "850cb4ce8d0cc636f90b490be46a23b8f161eb4afd5c8d1f8cd5cefca5d73686" }, + { 2744000, "767a9b2a2eb821c19230cc40f681bdb90341f224f6339ce684e7a73a556aec53" }, + { 2745000, "74645eb71793d87ec399a9194ce3658f5fce98e75de9e1ad3a9b812241a6704e" }, + { 2746000, "5f7b869ae12010c03e98db8672169147023b38e4d8eb3336490550b93e8cec3c" }, + { 2747000, "4051cecfbf5cbbd4c3992e167d901d9b66327c9382384925582b349199dc667b" }, + { 2748000, "1bdb9d1a6e3f5530f3adcf05e735ffc3df6a235ac847b9fcfff22bbcc95acde1" }, + { 2749000, "53b6f592ccde4a43efdc93a7aafb3e5277e1909ec2dc6a3f10c73740d151c3ef" }, + { 2750000, "4804581b02b8d6d5778e62c3dac2338f75a37a072c3c4e56de9589773af1bedd" }, + { 2751000, "1cb8c1dad4e1f6fee1c3c35683ae28e572fac050258bea0363b22838261fe6f3" }, + { 2752000, "c0d8ebd145a34f06607082fa5ce6ce291b67a898a50007e5b6b0d895a446a4d9" }, + { 2753000, "7fc357be2634e6b75b78415566ae0c5594d269a81bca84270898039a72754dce" }, + { 2754000, "aa73667427e7186c9d3ef00720fa536412779550b50d45b967613a65ff79cbed" }, + { 2755000, "1ca62900a6423878cf11ded9a8a228cfdc1c3473972a8ea493eab1128da2a53f" }, + { 2756000, "f822bb88030a980b7891ef6793914419df7150cc59ac8bdd70d3636b91f3c725" }, + { 2757000, "747d51d24a687a6b30c3650ce3fa278d937305eef8f2a669f90b2e3e907d55e1" }, + { 2758000, "532ed7546dae3937ad9a90ceb2a19b4b03baf639f859671e3fff04ab6f0e606d" }, + { 2759000, "b1d79b924fbff74c43b5c02b6b9cbec38fe9f66f29c5af0f200cbcaca4ee6784" }, + { 2760000, "1a8ec3d16bc96cc58b2090b1055ad69b61b114ba87da54d41167100ce1f007ee" }, + { 2761000, "4ea673eed96a165143f79b86eb743b1df9fb560acf29c6c07ac7b9e4406a7233" }, + { 2762000, "68dfe9bd86edeb80488fd6e96011f416afe5d6aaba25674e85b194bae4b8b041" }, + { 2763000, "b9cc18b3b7bb7e638bb9b548670b5fffd329ec80251294bbfbb84cc617f7b9ed" }, + { 2764000, "892c34773ef7294704282d4b81369b05b56039cf8e8c41840d5278ee0142314f" }, + { 2765000, "74d68dc1a82edd3d272919209ab23e1083ae887840e36b7d64f31b1860eba8f1" }, + { 2766000, "f1a3da4b8598428793a8d5edb246b09fe4988fe22060d786137c36136d29e96a" }, + { 2767000, "8305078fc0f45cc5290419d0aea0939cb6b7575070d11c7db07f8d3a64964a2d" }, + { 2768000, "48831c925b7c0387047902fe50e8048b86bccfc3c2fc0308c27ef763fbfc9a75" }, + { 2769000, "ed557ee29e17acca77687da20921e3fddc2d682d6de086fef40a0d7d463001d8" }, + { 2770000, "735de383a9f73180b0a5a4e1a9a60fe13329e4a62516759ee3890256f437d182" }, + { 2771000, "4d9c5601827f50414014c24efdaf218ae8a0238cb34ef9551d17ca155e77005b" }, + { 2772000, "30db97cd41b1fe3ad050558ad526205d9fdaedc602bb567cffcd8892cbe12c5a" }, + { 2773000, "9433d95cd570d65aacef12bdc960120fb7e9808f14c5016abe01f5ea00a93244" }, + { 2774000, "1058955e10cd0005ff90bc832553db2b6df20b016d412535912eff1acb551072" }, + { 2775000, "22db401cb0f9e578f5e4e8e816f9e745fa7e4263fd0d8b0cdd8c19cd4febe540" }, + { 2776000, "73c170919bbdf806e3793b749674e8fcd7ec5698b5b03bf23df4e8d5f1e69a21" }, + { 2777000, "21f7938acf8b2d2f5e37632fcc57c99b6d7c427dcc0dd7dfb8e6af86d36aacc0" }, + { 2778000, "2c5faa06b4de880294a5ff0c83202a0212abe724578e35cf77fbdff522c0f1c5" }, + { 2779000, "741909f7df0184e905c868c87acf3f5eb152e584342b29f7551a4810da65ec27" }, + { 2780000, "9250c863e9b5f68c1eb4005ee2b94c0986c8d7e440f9f9a41c1fc74098308882" }, + { 2781000, "3841918c1736de97432db870747910588414cbb6b5eae27f893dadf99705c3be" }, + { 2782000, "daefb11554880f792cb55ec2a7121f9e13ab98bc608d651a4ed1750aa24e6782" }, + { 2783000, "a66d7400c4357a88c2fb01dda47f8093152203c1b83e0aea3a5784e17c33f4e7" }, + { 2784000, "a60dc229d9039efa212185b4d29058c4cceebf385512071b17f57c207652f328" }, + { 2785000, "16509dbe22de5d9c098f729a771a3e0c8b6ccc56aa50241d12393065714f58ef" }, + { 2786000, "ed942bab3337a6aaa3bb491ba0dffd10c666efd1e7933585f6cc7aa33c336717" }, + { 2787000, "6307969099c497edbaa9cf7e2a1e37fb0db50ae598b4f4cd43a9cf4a9513377e" }, + { 2788000, "da86a16422eff6676a931e46df255e85398f96c6995320a1ea644ca3055733a8" }, + { 2789000, "cbbc0eed0c42af0613da0d2de99e80937f6a954baf6eb305da6bb57e9ed40105" }, + { 2790000, "873dc81a6ab28a6ca9ccabe8c8204d992962ef3c7e62c5a55669a33cc01ea2b4" }, + { 2791000, "09c13ebf50650e467ae85c48913246a7177994500073a4fec022923ee0103366" }, + { 2792000, "61c2fe58772faa28465a75ecc3fa0986856004a2fef54acede0719752b9ce69d" }, + { 2793000, "4a013b002e7cd503141c7d764d99f2262f247ae5d3f5a158e0fb9397b3bbd872" }, + { 2794000, "4485f7a325c9deb6b8d92fb26efb91a6d0b79be60abac15f64bd924d35aa38be" }, + { 2795000, "790a98670c4768c40a49dc9f264a5e39ee5ffdada13c4fef0aaaa3083c664a0c" }, + { 2796000, "1743f45a602029d3077ab46cd28d8364d99aa783df8b25874feb4216d7538236" }, + { 2797000, "b60a96289c1d4e8d7987707c92a4b89a74e13c467c695fc1a832cf6f07d6c3a6" }, + { 2798000, "f593e645840c1c7cc77cc06e52b5826c18d51541e4c762ebc61d981fba547c71" }, + { 2799000, "90e77036f764fbdc1722bc8098c549aaa074a5a0902eec674bf992b5b009aa79" }, + { 2800000, "11b5049e07539ae0f02c01cf60950017e1d2e1aa57dcc139764e07e1fa5661b0" }, + { 2801000, "7133eeec592c81017d6eafabae21f83013e327c66be4d4d04588d31c172945cf" }, + { 2802000, "537cf59bbb296bd99cefcbda79f0ff471b526e3423c099c73558a0507677f251" }, + { 2803000, "75ea06ae4f28877ab3089cb6d12ed499342bf7998a9f54b00b4a81fe081c6db0" }, + { 2804000, "b6e2151fedff44edfe6e82939ab9fccfd569b03f8520f663330aef6664a420ac" }, + { 2805000, "67cab4cf84ef48a0a6fad169eeea9cb9d003324d9739d25fc2a6dcefd972b3f6" }, + { 2806000, "97cfa8ef99db224452af5ab2aac4d95558ca8e0229733e85216828658aafe246" }, + { 2807000, "1ace244288483b197dd9e0afdc7e311782a698a9411445243e4f4afc0a947517" }, + { 2808000, "32afd6945d25c5eb332ace3ff67241fff35f8f8e04c3a5c5e54cdc9e83b6d064" }, + { 2809000, "965ba4dffc0b0660c85a318fd22b93f5a4ffd6c27eb52d1e2e8d212ab9435904" }, + { 2810000, "a1b7081fb212de3b3245d318190709771c50e7c720c797bf0166af179639e969" }, + { 2811000, "b9d0f29cf1ee1a08f512e6580b854fd059532b0429be069c77c21063c43a6bc4" }, + { 2812000, "4a0fdfd044233453d50dc347b1bca996a5db0f641cf757137cf091f0f131da14" }, + { 2813000, "f150dbde270fc74fdc31e33d222825760199533e032ceafeec49c88ce18f5fde" }, + { 2814000, "ce5bed86068e06b17a021ea76aa61e760dcd07d42c6277a97fad32391190a498" }, + { 2815000, "f15ac2e0623b134432d3b860bfbf0e0f4a2d68df33adc25b0937893a5f48c1d6" }, + { 2816000, "717d64696984d259171bfe4bfeb3972fe68cbb83f5b4ff051258763829eed045" }, + { 2817000, "2bb7130e1c082c5267fccbc0cf369510b42e8c7b3efe8f3961b38c464cf3e3d3" }, + { 2818000, "3ea34afa4617a82274be6d6823601fe6d0e3dc07cfd0311b1fb050549e705b5a" }, + { 2819000, "ca013e6c48766663982e91860dd17de87b1221e8fdefa11040da415760180730" }, + { 2820000, "b73a5177ee3198046db8a205d870d29c525a37f6c34bfdca8be901d64fa2bef3" }, + { 2821000, "4e3e774e314138191876906baaa133b4b8efc8606be2aa7d00e6b8092a1f42e1" }, + { 2822000, "c5d9c3a6ab4c67fa3ac0e7acd8ba71e91f6357f1dd44888127747c12014ab4b3" }, + { 2823000, "af4be96164acc52c87f4b23f5f6b8b920d6e519611293577026fc8748a803f04" }, + { 2824000, "4feeffdf718e5b7082e7784911bdaba6f2804d09d254b10c76108570e44caecc" }, + { 2825000, "db1ac27b102a33efc4f64680ea8d87d4eb620c34ead8a172b8e17f52368e560d" }, + { 2826000, "fabb5dc95b45fb7d6ff3083288db300fc5e719f7649f2900f1d21f3fde1e42a7" }, + { 2827000, "208798cbc11353294e883631fce54d92068b30f43ce680e7d76aa4e65e7db81b" }, + { 2828000, "586746adf799c9ef63685e9ad7f0bdffbc4701131cbcc4e7e0fe16c38255b005" }, + { 2829000, "9803ec8357563f0e4785e8cf23af6c235125be5eabaf0091a471e346b6b31600" }, + { 2830000, "6f4e293570121406feae06405a67a3cb39ce8847942d001e77ce61655685abb3" }, + { 2831000, "d970784b2ce88fc28603eb85f21dfb420ffa7104ee06473b335a1524d8c4096c" }, + { 2832000, "6634d04d710b42945d4affc72081cb9f3a0e7e8dcccf6f0930eaa587492c899b" }, + { 2833000, "33dbd53ea8925b7324526481c04b97f450ab3a52482b6dcdedbb28195f3f3abd" }, + { 2834000, "707dc95c04427a53d9e7c22c05d4e58c8ccc861acd13040810c7ed99bd4ffa23" }, + { 2835000, "23cc8ffe22c4722c9805e49d35fab1bda95139b3f8de511ccab2f9024c4a44e9" }, + { 2836000, "3305a6501d03d73aaa91516c6434fd7741b7cdbaf09c08243e50b4c47afb8364" }, + { 2837000, "7cbc1152945fdbb67f69b140c6210af135a30b493bae42ede124d730543e3652" }, + { 2838000, "841ec7982fa3400945f16b7e22964e3ff5eb46d659b308aa653d6cbe92a01d90" }, + { 2839000, "4aa2fff506f56b7672cf8c382fdc569c2d19d6c44fd85a287e6ff22685cc4724" }, + { 2840000, "7b9fa94ba279ab1c27e545df45aa4f9b6a03eb0bcfce7395a8ed20de7411249a" }, + { 2841000, "d5faa8156449d5c5cbf9e1c487b86572ccfa472a72d7dc3cee866e67154cd040" }, + { 2842000, "87b0c65e20cf0f3ec1785311d242a02e961c37b745df1002675a4fef74e5cdc2" }, + { 2843000, "9b1a4e071420d62aa7d28b002396be2aeaaf9aa6b532b672cc556ddc71cacc30" }, + { 2844000, "da12734d02a16b5b660fb4555e5d5ee15af2de17b2320da6fb082dca0a574f11" }, + { 2845000, "db537fa79ba3a5b1caa2ae9a6e48abbf879ae5becd016ccb98861c35ff3f48cc" }, + { 2846000, "091a4eaf47f6b330735251efb5be0e87a7bd518b4e00a48d24480f43f64278ca" }, + { 2847000, "b256a251add666ed4fc963fccbf408e746960a6a57b20f19f372ccb0b90af59b" }, + { 2848000, "eb89b2e3eceaa77b5d03acad126a729e6040f6017b50beaf674252975bd3c685" }, + { 2849000, "8277bcefb971329c094c64af6b6bca04fefd4fa784a4a8bc403f37d48220dfa1" }, + { 2850000, "88f38da9f867a894e7dec8dec52a0512317c243d60786a52ecbb3c8fc8d122d6" }, + { 2851000, "d1ad228af460f6578ac0b1cf0a8a5eb1badea5d57120b5ec46adbaf20759ded7" }, + { 2852000, "f65e20fd823b3ddd4592c186939477d1e1e7d03d3bb10a4c3d0fd247400cf823" }, + { 2853000, "025f97746fe14ff49d2399fc0953ae588c0f036469c75cbd9f1ee237a46c5db8" }, + { 2854000, "0538199c7d6f0f40761d68d37a903f26f5fb9cf431e59dffa127db16280375b8" }, + { 2855000, "b6140800b7f9084acc53afc73d77fbb9194fa399014c3112134d7aa3637d65a9" }, + { 2856000, "23fddc4eff6034b684fd3c6e8b2adbe8be2870a6ddddbd5eb4f62e98e90c5fdc" }, + { 2857000, "e3dc84910ec3558e38e2cc881d8d3afa3936f1cb5704e56609cd2d8fbb8e8a74" }, + { 2858000, "7d3b3a3871ee315bd04d5f4cd59bcb88a12df84189112d402319aed67c8e769f" }, + { 2859000, "7efbcadcb243e276bafd43708f07db057bce739b027e51a9e5fca7707d5c3725" }, + { 2860000, "bc154759dc5be03c722299a82fba8f46988846cd7daec7880fc120626403360d" }, + { 2861000, "dfe1367d23e46f0e7b29db3b8af192f18df45959a780c8c0ee15241c71f83c0a" }, + { 2862000, "2fe46603b3b30ea490079f08f8f736615c62c38c7c8762d7042f86dbadce61c3" }, + { 2863000, "691b824bab28f205f445df1d17672fb8cf25d769fc43b3e84978803d7e535d27" }, + { 2864000, "114926de58695f0de043a99fe3205b3cf37ca0fa96ab048fd7d2fe6c94387260" }, + { 2865000, "157e07ace38ba7d0bdfac7a3f96a129e237da9ffad0ca7bddaec49e3bb3f085e" }, + { 2866000, "e2a3272728ab02d13f751f9cac0d202026daa5c04f3e9a3ff6c757e3eeed7575" }, + { 2867000, "6e7242349d3348ae93741225029443cc4c311a855cc0c6df2cda842f3141ec66" }, + { 2868000, "11a69038e3ac0ff2cf5ec25c4a5fc76defa915018794c110e80fdbec4e6df6a6" }, + { 2869000, "69961b8e1bc0d6994c164e0570a7e50a782bd42fe5757f50dd844ab7f8e6a3b8" }, + { 2870000, "b76614d0d84b69f8337eeeac24295fd4953aecdb580ed92511385256a1d5dcf4" }, + { 2871000, "390c1e46d024d75da6816054258068f3ea2250af182587ea9f16797c0a1eb080" }, + { 2872000, "0d828294192c3ee4f4f512478a358841a73533789f090d5808ee735d9fad3d5e" }, + { 2873000, "6ac5393a5eea7e6dad804fc5db2190a83c26e0e231d7723e6a6813ca71841dbc" }, + { 2874000, "b526c4190ee2c4da10a0001d6f8491e2da85d51ff6119b95a2658517a4fb3dec" }, + { 2875000, "e08d100021392e983586af82d4082851e3f4045711a89a0ab0130073ddaa68de" }, + { 2876000, "98aadc2082dcb3cd813d5dd64c1abf99579efa0ca97d6151339dd883c1cac1f6" }, + { 2877000, "4d02196c9f0bd54a6aff28b5ae93b407427ff4da34be59949cf5f74d48915ba1" }, + { 2878000, "69ea8261713bd930d27a38bb6ee6b0f0677ef823d0a86ab613f53eb763c65393" }, + { 2879000, "5213b2384c1a3d9a176e2ffc535aad02b3edc668d058e9979701a769ebd343b2" }, + { 2880000, "9a5fc0c8df9ea23b2a6d6eada14a3ce340396761da7f5a41d214cf7835b20a9d" }, + { 2881000, "934689e474319241617f4336e50df8e0c2788292dfa2ac34fe616e47b6ac7874" }, + { 2882000, "b5bc34a0cba419e92701b6d968363ca3d1133c10989c040a4441eedf985260c5" }, + { 2883000, "1c97ceceed42296fdb1739e12a524940aeb62b24fb98ebbb4b87f6b16a3cde16" }, + { 2884000, "f8d883d2edd4dced40d6562f6116297520d69075ed78da56222a85bf3441a7fb" }, + { 2885000, "7869df5200f80932d0271004a49061eacdaa4b3fec519893b93f841f488d9939" }, + { 2886000, "e8ffe5b4bda00e53d297a206746f6d01e32c312b52024dc0e32c8d66dddafe2a" }, + { 2887000, "9f9231aea9e340bdc8f644c90b40e553a0d55f751dc932c1c63f0ead4ff7fba4" }, + { 2888000, "ceb237f868c61994247cedba59671b87d9869e592c4469ea9e17f04101aacb94" }, + { 2889000, "6b0ee86430e44b2d05290768ac049aa74d1121061121558521ea15259b8aa232" }, + { 2890000, "f87b24dd43d1dfb69cc56140cc7a0000bb7c0f757c33ef4a966c88d875c40e94" }, + { 2891000, "bdc06d125235206b4002077e5913233b90e327115229037031fa671011bae541" }, + { 2892000, "6003f24349f90dbe558166438f31065917c65d0906175702762b7eb498679bb4" }, + { 2893000, "d06cae0a8a9749634c9ec8e5c0fe3d7a7a6aef5b2edcab3f022d5e3ce7eb97ee" }, + { 2894000, "6e75d7215980c553ab1da19cb32c1286a3f9662c53155fbdae493d627fd42b97" }, + { 2895000, "3819b480a3b7ae6c5717918c522bbaa7be4399ecf7801411eae15d627a6b7f87" }, + { 2896000, "b3c482d62b1bb4a62cf6073b7e84955a4be716310094a2db078b96b4eb1abf47" }, + { 2897000, "7caed1d7bd4dc3d2bead3495ad6200cd3098c947f4bb0fffc31ddd51769daf17" }, + { 2898000, "4d868201f6c26b8f303f681386fea13c74f8fe945e0abb2abcbcfd5b47b24597" }, + { 2899000, "0b95e720d9bb7daccab156ce338f0fb5609a2033864ff6042abfb2cf30ba6d21" }, + { 2900000, "f00092f307be8376972d0efe41fc00f2087397fcf34917c7a0e8814ca3ef2ada" }, + { 2901000, "895695ab497d8d0e13f20e87ee3f2c17616bc619f8d67c3beded49c81e8aa575" }, + { 2902000, "fec558851d9b4916d3499d8ef72f39e986040950507b7c847593d864e274bb30" }, + { 2903000, "b2a94dfa26ca0f57e7a6eb121f0f6c2bf88c8feede9a5c4493575bd1a73c7aff" }, + { 2904000, "7dffcac745ff7ca6e9326d4fcaab048c066d3d9819a1bc06ff1eb4288f27b24b" }, + { 2905000, "65bf840e397b06cd81c437a6e2fbe1ef1180dc98d344f8f1b4a3d2371072fb7d" }, + { 2906000, "92f164e9ede5c2a5a742358893d8b901e21cc758eb47f07dbc56a7350b51a285" }, + { 2907000, "29a0c773cfb8e122cf5b01061526417d4d04d5b6b03f7e506c56ba35de927dab" }, + { 2908000, "51e07cb9c50a99a93d2ed5501745680efc165e2b423d8cca18230fde3f27badc" }, + { 2909000, "93fe30561cd0298d52493d3852fcae993b526bebba7510d8624e3da435434b01" }, + { 2910000, "ecc8cd48d4c95955623de692569ffbdeef1d22a00296d6814d4727b81a05838a" }, + { 2911000, "2f28225585ebd7847eeda97c1f499289b9d96ee46248a39ea4fc833ea0151914" }, + { 2912000, "faa72a36e9e5a1a5fb8af69f852d15c31e6020055fdf44f348653116a1bbe784" }, + { 2913000, "2fa66279a818fcb76bfc9b414031c2517e21463dd0f54c07dae3169c32ee3e2d" }, + { 2914000, "dd68619c37ffaa507b094f355b5b2e6865ec138876417296a9ec430b02486cee" }, + { 2915000, "8f9931f181e4af7d23f4726bbeafd2639fff31022ae909548c9c77956227ffdc" }, + { 2916000, "e4ecd174243b7bf6bebb78a6e37bffe4a0268dfc5d2dae905a3b79d0bba28c20" }, + { 2917000, "9a93529d2e20d015b4a4242fcb895d7d1175a55176bed0586143e44f9f648e62" }, + { 2918000, "3558eae3ac57999aa0b39478956a44e5bc98264300808edef4457be62d165bc7" }, + { 2919000, "1990ae70c239b74924ad782d81acda4ce920e7189081a14eae0ea3714ffdc406" }, + { 2920000, "37212a62163aa41d125d988c6688e7c4761e19225e635043b33dccc020b4533a" }, + { 2921000, "15c3938224c52ad3136aa22efd95c1f05dceac691972e6968e461d64322115b9" }, + { 2922000, "bff7da063775b960410a7273e37dafd6c14d036c230749bc7fe9472c4e2d5041" }, + { 2923000, "f519c69f821f21f69b46647f6c72f247a9e2705d24685c7a8609c2b62e15727c" }, + { 2924000, "705591938579cab1a3a3cd79eca7cc6fffcd7f419e952d17762d3e2bea59d088" }, + { 2925000, "4adb088eda5a1b90226e58aa79dd5482a6cb40804112fc99bc091e594ada9505" }, + { 2926000, "9dcc01073c58821ca2ebf82640739dae7f26745042f9cdec90b4739cf73d960e" }, + { 2927000, "b4655540362d3b5782900fa8e4e75c5fc3d7702a1bb91eb1e4ae7b68ff5ba0cb" }, + { 2928000, "aa20039830a70dacc36d7383a55b6c529a8273d2e05c90025f1b08d6841e6958" }, + { 2929000, "88a714ac70bfa2171306420978181110cbebc1558805e78c06847ae4d6290bd2" }, + { 2930000, "499b4d992f94330fa66a523ab30a3850b0b44755b205d326d1837bfc7a2833f8" }, + { 2931000, "0c20d9faa5feb3311e10fcfd84cf54687ac28383e5698dbd0cf95b77ff2f74a2" }, + { 2932000, "cf7777c550b2348f81722928050e8468ff621f3769a1cbe9c09765c678a7d022" }, + { 2933000, "f348adf2c68baedd795ebcdc49134d98efb74843819fcd5d4835df37ec9328d1" }, + { 2934000, "50edcdbcf1ccb2b51acf64e85513b5e85d5d630c81d6c468421a3eaca1e1c87c" }, + { 2935000, "9e9d6bc635f5560a1bdc8bd541b3ec3ed3378887cfd61c0b4832ffb88dfb10e5" }, + { 2936000, "7e63f0950e5eb1862971018defd74ab766077c36e4b0f3f3a2d28e15c43f7dd7" }, + { 2937000, "e534c62d4f0d84c28dd8208ad1b4c18dfc1eab32758196f82967a8560c50ec3d" }, + { 2938000, "74789409ae63d249e95083c854c6892180dcbc0349108304be55bfac4ddf38aa" }, + { 2939000, "3cfe6c8bd4dae4a1fd7965aaed0c0bac790b66443729e87333f23ba82c76744a" }, + { 2940000, "7d246e814c721dafa8b7a3cb24b42cf0644866225a56cce910bd4638a4383671" }, + { 2941000, "864b353b26a0c9ad5b1ed12659e0fa6441c720fcde96109cd54277e1d4bc205d" }, + { 2942000, "17ce53db974876e582ee327053ea194cf5d99937c08468b9cc24fccd32b56985" }, + { 2943000, "46b88b21090a22fd800b0cc271704513e17ca8e227f3bf1a9a71a18353658a3a" }, + { 2944000, "0bf946c0bb9847c860a6e35ceceb6a1e12eea96352402561f70d2626a4ea87d0" }, + { 2945000, "2787efd1654a3684da04af36c1e5894acbcd5779c829cc57297d5a84e4ab525d" }, + { 2946000, "951ef3b15956348de24d22b2c6911ab340b2db0db30c76400b8afabfe6e7df49" }, + { 2947000, "1898dbed3f9a7fbfbdf4b403bc4c30c727dcc90509a4172ef9797489b2c152ad" }, + { 2948000, "a41d0c69b9ff64d7cf55793ae7630a2bab794e68dbc4c39dcd17db657fafe543" }, + { 2949000, "410022f0c75d87d5d7207b4bbf649f8a46d467e92a5e9dde14703305116ff92e" }, + { 2950000, "ee74f785ecc67aa00f9de61ea82b0224c4d836cd6feddd4e811f5b1bf885eafb" }, + { 2951000, "c79f4e84cd02ca4d731e9fdff6389f637f6eab357bb1601fb9a79c82d5e770a1" }, + { 2952000, "25c755467457310a50e40c358a5225401748354bd3896a81279b75bdc67363bd" }, + { 2953000, "1f3010f134cd45135197e421ae9ada5778750d64c04043d957f8d035b104b99d" }, + { 2954000, "2c993f3b8f7d43dc3eb49ca76da951bd09891e0fa376e092fde5bfbc63342deb" }, + { 2955000, "4aa0286a4447fd3a2b4c56ca224008653aec7cf79046bb78f386250f19ceef60" }, + { 2956000, "8bee73a3698094387a7bae467e8976e7ddc8b54a40c2b5704fe48430b2c6ee76" }, + { 2957000, "1d18df661f7f9e8a0af00e2cd95d8c5338009386582b89844d0508163f9f0e57" }, + { 2958000, "512dd899101754a0f2b9d377d0535cd23034e0138a7008865058e32c82f2664c" }, + { 2959000, "90ab3e79952a2900355f43e97735ce6b1553cf9b09854fe3b3ec1c243b555409" }, + { 2960000, "d3177c665a0b946fd3e81091f6322ea02b88ca43bfd9729b035ba19ad81a58a4" }, + { 2961000, "db4ef73530a50ad6f704b0c6fb184c12475ec4f110c0ca0fa271c4186c99afa7" }, + { 2962000, "be4763f3c22e78789f2d4bf5ef8ab84d38dd541ad205f90651d74e015389813a" }, + { 2963000, "dbf23060fa5ffd66fbfbab4b61fe9d3ec02db66220f9c42632ce9236a6236eac" }, + { 2964000, "3a834275624d011e0a3e7610f4f8f15614c844598ee7cd73f5c5d40e51fa53e8" }, + { 2965000, "d765fee236bdc38cdcadb2c2964e11b65e929c2ab06dde474fe0e66e696a2915" }, + { 2966000, "94efe98bfa526fc872765bd366cbd0b5268b02976c632a5394b003b08f3b6cac" }, + { 2967000, "68e61ba7671454778a936a3dd65515fbed82f52c9aab4fa5362714f8732eea14" }, + { 2968000, "7f911b23e842f7ff59c4dc23668cf64d0961f2aafec99b6aa60a3d7ded44f33b" }, + { 2969000, "31abd6f5f42509baad5a1a77699dcc6e7e0287f490d7524f92e5c1dee7b09ae7" }, + { 2970000, "cb7cb4473c6ae5d77c40f9325745efe7b4a853357d95ee7cb5b6eaae5670560e" }, + { 2971000, "bc6d2053b6bcd002f9368a8e002876fadd92c10f45c1fb01265350552feb5aec" }, + { 2972000, "b25d4e264fd9cce33f94ab36a6a32852b5bc80461a47e1865b52c2f105ffdde0" }, + { 2973000, "9f9a812a93637291c0c147242d50de5e20fc26c64cdf1a0f2638469ca92ef7e0" }, + { 2974000, "42892c679fc411e3f44cd0fb6fc1dd929a94a832f4245e3ef931f70a3a3355f3" }, + { 2975000, "78d9a883fa59af52aafd3a483d0a04ef045b2262bc01757a4540dc580ef9294d" }, + { 2976000, "23bae00e966149ea6db780fa7981f4dce7014bc1f287ee4f1ca6a97b1ccc1181" }, + { 2977000, "4365cc4293d5f1d4d3962b91e21b883ffc53fc876a93ef35c53ab1ae6f1eef9b" }, + { 2978000, "756955fc283e43e9ff8a57a654a1ea9df16b7f6e99bc4039a93c238020fa79bf" }, + { 2979000, "0ee8a16dc05629f207b2d0df5071cd5a6b9e8a0f1f526e9766b711f5eb7dab76" }, + { 2980000, "ea1b4b87fa8be72ec9185bdea883d75457567de158c3802d702cb86a88951053" }, + { 2981000, "3f665e6b9491490224700ff8bba8e2ae74ee360db5accf5b9561fc0501f25333" }, + { 2982000, "37b855c2902072fe5bff47dfd155e2413e30235130abf7c9193ef191a31e696d" }, + { 2983000, "2cc6a3acc301cd7f128d7395b05aabc03d9d98aff567191828bd5707897f2ebb" }, + { 2984000, "17e96ebf299389febc9c76e81286da32124cb139ad41492cdcdfffea0da1b94f" }, + { 2985000, "9b5b059168eb994add6a0703e25d3b199012994d23c36dd27a0d7858abdcbb55" }, + { 2986000, "0a72bb9222b606d8e137fdb431e83b1cae54431fc9da5cb8455bb1a02074ad4c" }, + { 2987000, "d36213cdd2016e1825725cee69f7bd31b381f07615dd2034c0fef771c23dc159" }, + { 2988000, "0cf4610b17649b973976279ad61b0e788dd43a3d806f3fe643e0d096400df52b" }, + { 2989000, "12455f1fa73128bac129e2bd45324787c23ca527d6d21a5684254bde9f73f4d2" }, + { 2990000, "328c5f8c6fab55f73b20274ab61838b03c47f3c70cdbb416733f320c5daf9ab9" }, + { 2991000, "1b338a36300c77659a98bdc5cff8ec99324078023689b62b6296f9791da2cc16" }, + { 2992000, "abadd7811fb2534d5dc95eba6d3d5410b27a1fbc4fb89ae7674188c222534ee7" }, + { 2993000, "eb3a4b772f1095dbcad58e38f4f8251fd661fd35fc9d8b34b25b59df8826b891" }, + { 2994000, "2bca5ebf0c8290fd5527c371e3ea6459ddfae2197e87dcfe8066f0112a29fa4d" }, + { 2995000, "78c0f93f1e87233628ced9ada548cab24a727ed4a2dcec2b088fc2c493aac90a" }, + { 2996000, "acc30f8a06ee0a9c0c14e71f63e16aed225ae95df506796e358d491962432d22" }, + { 2997000, "d24a85b4aa547a62f68b9d3bf31abd71dcfdff28e203ba229e3db149d2ff712e" }, + { 2998000, "f3d96c2e1eb62bd35d4fb584417590b52488de4e65ca9071470239377a28343d" }, + { 2999000, "0e5138871d719127a87de490a3f50d718d7f3b7656207e8f6792dbc578e911ae" }, + { 3000000, "5c25f9157bd71e4ce367c6b2bc11fe6be51d53e8ce905973eb2ce18b235b34d4" }, + { 3001000, "0b3b9f62ba31e5d809535b5b7158ccb5ba93b600c55976e4924e6c5f2ab40f6c" }, + { 3002000, "4d9d906013b10af6a915275c2c403ed7c7ef5d2a2fd2ac1497e6316792300897" }, + { 3003000, "83ccac866d37231510e382588297bbc745c5041b6f6db2f3ae358033e6399b39" }, + { 3004000, "8956f2c94d5996a15f6f7feca01dcc94d33c0bf1e24fe7076f70fdc2a6012adb" }, + { 3005000, "9e0aa33baa221b4826dd7077d233e0955752f8a673aa60c0083a681cdae737d8" }, + { 3006000, "67a17d8f48ba828573f7e0402b5eedecf4924c047279ab4183944473fb08c42f" }, + { 3007000, "f2b7ba7d451262530a3e2988bd25abd25876be29092df436d22711bbec8217f6" }, + { 3008000, "33b54604e7c4ae6b8a14030634d82c0ed1febfc32e1ad76788fdfb46ee1b9231" }, + { 3009000, "d50973362cfe09bd8ae2d53737880b0cfbcd21728ee33fc9e0b53280019b962c" }, + { 3010000, "765898ce1d360ec484066886ee52764768a5397d9a79cb313c62c4ca53ffca36" }, + { 3011000, "94d95559586e7dbba1f359c3a259e2e46ab3a87cfb7ba1f4ba7cc73305065290" }, + { 3012000, "548e244cbf64edcf323d7cdf7bfbfd2c3dc3402f08bc8e2032199f73967423db" }, + { 3013000, "2386bb38ca46e47fbfd0a6e41c5cf3a6addc331a8966774a03eea688ef24001e" }, + { 3014000, "cf8f5924638d961ed8a66525d7a18ab81a275540068e8b64c2b622a872b3113d" }, + { 3015000, "c7dee77653f7e6db4dcda861d2b3f3b941a4e5ffaac09ae837ee940aee237504" }, + { 3016000, "8fcd10fce45776445e38c40c5a880e10306a17f0b1551568be0acf50d0ee6839" }, + { 3017000, "1be22280b41f98203b6fb96f04e693c218b71e7bcc9baa5fa3aa75594343cfd6" }, + { 3018000, "6ccec89f8d2b1ade9a9950b44abc50499040a792dde422eb6145b00088f2cdb7" }, + { 3019000, "87a4a7d662579a9531ba86a4dd7074a69bee751c6fd928bd034d98321f606482" }, + { 3020000, "7c5e474f2813a17fb2a55dffeb4d5f34a3a6ab627964fdedbfcb699b1336d2b2" }, + { 3021000, "a13dcfed00f1e9f2027c2030b36fc19ca47a5fec27c410ceb2a6fcb605aedfbe" }, + { 3022000, "01d282df5ea7d80bcf6466d41f8d2f059924251dd10729c5580b8041834d69d0" }, + { 3023000, "ce42c5011b5b6d971a5e79e45a908e44a543703be0a43687a164ab1baa0fc409" }, + { 3024000, "336953cc7d0d4bdf37b5db850f283a957b16fa05fff0073f0f8b7dbf2a22f42a" }, + { 3025000, "ba706928b265f22e7fd8de31df6a1fa487a9d27533c4fc5a0cf6484405d9451e" }, + { 3026000, "31381e843113a0f6ed45d177173785861abe15db6b4de45adedc9b0d7aae470d" }, + { 3027000, "7b55e96bcbfdca44cb5d070c0281d7d2f38de81d63649f0d52ab823c387a5054" }, + { 3028000, "9d6563e49af1bc6fdd574e58aeef8ffeea22d01fd9b793418523d59e94dfa176" }, + { 3029000, "22143c8eb06fdc6126807bc11508c97d8280dd2b1e26e5d2d22ae3316517c4fa" }, + { 3030000, "6d4a4541341110709159322e929bba110d45de7db30fa4306e972ff0bf61ffae" }, + { 3031000, "508d6fcc9b961aaf6d0f4fcb856e3379d4bcfce9fbfa06d1004287fde6a831f0" }, + { 3032000, "0ee0365efeebbb2953eaa212a78c3303f26c0a67919279b72a45e4256df32997" }, + { 3033000, "2b8e55482ff8fff760d9fae90f3cf2f3cc5bf03898c003677b2dbf71e27f781a" }, + { 3034000, "6a181a94d98199b26de91b7560436dac7207cd4dd45e7442a892ba394fd023a9" }, + { 3035000, "111c3e9b6dfd3dc30fbf6a0a4102c66e3ae70bef63d625e26f38a2dda692da51" }, + { 3036000, "9c9d760994801915f23e58c5fb234b46b4e97ac1c9c4b01d0d9a031c9487f760" }, + { 3037000, "8869a18cf754ab832ce28883ba849e2a93dc843bac3db001e6ef1144a1bf4bd7" }, + { 3038000, "a5f56a513915f3df6ad582e59b0a936ff1ac321f1f94d8c2ededa95f2a08d4e8" }, + { 3039000, "5e92b53395cf9c87e5bf94c422d06f8545a9c55f311b5b3c24dafb6fd5aeeaac" }, + { 3040000, "7444fc35c11a295a3f3cbdfb777bbe40580cc81c265ff4179389e8ec0954354e" }, + { 3041000, "d079b8f3f5c6f66ce3b47b49922dcad7d06f8d2304f43eb3ec3250bb3f9a8a20" }, + { 3042000, "1cae5393fd4d2bd9d7955086ecbcaef9411f1ab78f72598cb4c09e94ae330872" }, + { 3043000, "1fb214b7693c4c54a7425c61756dc00a990c9442cc2dc6f7c92b7af3e65654da" }, + { 3044000, "f9360298425bc01164162126f24fdc4ac26b984f5c8b8dc5651fff253cc2405b" }, + { 3045000, "eed57ab8b800021545496ffc531d92be84f433e944d9ae62b2b4dd8f8824479d" }, + { 3046000, "a1da3c2157f019c6e9dbf4e1d32c3270b7a9d1ad96182db533048f3ad8469d20" }, + { 3047000, "3e81e33c565258db7cc373729f1be67f8ea010a14f91701dab7b20ae181fb4e8" }, + { 3048000, "89c36cba2d2aaec2a51ac3e3c3d1e434ed984b9ee6d9a5260436082e4e3f0891" }, + { 3049000, "d2fea290b484b5827414d6d089f41419db48b959963936c11a0e98dc798ec7a2" }, + { 3050000, "4f9614382ca05d41179db2640d7694f8796fb26baaada3ef4775c7a9261881cd" }, + { 3051000, "99a7e3b51b791295bad8579ac4b6340853ff3b8263e9fdd1351a8078d1aac05b" }, + { 3052000, "c68ebb01a599834fa6dfd8414da3ceffe177c49bdae142ec38330353e47b6e37" }, + { 3053000, "39baad20e3f12decd65b29a17d654fc34dc8e9baf372836759313b686de23810" }, + { 3054000, "e1554b71a0ccfe2a1405817974b6a5cd8086303ae77a2243f7cb0250aa30f88e" }, + { 3055000, "6eb53c330bd60768f43991255a06fee700097492f25fb4a0d6a58c2d961e31ed" }, + { 3056000, "b089b47d34be46b4d621eb99f24d6edeb8f1c4a8db3e14677e8f56603b757de4" }, + { 3057000, "f450156ef0491fdfcdc4f981713d31ad27a36072b1ede04f06c36364f65c1698" }, + { 3058000, "ecaabc81ad09fd0fb21b2036305ab0293f58191f8c76b82c577bf3dad44d0b5e" }, + { 3059000, "422a39760fb255f2295a590c17b5d7212fc3ab214f6a16b458cb70f0d9af13bf" }, + { 3060000, "b71529a0c8eb46bd26c08100fd571ea69a8bf35e95ee89f6c5c1ba1389718033" }, + { 3061000, "95f254419da6301927524f08e841ee857a0cd1dd5b8a724ce5e0e216adbe5349" }, + { 3062000, "76d53794e08407294891036f891a51e47f2e98cdec6a5d9c505b0235b6f42505" }, + { 3063000, "bbb185be470393f0275127f3f7f45e05923d2ba9da0d6e6f036c2f7c72f7796c" }, + { 3064000, "97e50864324b9360d51c770c79769523269e2fb30d9b5677531c4ad10c0109b3" }, + { 3065000, "9eac5fe3a2858ebc4e57774cab8ba331d508be030ebca22fdd7cfd3c33e5e061" }, + { 3066000, "634ef14bc5e943a73dd73cb4111550d385d158243691edf53964554a08b80380" }, + { 3067000, "8fcb09ffff3728f61cafdd93a10d6f3d2fea108596b6efecefa0bc5f75d42457" }, + { 3068000, "8f0568fe525f328373a584c8ffced9ce3b06792f1d94e285321a75f98c2bd2fa" }, + { 3069000, "44b87c68520e6acbebea954826dd5e776105965c9d2a30582bf3ad19c7765e3d" }, + { 3070000, "b552f05e1fa92236443269d9ed1ea54e7d51e684613b7f2f2acbc00c7093f688" }, + { 3071000, "c3985aa1e09ebc50656ff7d4bb63e2c6615257bfb327a48091cac1ead1cfc7ff" }, + { 3072000, "3214e19393cd0cd8e1d6509bc1ed5342121352ea2bb093d1079c296b85b417fb" }, + { 3073000, "76d21b29041d218156ffe91afa4cf63932178a3d83e8c9c8e146bde62d49f28c" }, + { 3074000, "cc335a7ce6fdfeec607058a2f98697693d14bd2bdfde7935f59b23989e29e60e" }, + { 3075000, "fd37593851a62e3170e3d3ecb84715b005fe8fbffe61a4fc32d0cf16a1533cce" }, + { 3076000, "c27cf123745da7e3f5e7a4e4bed119bc10b8892de28d16c58586f0e901700bb9" }, + { 3077000, "67d44de0ffe2cb86e515766bf33e1412f42c03dae0620d07375a71e781d85ce4" }, + { 3078000, "89e5fc5892cacde126f187aec326be5d33adc04459c9bad3cef377218519efbe" }, + { 3079000, "99774b91ebeba3d1ab68cff8812f15998dcd8f82a221953b4eafe263581187a5" }, + { 3080000, "cf1315a2217955940201b37980a85f4211b8bcfe0ad543a5a77329418de2527c" }, + { 3081000, "f05faa1ed0a8ee19dbbd57f9a4c9eea2e82faf5a8ae1e3ff22a67bd4a14d07fb" }, + { 3082000, "c6ba0eb3e2ba95c5c7921f1c369208a3e539761c3b1260b657744f28d14b288f" }, + { 3083000, "b0c551e974bf388c51fcf48324437ac92b29281e49328406aa743adff063ed30" }, + { 3084000, "a976514b9d9731b4b2792612027121e6cf23450a81cf0925c672f7e7d4b2c838" }, + { 3085000, "cf8827788421c1aed64aa71c1c342da421c7c9d9f457eee8179861027a4daf12" }, + { 3086000, "314aa0f3033a8a51013ad23385ff1158a38a71be2d20044db5c9deb04fa63697" }, + { 3087000, "13db6c88a669bf223b35fa4ad1904fc7b439c859ef7a5be6a2ac5fcbb113937c" }, + { 3088000, "4921dac730d47885f7f9ebfcf5e92e616bf37de015854ef6994ce52dea69b4eb" }, + { 3089000, "8072f3964e4588ed2f0081cbd20dee18804ebc38de495681890b4c43bdc24a87" }, + { 3090000, "5218ce00524cbcdd6dad30d9bfbfa6bac41e7279bb55ae3f2e34e3de4805b547" }, + { 3091000, "119fc5d820584f5525027907030a1a63f2d801e3a91349a6f41360498a0ac7ad" }, + { 3092000, "68d9329f3c1c7ffb783f6b598869f7a6093f06786fc93dd6590b7be59d76c056" }, + { 3093000, "49358a12c380164ff8bf28d83c6cc4c79de41beb1e43a81124239421086c7c7a" }, + { 3094000, "ce7363f433b402a78ca9bf08da1978d506a0b511788ec21e218dd28f8136bebf" }, + { 3095000, "db51e079b6bba29c17911e93f156a781389f27e17b3c22a2bfc11aa47b550c43" }, + { 3096000, "be417367ce8362e226971e2a5d6c19510534fa7ab1836a5c443bf2d0791ba306" }, + { 3097000, "ab2320f67aa316ca87af5c3fa90f5970019e596e121363058e5942f0c3054950" }, + { 3098000, "0f880decf6fe3064c844b23346e5c54e5bc2953f86cd7bbd211ddf43c7c74768" }, + { 3099000, "27075dae4e3acaa74fdaaa224723837e800477b95acfaa9f78265b995eba80cf" }, + { 3100000, "8181379a740aa40fb3a8d1d5d5cdcef7ea62d49ba6f3c65d009cf02383e678db" }, + { 3101000, "389e462cf17fd7de3d9256c3ee8bb2c4e2204601f3175722de163588356fce3c" }, + { 3102000, "63a9c26e6e6343443f2bd5f10dbafaf622d9533489c632fc3122df556c530d7c" }, + { 3103000, "e89ab3745e56a84a8b3b174c34b1653313bc7af641de1c02af03c83e9cf5dce4" }, + { 3104000, "3f1796c4acb909f44a7b5439701d356ab7d0ada0eea5e8bd30c67f13644bf3bc" }, + { 3105000, "fb5787c1108d962cad027d2742c47695444ab125320601e34c6a7a28731f3bb2" }, + { 3106000, "bd8b5e3d80d9e809f8ce4503cc3a1722e7b1c269e93bb4b4244dd10fefce7d59" }, + { 3107000, "b78b8f72f62cb0e3a25c534bdccdae55ad90636cfa86ca157c3b4bc4a9c50b3c" }, + { 3108000, "5db4a3b969e0b06dd50bf18ef01db961dba97c1c9d6c6371e22413d69fc290eb" }, + { 3109000, "96290f9e9856e70081c6bcda011be2c48f9b7f79f1de53b38e17c4bc5fa93ce6" }, + { 3110000, "f3e89899f9cc0ef605ac6822198168b3b68cc317e6bdf5a4c438519f756f26c8" }, + { 3111000, "de5160d9ad80d4e98dbb1b4587d7c24a8a5530b8855320ad88c9e1522a8dbf94" }, + { 3112000, "41810592a7e1e32df10b711310bcaa695a47512be8d796d84e5afb000f8ac340" }, + { 3113000, "6963699724dec80377862ed98ff93cef034ead326adf313387a29505f7706790" }, + { 3114000, "ea1d5826d9d5c992d6af2c36020562dec27727220237b8b343ea5f628d75c90c" }, + { 3115000, "a65da760173c886100052c1f229eb390f4a622a2e799e44caff58e8dd3fc250e" }, + { 3116000, "1bf1357ca5eedaa9ed9ff57c1c844898bb7f0264839d6b64c2ca427a964e47d9" }, + { 3117000, "8b9ecad196459d881d6f771218ee0aa8a734358fdab2ca01dde69524682cd49d" }, + { 3118000, "dcf9ed93ebbcba66ab65bbe5c3b2b2270ab271b439aaff0af1eaa004612b5372" }, + { 3119000, "ec38e319c5a853504230db117522191a5527a9b3512c9ad4ab904f4193d2c43d" }, + { 3120000, "595e25a440340e1ad78e118c183ac02a1dbd6b053406d4664cf3a64b6df0a1d2" }, + { 3121000, "352d2cc9e3b27da26f0f5983fd1c914feacaae874c5b2dfe72770964ee8207a6" }, + { 3122000, "888c4cb97d45a9a6f726588bc3373e0c3997e3e9c967ed0322b985d9e83c0625" }, + { 3123000, "b48d193f7c1ad92ea9d40c76d9436f367e8473f030933bafc8cf0b3e0b014b5b" }, + { 3124000, "17d422fa98c670d0a1519640e5111353f05cba518e906e331c67490f76a80fe1" }, + { 3125000, "d56a0372ef438d5d7a3a984bd9eb05abec1aab9a3808b1b837a70d9e81320278" }, + { 3126000, "5ef58a6cee33923f03fff2f22d3076553d73dbde539d0442027531cca9e6f6b4" }, + { 3127000, "c02fb75c96b78bd700e447a013eaddf3889f22aa51ad5cd43c1371ecaab26b03" }, + { 3128000, "a0e2352bfd5e9c5d21192764ec8af742dcaf78f0f52d2452192565e3c983514e" }, + { 3129000, "7c0cb1ebd5b04860063ebb2637979acf29f3c925ac5309471fcdfda912797669" }, + { 3130000, "1a9ddcb0443be8ff19afd1e5f64bf1ac25541a180ea0b7b3c61b0c7a721bf7fb" }, + { 3131000, "34d774821111d6ca9cf54f42b99d004e4b857cedf5ba6d3f87a4388bdd8beebd" }, + { 3132000, "7142771c53f2b880bcee8ed8150d60566306bd8978116bd4448833c4e561d9d2" }, + { 3133000, "da64ee333b4273aae9589939338dc592d9094159a6a69b81e523e7f7331b9765" }, + { 3134000, "0341ebcd36b2b8d6f5f12fb140447093b940105d36e0bd027b7be910b3e3b24d" }, + { 3135000, "195580b3a710828166d7b3f0dd05f5ac502b319d0800d886873b57a6ea41399f" }, + { 3136000, "676e60463ad1781bec974443e6cdf0b66c82622e335aba2e1a660373255c2bbb" }, + { 3137000, "009a70ed78c772b8bdf16d13eca8db28cd0dcc55487c233a4d19996de4b86a4c" }, + { 3138000, "25c2522ee1e1d01d17c49c265cee20b7afb9fa935a2c1f4b92e8c9550841abf2" }, + { 3139000, "91c94a4781c93164d2fcd0a04667b17c57ad9d347fd3304a56e9d933719d2269" }, + { 3140000, "b618625fe7f15440dcb0c552b0b10746045fb9b26833dbf3d138abab3689d340" }, + { 3141000, "f912ab289e68f748204cfa4f4621c9609d4dee9ed7c45f6bf8c67bae5ce27469" }, + { 3142000, "3a5fa59917ec916806fe9d853f3153cfa5b4fb37867f58c98bcdc4ceb258d691" }, + { 3143000, "6d83be09d8e00d6a1883ec48324e3129986fc6e6178e39bbb32b780dad31c505" }, + { 3144000, "aea3888b87349076ca22f4be07718f07710bdbca55ddb9c657abf02e2e21322e" }, + { 3145000, "30e6eb105f262405190bff7c1602dbca75b744196dda3e7252e15dcfa74792ed" }, + { 3146000, "801320b0ec932141fb62b88be9dc38f6cd5a2399d81211f17431a55c5264ed26" }, + { 3147000, "09ef361292ab0fe69c1f254bd460ce69c65df70bdcd44acce79c0ed1c8037428" }, + { 3148000, "585077377ce46e8ad1871152e0a6bbcd209d86b70f0ae6af24c754fbf5face6e" }, + { 3149000, "eae94f19f9b4f7024a0e09d1923d93e9f2e3218f40b66db684365339b1f91cf4" }, + { 3150000, "410d589d09dfee9fbd536e24821f5a91dd00f773818287457c4e7869edff8667" }, + { 3151000, "54fb731905e864779609e719e062faca1ec84ac34cee9827db664756450a05ce" }, + { 3152000, "9accfeae5f07b2623e64b398caaf13f72b57bc4b5dc991b4388cd0ca5da2b263" }, + { 3153000, "5c8e875c77a41fd0eec67102df9dc0312853e06dd645767f31735b57f236bf06" }, + { 3154000, "5bc1a880f5962e0ae63fd65a7fde7cb784388070851135b4092ffae00168fde9" }, + { 3155000, "dd1d92ad266365bd031f21682d6717a6d5b6af8f3901f95cb2a75a56d1696035" }, + { 3156000, "bba5f48e3864fc0b96970460d087050002f76239b647f73aed5122175a59da64" }, + { 3157000, "9dc00a316fcb57ffc8b6a55f56b6450d24144a394dc2748bbcc4b8bb753d4b3f" }, + { 3158000, "79e2353c70d5fbda54ee4e8d7ef3e5194afd1d6c5c247360ccbe3249e287f746" }, + { 3159000, "c53cccad639305885e3d771dad76e609eebebd88e7abf5bf88a3d328baf5d1cb" }, + { 3160000, "9e1e2a71efe1d093018621d5c9738f408cfd2953df2daa0acf8690a82b549960" }, + { 3161000, "b3b7d4ac8cc37e1474e3d1f93b98f8356f35e83d57eef9bae26bf5e16a0738dc" }, + { 3162000, "abba3e5301f1fac4bcf1ef081130577fa409ad091da2470516489ce74265297e" }, + { 3163000, "aad231052ebd0cc5a1aec641557d6dd1e00f5e51a36f370e35f539dd3753837f" }, + { 3164000, "812bd0cd9758d6b3fe479b695e01481206092718363955923833b53138a7fa8d" }, + { 3165000, "dd27ce5354b3918fa8c2a4db59a6944442b4e49b624fd271750707339513a829" }, + { 3166000, "4e5a0ffe0f49fed0f83847b8c4973fa1f859b12cfa397df759bb2680fb7d73fa" }, + { 3167000, "eafab654002a8362ed9b7c53db6d707ca2f046e285f282b0182fea54e83d2ea3" }, + { 3168000, "b17b0168fd203b4663ecdcdfd45acdd248b07de1e9a2e975f79d8332fe2b95e5" }, + { 3169000, "43b6cb92be61ab46c34c9c45f6191d1e097fc99c46608d340efc06b7a49ba333" }, + { 3170000, "473d0594338fa27520ca6350ff87817d52df70b4804df54dd8a98a89db4de054" }, + { 3171000, "5c2e3f68a4a1008ed69571ade48182c39028937843ec959c98d33db37edf668b" }, + { 3172000, "742c8d15dea830c990f329fca9aa625e7142ce2e979be98ef04f46254912cd0c" }, + { 3173000, "624f9b0fa80a306c1586307d3f6200cd671d72239522a7ef71365a3c3c226203" }, + { 3174000, "9b0930e2b8f6fd879d4b5c234d15beb08dc9c31b587c45e0802ba69c1cd3c116" }, + { 3175000, "467ad2c6d2b6b8712fa041503d84f8e475e098ff122de62a062295ec2d6f4135" }, + { 3176000, "e07f13bb62cd8795f5106107a388a12d03d88529abd2d98df2ad549273f6f9d7" }, + { 3177000, "300770a79afa8784603445290c4d778b231f3563eb6b8fc375a08c45dc7d4a7e" }, + { 3178000, "7b266e8b1ece3e4965ce94c1c355c0268d788b160e8999dd960ada6dc90fe341" }, + { 3179000, "4506591e656a60a3519c8a48656525ffb88a7f66d303c795bed5bd9d6be0a39e" }, + { 3180000, "a03ff0343f63733f5ea1df43852579a09b75936b2fe5a551e22ac1113de63de4" }, + { 3181000, "40ca323ed35725ffcfdd552172ddd5f72978530ccb813b55b1d789ada71f0233" }, + { 3182000, "c248552fa425ac221ab5ad5980ac36ca504a4a8cf5e37f375dd34a9da287e07d" }, + { 3183000, "d929c6a8874b441010fb0784651a4306a9b3d1db2518c9eae0d01cf2f305968c" }, + { 3184000, "f4908dfd32a2ddcdcff3496cdce13bdc0d63f52b0ae5751e2f09f946e1d80470" }, + { 3185000, "9010fd0074dbe3ac9062c59d54a66e067caa5e5056b6e913613e72862596d18d" }, + { 3186000, "e230c7f329a97141ee4d99b6c9f33ca0e8770b0ccff9647e273737257a28fbb5" }, + { 3187000, "58f5f93115771bbda78c99e43493a5deead7383998e8a0eddd20273573e39f83" }, + { 3188000, "839716f42c1dfd7c3e25850c9df1a2ae2dd855ca2c92eb17cd06fa1eca596324" }, + { 3189000, "db063dbbf4521b55a93b3916f6506c728642d305606557e68ab62d778bc3eb33" }, + { 3190000, "9b2f6e26734bc6695be4823de4f8b2af8fceb2fa53c287d631583e64ae73b05a" }, + { 3191000, "03dee9e0155fea3632a2ad7aa8b630852d231826dee076fe7fb346be6d8a85bb" }, + { 3192000, "4c9fe2efbca509a3d974eb15cbbbebe0dd229cf43e5bb7fc9c98079b388cd7e5" }, + { 3193000, "61d7b9c6e6f1a43dbc3cb6d87240574ae297ee3f6c3183f0c6aadcd2643499ce" }, + { 3194000, "023f0f74557add3a03c790c5690c9da4c7a279a4769e21f097dfa122e66b5e43" }, + { 3195000, "7dddf7953f80b061a61ed0bb01b1793cab007b7f271ad4576834ad2803740e34" }, + { 3196000, "2a8c24bbe7070f9ec22db84f4322a5427d1c0b328f40fbc3403a2fae2ac97ec9" }, + { 3197000, "400bfc0f60238e00075c9f66165ee4e0ebd53c271eba76f02bedc762be6207ad" }, + { 3198000, "f68d9350b4b5831debabcf9b2f177f8fcab36ffab4b895dc31bd16f9cfd55797" }, + { 3199000, "df88991a3c3f1b4fd608551162389888cf07a5df9655cd1d92cc444308ba72ea" }, + { 3200000, "3b58260891025de2881e45989f6f93fbd2cb5067ef9a0e4a2207833ec9469675" }, + { 3201000, "be874f029c7f508771df6c783ec117fb70ac313a5ec80796ec35c2957b93fc39" }, + { 3202000, "bf498dbfe5d9a36e14635c8735067673cdc43ea9163cb17e4c6dee8cb0ff0f9d" }, + { 3203000, "4e410d8615e3035d61de643c286ffdc171668efa1deeb6a90a946c2d495c07c7" }, + { 3204000, "7fe14a9c7e3bbebd1b5df821c3017e0a4bedb0e9786679b9d31950ba4c804971" }, + { 3205000, "452bc44d692fcb0d208ec1f661b118678025a642222d8f8d18b6d8723435c33c" }, + { 3206000, "536c80d6c756c99bdee8a98ead62924a77c4cced9b02cf7593bda60345228dbb" }, + { 3207000, "159e568923bb809a02370fad123247df4af21fc2fc102a91930450d7a76bbd67" }, + { 3208000, "7d07877f6c8c1e25677428d2a31109bdc1e882f0f7a464c8fcd0cdb701a25e31" }, + { 3209000, "7be454a363dd21df880ff1d2f2a74dee2bf1f2427685e1ac39156412a13b5afe" }, + { 3210000, "d8bce02188c554e1a96a2afe0fb235be473778e1fea78a91a444a06c5edeebb9" }, + { 3211000, "fc3ed511ab90d66570fbfd361149fc8cd30ea3d2e5b2de9d5117974fa822a6a8" }, + { 3212000, "d19fe23597b11c6426be8ff2ffde10e6eb70a15f58263a8026e2d9b93f820093" }, + { 3213000, "5c2fb09397d01bbad12f6f8743888e6592868da3602de366de9163887409c80a" }, + { 3214000, "11af29a2afc910b18f2572dec0288f6d424aa4d30c783b3baa4311add4bb47f0" }, + { 3215000, "f52cb7786fe56b2ca7f4fbac5be5fd595f06dea3bdce92b10399875f059e655a" }, + { 3216000, "033f80cb5f066fe3181b6d46b0c3054c8bb78ba71ba08d3ffb0c7c81c01832f4" }, + { 3217000, "0c6a893f73c3780020d1a875437135cd2943729fdb3c0e204e8f375f288521bb" }, + { 3218000, "d6d52e70286675b77820555e8175afb7a80717ce725cf1d6cf9211a5ece76ed3" }, + { 3219000, "bd2c832fd8fd115b2516bc712e8921d24cc3a6738ef55a05d4485a37ecdf33e9" }, + { 3220000, "adf4dee3d7acff2239823dddba15499da7afd30618d5b998d14ef05d7d8e48d4" }, + { 3221000, "069385e589baeacf5375a1d25379871d0e85e4bd98aae74890ff6838249c9a0d" }, + { 3222000, "86f76c1016ebd072610c2b8f600c15980ab7245a443caf7a4df1e2f2d740545d" }, + { 3223000, "85429407f0a54c096998a83bcdd30f01810ffa8399a1b59d5e85bd6727d9bf19" }, + { 3224000, "81075554f9d4ee08d1e472d83e6f5f575bda9b5aaa57b860c177c09dcef109ea" }, + { 3225000, "8fa10381dadd3fc548b815487a15509b64c8df23a3829f7e87c626d7c8329c23" }, + { 3226000, "767084dbb9887ef0bf0f7243b50c4b74d2f28521fa1391f8a96ddad310362faf" }, + { 3227000, "bc0db67ad69fdb5a5dbba82d56adc07e97487369630e114e33427edd5917eb10" }, + { 3228000, "cf58b53164236996ca2e0cb81f844a18d7de63129a4a0a7bf0484ce3a47fded5" }, + { 3229000, "11b2ece5284c17b6e6759284b819d736c3ea720458ac72bf2281067eb311c12b" }, + { 3230000, "75fefaf4b995d2043ee20b47897d40c9f4f589496f732acef96668e76ddf27dd" }, + { 3231000, "c580685e5f9a8f006ea1cff7f6b7597474fb4de552afe53b723dbd55efa4e1bc" }, + { 3232000, "91fefc511d10d0191dd70793fd6445e60fc8b4cbc590971b063584a300240427" }, + { 3233000, "dcd8031a28a84aaee12a5a42b7664528952dc0deb2be42f7813b87415514b729" }, + { 3234000, "e876148ee58245466190db645d78b119798d1cdcfa9fc1660bef9be95b4d410e" }, + { 3235000, "a0a7953c43483493e2f9fbec69271bf05f148257d877efcdc0ca195534069662" }, + { 3236000, "fa1bbda352728ac9fff48d48fa44264d783953d3df43b3239ae5e3d41825767f" }, + { 3237000, "4f0920db52401aa3b6b00d1be0c165e05693b52f3a196956fb8a481cccceea3c" }, + { 3238000, "9d0590dcd78da30742cb160791a075ca4e6fa35d9f557ed9598d7e54dcd23d2e" }, + { 3239000, "cce792cbfd78645832e3565385ff04d9fb9bd3367bfbe8751306d846ab0bae1f" }, + { 3240000, "b42e157b38cd57ce7f312ef5fefe78590cec52bc123d20ee644ec5c2ffd5db54" }, + { 3241000, "c6a510952d6a3d2f5b9cd05323c531cfb5a3641e7420db4a30884a185dc616e5" }, + { 3242000, "877e651018bbbd5e2316b2695d3353f50741e4a751f871cbf0782651e793fdae" }, + { 3243000, "e7a18ea5cfa25a593b9152483b40ce224b94d036e23c1f4f99cd5898f3d32781" }, + { 3244000, "fa1c0abc88fd105bc546a6860fb518f594b7e793db8172f17758fc2ce209b533" }, + { 3245000, "785fa37d40f82669ee57ed6f9306b551b63d6bc5ec348d7f1ff81ab8b0fc19c9" }, + { 3246000, "6b6dbf19f5bfc8689eaf860f9b16f17a340a1fe599856d17d63e1de9798b1379" }, + { 3247000, "1f8826fbb6f5a0a9fba77a1a976262a03eba44738e9fcf24327b7395d5d42222" }, + { 3248000, "3d711f831979f0277b0830110c83a3ec9c6ca04668ecf4028b3c5cbc911e7067" }, + { 3249000, "a9cdc9ed5999c883fca35703838970c15fdeba47e42290021e09387eba9e4882" }, + { 3250000, "b82a77a6aaa5ac6c376f7e0e4968ef5bf7d56514bf992996057f9f0e1c8f9fce" }, + { 3251000, "5f4618d437a811b1dc424360a33193b2605ac660f385519cfa59e9b48e46180e" }, + { 3252000, "5a57c0932b8213660a65bd8f1b369792c6f51d775cbfe5e3ef92d5314d2561de" }, + { 3253000, "d5348b5d27d9cdeb1afb29c4364a0a8a99302e86c1c84b9764fff10206c10b24" }, + { 3254000, "f2d1c3526c27d87f57ec7af7529cfbd8a97369913fb53f2f0d91738841225d84" }, + { 3255000, "f99f075ee2372ce1341b04908d7e13a219eae5bee94b6dc65ea7ba29e80cf7d5" }, + { 3256000, "8dab22743e18d9dbab7298f6ada123cc0e74be0c426970d57ff2a6b8951a29e3" }, + { 3257000, "5b97a9c9f3e47ba13cac151dbc23f24cd2703dae72a5ba5bd9030a36bb05c71f" }, + { 3258000, "56ec37feff42ef99ac6cf7429ea581b1e44b6bcf22af0400f4f7e76bf4e029ac" }, + { 3259000, "bf6d469e8c482776ce1f812a783c2e798219d609d928711372b433b05c01da3b" }, + { 3260000, "354beab712e1b92c51effe5b84348fff6a3e441823104b8807c5120f827b085f" }, + { 3261000, "6080f26f11cab1b1319d9a216d42588e6869b1407b9c5685aad70decc8174ed8" }, + { 3262000, "58f8cf1109356644ca882e3da841d3b9ee97ece95a452ce836f8b08a39cec1e3" }, + { 3263000, "4814a51f7c6643b483cebabbf91ffa49bb91e0ee1f7f88ecb9b452cce1cf06c1" }, + { 3264000, "5d252694f360d8105ef13fed654b24b88b9ef5067e19b6a7c43979f20efc18b1" }, + { 3265000, "253c33631870fe96f86c91c1543d3ff54180ef3ae50185883e2b804e92852f72" }, + { 3266000, "ababa93f2da4e8fc35ea25451e74f92117569ae298669f3ed5bb79b9cc069969" }, + { 3267000, "84528f0cd3a596d0d8a7053484728c8f3cd3d5ee0aa5c02c22d947ddbff8718d" }, + { 3268000, "ff42f698f29577a7f9e282adeaa32a0f98d77aaa2a58e2ca6adce10284b94e7b" }, + { 3269000, "64475ebd9c7c1a31b67ad8b9dc0146168a4e6c0666c747c0cea09df8fed2812f" }, + { 3270000, "a78481ab822609c38e20335be4d9f220880e4de67ce25d204f874509b90fd750" }, + { 3271000, "6f679aaeddb5071095db48cfbba1a87e7d4e72074c74074bb7bf26ebc3415442" }, + { 3272000, "4e061e0e63433b92531a9e01e9fa029df4bc21f2c87487bb59c9b39721cba18c" }, + { 3273000, "763ef1c7d848133c3598dda907ea93f53f4e8febb5011e699f778b922011661c" }, + { 3274000, "87bfdb231ad4c613bd60e1ca79d128db89af7b181e098b6fbb535159f9f583cb" }, + { 3275000, "e491a0eb1b40289f2eefbabd2142d9b22f0bd9dfc1ae73adec6c10ce0d8aceb2" }, + { 3276000, "d00a32578818495e79d795e80d3439eed10e033f33d77aacae6dccd0c77b891c" }, + { 3277000, "9b312b8e630805745e490dc250521b318d535db08592d79ff59dbc0320f76283" }, + { 3278000, "2ed3ae326a1784b80543d523df7dcbd9401c005eef3299389b30e4e0ed41524a" }, + { 3279000, "810bb433d1adac26942785cfe1a49359040d231c9f348efd7a9e65bab28e6d0e" }, + { 3280000, "f9b3d574f51966e741befbd06f2df63e8113bafc2e023e155a2e069d45e7da04" }, + { 3281000, "ed72411cc2be933ec08ddd55c6caa74d0feb85b76117990436dea1b647ff263a" }, + { 3282000, "840a5b9f65007180745dd119f046d3bae3f06f980bc4d94b5c732c5bb80dc27d" }, + { 3283000, "473a7ba203dd428de49b4e67861beb12780f746cedae890a85183631a36e156b" }, + { 3284000, "9a00e093393ee0654fccf9324430fb176bbc4ecc57ee49cd56bc6b0e736889fa" }, + { 3285000, "69038a4844de38550f55f85ebfda6a206a579ce81457d2c92faf3a4c3b92f0de" }, + { 3286000, "fdba443d3149a86f4348c08522e7e3e175991fa2f608e305547eb11c199b3be0" }, + { 3287000, "2cf48af1f256ea5214dfa3a80a9e904a2bb2568f5b6b5646299bf95b61e30419" }, + { 3288000, "fd9ba9bd1855dcaffad2972be5ddda66b57e7cb94b63da650677341199924a89" }, + { 3289000, "aa59c40eafdef288b1f93598621c81c0cafe380d8f19a063bf000a09bf830492" }, + { 3290000, "c1af41c7ff4614de0181da4ce0de8fc01e4f525d0835e84a53098756679cdedd" }, + { 3291000, "fa25e0fdb9a5a4d3708d2a0df66570b0c20bd3ca8f283cbee9df61f92883b69c" }, + { 3292000, "c1b34a6ba3cad452556274610ba55563b8a9a2829534c9658be78c495bb893b0" }, + { 3293000, "50ecb783438d63e44c56a7004f3f61ebdb03bf8f97410716ea1a2158b4d652ae" }, + { 3294000, "77bc8e7c52dcc56e74b3ab5f0a7fe25f205fe08c51d113e84873f31baeecca62" }, + { 3295000, "4a956cd8696c45adf3d8aa8182da53e9bc553dfe2374f78a174be002578bdf68" }, + { 3296000, "005eece1745219e36824f8cd97b5371c6656947c95286e9d482ab2bfb34a6840" }, + { 3297000, "9d3681dde5b907422b5290a63d1d4949b19fcd92953898a243e94512bcb745db" }, + { 3298000, "b65b11feec87fa996120c5fbd6d171675ede723cc04a84ab6d0e8991acd419c7" }, + { 3299000, "5275c248e7be4f24aecddc9cc16e5e020030c2e32195a4d75fbfb4d1aff4c7e1" }, + { 3300000, "0ddc52d1a727e9a1df55a518ac17de9185b201af0a481a1cd6890a80ed3b6bd9" }, + { 3301000, "db68e4868b7eb225e3297d40537b56fdf77bcda15434da60d271ffb556c73130" }, + { 3302000, "6d0eb703644f61b3f072a95051f2364bd5b25759663dbfe7cf9d130346036e5e" }, + { 3303000, "a54d423e2e16baf116579a7250835157c4253a81a7fb3b2813df4b70da6394c9" }, + { 3304000, "7151f8f549e71897e7347d59f458d54c4486d41284d681ef3e6f281026ad3654" }, + { 3305000, "f3dd8ed8a19c6a4640e9412a58e5716c92331ac8e0e10c919fdb4a9f064eddd9" }, + { 3306000, "8339a07a1a26395cd7ec6fd081b4c3036c3d74353720ee12eea1a28abc9e4005" }, + { 3307000, "6ab15353cdbf60a9c7665a2578c7baf11e63883e014d326581aa926e9fb7ab14" }, + { 3308000, "46d85df6696e0e411dad4faa5d35bb7e1b3d8d22400c69a54371bda994ad0d3a" }, + { 3309000, "d5ea57a3c3abb152af6c0aab39640038861a74d72fd22ebd9e0a1d8f1b2606f4" }, + { 3310000, "08fa05c410be457df131475dfd0e60d76d5c30d44d489ed57d2eb8ef8d377417" }, + { 3311000, "9e284afd1ba5fc7aaf331f710cbc39c0cdf44e567d4cf26d4403357d621310f1" }, + { 3312000, "88c445b8d8e1711cfffe8e9b99c0b9f925b4d0c221dd1ca2b6c891ff3251f63f" }, + { 3313000, "62bf872b3f467afa5728b0a4f65459a51097b95af5a4a4d2e9962dd553fedadd" }, + { 3314000, "7b9cc9862e25f8eea5d04876a2b8ae2efcb679c0d5b40c21f7f76fc4253ed832" }, + { 3315000, "ee801c6bae9f0486d10a03e277bc6f3aa5c3e8877662bf2d33c9380a36a505e5" }, + { 3316000, "7317be9f8a11120ec212e250ea3ff167d8e8e63f2fadb8a6a58a1b2694312987" }, + { 3317000, "c3598b73ba406b14ff38f9e5f93faab80477c5b20a50df6082b4ee0113b2f7b3" }, + { 3318000, "bd9011c0828e5763fafa6e308cf8f722bec1908976beb3fdbea598ddfc7bdcf7" }, + { 3319000, "ad156c9e8b12f752a780c1ba3d5fbfab6ad2863ca12fa257de4167f1f646decd" }, + { 3320000, "9e3d1953541e9d5fad8587fa419d571c864686cb7af13a8060902f93989f3b02" }, + { 3321000, "f592842a77307c66b6052161a1b59f3e33d104df308557f9c2ac1a6db746df7c" }, + { 3322000, "2b95a6d82836826019bc12dfda009c437e02c67fd00bedb792b1d23e2eabddeb" }, + { 3323000, "1c1b8fe74fdb9045d6f5d5f00f8b6e2eb34dcd4f1ddcc5cc10f636c5b480cf7e" }, + { 3324000, "8e720bb76d84f406fac690e11d20fc5983e355b7c6689dcfeb867b8c56c18513" }, + { 3325000, "88f865e80cdba9188ea9469f01ec473979cc2685dc945f586c9c246d60bbf0ec" }, + { 3326000, "20758d50744581058ed1a07c3923b6213f571cb14b99976715d081344ebde65c" }, + { 3327000, "41ef9f39ed9ad604b79f755d10b149f5438fd4b97f7233401650b39c5b455375" }, + { 3328000, "e49b550814378903b3ed4ea201350dcde3cf4728401110ec6f842f0e61774003" }, + { 3329000, "56cbfd46e269fc2907585cad70a19bbf52a86766ca210c503ecc6b90f3c2604d" }, + { 3330000, "f598d12ae0e82a0be7e09378dec73bb7b18ab3ed28095b3e1c3bffde3c6c41db" }, + { 3331000, "23086d5b172d843c84ba93602602eeafb732327988bc780487ec9b49b8187ebc" }, + { 3332000, "1d008a88d325917a67b519e29afb2d14905e49828018ebd9e7bbe2272c2aa92b" }, + { 3333000, "9a6def07e0cb437ccc1a9229d05e1fe47764460171ae20d319e96e8503114cfc" }, + { 3334000, "1865f4845063d0385eb991b3b6429cd2fdeb79d02cc0a41256553662879436a5" }, + { 3335000, "0e33f65d7915417eea50fcab7b6712998136c970f138fa3ae12a121502ea0de3" }, + { 3336000, "abe35bab044ff8d4c026b1cf1fd9d58a7daf1038ba2f95c771520e64e13f2ac3" }, + { 3337000, "0aba9aeaaf2e79582af1b1678331e371cfb2900e35897c8451929d276a8b434a" }, + { 3338000, "77b80487f7794cae2151b1a6203623848cf19fac7da21fcee6a4e7ad5a17336c" }, + { 3339000, "c265267722dea27ad38f88d23b2d6d243da5b7b1376bfa72b4196179249375d2" }, + { 3340000, "221e5a51e159b16e98b6aae415bfd923074d32331eb4a2f9f92fc87f947d3863" }, + { 3341000, "a43f6579322d08788e2cb5844e6bdb1b941f35c6f409c0586d52eca077de5ded" }, + { 3342000, "65f4c2ee5249c92b72b8dd95afbb35ce29b4d0176f0439b3cca4d411d43d954e" }, + { 3343000, "9e8d637371c8a7608e8b4d12ba304ed666dd0ed8c0ebb2e0a240f13336eac93d" }, + { 3344000, "68d6741aaf6bfd8290bc2e36280af2ce3246498c4cd6ae07afead2d5e733dbcb" }, + { 3345000, "1b87e84bd32ef7f407f02b4206fd333859c4af5f684954a0db8f3dc2a718a812" }, + { 3346000, "fa9dbd6f4f643478bac7922bd414c44fc58f0c35b049dda0be1c590a0a2e5a35" }, + { 3347000, "fe3592ef6a1881fe030add93c8bdcbeee4054429acb912a25f30d2a9751871ff" }, + { 3348000, "5713327c78ee265039257dc2a3cab45a26aeb26f27089a6ccb552693c6e65690" }, + { 3349000, "d9f603369243adb87ada60317ed687c9a536cf9537405ef05d4cfa5f479f76a6" }, + { 3350000, "6d0c784c9ccdbf7fda41243a91498e136bbebc138c764d7e3413ae1e57f7a60c" }, + { 3351000, "41ba7e7c0aabb6940623b8f7db6f09c092439dc2f2dd113334e62cf100af7249" }, + { 3352000, "e32c166b81dcc0aee4c0e018008240c36a15d35c25d4bfb3f54c80f0a490af20" }, + { 3353000, "9de6a8aa59ba930b4aec45fb14167f1953153723ec6d6c88cc7590300e2a35ab" }, + { 3354000, "0c2a650620df29e52a5876302616c77cb76e5d5180a597ae4c5f32dee7afcc26" }, + { 3355000, "225357218d03c75cd479ad0a258ebf4f61ac9e2248accff2e7680f5bb16c4ad4" }, + { 3356000, "43061b0bbc07fb03258b5f95da3717817dd9cb3d9413547f048854eb2fd37b88" }, + { 3357000, "c2f86b47d3a957414a4a4d3728228d3e9af1b3ee34254208d8f78a916e807753" }, + { 3358000, "f23f4e998d8b8f50eb3cdaea18294062ce87087ca0903b319e6d454a35424c2a" }, + { 3359000, "d0913918f4d23f9b868d1725ca3929acdd77375022097cf437097cda2818a5bd" }, + { 3360000, "eb17c33de3835012bffac49303907da26b007985006d2251e854004bbdb6e78b" }, + { 3361000, "8a6d2bee3aa95f0da71f5a6174521ad3120c33e4854e3075ab7609a5cb6e3a90" }, + { 3362000, "63e39b9a53cb47273fa13b9a88891bbb519b3e84c9f16d0ea33b822c5676c7bf" }, + { 3363000, "8f08592128ae68bd604b63294e55e7ccc35efaf2fde79046dfc26590c1c9592b" }, + { 3364000, "ff5cdbcafbc58f48f5b7d21ec7033c986f0b8f403c089fde67a6bb155dc7a9ea" }, + { 3365000, "e9952084ee20b115942c74fc58272e72e35d3e46f15efc3d07b68eecb9070db1" }, + { 3366000, "4d901d096d97be65370cf7ddd0a3cfb2c58d542496d3d16dc7fe15b5d27da4b8" }, + { 3367000, "f4d522ed0796fb5b0e2a4fa4aaaa03b2918a0e81567b87ed4351f1e062c8b627" }, + { 3368000, "ac153bd0683e269a938aa199bb6f13fc9507d8e8adb08f136b30ea4e343f319d" }, + { 3369000, "a1598c6f969e75865d0b945bf6e9fb87ac4c7da70e16d6d9c0709d7f176ec0dc" }, + { 3370000, "55f634cea34467c5826eb11cbbc327723fa926a8d2f9446e548a227d53006883" }, + { 3371000, "934af6289199ecadb61557b501bf1dacf9aefc541b96b60736e24e3fbe9bee02" }, + { 3372000, "e667283adf0931c61a1fb2e97f10d9d276fc92e983d597748163977e9e5f3fe9" }, + { 3373000, "4f563d4c0f6d87a43a135ebf11441cdfab7857aaacf0d65be6860e20d886ae80" }, + { 3374000, "df27e02996458e2f8a5d037037711bde0f84fff336cf89f469265336bee47679" }, + { 3375000, "843b2d0c83a8baa2a39fe27c07b56f57b62a425cd5d0f1cc6c990e1aed6783fd" }, + { 3376000, "511c9ff88b8e45b298633800833b902371ff2f7485107b1b8167bd5aa8087d0a" }, + { 3377000, "70670ee6440c3287e25c1878cb1895454093708b9bcf9f933297e15e2f299933" }, + { 3378000, "fc349130b87ee6f5ecc3a1dfe333791baadb6d9f84a1fc0183551b49072dd921" }, + { 3379000, "560d6de1ef48dd1920f61d380f8709de460785d13365215a6eba388b22ede786" }, + { 3380000, "1bbdf4589afac6e47b84fefcbdeb3752390cb4a75ddd6af9ed5a8fd69422360c" }, + { 3381000, "1f46250e44290cdbc492f105c92a80861f64154bb9e9648912a643ed352e7517" }, + { 3382000, "b4715178891ec8419552d5b4e04399dda36d6ba212a8f74b93f17fa7b7c7ac09" }, + { 3383000, "b5e74af6e185f3b1a5f21f0c4b9dda7a29a79e242ccdd01fa95dfcb176b2a567" }, + { 3384000, "064a0ac1c568dc75b23a3ac952d2b1296de8c68d3d512cfb94273235dbc7fc2a" }, + { 3385000, "27cdd378700e3e4b838a6ce7a4a95e9cdc5e07ddea16c100070a176446f96c00" }, + { 3386000, "8e64efb70984904b0eb33de0188fe273c1c2eda2a88a6636cb7bc19a9792b405" }, + { 3387000, "683f26ce79fef62868dc7ff6766cfa8b37b1a42b0b35613f06f631fa0d7403d7" }, + { 3388000, "2f41ecdadca0d41688720969bc19bc034525370067cfee31371bdedb540b52c9" }, + { 3389000, "6a10fc0cddf5a00bd189ac585192e1a03da8db2cc8fb01d5b00735fd77b80e15" }, + { 3390000, "8944cadc5ea1165ad123cf5b2872d2055dee23da7d349dc8cfcbaea2339c1cfc" }, + { 3391000, "e634975906efafb46af35daa966c5f44818dd660757851faa67750fd1d8613e4" }, + { 3392000, "1d6a6a7ae535e57595384f0d52ba4677c58030535035040b87c5a6e4566a86d3" }, + { 3393000, "848adcef55755e0ff6fac1d39c07c34488e43e1b488733a1f36912dfc42f83b6" }, + { 3394000, "ae6dc1b18bdcdf384ce3820f257f1b7542ef3b6441724e5b53788e2d24ffbee4" }, + { 3395000, "92c26779776b5727d31fb93f98a5aa1c220d8bebfa693692718b23376108d6e5" }, + { 3396000, "c34119f06623b53a2fa21ec35cc80216f8344a4731abef3ead595cb7662c54aa" }, + { 3397000, "74b1de17fbfcb29957c37940d53e6e8dee8fe7c0d40b0945fcc8a07cb6eb9741" }, + { 3398000, "0a91212618e848a040c3512d6444194cbca721354d3109726f298c2904034ec6" }, + { 3399000, "5789f98891033338efa414f64e5607da9e24eca0c52318374da78c7f02f048da" }, + { 3400000, "f6b9450ccd29883f620c89fc94e8db30287dd2f08635e2e2de134c4a3f5ecd3b" }, + { 3401000, "40b6a8d67ca0f4973b541f5675518b80c721b7af9d8b020654937e859967d293" }, + { 3402000, "7b30f7bb48523eee5be5a6909b01deddae7e60d4b55830001f9b0b589b85f7a7" }, + { 3403000, "cffb94ce726daf4330a5dc52e374a106420d032c8e5df517925458d8b760e9e9" }, + { 3404000, "5a0f7b9c3aa2f304d97984eddeaf8d62772fc5ace7585c69a5a85fc33143eed9" }, + { 3405000, "e2900ebe0c59e995d4826a329b88eadbd4af8de3c795c222bf37ba27a5296f82" }, + { 3406000, "c001873f5d7d7deb7b51cec2782b4b43485418c7dbe6bc1d23c4c459e904f3f8" }, + { 3407000, "14d6263c602674d670b851d4e2a98ca0d1896385c32c64db417e3fcc8a0b7998" }, + { 3408000, "c7efdcb636757b6ea34378eb2dd05f18b88a122437653035710e9c5037c53249" }, + { 3409000, "4bb192aad79e3f4f8a6ed0ba8e01e385f149998dd7a1b872c72dd77a7016f812" }, + { 3410000, "c362aa842839b8809e1c5c9b3104d4fd4a0b0ed36910c2dace3f38eff3289699" }, + { 3411000, "f0c4305b6303e8fb011d554e7e125c67c33557e263892d20c6c4bbca3e15579b" }, + { 3412000, "05bf3206d2c6ede91fd87052a373093e1eae6859b4e43a88593202fbfe56e60b" }, + { 3413000, "f911b876f987a3235c534bbe4253a839bd2fba7633bad1b3e052acb55efb7ecc" }, + { 3414000, "ca5b13c552e3dac78187c1d5551726cea65f8a20fefb889e9786fb8bd47dc889" }, + { 3415000, "de0d382c98cbe4d43a16d8e63795d047fae71305b65865bf824cfbf90c9cd944" }, + { 3416000, "27a83ae4220d6cc9ca3a1e2c630f1bc5bbd44e93247022b2e991ea5e35575e10" }, + { 3417000, "43ad2060038b992d083de26451d6b6f88fe50298b6c227882681baa49eec6ed5" }, + { 3418000, "c29a16bfc1eca9dbdeeb18ed4b5ef5ef9504d65a7fd3fd72202f553f7b431215" }, + { 3419000, "8f358dd9f1ea6935501dbcb1110322990994bf12209650f223a55f21178adae2" }, + { 3420000, "f4cd2126061a3dc717bb568cfca6592aba45dad23b3228afaf500dc8adc4fda5" }, + { 3421000, "f842392764bedea119e4c18e1022d1bf813569d649266fe55ad8f1650e87c09f" }, + { 3422000, "1bb4a8799ae96b367a8ddd6f1541e8f8b43bc924dd5415b67f54d311837e85db" }, + { 3423000, "61a78f15c016f0eaa7ce116738bb4ce44c184fde499f3d488e7a3e5188899fa1" }, + { 3424000, "d0cc206cf6e828df9d24d4f945a97a640485235e6c85a25f4457f17bc3423599" }, + { 3425000, "a195125404045a9a4ec39f3cd2501278d76ed1b087c8d3789a931c6176808d62" }, + { 3426000, "fc2458d8e96c711529f2a3d3362e162d81ec14ffdf3a9ca6bf9cccf8fb503bb1" }, + { 3427000, "36a3ebff03e1e668612968124a2635ede82004da930a9de29949e25ee0672fe0" }, + { 3428000, "ef6fb0a52c40e630e6ff7c6ecd6872dfa85a5f4a47f7eaa633c4c07a0e0f0a28" }, + { 3429000, "e94cc4196f7123220eb5a6237113ea71eda099368e13acd3de352c04fe347ce3" }, + { 3430000, "31ead53834b4cd8d183ad9e603446ec96cfb7be58a38825ea7b5e657537687d9" }, + { 3431000, "081cecdb3b17a6f7e468c6f50828d10143950d2742ddac2b2e0de5fae8f48ed5" }, + { 3432000, "c7d21e51d7b5c28f9fc870b95aa0480ed1fd0a6242e23f68d11651f49a45758c" }, + { 3433000, "bbf6d479bf02e7d26898e5ac5d29f4d72bbb316eb386034ec8dc00f7c54375fc" }, + { 3434000, "a71371c33822eb0986706bffa17f2df59d8906ef38643e86eb01ce6c7290f1ad" }, + { 3435000, "fd26934ca2477e6168da39160dd66dfa53d17720e9842691a1ecce57c94c1226" }, + { 3436000, "3288dba8415f11659cd798edf79305e84d0e3fa4768147f015dd470b0419d52b" }, + { 3437000, "f35b8455afc7613a8c67c3d8e07a460c275428dda1f724068ae82b6f23f9cb6a" }, + { 3438000, "54b2ca658dab4fa92fdf8d1d1e45ac55f7a4386d422e3e73cf51fde670a6e285" }, + { 3439000, "b685fc5e9dfc21db08fa1d5813ab5e03991a4e6290a830f69687ed03c833e5ba" }, + { 3440000, "370dfb627719a30f89529ab81efde4e6f67959b51b2563d138e70dada43ffbce" }, + { 3441000, "beed32e8125df7315acd8ab5a0d10367bb759f8a61026b111d65e1e90f0559f1" }, + { 3442000, "405e2d40cc9f7517d015ae28adb386b5f2698b6de305db9bddca80d50567f8de" }, + { 3443000, "480d37b603923e70fe6169586a2582a6c002c1d14cf05a4363d540755a7fad23" }, + { 3444000, "080d4ccc7c9ee071a3eb0820bf3292a624484a083f24f1115f3dfda53ca61de6" }, + { 3445000, "bada5c4c0d9be8fc45dfe24bf0e49727660dafcbbab16e3dda0bdc831f784d8e" }, + { 3446000, "46088e6a64fd1bf4f8e23d0824c8a83ec0816fa0692633248784044dd9131bc6" }, + { 3447000, "d4acc97c2b8d5e86f859b4724026b8aa3bf3232d232246ef4aa629d5b6dfe94e" }, + { 3448000, "37edcfcac5c2ed8c381332e6aa8b2dd01223661675fa2e3d3164a6222cb8e8d0" }, + { 3449000, "5139788ef2b85de88b64faa9bf886e1d834e58f2b2d42e433c8416b04d989081" }, + { 3450000, "e24b789541a4c5cefb05d7f335fe0937cfc8c197fc432e86247baa209ff2411d" }, + { 3451000, "096fa973d7d89cbe8c652fe3586a1346a0b5d919e8f06cf83af4229f0d08c953" }, + { 3452000, "46a91ecb27820a81675670f227dd9cd5d7b0a8de5d226978758aca7cbfab4787" }, + { 3453000, "a010e6920d9f935daafcbd2932b4b5d52b1e343780e8dbb43a4fe607f54c6425" }, + { 3454000, "87dd588323c6858bc88b659ab404e48a4f64bf5c679413f06655ae104f326be5" }, + { 3455000, "55374deead1294bd4b46507b4b679dbfc5cab49b4fd048aca9deaeb70f57b6a2" }, + { 3456000, "30557fc008fbb528f66b8ffe83a2383b68dd91d75668b53a68a1a1c60d10cf97" }, + { 3457000, "73a42b3bc6ba5ddec4e05742fa9ff9422c53e9811a51c1ab88d5099ffd307380" }, + { 3458000, "68f832027a5989f60ec651437d030fff0dbe2669033dcb7fe30c659bd6400039" }, + { 3459000, "d55f1af24932e663838edcce6087ae6c48016cf3f06133eff0dc95ca441f9328" }, + { 3460000, "53a764fa463df0cca261e29e5448a5211ac211d5ef758484902bd51966aac594" }, + { 3461000, "42fd3e3eb01cd4c2cdaff473b615f0121c4a2bf960382bff1f0a356ecf784bf0" }, + { 3462000, "b9484bf74630f1c01db2ad39daeae32a0f34e8c5828446f0c9f9148b97cbab50" }, + { 3463000, "79235796a44cee2896127b46d4d7489354e493fa87a1f2d67700f09752865769" }, + { 3464000, "9147e8a21f6989dbd37212b595b55dd0c4ab7f19b6c14fecaa0e42637c41bb06" }, + { 3465000, "6f543509c549504b825cf7383009735adc4ae2037bef62fae22f3513e65afc9a" }, + { 3466000, "86ddf3ceb78d5e04584e6a1f3cbe01781855d56a163d590e0812db252fb4adca" }, + { 3467000, "7743ddff10c37cb8af842bd7692f1207aa1b9eab521b7e5ee75897036a266caa" }, + { 3468000, "bb907ed72662cee8addb91a85edb0193ca149f47838df902cda349e6b304a18d" }, + { 3469000, "d17c1ee9fd958a5a4215450369a0009d4873f34bf2bd8fe08bf204918e3d8669" }, + { 3470000, "f3fb0aa62391e2bef31fe81d970f9a698f71dfe81fd4ec5f7ef7685810df3864" }, + { 3471000, "cd45cc532e23a9d48af51b3e67253d488b416640c57b00dceea6542f4129624b" }, + { 3472000, "ed2b23784ed0443e9846eccf7699d8c58907dcbf2226cd614a354a8425f523f8" }, + { 3473000, "f44abf60fab852d84998ddbefb5310017fe82e39c2e4aadab9a2cc6d60ffc5bb" }, + { 3474000, "2845687ac600572ff9c2d3825d83c9cfd27385e91e36b05deec9ccb67a647a2e" }, + { 3475000, "c18c6f262f627924748470346ecbdf17d3746976f24aa16260aa51cc6642a0fc" }, + { 3476000, "f8c9a9e25b0682d723db0bb2a78df400e4a49e41fc62911ff7e2dcee87001dde" }, + { 3477000, "a934c00cf5ccfb524e74ce662825e8f060926c814f74687cc35c4fcdab785493" }, + { 3478000, "fd6fad2f251b75e7e2b2a39e7ccc58571f51a591deaa74c42b86151128436713" }, + { 3479000, "340d8a9e704c516ea68ead08a56a6a6952e838323477db5f53e7a7086e55bf4d" }, + { 3480000, "5e92cfaf15622b7271e0659a3996f9092b326a6b35fbc64becd99d6469b902f2" }, + { 3481000, "5d9ebbf16fb3114dca2b58833208b4dce64d480aff6e21678e21e3295280e899" }, + { 3482000, "6225495552f14b30d0c994fe26f0a9258d6d5a52b9d0464d886233a370f628f0" }, + { 3483000, "77cf7ec4b1cde3fd35255b79f055518b18c76b0c58e04f6d3279233cf8fc7b2b" }, + { 3484000, "3d296703231c27d4bf89d129433e397132286b39c450e8a63474c27a3cd53355" }, + { 3485000, "572c9ae0cba2b4bf5f271ffde4b5837e2d488f98ab94c001582b10c143c1e189" }, + { 3486000, "c1584b2d253e4e5e907a000156fd7f50bcdfccc2b3e54ff0b71b7b42841b1f9c" }, + { 3487000, "46cac4a94b94e5c0dfcc71486a227b1d8117f58dcd7da1b7e3c509f77a706d80" }, + { 3488000, "f3801d62002eca31432ceaf4402e8999868797f33287e4d5d9775f87ad55a211" }, + { 3489000, "c04083f770db58059df638813182731e3185f2afcc36561eca462d9ab3ebaba6" }, + { 3490000, "28911d688d33fb702ab11c8c8c236efdf8b96049ffec2703b29ad8807a8dcae5" }, + { 3491000, "71196cd6ece13b9c85d4f00944fd40c6fac7c97297fdcb3ef6ae9772b7a78d2d" }, + { 3492000, "57e7a4b477c506fdf00fab3be5193a615cb5a3667c1b1b0ca4399da652d25cb5" }, + { 3493000, "b44095804c15cde09e6f4cc80198028dbe1cf82b8b343fcc4cd9af4433d4a528" }, + { 3494000, "51be41cf515cd83bc16510a923d120cd7887501d388c030810ae1aab0b8f885f" }, + { 3495000, "49dbd46e58a92681f6cd99c06c7039acd8e5b068b5e77cb5ba54303c314f381f" }, + { 3496000, "21315b87612952dcb25ba2cd5154989396db50c92cc434bd181e7a8c46c6e74a" }, + { 3497000, "46e6e2637ba4b65cbb4aa8bfdac53a2fc54e95937e81b7974c46bf891d4f569e" }, + { 3498000, "fe0f7b8f4fab97027e5c3d65eba534b4c76af68f181de22d478571664d24ffcc" }, + { 3499000, "57518b62c30490041a1f498476eaebda9182b1c31b312f595f5b2167ada77894" }, + { 3500000, "01eb0a9113f0ba23492907ea6208b1de001ffcdeff90324da0f36ede5b8c62fc" }, + { 3501000, "298f1b1556f91c60d6262b2c8f7fac8655492607c47e616f4e067df18820af1c" }, + { 3502000, "2d5a0891ed817b3c0d8746e866c1fe8aca5fdd5ba667fb7a914160436223c32e" }, + { 3503000, "55fc90ebd864ae5635787c2277fbad9b1a317aec17c86b0c07ec936181705c38" }, + { 3504000, "47619dc8d32f6d93bb4dbd3127aa60e1a0d552dca4288be73f6d571f8559823c" }, + { 3505000, "64190ca344bcf0cd2dc60ccbd738b02d052091277bb88012e384619cf252b80e" }, + { 3506000, "a75d4b511fa5769ea609400182c86dd04bec61a9de11ccba741232ad23f11514" }, + { 3507000, "97cd579f18940d2c2f47f4f546680839ecdfc20e0c19d843d7c46c6b963588ce" }, + { 3508000, "61af1f665cf9f033a0436dd9130cc3f0c00e626d417f96f531ad0c2f490dcee0" }, + { 3509000, "007e1a30296489b336b2ed52471d662e39b013026dd22a1ccbce546194ce9fe4" }, + { 3510000, "107b7330db0ac510b75b943fb9b83f572792b58f6888d1702a98cb8a9fc86ece" }, + { 3511000, "091431e328b152232da2e3d35b0b90076849b3d985fc1c23665e90326e3f58d7" }, + { 3512000, "fc781a3c6a7b3059ec75c252c3b2f7a5b708262f38bc784c082ab0aefc2cf034" }, + { 3513000, "6baca750d51a3c68ac386ee48f4e09f01571631b646e5d9eadc8e8d6427ae660" }, + { 3514000, "a61423036f7026e739a5e56d613a4dcb593047d3a146e309cea0bff92cd90bf4" }, + { 3515000, "b1de3b3375f17cf6141b3c3d0c87338cd871c5005d28745944b46635b717371f" }, + { 3516000, "46c3f6dc527557987af85070525dc4030b2f8cfd7173063005655476c12ca1c1" }, + { 3517000, "0242bc50914648d4bb9322dd7a14e693ecc05d6750e87ae4dae6140d79b01d03" }, + { 3518000, "dfc8e7380435e90b25e2530e210e5d74299427adf75d9a2ae4f1b674f24f4c77" }, + { 3519000, "0060ac7214cf496a5e8328ac6ae88b27b4ef314a59d90cd5aebf5f94c51f0242" }, + { 3520000, "b7b6efa2164192f820096bab90591b5cd3ca4567f0f8e49f70b5a6b42dcd7003" }, + { 3521000, "461ca788ad451c45d46ac63a543a250295ababe541ce27733a71a6089176a51c" }, + { 3522000, "925b76dce16679b604b762b11a3cf5514a12f2624a7b0af15349e678a209becb" }, + { 3523000, "d6837fbfed7e00b9c44529aa0b6e76f6b4114a9a0262a437d91775ebe46e69d5" }, + { 3524000, "e5d8ec1da25dfd44cbd6ee0ca473e21b505b1fa15416a5cf3d090f8e1f2de606" }, + { 3525000, "9271e8ba70729fbebba161ee954caf5a37b41f696ee027dd37e51ee3bce711fd" }, + { 3526000, "79ebcf432b4c7a20944b01072225cab5267be3d702ccfa7a488f7f0f433fe388" }, + { 3527000, "da009ce7b6ae607cf6d28ac7275aeda134e14e628c63beb3f2f5b434b2ac67d4" }, + { 3528000, "df31a1fe181fe75a29bba88d5d35f8b6f1c1cd54b1492801f54a27a537fb4ae5" }, + { 3529000, "d725148e913fe99c86dbeb331088a7a17d130e264dd76ff9047fc9d115432be8" }, + { 3530000, "b16e9b802a73f1dee7f0c7f3d2fb44d3a81b9ce4dfbb5361191d528a271cac14" }, + { 3531000, "4f1a6e4bfdefc2d8d1127cbd5bf8586d866ce3d5c9b14f8fdee842977c7c68e8" }, + { 3532000, "c818afd795d9db600db36a1948dd49d282397fb0d0b89a1a27d78c211aed3e9b" }, + { 3533000, "e14d8c7629bdfbc0399da427b67f35ae22ae9bec44c0f5374432f5541633bcbe" }, + { 3534000, "866536c5c1cf9660431ce8e8c8992cdad7677b1bcdf86b52924d03e570791730" }, + { 3535000, "36e695571c15facc8a48b5d248ce291315803a56cea9f0903b6b015e7b95ffd5" }, + { 3536000, "88949e8807ab9c3f8ae400e08245fc2dd31ec19aeafd79d4dc2bd3ed3ce25b98" }, + { 3537000, "5bc630e0f5de97efa0d6a91182061ccd9a5e07f294eb6a9b73823273e452e96d" }, + { 3538000, "a0eba0058b34b564bd90c34fc97d86473d07f863b57dd208ab80e0d3215abe12" }, + { 3539000, "113f9cfd709eb1a106caba4e6a76001fae1aca73057df6bb18a76b60ee00ed94" }, + { 3540000, "66d6b7bf6a2ed9b6db1d50295027c61092463e608333ab093072d70f8ef82ed3" }, + { 3541000, "f3c16e27fba51f3c193cb88a0ce027a45ae0ef6ae86b89edcc3a7bd24d7b434c" }, + { 3542000, "35e5b9a7c5c833a7895f8ccdf022eaa7ac6811d765ec40c453feea6398298979" }, + { 3543000, "677c36798d8b5d268e3300f14563d7602cb6fb0c7b1401ab654e05495c760ebf" }, + { 3544000, "ad13ef5ec55528667364328dce7d4f1eab15bafd94a26dbcd5b5e836e44b5221" }, + { 3545000, "5b9debde5623b0796ea315009a27902995cccc3829e7c3ed2e9cd8b304453e99" }, + { 3546000, "37affac6d6261177c3527219b34ac78a4ae3ae60fa73a70d7cf89483791ffb50" }, + { 3547000, "110ac87253e5fcc6b3c995c62bb4cdc4f8d2f63a16ecf28893fcda8e31c00cbf" }, + { 3548000, "ff54a4d20537089c880ba60822d3b9c5249820fd9c64ca2f1cf8cbe03ab9b9b3" }, + { 3549000, "e84e8ab749cf3f2d7804bb923d571a2fa7aeaa7483ad82850a49b2100e3eb2db" }, + { 3550000, "ddb98a20273945d59f7f7733fb3ba13ed68895964c34f178e711c6661d679719" }, + { 3551000, "b0bbc4bd20868987b67bf08023e1d378bb1e5700c3d1796467efd8899c02240f" }, + { 3552000, "0af0323ccf5be88d971e4ac4938a7e800d62225d5c8d4cfaf6c6db36b556ad1a" }, + { 3553000, "cb4e6412e180b9559cbb5ba2a3712a6f16494ddc0ada05ca6cef3e76684df366" }, + { 3554000, "64d1b1b2038d21a6760196d3262e5e446b72f19bff8e4c0c2b19d36e5ce04d0e" }, + { 3555000, "1e9a1ab6f4d6e67d61bb8634507abf7eb71e94c148b0d715061600eed1f69647" }, + { 3556000, "d1fecc61d1295700e2025cf968fdc0a334373a66269539974c9cf7c9c2fd74c1" }, + { 3557000, "4dfca671a85f545f1bd7459632f9e9e70498be5822fcb0aaaeddd251fda51630" }, + { 3558000, "6afea559ecc35bcd35d9035d8c88a2536030c262a7c75806922eab351521d0f9" }, + { 3559000, "8408973c654ab13c542596699b95a19d8aed7142a386a5fff1f2831308b0ee1b" }, + { 3560000, "835c8cb790612958e182028ef6a316dec83b62c234a37012322645860c405a76" }, + { 3561000, "89420fc80e51b419da3ab4f884aa577a731ac64a1c6c6b85bdaa10d18a19284b" }, + { 3562000, "7b6652e85ee6a04d34617337c9c17efbb668f40ac4b1c1da8eba5c6f38702e8b" }, + { 3563000, "95402851c93faccbcb15559b7c0dec975ef2783276c373b40f339c141b454157" }, + { 3564000, "e5c683e65fdc49a2efab264969eb4f448d4ed587b865fba4b5b56ad49c42bc4a" }, + { 3565000, "b9bae250fdd1f5faf6e71171033188be3822a27613971eb13a7156e05fd4568b" }, + { 3566000, "4f68f9ade51dd351f974d820b32e4e363599a1753908359c60ff7fdf54022d55" }, + { 3567000, "d842f549ba1b667eb15dff95f812a3b00ca4ee8623ed0171e6f4cf6b8d1bc87b" }, + { 3568000, "59fd28240700e1c712c9dc96fdc7fc9991c1cb408dd5e6d09ecf164c086bde3e" }, + { 3569000, "416be3de65f52a739178ed6afaed8ea6e8c1789260954b1c42771bc9bdea5951" }, + { 3570000, "d66a1702f88920d0123741dbde8667b947491237dd5b042eae5d4c5c92cf1e5f" }, + { 3571000, "f21ddb26c27538e414e936894279f4b6efca4e0ca25a465652dab95775056516" }, + { 3572000, "bfabf834f64a37fb3d641599fd75bd696e4a896a17a9102988c9bc94e0529665" }, + { 3573000, "ca6d0ced9f8785bbdf51762fc53bc89197c8774905a3206f26bdc226e8446ba7" }, + { 3574000, "0f993ac436e59e5920924bb3436b8087a50f73e15d9e83382341900131c86c3d" }, + { 3575000, "d78f9d9ce52ac3483d861bd07caf2536120151d3eaffbf3ce93d3bf75d5bd521" }, + { 3576000, "b3921ed3ca9defb0690e9335e93bfea3f43e770dc411ee79e5caa1b7219f6272" }, + { 3577000, "152d6c998e272644813c55bd32c2901e006ac972fc06f7dac877db0a18262082" }, + { 3578000, "a918678fb9cf8a403ba97724dd7d206d478f3fe9510fedda004870b3c0697d95" }, + { 3579000, "37d006a737a96f7332b0c2ab4a2280a0093bb926894282b3f20e345e3e32afe5" }, + { 3580000, "151b6ea0ea71140ed37424d44da70874e13f73cfefee3d46b0702320cdc48f3f" }, + { 3581000, "e1f4c26e22188a5eabed3bab3e26fdda35b59f29403be41b8a87b70a8850a1e5" }, + { 3582000, "15603a12cc688ee494b3b7fb02459883abb9040b7a967a8688180bf17a836957" }, + { 3583000, "9e5d8d19e20bdef764fbe96b1695a8929eadd72248e566dfa29789bd33e9180b" }, + { 3584000, "7e72108b1c031cc6128afb55feb929e2752010ab45cdc7f6347eef0c6bed0884" }, + { 3585000, "71cfa48d5d45eb22359a8e5666dc4db3b5d401024af296724e9f8dfbff1ae7bf" }, + { 3586000, "26b2d349f9618b465c1c7e1d8e8f0671b730356935f07ff043a130affb0ba658" }, + { 3587000, "d233281b314ab21258d0ce799d698cdc6dade58a1e23a900e77b75976782a9e3" }, + { 3588000, "b4539bfb217c36a439742bcb198df82d15f552792f207dff12f7ee40ac180244" }, + { 3589000, "68b12ec7a98940e00c7d9e879cbd4af38e6dafc62e7067067be52473735d1cb3" }, + { 3590000, "f56b470354deb935ff1f77d7ae0e4fa9f6534a959ae59766fec40f0e278e9cde" }, + { 3591000, "a049c7322cc2d74c198651d5990e85bd7019cd0d0500d635caec785b1d608514" }, + { 3592000, "6518cf788145aea503f3e8897fe11f071faca43342097a41eef9640f98d36c0d" }, + { 3593000, "1a896da1bf0388c0c1db3b4090273eedba9d1f206f61480f8c4adc5ecee20ae8" }, + { 3594000, "447aa2e11e79f70b11c146879985e19c09c7f5a9ca0bc9292efcf247b7b56110" }, + { 3595000, "09a2f36324803e42226f3153439a3433834b31cea5f209daa2027c37f1541208" }, + { 3596000, "70dd1b846b2086bdc4b343cb78cc5be3f011484778c4186a27d550cff8778857" }, + { 3597000, "7ce86d935a4b8ab7736a628e2126a5587dbf65064d1da3d607cce30d1a240d7f" }, + { 3598000, "ca80ae5aef3ed429f65be82f38e1bfb1ac896aaf52b01d24bd23b9bdc3053b65" }, + { 3599000, "8d1bec09362066427a260052d39056582abb2f36f8aa6ae4a615283277815594" }, + { 3600000, "0ba9f2870be7afa53f9fbff27733c0aaf7c5e132f92cc562706c954c4f4878f8" }, + { 3601000, "1b1d2cd05a6936316f97c0aee781da0644057d7d61e963f1ac1f22377b2fd95f" }, + { 3602000, "3903914a8f3e6a66e4b746cb0a5866be5f83ba1071a709d59449fc94e1a1a69f" }, + { 3603000, "13250c1a4071102da18a419439b0315bb45d59a4c7b5842b1b339e65f46c8f19" }, + { 3604000, "b8015e9cbda8e50827c9f74f143eb7f149f3dc3cdbc5175fad63794b5ed63120" }, + { 3605000, "f451d451e122501da30eb96e8e7bb13e7aa10213f35d9b81d0b1295bf66fdb37" }, + { 3606000, "66099861fa5d21cf4448f504c4f086cda6e87d32048e226751f8d4dd85881cd8" }, + { 3607000, "3db0716743b87654f323213cb5cd9120ed5929fc4efc5bd4bfec75954c7a6ecb" }, + { 3608000, "05270a4f9320b9bbd74cf0c2843e7a16da595673b419c6c1ae18cfe061b16434" }, + { 3609000, "1ede8e43932d12198ac313029b0a669b04d6d2c85d6ff75e63f8f61573591b30" }, + { 3610000, "8704796a6f5864f3f4e28f9c7483cd044f0d3b885975f5617a539079bdc4f4c1" }, + { 3611000, "b33a9d7bb0ecb79b7446bcff8bc834f324711e1b59e249597b3dcc54b2a0b225" }, + { 3612000, "6d3b1681922e7a6f9def0dc586654c4a59ab9226a840285acfea20319562eb96" }, + { 3613000, "6dbcd0b4edbfd574df591d7c042cb7de3b8cf712297458dfd9c1b1723a53c92f" }, + { 3614000, "7906afef2dd4decf780c48fe59ee851d36986be7abb2bcdd933a7ef8582b09c3" }, + { 3615000, "17f97d88f19538a4df471aae81d7877a2a9e2fa1e0d7214354fa6b83022efda5" }, + { 3616000, "3af9d67738da9312153b1845da1e81502a6cd633331d0d14311d71442c3dea43" }, + { 3617000, "da2c313ee652b32a97374b93a1d7f75d99046eeb5d5569e789e4ee1e3c862464" }, + { 3618000, "613062f6ee85027febf7634fbf622ac2430e2694ca24319ddf62da04a9873eea" }, + { 3619000, "eb0106dfe9dff4adfc6e2328ee4c712733402d32c5a09d0531679567dd3e357a" }, + { 3620000, "c063f086f2236378d78486d2c59b82e35d33ab1c3113fdc45cf9a9fd8b5843db" }, + { 3621000, "4d273029bb9ab50c3102586df8dd8bc9dcd07e2c9ac258560cd2dd1aa41d0b28" }, + { 3622000, "11260ba86ada78f85492953d6938fe81b17490fafcfed3dee24f7ec405ee0490" }, + { 3623000, "9b07f25135371a693278ba98399e6864a05a35ead4124aca40e9182f74cc69b6" }, + { 3624000, "c9803116f1f559cf8bf0905f3643e648dd1eed4b9f7b663f4ed49429b87abab9" }, + { 3625000, "13c99efe599dc994380ebbec52238af9f488a1d3c47ce57041583fe4ab2e186b" }, + { 3626000, "e8ed76b7391763fd9b03591c90b4cf53561a201b8944750ae4ecedf886438a22" }, + { 3627000, "f9dfe4ae71bee9972c440fb8e0edea29c447fab7d705e878cac6b1d89d7576c6" }, + { 3628000, "3532813ccf51d989eb1ae1c59593ca3cd684ed40550cbba506e8f7f9f0012275" }, + { 3629000, "4cd03d3653e66c5ad75a6d21a3443a8b5d0f0a262131d309efd6bb5b05a90897" }, + { 3630000, "b00438373ad40b0d5c7400de9e48104f220e302a6266e55430f33d3d03b4758b" }, + { 3631000, "7f0422778e6f6e5b799860704c4283905f188bbb234fbd101345a51e636a0e45" }, + { 3632000, "637e1fbc840d18e9c732fbec72f0b5f2058b52263345b140dffed0fdd242958d" }, + { 3633000, "de98281240c9ab26edc0b5ccba4e5786bfcfed52d5cbc1253790d5169ee17513" }, + { 3634000, "3bca20cfe01e1a947477a058b72bd11c59ebca2ed61cf4b7ab854fc0b48eae9c" }, + { 3635000, "4e853b6fc32192e0ee8fc7c7d9bca909fed4055e7a6184e40eed88851140499b" }, + { 3636000, "d2ee5429bf8c69719f598ea7e54ed775900ecd8d4ba93d7e7ea21d16ca91c371" }, + { 3637000, "d415a41822678748616f6dbef592329b648f61ef38a085c86853213f1973f2eb" }, + { 3638000, "67d5c68f8acda0b80093ebfaae9fb69cd076a664583555cc03a2b9f9505d2c00" }, + { 3639000, "5d7a0f64b46ed48a42aecc04fa8f4ac38092ce214091e196237e6cf81a0e6f1d" }, + { 3640000, "19a1d6bd2c4162a1764a4f9e7030c917ba10371a35a81af50e1fceabdf690523" }, + { 3641000, "5c602244dbfbe7c3f696043e563e0a9af18ec8f38fac5fc0fa2a29f3bdff59b8" }, + { 3642000, "2a53d03b6b553c20159820e7361df960cb51263e6f57dffdd1ce13ad0e2fbfac" }, + { 3643000, "1e4761a99a7f75337ecc38a84a5cbeff0f217b52bff525670584ebb2710443c3" }, + { 3644000, "a50b240039327ecf302c81d052baa648f29a6939450fbbe514c58e8509d39644" }, + { 3645000, "5166921272e30bb86958d0b11f1b38f41893a47b62e453c87aca91c41b18db0d" }, + { 3646000, "144385f9926ab0c841ec7cd8e22f3d4178bae2207c8dd02b60f72c9451909ae8" }, + { 3647000, "850d2cae5c9f4006bc2b97f28aef6aec489a5b80955fc243139ca4b84e9e1258" }, + { 3648000, "fd0ba5ad845765412b7f9fa317dfc20ac8ca9dff368f05970bcf74b7e6aa1488" }, + { 3649000, "709d1909686b1c799828ceb501ed3c4cf266b56ab05ba31b574aaf6634f52457" }, + { 3650000, "1021d0daf243011210e068bd4276dbcaf7ba4b9f67ca5cb4587fea0573b6c0bd" }, + { 3651000, "2d87f27cecb51a40b3d90845ccc7715d623a3845181275c21615f0ae7a9b6daf" }, + { 3652000, "bc5b4dd0e9cc7d39123d0fae30b90e9389a150da49395fcaf253430ff3445f7e" }, + { 3653000, "1f1aa4275223fd58a227373226e7e6beda51f1f211b09d8586b7d837ee299651" }, + { 3654000, "5571669155dfd635857c8650e851a8f52ec92270f437427c24344ddf67ccd1ad" }, + { 3655000, "bd7e72fa5e0e99381cd7637972ff0196909dabc77565e4ded88e736ed37709c5" }, + { 3656000, "cd1adf83fd0f7737ab8df3773a35b13529d116861b2016b992350854f5a0b804" }, + { 3657000, "8c3bab448bddf83ff5dd85cb1037f7ab50e05491832cb906252f5653014ea23a" }, + { 3658000, "ab06481e6576cf380b06468768fd09131b86dc498b9a3dbcfa2d7c7c2ebfadf7" }, + { 3659000, "5f98e5fe511b2151df7f7019ff5d4f9f62587d403a35b2058e338df60d18d97e" }, + { 3660000, "b51d3ed93c76729ff959f98934e7a998ed213d90cb231b3d558d931b76a21202" }, + { 3661000, "599ae1bc192c73c893c30e10bc195ad4624d036b6c693170c0fa2aad6c9751d6" }, + { 3662000, "136c14f9674cefd71d001909c7c08341f75d75e9471eb559f69242f23433e514" }, + { 3663000, "3a0363dd46fa71621938f91b90bcc44982c0a294104c56bbb80ef186dce137ef" }, + { 3664000, "fdc974c25c028ee6e7ff287342cde4aa8ad46eb2f6b9a5d1d4ba2f993ac29b9f" }, + { 3665000, "93a681f06604d84288e96f7106288b57dce1d5a396af1008c7a67717de446d54" }, + { 3666000, "20f307a3897e2087160d75c6c698e14ae530528d7021342dda3c40340b3ba040" }, + { 3667000, "59d397fba8e21101d765ff4cb56e51ec89aa5bbdeb18fe287d472493a0912461" }, + { 3668000, "34f59b9b55895ec3317b2e514c61871b50e71265783c95582bc385d390d3d6bb" }, + { 3669000, "a3b12b906b02921ce35f52c6620a92d8f72517b4625004b595aebf3cd431134b" }, + { 3670000, "ede9fd24b20bcd8574f14a2dd6a95045fe469b94d5b7fe956212c5b89dc3685a" }, + { 3671000, "1173a13342395c9657ab883820c46ccddffa87ff4bf43c5a52cee1e5b00a4bd9" }, + { 3672000, "6aeadfaa053257da6491801c7321371313f18abb1e92a62610d9c25e359cfe3b" }, + { 3673000, "16384cd4b1b28de48cb222e2bed4e5802fb4f8052a69b4ec05b7b1076a123a8e" }, + { 3674000, "de15633d95e35e4b0b90c4f3701cc58bd9b5f41130b1f7aa5114ab87297477d1" }, + { 3675000, "3a68ff995d1a77dbddc473e12f47e5458490ae59d68c2effe49ea22f91fbc53f" }, + { 3676000, "f70622eb016d9969edca2b785186d994b350189a051808f82bc9b93446df0bbb" }, + { 3677000, "a9613d248d54e9c044df4bf594d7c66490c957409919f43e16841bb7135785d5" }, + { 3678000, "15c1cc9f019d0d58b170af3fce3447e22d6efb9ddc8d5cd5dbc09fcdf9746415" }, + { 3679000, "72b2223410d515dc7f5a8e3063dd2a318330de31302125c99aa31fc79240c25c" }, + { 3680000, "cc5bbac344aab6fcbea9b4e1a237c5d5e7c33ea15ff3916241fe240155e9e9fb" }, + { 3681000, "89bf989598eeb76fb2bf83d338378f3f3f70cf6a523379b4af42683155b8c760" }, + { 3682000, "a03950de8a1dbed9fde001abe4caa9a7ac1cbccab9a26dbf280529c6ef95096d" }, + { 3683000, "ec87069d40e39a8f646467c1a952c34f759fdd8c6ae8d53b4524165a68b25018" }, + { 3684000, "5b371d144f0f43bc4115ce2afbbaf0ffc6c77f3dc5569e16f72d78712c90bb83" }, + { 3685000, "6ba18aaa7f11a26a40bc73ed9b95e64f37ca5267f876a6f79fc33e48892c022f" }, + { 3686000, "9fee24ea0b0da80816f3d982a3a457610025cb8fab654e750f971da6f021ddf5" }, + { 3687000, "30d694cb67aa09b16eb374a9ccb95efc35aabfa0049d99e7d8e007acabd69b2c" }, + { 3688000, "b4887172ce797344261f1ae41332f0d8e21c798f4d7e3478baeafaa99bd8e1ea" }, + { 3689000, "ddcfa0e327eb45fe39108620665a5d96f5a108f8fdc93fd5492625d529108a00" }, + { 3690000, "0e1f74e93f5947a30dffb9a3e70cf947b5d2d71319380c6dd108e5e4f156806a" }, + { 3691000, "be06222d2286eff474af40dde6d77d80029726cfa5de11d0516281fb594ffaab" }, + { 3692000, "4a6b017693358f5dce514e2d755806c40716f200df97b33c726bfa990505263e" }, + { 3693000, "c1b3d110ba9d0a4b7ea8b1a14d2703755ebeb43dcca9ef0fa16fb0bfdcd50c0c" }, + { 3694000, "e8ba119a0a5b1eb82f047f051b2ecb81ae9a62dc20ae2dde0fb81fc5cad23102" }, + { 3695000, "005b60323b5367fd0a8678e82644f78cae525667ab6d7396c61ef5918907c993" }, + { 3696000, "d34e8911c95930f70251db72cedc015e2eb319f2809d0da168540ec8b49d7f75" }, + { 3697000, "0241e930968a98387c350d21307516305e1828d856ac2d04b146cc601c64e06e" }, + { 3698000, "71a998f919a9e7266dac66e56d256822e90d64683d44956237a412b844555565" }, + { 3699000, "dbfd45b4bcfe7fa63492db0928cd2195a64b0cb4ee56d1467d220c34d2e3c640" }, + { 3700000, "b5f4384d503774236352a7e1289cdfce15dc0fadd7f5d61b2408f4c886692700" }, + { 3701000, "a32abd429c1c3cd8a4e81cb40382e0e86e5f9547e716c98d169f9bfeddef716a" }, + { 3702000, "11b9ed36cac9fb6c0f66691e2becec3abf69b893ecf898a48143fcad4e8704d2" }, + { 3703000, "2205ce91fb60aae72cfea56b6936bdc520a8822faf7fd459c55fe7b51d360e7b" }, + { 3704000, "0620ff410099e44faed267459c371a0b757cbb5f8d80f59a382186a59036e2d9" }, + { 3705000, "0f1c83a67628cadcb056b6af1dac1e14adceccdd95034ac452e60f18623c8a4f" }, + { 3706000, "651c9d2c78e68d627685903af28894770d5da7252933bd3da8b9eb4e309305a6" }, + { 3707000, "a94bb1c55a4c93a1ec06da0c49fa180681ceab82e68fc573d868e27cf3bc9931" }, + { 3708000, "161c22238875817cd6fb5494652529399e18146f2b3133f65a2b4d8b6845f205" }, + { 3709000, "1b6f2a5f49f7d87e3af25ca33d148ffeec3a7aa39ee25fc1199ef0d1f7b92570" }, + { 3710000, "337eaf4763a9c4a4e400497ed1680815cb1d80ecaca84bf6cf38580a1cf16440" }, + { 3711000, "320c4f58e574c02397ca50c01850343b04bd4c47d017abf5ae0f0fd727426945" }, + { 3712000, "3905fca46a7e0daf69fb781af66ff85342c59d2e1eaa7d422bf08573ba2ab6b6" }, + { 3713000, "f9987df6cf1a2c6379b7b2d49dd517fc18565fe36aed79e7a043a2a8eee0339a" }, + { 3714000, "cdbf909bdbc46d3a2dbcc2ca277c0ea6dea8bdc28d4f1510528a15727013432e" }, + { 3715000, "0877d0a20f3eb94b9496b955a6a4d603ab91bf55f4ebdec89b9c944aa17ce293" }, + { 3716000, "8a7a39f9cc3fd5878eaccd3ddc5931a1b7fe61b6309f473c166674de40ce43f3" }, + { 3717000, "bc23c0ca1cacc53cb81af262979a6b00b44aaa96bd12899ade7757e70a051b2c" }, + { 3718000, "f88dd4b482af2e63b6ed2a2daad7f3f53e2afb36ebf362ab42096de3ffad68ce" }, + { 3719000, "fba6904976c360cf6bb468fa84f7cc469fe2c202fa0da13299b69b42f1523f05" }, + { 3720000, "285f2c436867ca48ec40c789b6dbb0697cfcd3e1a1bf85a6be83fbe39e25d926" }, + { 3721000, "c2ddd2b55116e5e49ffcab0c03b0fd4cfa851168a6c8a8c3b70149ae14b85d8d" }, + { 3722000, "3f8370e72100a5003f8a8b3291a0b6263e2fe35812fb6dbd7b21653e47606342" }, + { 3723000, "392d476594778a6f4d264c95f4992673bec99e8d5314deadc6d2bd76d3443c1f" }, + { 3724000, "0273a81fc8f61af36f50e298881e77d9f3db763ec01a8c0d40db7a45e2c61fa4" }, + { 3725000, "e7a0f0445a6abd9b0d89add2b3e064fde9373e7f048a682ed36f2baade8efe50" }, + { 3726000, "bce0419a31e86504dc81cd3c365fcf23ca11cfab9a7eab97d68285059604d500" }, + { 3727000, "70cd393bd58cecfa05612c59d2488901fe5c6f1bbc299f94fcdb3ba941ac9759" }, + { 3728000, "4b6ed158356e9b8d9afec4d45c0911d0b8663d6c8d7e52683b5a698ffb50f03f" }, + { 3729000, "c7cfaa51fcf6a3a1c3672cf5f14f52982a8bc7cc2d0b2be2711372667f4384aa" }, + { 3730000, "128b6a17e6e4acf7ca5de7d3b819329bf3f0b8baab1521acbc79a315f3e11c58" }, + { 3731000, "6a92b431878fcfd2d1124f7f5c2f78af46eabb79c7672c68ba407dd281e01306" }, + { 3732000, "f79783091cc02dfe6773ac09656c2b33875911683ab2393b6848509bf415d9da" }, + { 3733000, "934f9b8f6b1331712d4b1c5b82ba53a21f048c8437da53d37b8991f6bbae17bd" }, + { 3734000, "4f0ddce96d81cf6bedb7c4d3b68c5c5479ccec6d9c14ee4a9751342803764070" }, + { 3735000, "2aa69e273ee6ec925474936e3847f73df645500d8c0fa97a0371726062bce959" }, + { 3736000, "2af5ff1a1ca1353f827b439c15a67372c756097601d68e51183c77b8f1d4480b" }, + { 3737000, "cbc92d02ed11c3da3e1781402f5fab827232ae87452961f14fc671f6822123e6" }, + { 3738000, "b1ae1e05b6cb4aebf32e67b9bfabdaa928d68d8a3bc5aa5bc841623089e15459" }, + { 3739000, "c42af5efb98bfea4cd971cafcebf6695f4b9d23d1fdac2a8624d2191b3d32cf8" }, + { 3740000, "b7544a42ca66206c82dc2eefa469acd499c5f377bf0bfee90b25bec0be01372c" }, + { 3741000, "70499bc4bef5184c63b6de4ca80b4d64c72cdf553bb5bddc617a350ba1287201" }, + { 3742000, "d1480291bafc43cacf11648587450529cb88e34f3ea3c9efd1b7df45fcbe03b1" }, + { 3743000, "7d546529c47049f7900b4f191b6f4eba6d1b94a82a8f0003a4f001e2e5907291" }, + { 3744000, "c866f63596ebefad13748883e1113a3a8cda91b44e50ea0b6c861d33e45e50e5" }, + { 3745000, "d516cd1aba0a69f5d65c9d5bca78d55acaf4dbdc65be96b04ce602c186dc8a8a" }, + { 3746000, "e42922d47ddd451ea7b6f0311f118af31f1492b199e2a0bc4f6ca4ebb10c0153" }, + { 3747000, "2c8d69d455f0800dbdee80005049e3d7bd78b5dce5c897bfe8aab54c80a68e87" }, + { 3748000, "b7743d92c6b4c91a5fc97b8ca25fbed0aad99c0348af1d93e50ee768a2573ad8" }, + { 3749000, "38a30be3f78d755cdb9d010f0dc0e833f07c3e1edcc896a903dc42a28bef3c43" }, + { 3750000, "8272202236a188bca395dfbf32e1bd1cc0950b76c2e50aafad2ea6ac9a304fa3" }, + { 3751000, "8f02a71762d098ae43d335848688ecfa7b38d3011e86e1b635a4f44bf293013b" }, + { 3752000, "ccd819b23d295a64b1b474e99d280e9102f33b746d28cecef322a0b71549240d" }, + { 3753000, "bf62bcfa6576991f8412dd16cdb334a587bd3eb1e6da50213da996671b6ca533" }, + { 3754000, "3794393dfd137d15be79849577d9ae8dca6ec82668355af1f3a5e709fb20538d" }, + { 3755000, "d6c56ffeddc5644bc090d2ad1b572cdaa61e63c7d04c4c3b2bfb6d787176b49e" }, + { 3756000, "ff76d3cfaf9e98eb7f26a2656180bdee414a2cedbd9d114a54e62b417b1b14da" }, + { 3757000, "05296308522d3f17bc9d0cedb59ce21a2fd616e714322304449ef4b1792bf4d4" }, + { 3758000, "bbbbe2c37163162e3944c5712451d83b654ad0bb77dce55854881285ae6c6e8c" }, + { 3759000, "f4bc726288f39fd96567d30e53a1e34ef8b17e784ffe3f0a911a130f4c813ad0" }, + { 3760000, "9fb55aa12ccdfa8a5fc5d5140d489e5a4e42fd0a313dbc56c31725eb6c09ae6b" }, + { 3761000, "8d5bc39fafb6f4130ac1a7eb1877a355f48deacb073a602ae488cd9fd89e6e8b" }, + { 3762000, "301998a41b67500e456428bdbc03abc90c4b52b3b22c4bbd9e6750a59ce2f3fd" }, + { 3763000, "fffef5a5af641df8587aaae984ae014b7ff0f141eaa81f276a10830d18ed4f8c" }, + { 3764000, "5bb44562d35ab3d6e51edcd0775f3e32455b6b3693f7eab2ab09ff44e44007c2" }, + { 3765000, "d0592fba96309af51d8b41a08a4f5628bb555299134e4ce0c3f6806035afa57e" }, + { 3766000, "902c728ab7ba822744791b4ba772d38150ae1efdc5ed4265ba05cf333189ec60" }, + { 3767000, "ed46492ae519a4038066e2a888ad8b8adc48f3be6a580bde93ee6a4fac763cd5" }, + { 3768000, "d2d3c000ae5eefb2d035193a1f71d6a731b4d3dd748480ddc2683a4a297263be" }, + { 3769000, "14c1080d8519b3bf1feb896352bcedf810053e0c460b58f6a91f69fdb8e8ea8c" }, + { 3770000, "1d1dcc3f9d952b42da47735b5133ccbf37d5554dc82110af2ed5cf1c6a467b8f" }, + { 3771000, "bfeb0a5644ac5c465ec1fd07d57e3943462e92f45232e95ac4c4115df1ab3570" }, + { 3772000, "80bf574a815e835b70b9a1c41289472b7de0fa8a695791eb50ef20b8c8de2164" }, + { 3773000, "48d60856c22e6b88330e9718650303bf20754b945a4c9d808110df89aa3b2685" }, + { 3774000, "c00f6e3505c149faaebc45a1d7b2fcc4de24528d9b4013fafe781d1996bcce92" }, + { 3775000, "ea3581ec469d7962fec2362348f66a086530ec7d8076c22571fe0f6ae721ba78" }, + { 3776000, "7411ce21c9c2c8df0809c6695d847fb9913303cafc79c55cbcafb60b447d1410" }, + { 3777000, "def21292c2caa18cfb040187b324b1d8aff09140dcb76a80699f2fba024eda55" }, + { 3778000, "3a8eafff7cafc46a39b0498d5fe047436b7e70dc1d9c5a59f0610c98d1633858" }, + { 3779000, "72a8e0d4d423624f83d86fcb093b6ad1fd69240bbe1ee524bdad26b7509412c8" }, + { 3780000, "800c22bd7cc5fb96a574b081f1b4d25d43ca8f0f8935412559e1ae1d94a678ac" }, + { 3781000, "9973abb11a2a7b649c5f870ef5dffc3740b68fd40d2a79c6bb83cd4284ba609c" }, + { 3782000, "326909d355a7b78099e435bdc0e48ff3d339bea054040ce67b3e83adf723c100" }, + { 3783000, "99a82c472f997031be9eb486693a3640e34362c58a1154375e8cbec83b969ce4" }, + { 3784000, "94635eff4037bc3a53fbf8475d1444aab876d0f1be0d8818c9d51c6db437970f" }, + { 3785000, "70ed40c82294e6377655643aecbc5db2f7bcfc9a65677dc9ee31b71d49a08bb1" }, + { 3786000, "a7f12ff79678c23eaaff430f326146ffb1f9cdd9785cff47b0b12f9756c5f987" }, + { 3787000, "e6a1f9bf6af78ef63c6528d8aaa0958e015c0d8cf30f38f52f0ad4706573587f" }, + { 3788000, "3805232b73e27faf537ff46be8e275e03184ef8cfc15ad72a57a407e2b8d6cf5" }, + { 3789000, "e3773cced2107f6dcd660632e6f47d35d7b3f631035083601680f66377c1dc4f" }, + { 3790000, "c37159508ae7fa6dc8d1e455a8da72384119e5e53e434c6fb4e8ca84f3496d2f" }, + { 3791000, "5f35e9df9dbe2d4d9914816de21b665bed798a4ef20946114ede844045b01c9a" }, + { 3792000, "2307a0bfa1091f17126a5f75425f757185eabc940935687b0d85f6ad420dbd9d" }, + { 3793000, "13c8b094f901661283d88ce6e3bef89148b887688965dc638a59003c5bd37835" }, + { 3794000, "f18ec97bda8daba642f366efef8f9dec26d054ef7d683dab8933445c790a67af" }, + { 3795000, "71fa6eae68611686e60678c1d47efe96f22d6480d37a56254bf326baad2ba999" }, + { 3796000, "ea2eaec8db155f0019a7f77c3184097018d2a78b7fec4741860587bb7f4f6d82" }, + { 3797000, "20293a7773f4fb85417e9610a4d6f8549fd2477c49d8af45c8b8875be7e440d9" }, + { 3798000, "a30c3d125707a8afb0e4a96be3c76760dd2d3aea003027960984102dd90f79b1" }, + { 3799000, "a1c13a876f76cec25a983ea34edbf020ad430f41cb05a448fb7f14695161f8dd" }, + { 3800000, "51efcb866e2f9a1ee1a24589d5ab7f6ad806646b45cd091fbdf9c20b57155e5d" }, + { 3801000, "f36a9808956340d9fac34ee0a939181408b052dfa6e48b432bde277935a20f21" }, + { 3802000, "1c312d84308999e0495fc195aa58d6fed4b8e9f91dfe2b4f6fdb1e6af0edf133" }, + { 3803000, "1b004f8073f988f56d985ce092fdcd442fc985359f107f2d45014095a140eca4" }, + { 3804000, "bc18c5e5c85cd77b4a2e54e4088161975bc46f9f36f0b7e00fc6567b4d0cdddc" }, + { 3805000, "244a75127a0bfe9355155d31d19bc2e1961de3731362bc5763676136bb1ec0dc" }, + { 3806000, "216eacd483b1286e21038007d15529ef44b9ed3fbc9c900344344cbaf83002f8" }, + { 3807000, "9a79265fad844d352cdacdd896b4c9a73fc408fb6e230f0ce69414cc3119ee2c" }, + { 3808000, "c8eeefda65999b788de3a2f19573ae64a6eeb119f6d1b23b882a7a44a150584d" }, + { 3809000, "9226db4ea9603474ab4355b6dcd8ad8e53741eb270fb50dae95e51e115f290a3" }, + { 3810000, "6e85a7e015ee84fa86dc71ddb6f5b9ac4c16b236ce80edbe5bd23f407d916fe3" }, + { 3811000, "d764ea5f13a5a081b3e20fc98f6ba32e32ea4cde798e89a79cff10beb792da99" }, + { 3812000, "703f93f4a5703b8598be9a7332dd1660dbc702ed1efeaecaaaef35d44e062310" }, + { 3813000, "ed748feed926d4157ae612b02eb9ef6108a650c58ce0b72259152001a5cf2f6e" }, + { 3814000, "a34020b756874eefbb8bdb269b440fa8a908b6f005f3aca70b18c2cb827825a0" }, + { 3815000, "d0a8443a7b56b0cbefcdd9e95c7991d9e2bd634ebac49c003d1cc02e0f4f014b" }, + { 3816000, "0aef5437e96726157f6f75d2d2105f94bada0420ede30868d73ea1eaaf40224b" }, + { 3817000, "e63c833c24f67408f73c7638475e387b780e6f95a34b403124d28be9494aba67" }, + { 3818000, "d2aba6c7e9443df75d3490856588320c8f34398515528c8cfcfe67a6542b3ab2" }, + { 3819000, "5f071d35ff6237e695af857c0ad8f9b666ef6f9d0f1bab19ae89fcbf68e88472" }, + { 3820000, "855ea75c4b37747ee170a2326a99de5a3b7b2c349baeb013f31b13685d16f827" }, + { 3821000, "c51828aa7893cefa435c5a480fd01eff338cfe85e37e6345aed1b1d0e73b91bd" }, + { 3822000, "d56cdc45499930e52ad2458f661bfb1526d7e3648da0794559ef6be8e950ba6c" }, + { 3823000, "cd88966905a5b374e31cea01e0477c34fc08aac1b174ac604ff0b7249e39dd05" }, + { 3824000, "3a2bf5961ea839800e8cb683a76b0bf8e053189ba078983ae407e46395fe8b82" }, + { 3825000, "410c0b40ec35a64493f70c974aa0c21c8c31c91f44c3f70759061f8aa15ddf2a" }, + { 3826000, "dcfe17c34515a011d29d526d2d0d501a457aa9c3ea7dbda6c9f7c8232d1bec7e" }, + { 3827000, "10eefcdceb88f2967d6f785d4a26d88f190fa641632a49f2316112f8e5098090" }, + { 3828000, "ff783c45935b7fdebacc04588395a2b56f63015a58fc620e4066453bda6f6255" }, + { 3829000, "ba754f748d051dd698dc90c524e67a690d1c8634db92598eafb043d9b0f45c06" }, + { 3830000, "fbbf61411cbbbe226c5c94556d7724b7887deb07c6b5532dffe27f51e8636dcd" }, + { 3831000, "05363cfafc8bd3c0aaf281fea3a9f72afe2eb3ab6e200ba125ea4182b078981e" }, + { 3832000, "5fdcab28fe92db87975365396834e333df1e20a9df169ddbfd16093b26a5775f" }, + { 3833000, "b72d9c82393814a914b0b4852bfa84a373490442a82c806eb2669bfa29db0223" }, + { 3834000, "74debfebddcaae210385deee4d5cb0040d1212394641b9abbcc148df2d530cce" }, + { 3835000, "5909b63494694f9f0d799f2add97ab4c9eecb1838e113b762b58bb132023f838" }, + { 3836000, "f8f16388c358640fcca7696253cb996ab9acc27f1cf5f9846ad0069d85768942" }, + { 3837000, "9292209e82abcc717f70da35c25e5d0d1d25301288762fcde4d45b5d8ec7767d" }, + { 3838000, "0a4b93280d7b23195cd6bde12e4fd43db1720b376bc8ee2897abdae18a92b98a" }, + { 3839000, "39a0f5b23e959aadad45eb1198a09cb1ffdd50fe98cdbe0110fec450213a947b" }, + { 3840000, "681e6ec59a8524d6e3b5393569bd2fab2f22736c0491b9d1bf10d2ddabdad235" }, + { 3841000, "253fa28feeae9d8fc06dc8a21c07371bd3c7abb6fa5aff3e07c2b572613a3214" }, + { 3842000, "3f07f005b7278a8d58d9b5744b85166b9f2df164715ccd4724eee744c71db271" }, + { 3843000, "0d65c738b32c7fae6983781080f6867ace9ef29c91af616f2e6a4d9d818c0a55" }, + { 3844000, "705f8d95e4a0b84a4948bce5c9c8d93b40ce0a8f80d7ed78de180b61a8c5c47c" }, + { 3845000, "46da5feac6f1f6989ef98181002a9227a36b1471abb64c0122ebc4d8c0432344" }, + { 3846000, "967ca7727b00b910bc5175948536233c6d1a19fb828097c759b146bc83dd41eb" }, + { 3847000, "61c487dc4f5377a1c39508a8b857ff3b780cee17c80e5e3b47202180b776037f" }, + { 3848000, "334387a013445d3c34cb6281554c9f68bc3f775594de72fd9058a8e24dc89979" }, + { 3849000, "e658ef794cf89090ff4eb01647e4fbfe0b513cdf50a3ca4f1b59d067badf8eb4" }, + { 3850000, "50cca9da94e0d3b95c11e569b6dfd97f70ffe72aa545847489a98ea0cef028cb" }, + { 3851000, "2e2752d6bcb7466871b7b36a59c6fd8c59bb0aa5a8f1e52937bc2df03ca6a208" }, + { 3852000, "affe8673340a1b4005fc3dff93c4562549cbd22b6710e3c1bcadd65599be6d47" }, + { 3853000, "ed232662d91c6206cbdde14f3a9e4a5f8a02951a17743ccc1c656420cde4f8c8" }, + { 3854000, "0a048d6776cb79425f7d932b653fd4c3978c9d1f3d4277d2510027eaad3e7649" }, + { 3855000, "65b7352e0554c4aa7ef8b546e28aab01db9bd6bb05b233b8dbbc6d8ad89d9ecc" }, + { 3856000, "6175900593ad2550ea1c44c55dd28fdb762134a44f47b69a448bde6bc49e7c4d" }, + { 3857000, "0a5b71e52745aeb4a445a35c0626a0832c160dc8c7e45b77150acdc66e1f7acb" }, + { 3858000, "2661cfc5d66ab7f125654207c572821f5c02cbe370b5d741e8967464a45c764d" }, + { 3859000, "973b862633f5f5edc5114d3577d490275245320df518d4bc5a2875ec92ced94a" }, + { 3860000, "817865da1f3ff5404734691c43ba77652c6b0b08aee17e96c61598d96a417411" }, + { 3861000, "8386a62b41196839f7a84b053baec788d4751ec801143131e6cabc52b2c4c2df" }, + { 3862000, "5f2e50e0c1c8f5321278c2dcb9a010ca8399047fb506585b361a74f1a72af396" }, + { 3863000, "61b87672d8c81fc9abfb22a987de66a7737f6165a8fa6200c927a0a44a488b3b" }, + { 3864000, "82fd310e82c952d1e82adb1efdb93c6f8be3b22342dd73f875922a2ab4d645ad" }, + { 3865000, "2e0b6e80258e9c536e1232a5c49aec160a91ef3616fb4cb7e945b86f7dacc14e" }, + { 3866000, "f73af138eb51fa1345c8cc8d142b84bb79efae6d3900bc154c6586baf685f9b7" }, + { 3867000, "85cef5ee4184d960a499867146423bd5bc1e3e6a7adeb3eee6a1db2a87ccfeaf" }, + { 3868000, "9746af6005c1bceadd10f985bc192a9883b78f38d348848caf46aed7e19f33d2" }, + { 3869000, "368417637696fabf33e1e3b53fac0eb18bd8f58fa3c723928906bfceb9efe476" }, + { 3870000, "7df24e77484f7abd31cab22002e6e42af463a5b710582131a738056a9e7d4dfe" }, + { 3871000, "c49c0f8aac63eef5f972698053967d553279d523fe74717a2b5f153013674d42" }, + { 3872000, "a400ffc094fde39a3897849b071e1a58669be58331741dcb0a8fd8617cbfd976" }, + { 3873000, "c36413d1c4ddf209581e65e022a4720e9e1ea8c1e275f509cc33155407df2b0a" }, + { 3874000, "ef677b751e2ed5d474c33740c23e51a7f751730e7768dedb7e3a79cf8630b8fa" }, + { 3875000, "1a8118e0dcfcfe18078df755ffea4294ee8c389da8d5247e00490e14e40d8b47" }, + { 3876000, "0b60c72cde9dfa16dc82ff4dfb097d9eb7d304714c1aae5496f0438b08afd8e4" }, + { 3877000, "28816e944602a4801b78eee174519e41644e5d3061066362c51495a0373202ed" }, + { 3878000, "04f55e960b14c2a17bb10d4ff88b63335378471d0db135fef2724f48a8ec0877" }, + { 3879000, "21d5155c0cd574c0c1bb9453d0fdf3b727ccbde7bf0da8c72e36845bab1d553c" }, + { 3880000, "cdec7f057628e3bb6149d93111579e3fb86370f97a8c72fdf0a6564c7d72cc16" }, + { 3881000, "f9fb341bb333f9217441010cdbb7c2ad8dd852a2fe3621d53e50f9178216070c" }, + { 3882000, "5ba0b846dd6c8e805dd555e02361ab4904aab23dfff8fb3ba47ada9266b2b4ae" }, + { 3883000, "afd0f71ddf5467f77f6cf764a8b9b46209d733e16d0f8e938dcdcae65c3ca1f5" }, + { 3884000, "af003e687a902032f3a5be364bdb545585601b001053fa400fbcd3dc44bacf18" }, + { 3885000, "5b41b2bf58fa82a1581907fe6e0c4fda276376e051621615b12b74573f244345" }, + { 3886000, "a08757919c6eb05da3a14623c0c953b1b15e322c73d6835a25bc9272dc87ddf6" }, + { 3887000, "a3dae4774f95426880bdcf6425eea9f49579e602533a9c4e73edca7f6892cf8d" }, + { 3888000, "4b51c79cf380fd6db102077f6d8f0bafede612493718fcb952e42fb3b262563f" }, + { 3889000, "9414c2b81ec806e37e759b57143b37104739e4adeea9c41434c5f96ef1855db9" }, + { 3890000, "a14863781a6804a83ee6b0e41b0b29e5aad728984931bd153c92160c8a1299a2" }, + { 3891000, "b1fefc7e6c9b9aa4a289bce6af029a5f42a37800253cd5840e3653025da0a08d" }, + { 3892000, "8b706019979ab994f5b42c58dd411ecbf9e5ae01780656bb83fc99a72aad096a" }, + { 3893000, "8b7e48a62dd8982fe74efb9448d75dd976d69b7fb5e6557e7eb38ff08b6472d9" }, + { 3894000, "7880d4ed30d92cf08429296c240ad20861f3df2dd51843f41b8ebead41c75509" }, + { 3895000, "ccc0e7008b41ca147155df81703191a88da49f608186419602ec9123c50e174f" }, + { 3896000, "4d15926b7c50f7cdf0f871e2c067a0c590af9e49cfad6b4817b0ffc0ae8c26f1" }, + { 3897000, "98933bb76cdcea770e48cca008125e9551a2ccf5a86faaed30c6f2a7c6813eda" }, + { 3898000, "a207f42ce0111335949b236ee9e12c7980f0e5d7fe872f366395dfce1a680900" }, + { 3899000, "425bf228494c9ceb9b0e70d410500d03f9184c14aaf58955d2d0ed3c2618dfe0" }, + { 3900000, "c4210b54c185004b6b6c2814c071856236c6bdd8f367465c4a4830674b770318" }, + { 3901000, "d018e22d840f7027dedfc6288ccf6def3731b0bf4a2a06bdd33c870ff4c0c326" }, + { 3902000, "55869d78883ae2f2a5356c2aa37651ec98b933c15f0f4323fbe84e82535008e3" }, + { 3903000, "e5af50c239acf00e96e3a6bc217c6e3fb4f0fcc7e742944aac05e89ea453b37d" }, + { 3904000, "5fa448b00011285050a7f26803f855ab43c10c41c1393bde70e050b2248f0763" }, + { 3905000, "201e6ef54433dea9d9018d1ff82af9064ccc33d5f6b7c67ddd07f7fb5ef4b6c2" }, + { 3906000, "e9963d5fe6aa250598fc2e33eaf6119f151d12adb2cbd297e67fe4d12499fea3" }, + { 3907000, "ca7c099c35b8d06afac35785b90755b44e0d4c37469b8e8ed5f41a88ac2f1b07" }, + { 3908000, "b80703f98f79f38d4534a1e16814bebc787034ffba71a4b5446ecfe68e4cf2b4" }, + { 3909000, "f7db9f0cc9625ea897b6554a6f05616dd244614c022e147468ed9d70b6a2bd16" }, + { 3910000, "c216bc8f6fa21e0ad754f66c3e01684e106f45f6b35ac24e68204a08ca0fccc5" }, + { 3911000, "395669a2817a861a741202c7a12da07375d8187aa004cb7e47d5c69b5a6ec980" }, + { 3912000, "b7608239119c50c555f4890716a9b7b45a6999317d34e7eaeea7da180c2b33e6" }, + { 3913000, "dc5daa0ad66a1089cf84481d3be2ea6b622adadfc1b2fb8887ff7e7f2766075b" }, + { 3914000, "512cc6b1007bcba1d8d2bf4d77251f723b7446875d0a03ef8f58ba75fbd20ffa" }, + { 3915000, "7406beab6437cb6f4eb7f0d44164894460ed3587faaec47514f5cd732b2ba3f1" }, + { 3916000, "23c99a76897f5e4e2f980084669056163bfd3b08cb847ec021769970f1095a5a" }, + { 3917000, "7cfde92510336bb17e3a2adda0f3648ff07b6497d4892d9dea0ae40cf4a8b060" }, + { 3918000, "e8baabff64c47ceebfb0b7dafa5cad40b6ad5eadd8b73885cc041137df029bdb" }, + { 3919000, "93af9af88c6d17dfb616616e5b0bd511e689faf8759be7afde49877b4c4dc069" }, + { 3920000, "3c2a507f12f67c5196cf4907413afe90d6a4bda5c6006e744af80e80a685897d" }, + { 3921000, "0d56d7633446c737863790f24d39d7e9db1d8579ba0b9bc0b7adde399332fa19" }, + { 3922000, "dcdb543e50d245625897dd43a78fc73dc5138363ac4cad22b3b116f98e10b676" }, + { 3923000, "6f8aeebbd9f506f5dc82655c90b126dd341bec18299f4aec5adcf12212d0e62d" }, + { 3924000, "bcfef6c961cb9434d8b9df11d0987c793392a0cab6d82c976ffd00ddcc5b4a6b" }, + { 3925000, "17428f62dba08d67e3e0d7321e9a24785a93c8ad2c4644edf6cf1523f6c55861" }, + { 3926000, "f0a7ba86562282e7296062d827dd1a8a04bd7a29a437e027e34969f01a63a07d" }, + { 3927000, "cbfdb490a2629e29efb0371ecdb4417c9fc31546f050b4736aa7bdd4e6f6e577" }, + { 3928000, "94e9284df0dc3f8b1adb5211ecff3b8c4c12321a19e01a2721379b428d0b22e4" }, + { 3929000, "8aba541698f86cbc40fe00cb1a8c42dfbe25ae067b284aa3fc902db9e3830259" }, + { 3930000, "7a0d276cad228c17654527d59c5a62de61d505872d28e1d9a5dc926595259089" }, + { 3931000, "4593f728972201326a47ac0cfe79421baccac83fa4f9d8c6090bb49cee6304b2" }, + { 3932000, "57031b340bb86881e97eeede7fd7a101e78eb0bb42c3290b70045c95ef48659d" }, + { 3933000, "8104795b7391770fbd237200d71d429576d47bf7921e9f6501189dae26cd7475" }, + { 3934000, "a33b95baccbd751091e3f838a574bde1b0f7f61dbe231431a95c0bdcd7b8c0df" }, + { 3935000, "f4497ce50ff164fdf5b7620fec342140757abdfd6685f67ca9e7f8f617856154" }, + { 3936000, "18dd17a59cb7a5d0cedd1168adf7daabd4a39e9e96e8a571b77f04a7c0fd3dc5" }, + { 3937000, "4dc2d5f068a0100509c1c32a13862edfaeb4a7ad0a9deedd1ed6e0a6641de871" }, + { 3938000, "e681f851d01ca7cd1c38cca44949b145bcdab92648b3c3c04016fa04d801f2a9" }, + { 3939000, "a3b3c73072428fa675b318077946324287a29833e2475d961eb628aa25164a82" }, + { 3940000, "9549b88344a7ce7f445875676188e43ef85b57c3819f09dbcbd96c9d1bd6225d" }, + { 3941000, "6e6adfc00c5e52f946d58200ed08f394b0372e47eb82e41309da77453c692d38" }, + { 3942000, "cc88ce1d0db0c41239d80bd9bd19c7a46acea2fbac050e02cc837c89b70cf2bd" }, + { 3943000, "0fdae309f8bf07cf1a68c4b100680a4e5bc785d859cb588ee5be202ee84a74ed" }, + { 3944000, "263a4ec90e7a38dc03ba2e6e80daf5965666ea2d63ba03a6b8044bcf39b0cef5" }, + { 3945000, "2645339adf3f2d4052d22a6db2ca23f4676a968667f13e7401f1974f54c00332" }, + { 3946000, "f384d7bd884ef228bf8ac03caab12867216fcfe4463f4f6206a2ce12a49535e9" }, + { 3947000, "34824ed9735529149db1dcb64fcb54c1009095508f6c77c97f21d6ef1a5dd46f" }, + { 3948000, "656347ca9b9548591f4a81fc59b53b3a788623d5e8a9d8bb98e0c5607b78b73c" }, + { 3949000, "65b125eeecddbcdba8a8c2da5b52cfd46839de92b28260991a12d6eed8d774a1" }, + { 3950000, "2c37cabea76a35cd98e5d880ddf980b9cea7b27c1cb2443cfcc49a9c4fce16b6" }, + { 3951000, "72ffb2dc82712ba63e29773f3b15a5ff75afc11293b0352b5b97027032899305" }, + { 3952000, "40da58a6e97e32430a183e7cf334d3bea2e1a4f949c9633bed5b9df8adf764b5" }, + { 3953000, "ac9b93bc9cce9c73b57ea54e4de85384fb8ec2364d62c99d59c66756b3a7395a" }, + { 3954000, "1ec66936f7bb7d6596401696354bc0da1c1e932e070e2b5ad0cad2c6fa77f60e" }, + { 3955000, "4e9efa5bb6f7af814181cccbda80eca330c06a6ec2801cc5cf72c922628dc154" }, + { 3956000, "5426a948b29af3ab9aa602e926614533e4becd015fbec9cc025b20526af197d1" }, + { 3957000, "def7e3f3660c8edc04065f04f98f75f21021ccd628b11304440f29e9274257ab" }, + { 3958000, "6ce51d7ec0f463008860783d27a9e2da5e90a8dcc1de1d9bfe7bef90f17b0054" }, + { 3959000, "508fd8a474da5f99283fb25c616ea5707ffa7ef47e94da22bc9899b9da14774d" }, + { 3960000, "2f6a9b010cfd64fc743638ce360e7f58fe83cea939ff17983c6cdb106e5167ca" }, + { 3961000, "d1fd69ace6b07b5356821c44e4c514143f97d793cc99bc34e4a334f56a7d9a83" }, + { 3962000, "d9fbf23ed2a0f2bbd845a0193eacb9621a274fd31f33ebacad52c20827b9ce2c" }, + { 3963000, "49f0072ed49ffdccc96423de863a08b58a8214a5e98e0c127e64eaaa9c9dd20e" }, + { 3964000, "09fa7072cfe4cc510eb88034682edddd30bf4fbad37aa2dbfc7b631e7f013e3a" }, + { 3965000, "7052e8411a20ea8d8f4335cc20627c757f7039f34ecc317dac70fbf90a103b4a" }, + { 3966000, "00b7914b9c51968244d5eb2fc7d1d627596f4919d717329ae1460af54a4e54c1" }, + { 3967000, "cac32cd477adcaae46fb03dc2439fd08034e3c927d0c5e3fc6552e91220980fd" }, + { 3968000, "34006880ae4a0c939fcfb23139cf4dc3c9634a5a9b0614475ba62f4beb4bacf9" }, + { 3969000, "9108ce9a6e46aac7505c3d14a91eed3ff79a71c889d9e36de258c49fa52d6815" }, + { 3970000, "a66c2d4180cac27abc19fc6a09dd467fc910596f7ed0fd9a20a303e16e8d64c5" }, + { 3971000, "d8de4a9851c470b81cf4b7d17ad8d9cb7441ab1bd902ae177a8b62d5a84a2e39" }, + { 3972000, "843eb3bc074d3165b4d945aac13781655453d800f04bfe3862dd1ddbad8c9a8b" }, + { 3973000, "d8755838ca5ccb8f64438dab59056098c0fadba0919abf1f5ba9f99c6937ed1d" }, + { 3974000, "7c13a69cf4dd0e1671afeb2b42b1b16fe100d2a2ce2916e619e9c5f71c33d34a" }, + { 3975000, "fb62cab706ac81859648e849f8682d3aaeb494180627edab016e03b2754b2cb6" }, + { 3976000, "c14d792f0fab314a087dc2f79a35ee84163c34b9705fc3f988a95194bbe3edfb" }, + { 3977000, "c445fc94fe0feb154212b529bc81ad777b7345df2b018781f7a25ace3a5ac340" }, + { 3978000, "1d5f372e77fd351916f64c4617e5d89d23874f8910105650f1bad330fb9d685a" }, + { 3979000, "cd709b207da36412ca6f8abf295efc189709facf1e3389cdfbd1ef76026f4598" }, + { 3980000, "56f52dd3d69cf59595749870ebeb807d6c0f01d63f692de8754e72fa2f4c1de0" }, + { 3981000, "0f837f4b4569dbffa56cc408d25e4948529f7e52169ac2527f8d9309b35a7132" }, + { 3982000, "2b7760d703cc24dc3a18cbb09b185283eefa733c556ad9638ab22bb95692557a" }, + { 3983000, "00176ca798b5cb3fa77ddb0340e1789f35c9c04bd7929e708aae15cd1b4795fb" }, + { 3984000, "bf989cd6a6fdd4bb1a03a63e81a194cff4d024d58a84785571eb181f6c810b28" }, + { 3985000, "16db5b01b214a9e10140a1ae3176919792cb47ec3a13c07f24d52bd9a55ccfbd" }, + { 3986000, "969528ec3d655eb67890687c0b07ebd0bfa84641b34b77ff8e84894d5fe497de" }, + { 3987000, "32f617ec4be849625c3ae9831fda38a954667f09c3ab0491843cd45cad82167f" }, + { 3988000, "092c54e1cec6f7138c3ae3f9cd517b79575956e4b4d7436ef91d4c7130d31be6" }, + { 3989000, "e34e29cbe5826fe4a74744e88501d0b010495237b362a2324de7eda5893005c7" }, + { 3990000, "1c21d6b2099e34d561a4f462302e8c6e3a972cff7d0f1a838944ab125443b084" }, + { 3991000, "881bbb89df63d979c540bb91b96279432458b5ec8968efc13d0b7e22ae55eadb" }, + { 3992000, "e22a4ce94509780698da49b0703b4f3752862029ed9eeb8d210db47883615bee" }, + { 3993000, "44fd27eb044e1b89f0213e6f9c8f53bbc6b154632825a31d6f8ae28b03ab45a0" }, + { 3994000, "252109c12380f147db762cf4e877331941e449284bf5be23c9fa67550578076e" }, + { 3995000, "10abf06cbcd3932ba4b2e8a3b36adb32ab9bad91a5288f3df927b4082d58ebaf" }, + { 3996000, "15f635b3e25cac0f81ea0e9ab0e57fe088728bc45794aa8a11d05a01183a0d57" }, + { 3997000, "b735e0442d9843b75c7e39d2bf2e46049ddc23a09008460bd0b6c5cca66888d7" }, + { 3998000, "30cba25873220c140d186bb5056492b3982dbd5e381175a5eaf39ed85bd2bc9f" }, + { 3999000, "21138f071624fd6de50ac691b8c6a2864f9b0da0807f20fbf20bcde14a7dd227" }, + { 4000000, "15ff6dc247f0d8fe6ce02af33b21ca3c49f149945c2d5b61ce07c9b40f799d4c" }, + { 4001000, "48e5e54b2d6fe956582210e48a039a9ffa19603603740943aad5fae8d5f5cd5d" }, + { 4002000, "e8f9f2a953f48f6b97429a3ce17d5239f695e20177fa217f4a560fce3962c966" }, + { 4003000, "05eff6f43c0a8cabc790ed79b83576d7a1a19ba0c3b69b0dcbc2272a346677e3" }, + { 4004000, "b7084a6ff982600e758bd78ad3c0b6184df49ed80e8c7c57277e97dc54ba6e6d" }, + { 4005000, "e72a77660a614cdae070564c841fad90c97f09c91a2c3da1bfc2241b9b833d8a" }, + { 4006000, "4d57d9d1d4536ed64a91068e4e3e45da328c40581f579edb9ac8d19eb64699ab" }, + { 4007000, "c4e770ff936a1abbe30c1fc76aff546bb7798d42436e1772633b2b32955fb39b" }, + { 4008000, "a01e80d3b7704056058a917a8ca4ee7d98039f73946af3cfe8e8a3761f1bf393" }, + { 4009000, "d2921324ec2e58a4031f5c9e029e96cc8f117902558ad1755fa0576c02a0185a" }, + { 4010000, "193768384f8d661e99f3712f4e2ca40872994da34c9172648ad96745bf2029f5" }, + { 4011000, "9e1934e46001fe90ea3f64817b23bb41c787928e20791de8ebaebc2e55839c0e" }, + { 4012000, "476a3ea80d2c59a8ab44d6019e9b4eb4376bb98c3a352b8d089b8a6386df6bee" }, + { 4013000, "29c084d4d75b52a2e6697104f98f878aee17b346bb2a528be889f5268113a5d7" }, + { 4014000, "149e543708ab57404de970360d7e29706a988b9248d2be542c29629f7cb28abe" }, + { 4015000, "311b10c7404bd2cea546ec6c4a209a24c4c47be297c955f221b2a6161a6a8e8a" }, + { 4016000, "f8a27cc6fc136394ff212dc20e91efc7a8408d5f51d885ea382e873fce8096c0" }, + { 4017000, "514a419c422868e64983d643f9aad6f3d11007ba4a4916d279194c82dfcd4a68" }, + { 4018000, "8013d87aa56e38bf3d8a69482d814f698a077bf1d4f9f643884ad96270e207b9" }, + { 4019000, "7cac461f7f50e3359003925bc3b8d57e009bbc1a423d5caf185745e9d997a828" }, + { 4020000, "2b170a50da3076aca78447468a186a6170344d91db5516ba79a97a130b76f9ff" }, + { 4021000, "81c3f6e2c10772434e939519a4dbf02223c126149483b75f7555a7b6d0093afd" }, + { 4022000, "94df161b33b4f9f4b7910d99b87c75deea192eda86469f991bc01760c72cd2a9" }, + { 4023000, "c68f9c7041ce76c39a70538c21bb6be1f80fccd90e24944914538fce71a4227e" }, + { 4024000, "ce707932e092442438d253b550dfaa4098e0eb17f9994402423cd3ef6ea34a3b" }, + { 4025000, "cbea93d8bd1e15e9892025971cb864c84655fb76a0effc3e293fc7d4a0dc36ce" }, + { 4026000, "c8ec13c5f87d631e03909dd4ea5637689a2adcec1b9203f7e11d29a580139ce3" }, + { 4027000, "9a8d5cc73671a9902fa7fab9b8a104531cb7082bc1dcf25c2bda5e5fd1f772b5" }, + { 4028000, "a0bb04760fde959c5c7c4b3f5087196393bc39302837c605aa17b8748c49dcc8" }, + { 4029000, "57490f3c987f892f8a23fd4e433b58d0f7250a6e8b117dcb0c2ffda7a5613f51" }, + { 4030000, "c3a37ae555a693c0d7f1273a60db50a9cb5a4fdd1a19407f6091f0a0bd7422d4" }, + { 4031000, "8d2019dc21cd87fc4c05e77f7669695d19ec2329059fb368d6868e47a894100f" }, + { 4032000, "7cb64f297561ebcfcec86ab4e4eb77fbe39836b890466eb7cbd5fa2712128ca5" }, + { 4033000, "b17467f05a24af9ea60478672dd49e909bf2acef81b1bd6e367d234305840a7f" }, + { 4034000, "7528c21a091fca549466aa6796ddd5740f51555731dd774f82a804cb5f61f49c" }, + { 4035000, "75c6131484d8c56f2e73a14fddaf55be93431336042eca9295297ad6d19286de" }, + { 4036000, "65f1d24167c2f045057fa263ac58d8ab54abe7559f9f55603821709c95cc8aba" }, + { 4037000, "786cb53e6b15f76c194de19b8934220e644b9a20bab413d11a8af09d5c78597f" }, + { 4038000, "bba5805ab0b9777ec71e4c9eb983881070529ff8295b86ac69e54c8074413065" }, + { 4039000, "c33a8eeabf63837370555acd1a9652d590f5feb55588612776633e65fd0110fb" }, + { 4040000, "4a7dba530617cbebe8c1a028acfb25507c6b59a94d2dbc356f0bb5ff8c7db068" }, + { 4041000, "43d15b7fefd36a340cf1fb5de4c1e3e22b6f2be6d01cc8c87bab03e9818fd1d8" }, + { 4042000, "e9610823e1212ca4fea98e90357c1b4aacd0045becbb7c37563ae11e115d1c46" }, + { 4043000, "bb9815e803ebb9755e9f461b8200ac13869c88d877a75139f0196873b844abc5" }, + { 4044000, "26ea46b43ca55b9c8693285ec5701624f483083feb174f815d9cbcacce6836b6" }, + { 4045000, "1e2d531b70982e2404a2159963f81c1a80ab9fbc2adcea35a1b53d52fb73624a" }, + { 4046000, "14fe995b60fbe0e6ce7747f037fb211ad483adae9161ce6acb4d0af2bafb5e7e" }, + { 4047000, "080339b3e6f69af7ace0032eba741695837743b557794782389cac9b970e3173" }, + { 4048000, "56194bb572df22129bc8469c016b7a8d39b7a9c917673addf46423b24356d22e" }, + { 4049000, "02610de383818c70294ad31d7c57a3b04a0e3d785660ad4acb217a9363426b61" }, + { 4050000, "00ac004b4615724d2b74c67bbab3443082dfc01194470675e4271ff397be0152" }, + { 4051000, "c38d1e83e093c2c63174cff464751f1e3609fcf50b68cc63f02c3f05404b1265" }, + { 4052000, "9850d50535452503f864df1a6bab254a8ef6944600ec86363267b6cf929e809f" }, + { 4053000, "777cc78206e33f3365343de47df67c8774a4fc4254e3c1d68bd954263399bae7" }, + { 4054000, "db8830061ff6a2fac60f4058729657c10203465bf12cc00cf5d244fff9506a54" }, + { 4055000, "f3627eb9b9c3c104159fd19cc0be82c4ffb615e34e95d0b42f0f8d26385cb4f4" }, + { 4056000, "8b73b7814965cf0d8fd93ad97ac64b6f6cc0401f96f83d68733f7528d26bc94f" }, + { 4057000, "d51bae6ae630552ac6fe6fb54ea825b1724e8a5411b28b337fada8cbe8a2511e" }, + { 4058000, "46a447fda9f5fc48be90d9de83eb3dd3ddcc5f8f11a2a9d45e541e6621ef5dcb" }, + { 4059000, "e09c624eeac7a43087b32dc1b2821bf5b24a83e174a297d6d570280c78906baf" }, + { 4060000, "1a1dab26535a2d43281eab4e296542feaaa3ea336b1a4e1708ac9d02d34d603f" }, + { 4061000, "70d57ddc718060cb98a84a4ba278997104f2008493d7b4df6e4b92c5c55a039e" }, + { 4062000, "8e1cb15d9f3a2312cc8cc28c674dcad4fb5de1f2bc0c79f735fe53efecdb6949" }, + { 4063000, "d2552d12b5b6bf23c8a3f68f2a6e46cf60f43e8c7c8c5f3db57d5161bb820e4e" }, + { 4064000, "7b9bf377d904323736d8132719bac2b4c62918db4a087e5c3e80e08670e9beec" }, + { 4065000, "d09bf3d5dce4636e58315b954d5a6b079b5fe3180b57ab0947245ab45ba383e5" }, + { 4066000, "544416acd02536bb8b256e3a650964d45d050b91339aff3b38e1dd040336a7b2" }, + { 4067000, "b0e568c05f1341986091ff92a5db8ede33a202d87b3ed0d7fa1f36f8db96264f" }, + { 4068000, "09e0034c1636b3a108f042f369ac2e2b8e73637e8dfb0daa1e037a1a84d0c4ef" }, + { 4069000, "c24a2bfbec531721ad4bf575fbb4d61401f4f59464e4a6c047423e22a9f101db" }, + { 4070000, "e86e851ba5806453990e88b02ad12983a5592ba6e569b8f968f8ebdf483831b3" }, + { 4071000, "7a7b27ef9ba85191bc4153dc5bd93a5f5672d4fb390721e5abcf55370af05206" }, + { 4072000, "8d70dce280059eacb1e59a995608e940c8bf82e0195fb8ebbcf232b2cc9a7760" }, + { 4073000, "bd0932c36fd4b2ea803d4aa0fa8fe5d86ef3b4dc50788fc9ab206b3516aba3f5" }, + { 4074000, "ab3e20baedf26fcaef8d65150f3a65a11c51e1b1a7bd4696944ecc80213caa9e" }, + { 4075000, "deb86b13df77969b944c56f8f335685e0b72ca142cc4f0af1e1073458ef1a44e" }, + { 4076000, "093e9fd8bc33c4eb0d69fb091837f8290c2b18eb9706bd0916a0ab55b38ee0b3" }, + { 4077000, "01f73544c8167e5194ea9b57f9b7c5b7324821c4d9d1b7f624ee99c99b711728" }, + { 4078000, "fa45e4b1ef330f9505c3d7de21daec54570eae418cfbf99bb719f6800e3229ef" }, + { 4079000, "6a791ba56fff300de30f24912a3953855f6b56596f1188f8244b19c93b3834a8" }, + { 4080000, "500e3e973e91097d9cee055dab63d22b4f3b67ef8510d4b1d06859d22d6960f1" }, + { 4081000, "3cf9393116aceb785c5fbd27b69b710296d19676a3413d20b0d8c70476eb2e84" }, + { 4082000, "cc221276be669a11b3e28bbc40cbdf348ea0d84bb6c0ceec5f488253368b89e2" }, + { 4083000, "5c7a01986893e2b97c04d089203a92a87a18f475bac3eec453bd82e8f1864c8d" }, + { 4084000, "62b0eb127954e489412a02273f9537d4fc98344de5efc6bc764994b8aacb2f8b" }, + { 4085000, "6865ef2b47b7e6de011eeb9b2b9e4dbf556ec718423397f1afeb3bad7ae23f62" }, + { 4086000, "89e09603bab96188194ca4e3e31fe21fb93810da2cc3683fe1a2f218b809d1f2" }, + { 4087000, "a630d3104f08ceb5854133b78f93b183b373a10bf35c5e418e0b5b6ccc8ff67f" }, + { 4088000, "bdfbf7bc3fc83b15eb82ba9a6a00b7966b56d6b2689c87bf6b14509294247fc2" }, + { 4089000, "f2e41df4b1087e3411e7fe53034def7a36a02005e79faa7804795db3d3fb1b7c" }, + { 4090000, "9fd7651fbc809af21ae2a3a6b13d443a0b123061da1027fc4c0ca34d7230f877" }, + { 4091000, "9f6a1794fa9550b64b200fb2e7c76dc6facf1a8bf6b0516d38cec75821788806" }, + { 4092000, "f900d0b550cec83004838b16574eaffa78da7ed497d259c8bd2e0a50229c6ee7" }, + { 4093000, "c4fecf73babdcf97327a1443c64e74283e944ddbba3f07a0a02c73aa283fff69" }, + { 4094000, "478b70c50c40da7e369e5c58d0a282c45fa0af01e82e9e8f0ffdb2e492ab849e" }, + { 4095000, "8b5c31ae160cd2cff2c463304960d830a6e6b2cb88133235c9b2fd971ebba871" }, + { 4096000, "6e62c12ac738c65ad4cb3bc7c5ae279063712e62beed990e5bc78dee45c33d5a" }, + { 4097000, "ceb699673da28091d10a6c9823df6ef66e589186cf15ea694bd436b2e7879eb1" }, + { 4098000, "c0c1431ae359e0ebfb30fb9e59453bc4d4ca6bf48ff6abe0202b57e8c9961bf3" }, + { 4099000, "73aaa0f5bc3df62e0d6ac3565ae44d0f226325345bd5b30edaf1c207f71ff59e" }, + { 4100000, "969daa1a7c803d5a4e6fb7f6e7a5528ba7d338ba260bf31e4e92099828992c6e" }, + { 4101000, "0bffcd86dc90c06a099770db88a776939588ef4a1956c57a7adb3965c2a1aebc" }, + { 4102000, "cb65e72c352d2579d4d769b6d7fa7a4468bbf9030bbb402d1398d908a3a7d40b" }, + { 4103000, "10d14fca66825f27f5be6b50eb1876e1e710e4a2f4ed4bacad14b5273f93aefb" }, + { 4104000, "cbde25b3872b77662edc0a34fdda32b4c1539a6aa0b100805dcd8e6043abdf32" }, + { 4105000, "404ed0eb5b35e00c6adcf097fbc6893b0592e0f5e1cfb8993bfb11d2342dfe2b" }, + { 4106000, "2134057229d0fe0d126d36818767e665d87f53423dc6213d4e9acc0c5e5db5f7" }, + { 4107000, "16283f263ebc97d2e1311128f626d202446e63998253917942dffdf4b9b31415" }, + { 4108000, "1fc1d07a17bdf9c8b3362273bb54258645573e721f5903540cdce6c4a7f12570" }, + { 4109000, "199568ea3c769569a715e7efbbc881ce56bd35179f4adc2e71ef7c3e6450b921" }, + { 4110000, "9a8fbde047a0ab60ac46580c52b8cba03bb86316d85f5cebfe58d96d91f8023c" }, + { 4111000, "d1e3e03e97ea7f853dbb37c5c07b149bf49cc951287f2a797ad31ad707d2ac0f" }, + { 4112000, "71f9a683206a4e93771753e9f75004352114c8989841c2dcc61aa80f73563127" }, + { 4113000, "0f21edc74e41a3fe3bbaa51dc32e783ac34c70ce8a9b45b4aec7fff0c7df38bc" }, + { 4114000, "f8b193ccb1205a408e1c4472f95c9e32b7560a5cb24e10bf3b4ce75da1d899ab" }, + { 4115000, "8e90065ba7c1ef9d10fbae211455ef1ee8ff985c52bc13f2ded7f16f646f1658" }, + { 4116000, "b55436eed12fb54ab0d61e1581455821669204e65692ee5417b6c34ff53c7ada" }, + { 4117000, "007bc5fe7a654912bebf799113d5397fa4aeb299c306571c39d37fa134d0b1f4" }, + { 4118000, "55fcfe885017d833ae12456aa0e8a5ee5274c62f0799079b94fd9132382fad00" }, + { 4119000, "0c72115546186e7d878f0866df263a132788d914281df62edd48b42ed8f8fbd9" }, + { 4120000, "02a7aba3f642f2fbf38c8a83471e9522a62b8f70b0568cf9580a88787ee29137" }, + { 4121000, "c3218f0a524d3bc32a22a826d565b72560a913658edcbec04ed798239ed7dc01" }, + { 4122000, "20e997b88fdf311769f7afe5dab36ee3ad8bdd6ab0e901406352b276deb440e4" }, + { 4123000, "9da0e4a21e34fc785a659d24704e0f4511fc08c4703b68a6e1a13c6572cfac36" }, + { 4124000, "68f4255552d4601ad740e9200d12bcfd946ce4e3004dbce145ea2280773a8278" }, + { 4125000, "ad9922902c8b9d4ba73ac6523b41b226dd8789595d28dff69ad198d86a083835" }, + { 4126000, "1e0e1100aa58d6b56c193f36f755540be22d7328cb9b5d24176b432ef3c15199" }, + { 4127000, "8ad47aff1a169e9915876d461960bf6195ecdf1f393a9172ffcb5282a8020541" }, + { 4128000, "c8cffbf1a4c6083b341edbb8970cf7351849a8c29d2cf7b6c70129433a833cd3" }, + { 4129000, "f5fd40d7a9e37d94c908756d91145404f04fd68072a821495b329bc77e92ce19" }, + { 4130000, "ccd3a8b628356d86712324a2366e5ce7118d719963843b7e4796f44842c4322f" }, + { 4131000, "13ed8c34d670bf42b96c476d991642da356316621461da76b8b3830878aa6250" }, + { 4132000, "ac49fab6187f57bf6cba513d53ca89404fcaf6911ecf54136d04c01c96771e6b" }, + { 4133000, "0c4847f2db42ae3bda223063dc01aee125224cc50bfae47034f3f3997c3bdab5" }, + { 4134000, "fcf82ddeec6f4b21f5d167788839caab1ae487abd5cb96ad1d5bf6b27848f316" }, + { 4135000, "e71c587af20a0a2ce2efbaea906aae55e86d54b3afcf604dc81bcee19ef535ec" }, + { 4136000, "b58d0a12862cc76a24c2d834920a398efe1f6b9660760cc3f9cfca8df15c984c" }, + { 4137000, "3db95899c7b72abd9d11aee0461ccbc1d906e5c5aeed0509a92ee9a0f180dcf0" }, + { 4138000, "92f08040e7a1d9abff7dd889462ffd5d71f9ec3b6463173bcd42914d4634ece1" }, + { 4139000, "32629c0c35ef31bc3c07502799402ad455b6c3d885d2889dbcd2fd12e60313fb" }, + { 4140000, "9c7097c40b8e0c981ee4ae9e880af1c17b2ba51477186021040568a237936a6d" }, + { 4141000, "6d58b0d59aa1c8492cabcbd052946482c50a1cee0928d70c43ba0ae0e3c208a2" }, + { 4142000, "4e115449bd17e5c8a944bd038f6288d50568a54528c3cd7e11336b96cbbb11ca" }, + { 4143000, "307c481cf63ebe0f09d9f8be0928246dac793bae0f58fc4166b844aa0416bd6c" }, + { 4144000, "d03821d2103002b463b6da1aa8d238fe52def7cc20312978e19e50617286278c" }, + { 4145000, "f64c099212869bbde6ef3e03a190a25027d7c6c4c8431dd3aab00c5d757cf193" }, + { 4146000, "6431662f363c958ea943685ee0fc2b665a7d44d43afa83520fbfdd9d6422111e" }, + { 4147000, "0cf7862f163c8012a330efa54abea02d26687b3b1a08b057c770e3db7a72a072" }, + { 4148000, "38a1a86eaadc57ef729cd297db7a3f80ebd6da7bfb910f7ee33b76fb5378dd87" }, + { 4149000, "c99286ebe2e5cc69ddcb10a9b4e6d2923234b2efbce5fbc0f57deabafe9d0f2c" }, + { 4150000, "53af457b0092ad3c90f059684b3d1fe315aeacba019ac12d76119356560d0f84" }, + { 4151000, "0c0844d52e5007115bb85dd550553558818870c67edb5b6dc2389311d376e35e" }, + { 4152000, "ff1ead6057f8a12ecfbbbc2c16d54f69993b779e10fbd7dbf524a79d66540760" }, + { 4153000, "6bf4d0d110c5184c1d1d1baead79e754f438e7956d41fa3b416d5ef372048825" }, + { 4154000, "a5f4b7b73c62d17186d00a86c822c2679c4a4288af3c71fa03a5a5e702d8d90b" }, + { 4155000, "7de6fb0bff8f3783f52da47827c1f95d590e92d6bb74fc5a8591f1e41a01bda5" }, + { 4156000, "e134cc4179ee1cb7997afad3f63e5c3f1de9f3c0a817d56eb28f23c0b25b429e" }, + { 4157000, "ba582754677dfd8cb8aa63721708a816a06ac596ce5414d767edb4fda0c5c220" }, + { 4158000, "02a7baa2b99c571f3523754d7f6660b51f638c1383ab045395dd3090227e491e" }, + { 4159000, "d0a3f209ff6855820a7071dd5ece0ebf5494e2eafd2699ee0c0e7009111ea4da" }, + { 4160000, "77d205d9dea5bcc440756f220f3c01c0207c4755268d533214df8e407afa80b7" }, + { 4161000, "51296189e6b0423b907f1b09ee4900434eb9e6650f37d6408bbca615a0d6b512" }, + { 4162000, "55051be5b1ef58d9a4926160a7e92691f08c67f57cefd71c927f57a3888fbab5" }, + { 4163000, "f009d2a013cfcdc91221590291ed28fe3a3096539524b96c7db7f1d020ff6bd1" }, + { 4164000, "6969a02ab96cfefee445605e47f1eaa4300745dbb614cd5f9c7d7288d422b8a3" }, + { 4165000, "8448f2c5e05ce9bcd5afc7868400ecdbd41fbfc36063dfb061c28af114a0ff99" }, + { 4166000, "4fb090c0558ee1f6363200a9c9e63719a276ca3502ca62be4ae849581e3d6212" }, + { 4167000, "d95e6845b80772360a9498da9a3aef1e6aab72cca2272e5af473995aa180b2af" }, + { 4168000, "783e03e8fda117da09692fb73d3fba9d535cd40e7e847dbb631a542abcb30836" }, + { 4169000, "669d2603b32f0e9055d88e25147e1556e826c96f361150d92ce0950587768faf" }, + { 4170000, "c3f5b726e3f5e90f081d769fd8340e4a44304387e77e0cee4f75f5155050bbb8" }, + { 4171000, "ff1588a6925a58e1e37e020eb84c76fd55e5c1623717c166d4f0655cc52ed1a7" }, + { 4172000, "73b111ee36ec09171814a6da9f22e7356b60934522254a11d38286df030fb103" }, + { 4173000, "949d2afaab93766dfe842f13d3c64506665fbc3c228e33833c47525d56e99038" }, + { 4174000, "63b0a411680241a9922a4d41c8cac85f6611a0d112de82edcf012b57b57f762b" }, + { 4175000, "1d063e4960a8fdaa2394adf89881247208b76734f4b04eea5f636b902bc290e8" }, + { 4176000, "a29b5a21a19bcfe3fcc70a903a0da7310cb9509ffb19308d977ae6c38922cac4" }, + { 4177000, "bf0763dcac22764a4b9a4dba50d49fc5f2df2e607cd29c0c2b0ecca3ea18e345" }, + { 4178000, "5be756df1282b51404f8a96fde1803fec62e8ae3b53daaa63442b343fc27f17f" }, + { 4179000, "b1edd623238ed8da0d4adaae87066a1e92e9385cb14cc3b2208383a8a5b903a8" }, + { 4180000, "4d8fe628a9c7756752c8f32b729ed2c3183cbad0ebb2eda63216033681ce6ecc" }, + { 4181000, "424e487808c1e386cf4e2ec7a7a9aac3b95850d3f21d66c6cc68ccaacb566fd9" }, + { 4182000, "e31839bc21131f2d2dc2f659aa0acf1714eac0e6071ca2d1d55bad0b20b2e063" }, + { 4183000, "7ba9f9bde172a6f41a36ef68f9ac029217e6bdc3fe09cfa6122fba62900654b5" }, + { 4184000, "faaab752355ce5eba30140ff940159b41ab381c8cc5781bfc00cd4462aeedc93" }, + { 4185000, "36048d42d39b9f1654b2bc1dffa4bea40451c10779df51181c7eca58f5316a54" }, + { 4186000, "cde3c4cc945b4781cb4b6bead524a6ed03135ff6a67986cf8fcb568987915072" }, + { 4187000, "4c05c0b6d276d13fe04bc14d187551e93270c516377118b18434ac2b6015f5c3" }, + { 4188000, "6f9929d136c1f7f0e97f2f91d316894d746c41d6f6f595616cd40be19fa1113a" }, + { 4189000, "e58341b9564be10fc97e861c78770fc6b82a8016a547b9f93471a0890035949c" }, + { 4190000, "beed29aba3d8b5f9bad7524733dd1f971c170101698fa95c193ea697ca131478" }, + { 4191000, "72ec7961e695c3955df4e4876ee83c3aa389906c71ec9d366a268921ec8be51e" }, + { 4192000, "978edd2a5711bc4853b54ca39945c11a1baf935b9d68e35b89f0154eac314dbb" }, + { 4193000, "dfcd9caa4027b8c0142e9013abd8b32f098c0e7016d95c0e1a5df4dff8b99621" }, + { 4194000, "28d689f5b882fc575018b88a818739bcfb6d650289506a7a1b6f25f7c1ede16e" }, + { 4195000, "04b2342c9d563e58058e915f81edc529c4886740024cd5f08c3c1d313033542a" }, + { 4196000, "74284339e5a8f8099b8a2d622c69e7f719857fa740c572f218ea77202668312b" }, + { 4197000, "861c82a97579c7f6d09ccab62ff6a425619f91a281bbda209ba073dc80671b94" }, + { 4198000, "c68da9fb09a3beae3d38daa99ff5a398bd012bde2df40f535c6e32a85e80c0c7" }, + { 4199000, "c4c29f65274a87058b4fc30a9dfd6855335461e01d2dff54c8a5a239218ba35e" }, + { 4200000, "e2e109927c49b92a958a071df251f1a63c56200f44016e53baafdd7658db42fa" }, + { 4201000, "1654054a3de56e50756e6dd2e7836c6c22838488e5fb096708a8284997635b1b" }, + { 4202000, "6d907aa4a0fc9873897c895d7075e187745a00e817576f09a0f9e5ef1a789fc1" }, + { 4203000, "f20ca27219124b0db0d0444ca3ce4cc1e6652ba41c6a791297d9506599432024" }, + { 4204000, "e8bf129db694cb2bbe30e28b0c3cd1d463e7fc0a82b41684cf136be4dcfe3c46" }, + { 4205000, "425ccad96df650676a55fc263b6633e4dd2c740ce5609fffd03237269ba17b3f" }, + { 4206000, "bbc6508726d14fbe82848310c9a58f6d54720fc0aad78654166875144cf4acd4" }, + { 4207000, "491d984233272e5b4b4b185762ac061c3c416194268ddac712b557bdc65eb0ac" }, + { 4208000, "ee342f3e0f58f412d2ffa0971a2973be4d4e29b8c18f6f6ba6acaf9f8ea43d27" }, + { 4209000, "69a8b9d49aaa3ca230d6fc15655456a48e750b5c529dbf14b8b2b30cc5be3d0a" }, + { 4210000, "e8511e15d64689ceedd7dfb818b6cd30199fdc8d9130592d16082c87a3573cf6" }, + { 4211000, "1ef3b6ad7482df9250c8255cd2e177c7fbd4587db112f3e97ad0e820ff3c45f3" }, + { 4212000, "f89657a388da1997b51003da30d31fdf204a32681ae6c80a707dd416087f135d" }, + { 4213000, "75b4bcafe8402e9ad9de66a9a3840fb4115dce10b42df929dc027d410b704731" }, + { 4214000, "76e6cfb38cb876032d7cf72de1464bd49042164ffa199c2b32a44e9871dd9334" }, + { 4215000, "1fe0fb06053b8bf88c542660c62cf7c5e3d49944297574bc5e69ed62fbe34f79" }, + { 4216000, "a16647aa7bf02ba6b4f0229a134dc4881bdb94e5096d352bd36756ae5f9f01dc" }, + { 4217000, "f429d57a7faec9ab5e75bff634acfe5b49dd898abf18e1622fefc742f9864f80" }, + { 4218000, "dadeaa788fdb0d16306826c45b664806f6476f489cb3b62a541d62fb1f1bd859" }, + { 4219000, "3e2338aa821e6af08df8fe108d523044b87a275a504676bc16aaf055e97022ac" }, + { 4220000, "7e0aec3d01fa972db2d06caab699870373ea25e12f937011740f73dcfe0da52d" }, + { 4221000, "64b92478a549bcfafcd7df21ab9bfbefa7f30d5ab16957df1747f55cd1b0ffec" }, + { 4222000, "34e30326e30083c8039a37bb545b1b80921a6e608b1f98ae4f908dde32bf9988" }, + { 4223000, "2a1a709cd5eea4ebe3a926f43aafad225f27353529fde710bde2a809d34337b9" }, + { 4224000, "ec4588d2d1c06ced80dfafcfd6c909474da9f047c98d16c22c06c964a4cbc1d7" }, + { 4225000, "9bbde80cb310db5d35475bbbe249348d1e827edb97491253c580663e29ace542" }, + { 4226000, "810db93a09dc6a0b02dd4285e401fa2d0526af589d7ea1f3eac929eba838b5e7" }, + { 4227000, "c2cc6c22f7adceb20161f1dc006ec901d83ef07ea4cbc2d74aebe238bfa11eff" }, + { 4228000, "9cfd0aaa30a21391639036528527a7749f35c065c6eb9848c63b71723dfe04fd" }, + { 4229000, "415e34f0db5f9171d23c6dbded33aa8f81fd7658b5a503b4323389e0caab30a5" }, + { 4230000, "f92cef3d8e6b2baf67f0e7eab4e4e30ebea913e7af795af63bd7ac60537fdd4a" }, + { 4231000, "80378960d10bb641d68adf4cd007eaf264de8314143c4f1d31834531ad97aab3" }, + { 4232000, "4e8d636546f591b25ad571820632d3f5cedfff20e3e3053b478e76546815e529" }, + { 4233000, "689ca19947faa8850d42fceaf5e821419134501c4b971a740766cf365dfbc889" }, + { 4234000, "eb062255d03695bc2872b1c0d18193f03499caf923f70a6fe269160453576f66" }, + { 4235000, "dca4cd09772321e54a7f37ae933830447143811a4d8bb52d68e64df0c86ad033" }, + { 4236000, "c9007166d22b902d16c21400d14ae510a4cb78648d55aaae35b874055142f42a" }, + { 4237000, "eb408a8e745696511c3ee0c73fd5753afe5e45d621cf1ef2729178f3eea82137" }, + { 4238000, "e58b756112a5dcf79df95b7e14d2007c11d616d9b67f6a863617f7331933bb4d" }, + { 4239000, "da6a4976c9e12ebaae31eea6419d84de91b6e46b47650fef9fa26b4ed336232c" }, + { 4240000, "1b972f09afbd43b9ad9a263a27ffa31a79ccfb4d7deabfd33b1b94d7f7e88ff5" }, + { 4241000, "627ab54e3ca3e37f8577ab2fa0aa27c8294b9a7308dc5d4c07a31c2c8f1f4c0a" }, + { 4242000, "74e97d7e038ea9b19f9d783eefb94d16f8f48d74751c8d11db8a9bae4f61bd85" }, + { 4243000, "c2f2aaa70ae13ec13cfb83f5619cccf508fa37ef46e76e09e0ff7784b340170c" }, + { 4244000, "fda09364f417628ec6adb8598f928ec0a24bf2d2acf380864f4d429bb17ce4cb" }, + { 4245000, "14dc30532bf704d54c0e8db5a653ac78f5e8663b22ec27c8850376573a2d526a" }, + { 4246000, "579dfb2feda15bfb5cd9b532e9067e9948b24869f0e3be8546fce2b0a46d05b9" }, + { 4247000, "fe1bc6b274fceaff2b0b00cc75934721558dd25ed551ae433ae726b96984f7fd" }, + { 4248000, "f3b6f06ec4b9ff7de6406c973145756af33efd153ff1660dd3e4c545ddd08db8" }, + { 4249000, "f07419facf03df70ef20ed25b7cb11b1c4c4b2a51ed3be639db6a0f9013d34d4" }, + { 4250000, "bcfaad50664b7f21172171fc994f90736a1ae1b8f7d8e04fa977411d7872517f" }, + { 4251000, "9cabefa3dc7682d0f7729e5a38c2e92b3d5c78b4857bf650ca66ede3c7c458da" }, + { 4252000, "d6a48d51c66901c6b7a76c830ceb0c36ab53bf2a54a315f42f90b6baabda1c64" }, + { 4253000, "7c2963ecc4078050a18d3b4e9041724314ff6544cdf201eac00203dbad2f93d2" }, + { 4254000, "d6e40a29a109b2b26ab2aef0285fdcd4a58a330d745a46baf548a03b2d425149" }, + { 4255000, "c40ccbb542e3b39c08facf43020707409d568910771e924c69a4a78fc4258809" }, + { 4256000, "eb4a57c81361bf74e5a53830fdf645cd196a4cbac1a3932a82a5d44a7dd24ae0" }, + { 4257000, "7f3e696ef04b2771a6a8e122f567bd3677d8944ee5bf3101f61c3091ae2d43d9" }, + { 4258000, "1f0970c31b63eed229617041e18d0886957cbe08a3c46267c1210006a8172bac" }, + { 4259000, "761be8b94058e66cf02025e5c6dc769a8a0fcb78cbdfe46dec858f3385f835a8" }, + { 4260000, "353e02ea0171f18f95e3d199e4bb078065030953c7c88911af4def7204c180de" }, + { 4261000, "65c0fd1eb2bc39d7f98eeaecde5f5e23fba777070ce8ba7877e9e3013448a626" }, + { 4262000, "98776b5361743e98b8fb06e9ab5ecea498bc342c838760697bb419b256e54760" }, + { 4263000, "ee7fa58c349c031bfc42035ea79c79e4c23286dc535909a2f1778ffcb7230f6f" }, + { 4264000, "3c746fc24cd983c66c82258e4cb290de6e154b59a63ff520653206752069f117" }, + { 4265000, "660f43a535f7eea35fbc888dbde37497d6b05f943943e3105156de7c9ee0ae7c" }, + { 4266000, "fd8860b928835c0f7058d8c240d45643321ce931285c5bbb7b500e8586115135" }, + { 4267000, "5c74155fa482379b7b121e9f777fb4f55240e50f81e4accc6ae126609aa27662" }, + { 4268000, "924dd1ea38babe16638fb560a067f4564706429e89ad980193c1b3a2bece7d77" }, + { 4269000, "d6ade52d9a4b9e51a0e850f1fd6c46b8cc9428b0fa4ca5a5176e682520e6fb43" }, + { 4270000, "f1451e2a3ac312478a5b9259839bc5ef37c9130e06313a6631438d2c9b574f1b" }, + { 4271000, "e66e6b5329a2bb8e54096c04e37259ac790f9e5672ee0af95402fdae05582416" }, + { 4272000, "710e14a12ecb76dac72b2e39baeb5c1ff797d236e3b6a05ecaa4e2a5ca03b360" }, + { 4273000, "b11dceb3f453e190b9b68fe314a9322de4931e78b9fffef0fd22a0e9d02c2faa" }, + { 4274000, "b08d7dd04d5f9dbc6a0260757c8adec05bf8653d7d21d1d9cfb2d8ff2bf7c4e8" }, + { 4275000, "f24d70c7d8a3b64e928eb6e2902be13fc690aa9da54b4c0d2807e5d46d182528" }, + { 4276000, "fc84e0a076da98742bbb1dafe5e762f211f9454199afc9501482cf5e8f69f248" }, + { 4277000, "d0d2689ae2eb81f05c5df830f518c9dce01ac83973d47ad5cc4733e626198646" }, + { 4278000, "c7127c73b83f1b443b550e5ffd47e837c398c32358ab0806f33a0b99eef4839f" }, + { 4279000, "8a7fb56f47cbe8bdc086f27e4d58a4f495fca8f743d2fe918ad1f7e48f407764" }, + { 4280000, "201d163556999bbb85a7a22917f2e3da973ea2fa0585bb400d41cf994583cecf" }, + { 4281000, "417eae61ec6b67adc7656dc93cac38778011b482013c1ff13782fafa3dc26f76" }, + { 4282000, "e9d5f2d617ff234dd9a01ae739b39dadaf1511d5039b9c60ba74023edc344fe6" }, + { 4283000, "4339365a0964c4f71f1b8d1b8ea861bdde24f95bb4f4b1b52171f0e8d65edd0a" }, + { 4284000, "df97900b5fb8683d7b115174402782715bf10768d91cd359e500b340eaba2477" }, + { 4285000, "edd47c892c6c38b1c7d8c6beee368cf1b7662eaf0a2208e9644a79c4b2c760fc" }, + { 4286000, "3255e68b2b55311f526dcb8d867cef88563d29a61900e0c92b9ae3e2d83a5961" }, + { 4287000, "6d548c9a9bba4eb222602d726430e5dfcbf370c3edc727718c72c0ef62884e2c" }, + { 4288000, "d9200f5cbeefa6307be65fcc678dbd9884dec7673f6eca0097b7cdbdd1e734f7" }, + { 4289000, "7e5e1129ddc20c98709b035a1f66389015ae2a6b4e77adbbb50abf5a9f932d00" }, + { 4290000, "63a8654aec6f2f051a19afc0b2a895cea5e8c5489b8c7c32cb8a0e95fc3739a6" }, + { 4291000, "fc39f324e6fddd7837427186dec6c3e44c8f5fa62dfb8c83db92e11118bb2605" }, + { 4292000, "0d627fdaa0a858d6c2899615055a9da454aad5dd8d6c059377b071e25780d00f" }, + { 4293000, "0c7c11d06c9aa5b472673741b2638d2cec09a1f07c209301606cf600a659bd6a" }, + { 4294000, "488b6c92b9ee0084e9a71fa1d308abe47395159d0abff498f503b81237d4bade" }, + { 4295000, "b47ba56f1a8e890127db4bbb6ff8aa761eb94e64ed829b584aeb0e310c84c6d1" }, + { 4296000, "59b11927cccea9cf31a170208ba7d74eedd3640324f149dd51ac7bb0afcc2bda" }, + { 4297000, "4a5e5be9acfc0a5d419df5236593ccdb1deff2b73c91d32947b7cf9a25cf701b" }, + { 4298000, "387360ebbe2bb88951a7adb0bb4bff29315aee192c0bfc0c5e107f307bff1b22" }, + { 4299000, "25622d45366fbe7e6b3450d830683ae601b9afd8ceb61a3d0e75f939db884a75" }, + { 4300000, "47c6705dfa8e9c33fdda3f60a58f700d2f0c236e3c6efc782f13b8025898f3a1" }, + { 4301000, "19370da50008935109058d13f89d37dc352db5ae127b447cd820707e5c016b55" }, + { 4302000, "842a2fb3076d93d24b7b5f7e972a8c4c065a8ad3fe71a11f6c58587177c5e7f8" }, + { 4303000, "3054b180e56a7a6eccdefd2dafd4c5a52d5125ceed13a91227c75ffc113b4342" }, + { 4304000, "99318940471ecbea92ac5a480e5e8dbae9f83fbbd33a834aad8dfff6ef30fb9a" }, + { 4305000, "4d6c97df147fa99533cceb5bbaaec747da1c66f69d4f44cc65cc41e8d592b44f" }, + { 4306000, "02fa580ec46803d019149c81a7bebda77e0ad9c108c15e470a02ff824ef0584c" }, + { 4307000, "59b05bcd0ed9101d395bc7ae6f6c4e6976b79ecf24ca912fd6baf1bffdf6502f" }, + { 4308000, "d1045d0f1ef45cf585eb97bffe9e492dd6db159920b2b572822064b934779e87" }, + { 4309000, "54368dd18ecf63839a82815b66f83dd9ff23e6ad6e4a69f12e09a9d2f7126dcf" }, + { 4310000, "211bfce06ca5c28c67c7ba6c630c976cfaf7a16a0d8f804c92acb5035c44563e" }, + { 4311000, "e3c7e3e36252eb89679b4a1e2a181440f6206d8f7ec8363db48b28e99b984a8b" }, + { 4312000, "c5a298c24b4531f923d1e78973f23df1c216b7c53a1ee7799fcfa69fe035eb10" }, + { 4313000, "f448b0cde176c7be7f60500ef5f0265381c45e8101cff06807a53fe4adf81f62" }, + { 4314000, "b9e4fc5b885c1acf75422b9534839f096f5cd191bd0b62229dd4469e9104314d" }, + { 4315000, "5dd1d6f760582425ed444bf858536ad0bca5afa6b69639ead22c5b6a690bc8ef" }, + { 4316000, "3dcf08d64fb2cbe0c94cdbde0221f11923ca31beecd1c3277a6ad16c7bbf11e9" }, + { 4317000, "323953e53b457ffaaa0e05a044cde66cf653e52de6691ab9564c9d6836e450d9" }, + { 4318000, "c33c953ad44a3acc504a9295f216cbfab0d6af8d05e1974f3d082f90d004070f" }, + { 4319000, "0ba12387401132715cf7721da0e237cb9304d4126d486f0f1877ed908630e2c4" }, + { 4320000, "c95991fc6db7f0c08fa6dd8decfb59eeec25f5f3e9ded5adb76e4137855d3774" }, + { 4321000, "93c881a4441c786e489e68d7bb51902e37d7136f2377a0a1a8b737f35a16c4ff" }, + { 4322000, "4b23e0ebb3735ce28b75b4cc0875868d8c8fd71c038c13d1afa79fb22f43bf73" }, + { 4323000, "3357c6feaf1ad3a95dd38c145315bc436af1c19427036744989f542986f226ae" }, + { 4324000, "848e969a9dbaf26f629ecb08a518a994ddbabaeddb3dd5190e1d36889a45db9c" }, + { 4325000, "61dd9f61aff4009fd0048a6120296bdddd300fe24f7293b42fc7883bd24a4baf" }, + { 4326000, "ade971f5b1aea82faba624b6bf0c13396bb16c4a0062b709d8e761bbbe9f2700" }, + { 4327000, "c07b704735df0208b23ecc494de83a268ee30549aab6b52e973a753d1c7f39a6" }, + { 4328000, "ba5efb17f360943de6d57b9979d190ea79e46ce4c603fa2c019ca94e8295144b" }, + { 4329000, "e63c3ed1cfd2778a786b1e926da517ef0dc1a26c69a67a9752f104d576cfdf7c" }, + { 4330000, "63d0d9152dd7ef23a035a87817089ab59453d5ca9a69e9b1eb3f33db66bb92cb" }, + { 4331000, "a3b10dc32072f67fc6d70985e74fb5952024fd9edd864ace97d161e9409c9002" }, + { 4332000, "f045084fa4507d49ba06cc60e369f907acae067e60edc20d00d4df90f99d423e" }, + { 4333000, "bfa53a2e93a20c00edf4e001cab7476900dc9f7f6d42baae111e9125f334c1fd" }, + { 4334000, "306804d5bdcfc9fb91007bb726ec5ce281d2df050fe9e1c35f3f321649d416aa" }, + { 4335000, "5f3c499e02a7933ab69abde8cb6ec8b6d8a575c1143386992636377a4614e847" }, + { 4336000, "d16723213066b436e1e869a466a48155c3dadd133a8a3f043dfb92e9eda67b76" }, + { 4337000, "421da8252300e173aa4c0b32185b99b689b43b26785b324072093d0073251768" }, + { 4338000, "101967ab0fe3a3162371bc4ae64400662e4a061342290e0a0b7fa0a60626009e" }, + { 4339000, "3f1cb644cfac73a417be6eaee7e3ac588f4fa1f96720afba67899c10a37a7319" }, + { 4340000, "4161852ee63ee06dcdb4643d4cfe2ac8d0e8c326392c05c1bf2853bddea5aba0" }, + { 4341000, "66d34aa651b80e56a72fb1a3082f4cedab3a120dd453707a96d1ee7e807f76c8" }, + { 4342000, "002fbf79999bef8ac891e5fc2dc710864d0402fc1a5f9646e5c9d88963d86b06" }, + { 4343000, "550fb98086ae6b104277847719198681d5785f1212448602493cc9913584c043" }, + { 4344000, "252dc940dcabca708867e8eff7c2081bab851d3e4d5576cce51f6f2b6c975194" }, + { 4345000, "3ab1521c381da218e0c73d70b28439120ff80a5f7684678168debfa65fb20bc9" }, + { 4346000, "31401e4962db54b47a0c54888cbfd284353919c3c215e65ebc6abdbd388feae0" }, + { 4347000, "56904c84940f2ebcddb799726d8aa74b98b3bc5ea85889fe1f5c0dc9fd046715" }, + { 4348000, "0b75659bee407981a5b012d923a0cd0889d478e34cab2e90cf0e90938558c8ed" }, + { 4349000, "53284bce729412a7e72b392c3de47245e385dc9caf0b021d2d8ab7c7a8603108" }, + { 4350000, "129ab749090d01b65e29cb309ee97ae59e3495770e2428bb7e4ba42911a8ee90" }, + { 4351000, "92de42eeeee40d653985ff2f9d13616e8d2b75101b117f3eb20f7a1d3419f53d" }, + { 4352000, "f3f800a8b20f1c82b85c5c0b3be71021a46da34efdfbb0f829c098598a9e681b" }, + { 4353000, "961a80cce115fd42467a2a21a213fec1f4ee19589981043ef7d7c75202f0d10f" }, + { 4354000, "f9c67b4f6078a6594ab5090ee1f3b53e4e972d3949911d26eeec7db21d5ba1d8" }, + { 4355000, "2946391059526da8870d9f42b234dbb66fce213bf530a50724312d1893a5b951" }, + { 4356000, "21a8d6b7ada3fba2c22ca58ef8cf1590a5f4709144c33fa3c9a089f593a42ef1" }, + { 4357000, "9a3cb6281c282972d8d845ecceb6ca55a3a4a292d66e1b7adab283bb06f17227" }, + { 4358000, "39a4ef3ea935dd36c35625cece562dd79d74aced1e46748f1676afae95feb338" }, + { 4359000, "f003f8e2c74706feac35a14c8a67af2af941caea402fd4e7b0e8e83b41f68e67" }, + { 4360000, "ea02b02730b8a8c4cd13ca1d127ed70e38f2e5d3692d40e711a30fe76cf5699f" }, + { 4361000, "c86bf73360295e81a13346fce411ffba4dc323d3be426c87b501dd9f420f13e8" }, + { 4362000, "2eacbc20b28f1e8186aabc44134a39672478b71a53edd5c14ed46ec28affcdba" }, + { 4363000, "3c4ffc25a79f2672a8fe9545a7ace8cc37c3c379a68c08d1e1007983dc5ffb5d" }, + { 4364000, "5b26f472519688e5dab42e09ff4cd5471fd5ffc35c6aaee0fca64ca6f101a93c" }, + { 4365000, "f7a1bcc4befe45ccf209bc9c77592903800fd554f4b25798cb52664a4017f17a" }, + { 4366000, "a9543afc33ef0dbf16005716154e54f38242a88ba3e51e790248dd8d5faaa5eb" }, + { 4367000, "31e3ff777ec288866a91095014dd4e65cd9eeb75345ee04b35c5e5a6913f75b7" }, + { 4368000, "59958410a97cae54754d32361ea24b2c79bdda9408f01cdfa17d873daa8c015c" }, + { 4369000, "5fe1f68cae8b6614f4fd79a6ac98a142a8a8f66795886fd734350e6202fb5477" }, + { 4370000, "a64647ab32013ea7122c78c44c9bc83a931fc07db84fad9f2ffba978af1ec23e" }, + { 4371000, "c80070fecbc7b35237d412c6baa0a00d884a9cf7414c84d221f14c54be8dae12" }, + { 4372000, "7b95a1585d3a71325a0b937b9ad419d9c7a5cdcc4973d0254040a8f4903acf77" }, + { 4373000, "b8c91bd094bd294137c5f2e7017db212aee2c508236ccbc11e4c6c40415af3b4" }, + { 4374000, "7cef69c8ece32e9afbb68f15fb5d63f257e1e2da39ac19cda48dceb53d4256b4" }, + { 4375000, "1c102f6ced5576bdc5dd895b36cf82a18827d0f8613034250257fea3e3db3ef1" }, + { 4376000, "495d95ae5b36c0b1c8c0394ea4d1154e67d9dd9b2797a004cf54d96a772bcbad" }, + { 4377000, "23b70819e9d977b8fd44013c6f875c4e33c3abbe13fb6ec0cf1a10ea82590c5a" }, + { 4378000, "aef3b049b6910bca51d82c5934710082c1563d5f57c62d953c6c6debbcc7427d" }, + { 4379000, "d61204ba36133636c0716e1fc7ec2c66ed1c0859f3cae02701300fc47eb7142f" }, + { 4380000, "efcad025203d032aae22ce666755bf9c58afe49ea6b524aa1f5083bcaa09e8b9" }, + { 4381000, "9c9434dea093bfdf5d71ed7efebd1af35f313f94fe74069b19147aa2102bfca4" }, + { 4382000, "99d173e1b0df49abf8a45c342b1899b0ce25bca1a5ab067ecb74ef2c6c4b7ad9" }, + { 4383000, "1666fbebc5276a17bcf2dfd63799fe85e432b6b3ee6005dea39f21584784e967" }, + { 4384000, "773fa9f7ac0eb988b47cfc8db9d552cd1b7608c97dfb674143b9c1bfcbaf7f0c" }, + { 4385000, "6ce63bb58f6749712648a081d09f80c18ee3458963c3cc5c77806275f79e2af1" }, + { 4386000, "65b06c3162f2043ca3c2fe5861b958b124820d956478e75f3313d5768e76cce8" }, + { 4387000, "037e4d309ba1e3f3eb565ee73018b9b973c71b594f7a774913edf897d89dbe9d" }, + { 4388000, "65776041c392d1931b45f2a9527fbb4697440b59a5c06632b9b69fcf4aefba8b" }, + { 4389000, "319a76cd0888ae7aaa8dfb3e4852ff0fdd8d2282482b27d84cce9c9dc15f5bc5" }, + { 4390000, "2e691848272e63418bd54b20ea3a2c319e6cd7f9741129947378f1f6ac11e06f" }, + { 4391000, "b681b8ab393cb09d8ba3caf14d099c210c04d68bc6bf26f043dfeed32f8b871e" }, + { 4392000, "183f6990e3b2fa3df39296b12be93d5fad0d69cf2a39b80d9fd9ba0d38f2ceb5" }, + { 4393000, "ca32cda3d182db5015214af3de297f6bd2b4c329d84ea5cf42deb920b0c8d811" }, + { 4394000, "cc93370b9289e3090e08739b4e1926544bd7ae094ff654b653ba61a30b17d960" }, + { 4395000, "548794d8d53fcd0e7d2925af139a8767dce98ec7448e1105eed9100ee2782001" }, + { 4396000, "619346d3466f3728e38f94e339c511787c632f8a51e9d2da83fa0c5a80a04d7c" }, + { 4397000, "fdae13252bb5c94ec002b20b563d649ed13c05d0fc4f2b6bbe450120c5a2706a" }, + { 4398000, "52e87238d48e237a90b83dad561148bcfc1da0f42375bccc46777e8772558358" }, + { 4399000, "3cbc07a304c22d138315bbab51e3e9df8c62e59adde8a039d16b48e999d60924" }, + { 4400000, "c0ebbb2ad500cb8836738c95bf16f1cb33a4337d618af9f7c521b0a1fd26dd6d" }, + { 4401000, "7faaba03fa03addbd374a8320ed896c64bba3de87f96be23fbc5f78dc07122d5" }, + { 4402000, "5bd2f314e9d9ba78326f23c339fa0a8a5e915f0460c0189bc1bd5b87318fddb8" }, + { 4403000, "da4b042a58f316bc98323e15adb6e8a797b17205f3ecf74d024a3d04e800a3d0" }, + { 4404000, "03a274ee3244426918413912c514efba967241ed91f1c7b5857c0146f5874fcc" }, + { 4405000, "2404a4b810bfa58f7af1fa24f86839b550aa11d3c2bbc034692aff5e49783fd0" }, + { 4406000, "d87bb7adb05d16deeb05d544a4f68c645b7222b1d3f0ea88ead58cdfeef86e29" }, + { 4407000, "38c6f953157d17c50677bd80960ac9d8806603d5e3070729ae5bed043c2c4a20" }, + { 4408000, "5bafa175ffe57a08cefe93bfb33014b65ba96f76f9d7b523e2d3d00560117c69" }, + { 4409000, "e2da8d2d6f4987253ef5f84779e253a0bf9efed96af034932685cbc0f594efa8" }, + { 4410000, "89fab313d7bd856bc066d7bd4c05d94e2bb85ce25b96c6c0ab810abe64210dfa" }, + { 4411000, "e5c27c33090af953e40be9b0c19d61ac76c803b2e569f68fd3e673a917613d6d" }, + { 4412000, "c69834c6e460b93ef48db1f52314528b934fbcf01c79525263480302998e8d0d" }, + { 4413000, "5f4d71bcbaaef3b989d7128875fe6566e3a02c4a0e4b761a27e17c5b3e6138b0" }, + { 4414000, "2680421845547ed853521d8a9bb93fd02ff6558980c7d15d901cdf605f91e802" }, + { 4415000, "e82b92f07937c1139e97ee349096665e474093764e877c88b44f8c959f3628b6" }, + { 4416000, "c7ece07c8ecdf48bd790f4fe07d33b2899e7515aba4501e2772d0f82f136ae2a" }, + { 4417000, "10effd96d37c8e77e1c2b27276d72853a143bdb0fa263794a028c02915883f31" }, + { 4418000, "2f1cd618e4ffdb446288640523e02b0cdaa7644c317a8a9e7d5b5bbefe910b2a" }, + { 4419000, "1bc4049ef712e4c021c73765c64a0772efac5632f75323db0d153dc98e84f598" }, + { 4420000, "ff9870875a872d43bb99d3899fee32043ea4516ec4444bd4d74731402c72d1ec" }, + { 4421000, "ca5d17c25ca36b6cf5991cde201b2c4bd0c729b1d44f10a98676d7010f528e11" }, + { 4422000, "d9feab1e9dfd6f881e54771bade43a83414888b1221243936191a54277d1e600" }, + { 4423000, "c8a6aeac9637d9d239b42468491ca41742faef28f61156f33106baa14d73a029" }, + { 4424000, "1d53de21ed4d75037f61d40e3f5053c75a90701f277519247bf1842992d27882" }, + { 4425000, "20e86dc2ac9a4a83f3205baa365f5ce5a6a66e0e6edac15958c8208d4d7b20f1" }, + { 4426000, "4cd731136ab3d46bdba8d8c341dc422ef0164f7387ee4bf2b50440fad1ba4d8e" }, + { 4427000, "9e7fea95bc8ea16fea05913ef35cb8246d28830feecd559987334ea3632f762b" }, + { 4428000, "696a822801a215f3c27ecb33e381444d992b50ce1b9575ea80bf6dbd014f3e1c" }, + { 4429000, "d0d50bd8c9b756a0c3a3dfae5c41bf61a54c99d5e767c70e23bed0278cf54ff3" }, + { 4430000, "037db9a2ba112c15faef671568360be704d6ee625eef345490816eb7ad699681" }, + { 4431000, "dd4a70f167088a6717a384b0485e9a29e7ed4eab01c6140201cebb187e6dd941" }, + { 4432000, "11f6c2d1f3c1cb0f881d24c80e0ffa495ad52cb229d601d2016e91593ec31a5e" }, + { 4433000, "3fa4060edfe911e7db2676219ac475cf3ec958d2234ab5ebd88371694b90da92" }, + { 4434000, "9a25dc4a0d487fcf46c80d3553e89f3f94e2b098fbd3b3b87dbd779cc7b691e3" }, + { 4435000, "b92e68afd6e9069efd1949f89ac2375c1658501f8914d05b2035359dbb04f4a9" }, + { 4436000, "82e5f9efc9d5a9252a902e797271a81f1491c13d87e72a9844d48fc4b71a73b3" }, + { 4437000, "e08b33e84f7ece51aa3a402705bf2a6df30c4336c0860757cc81fba9b2affb6b" }, + { 4438000, "8108f8a0b545f35dd66b608f72c5aa52107ad9b66fded4f60d18b91fc9873542" }, + { 4439000, "f3ad12fb1e2a20d0a724648331a7fedd809fb0fa6fb63b8f7c088d8bbbee66df" }, + { 4440000, "290df1394ff337b48b73b4a1ce61a16451ecf1fa04209699cd29051c4a5937bf" }, + { 4441000, "275d936b9dfad07a5fd37ffa6fd96bf9c21a78bea3d2dba95ce41093243f3bcb" }, + { 4442000, "2ed5b5a127b48f1a7d190f7885e291c3f96ec9c9d1473913c243fbe909afa975" }, + { 4443000, "2c129c0de31108d58fd1999ea2f7ee2b47be0e174c94004ecee4da35e2b21d51" }, + { 4444000, "05c3ad8f68b1e6c6c9dd732d300265d29250b0d4722d140a3452cae53c26d0d9" }, + { 4445000, "20952d1a2f8728113f2846dd70a0562db8274cb945cc2107b8e247609712021e" }, + { 4446000, "97c8cb99aed41dde4f13eb3cb2a816524b7d8d32d4dee3cca13f211a2cb69b03" }, + { 4447000, "03c5999e603a7a4751719a45226313b2e2f8e705b1da29216873d71587e465e6" }, + { 4448000, "efaf5449d1307a18d700707df2693bd793ae8344582930c8a5aa34c12ed71bf7" }, + { 4449000, "7cd602c0294ce9b16b0a13a69c7567143fefbea0740c09e099b562c391d582f1" }, + { 4450000, "02e1df308d95fb26769bc35dc001789759db598de961b2aeb7598130f302fcbc" }, + { 4451000, "e30d57b0922c8dbf36152b46f3008235ade289973bd5dc73b151a2507deb555a" }, + { 4452000, "ae2f8a21930a7d039f90e92838616692e76be3966bd99049e68af165b3867026" }, + { 4453000, "e59b68e3d1ee22241190de532d2f94deeec9190522614b44358fe0dc4620a58d" }, + { 4454000, "79d5c45f954545b8038f8b7f66d37a7ff72194a6a0d066d8c2555a87b9ba54b4" }, + { 4455000, "dde1712fb15f1739712e0a7a914cfb7d4b6e9efd012e76bd0bda08c6c21b1721" }, + { 4456000, "b15d29b6f020c251254401d0ad87e5eb9befa4f7c0930d1aa38973086ad9024a" }, + { 4457000, "d36fec3530156471a87dda178926b46646e496db72b450f3d4b77d0900a30ed7" }, + { 4458000, "bf8811cf1fd10b82816c1de41fba2bea7fc628daa209daca24260613c89acca1" }, + { 4459000, "230e308bd66ff0952f6a19a70656ebf7203c6eb1a01826ff8dd86ad46877c380" }, + { 4460000, "555b46a6d6f0bdac5f7b82a99c0c239a3e89194ed17421aa28a571bf0f21f78e" }, + { 4461000, "f88decae743846c9f30fff047f674a2e54c0f90526215108657518f198748f0f" }, + { 4462000, "9b1d9c0ac3f0709e858e6ce034841a852fd9f1d02c4854309cf92b54795fcd92" }, + { 4463000, "7701931cf906a9bd4c26d857011117177c38530ef2d8366069b06c557583939a" }, + { 4464000, "b7b7221e838bbb1144fba71a761ff5d73d377bab63687605a7e7f481bbcc04e0" }, + { 4465000, "2d6a574e830898984bc4c8734e7cb5b83b75c222885c7e8176a6f9992e11e634" }, + { 4466000, "46196f16c655ec3e1c3a219f2f4e82ba31f200cb4aa775eb4f1dc27df5c8d4ca" }, + { 4467000, "2bd60d9fcf7676ac948df613b6ac53448dabac1c5a3e3fd54ae39612510b9778" }, + { 4468000, "1987298019a538b8e7abefa2b511c0b2c3891200d1bdef376e9020d91422254e" }, + { 4469000, "690669c008067d63fef666bd9da1823727feded06a17dec81e4b86968ff4c817" }, + { 4470000, "881a20bd4d246f6266871bf4ff765cc8d7b1ff70f0708e0c2b793b370d42fb56" }, + { 4471000, "be3e1437ac0e7298ed118925c7e9fcc735ed49b8675ecb7ebd27082b90e280ed" }, + { 4472000, "f0f1df0c3ee0f8f91d87d143c7b71934fb32c0372af0a8121d8acdf14f31425a" }, + { 4473000, "43b142649b311e559de1a515d2c9b6b594ffbbb37ca468f1f50d1dda1120476e" }, + { 4474000, "5d6e85ce4cf56e2a16d12e0c7f6453425a492658741c21ba6a99438ff84e29f5" }, + { 4475000, "0926a14c8e9cfb6f5f5cce664f9237f17899ea552ce88acefbe1359132d3cff9" }, + { 4476000, "dd99f5e8fe13d06c94af1150543d72333cd29773680fdc8e9a08705a3aaa19d0" }, + { 4477000, "6d21440c48f6a45bdb83d717835d0f32866f86954d8cd8db267418b5cf298319" }, + { 4478000, "950288d08ed534c3114d2b6f30f864ba18ae8395fa8ba17f9a7e6c72d63ec0e2" }, + { 4479000, "aee13617570fbd6fb75deef5192fa437059f553d98cdb69b7ec9fcd640bf40b7" }, + { 4480000, "3807dbda19b64a20c010b9309bcffc63809c4f23ba29ffe8582978943fea2d5d" }, + { 4481000, "eabda002034aa49864221ae3c023c51e0d7b19efd93ee69e467dacbb8e86d16f" }, + { 4482000, "faf8f1db8c5a41724e5bb470d7a20ce6bd0ed42de4097837701ada28a93cc36f" }, + { 4483000, "89c8cfdd64c05e8a91c5b3325bba548e860281041d400aadf41e17e46b9d3f76" }, + { 4484000, "b62fb62acf3fab1d576d8f45bdc8c490d8f26a8e115427d922f1acbf8ad11907" }, + { 4485000, "d4aa2e5d00271c0aeb02c2b52c0e379e21c2005823127e0f9ba1b1ec59115f7b" }, + { 4486000, "3b8108a904a52ae85739cbb653bcbb189622e935992ae0460a0d810ecb4efedf" }, + { 4487000, "0c5d011e4d77fa31d5d5c2f879fa08bf1e3c79aa51140e3550f70202f0fd1362" }, + { 4488000, "1a55136c2e4a070b20a922ec86c5350c52cda6c36f482ac38987e8c0084c921a" }, + { 4489000, "71608b77208cba5d19e2787984a2ad73f37b15cddb4647d26f73e1a398189dbc" }, + { 4490000, "b6f9a1ac0495195b4d98b7b9d8b8f3de8a5bef00e37db6b723ad9c19bd07ebc7" }, + { 4491000, "a980d97487dee899aea2ef084125e51af3d55b3e7a31cdc153ee15ee44e3a968" }, + { 4492000, "6ea15a599ad11e0e3eec4d2feb088a3de9a58ad98f483e123d409261f8e56881" }, + { 4493000, "66ed0a9b2ea31f76b39a4b473b7ada1a904c6ffc7498734a07c06da4a14bd818" }, + { 4494000, "4b9124d49edb0ce00cbf678c8157cc90dcd5dc5c03764b6bf8f6b17ec6dda3f1" }, + { 4495000, "03f04c787af7e1b7081b8d7e5bd2513ec3fe143cc3d5e34a211e22e04c50ea2f" }, + { 4496000, "db1020cb62da6b3f8a1ebd680653b286a957e1a4bc45108628fb321ad7a79eb5" }, + { 4497000, "17fa3a58862bd6100b2c2bf7928b37814504724d633962327e63573613b977fd" }, + { 4498000, "913783e7999ebe760ec7e77f45f5cad1370e389d5302161a3988a2efa9efcfc2" }, + { 4499000, "4324d7164c71eea278c2bc67faedf6f517446632955880d1d52241c4116e9695" }, + { 4500000, "2d4115e7d6dd542b986ba7ca91a3c2bb34fda1248e4a28a3dbc6676ce680c34f" }, + { 4501000, "bf26e5d94d61229dfc541c05a586ad0841eb8b232b777202fa8712e5936f4864" }, + { 4502000, "491627e5c2991417bbb078bc70da63666fb017a199ac26cd72c25e2c5f6439f8" }, + { 4503000, "b8a308e7cd75fb71182ed504f07ecfe37d649aaca09eef6f3add99e44e04089c" }, + { 4504000, "6a9e14d9dada402ea7b00f56dd2f22cbd95aacfde5283a2580a52cbe621be363" }, + { 4505000, "558266e45d2ca4c90002cf90188adeecfa390c64e03a3bb5de0fe49113286f54" }, + { 4506000, "09f7e6097b00b2925be201b39c972e3a6b56df227c109a6e59c7fd90421e2254" }, + { 4507000, "6a068f646446d31359282679636c6aa77c5eb9bc9ec2db3ddeabea960a61b442" }, + { 4508000, "795d04894152c2ed73480e7576369da83e2aecf3c19e5ef98d988def997d7f95" }, + { 4509000, "04ddd44135e6399ff55203e04f5c8011ebfe86d1ae9a7f160183eb757370858a" }, + { 4510000, "a62bbdda49766ac0c4c6611aad2dfadd8ea6b735f0bcc537562da44ca8f42c9d" }, + { 4511000, "f857050400297cb754288c16c4126d8337bd5bf35e15c06d2550773f8a04fcc2" }, + { 4512000, "643923996630963daad6af075aef7bb1c703bc6af78badf8fd2a69bcce5c2702" }, + { 4513000, "01210df1fa119130aef59de254ed51d3a9af1963b156931e6c515fe3aae56937" }, + { 4514000, "fa258ed1c3b984f025542f15c341ae8d649cfa9823721169c5a70a7cdcea0e5f" }, + { 4515000, "10b1181cc86dc7e226a7f913ef018c8b2ebe37899cec37dbe78bf9b02e2d833c" }, + { 4516000, "4e7615b5b8f03417d9e880a9dbbd547e8d0cce1e463fe9b05ed3a63de04107a1" }, + { 4517000, "088396833c4bde8729a6dbc8636652ec949a694f30ec88f55fba056a5395a32d" }, + { 4518000, "53633bd93e1a829b29ccd3155240173127d33f94b9660cf813f3b58c8e66ede6" }, + { 4519000, "fa94871d8ea09163ef0a32dce2e586fb19b6f18dbc71c6470643573d8eb170be" }, + { 4520000, "155e25d2674480674e983c9e46183928f1958a9b26ee1afb49fccbbabc55adbc" }, + { 4521000, "1985173a57b4627c57b7ffa8f2a89d7c060961765ddfc48ed2ff669b933ac9f5" }, + { 4522000, "b0ec6967fc8ec537e7034e52d4272187e964cb7416922c646f8c94ac5d3dc368" }, + { 4523000, "cf2dc108b1b1d5cda4a2056a27f36145ed493955f4e91cd7bed05658556768a6" }, + { 4524000, "d30c359094e13792c4db117f77d861f8afbc5cd348da68caa235d68c310dffcf" }, + { 4525000, "44884184156a85576289bc10c1de4dc8ee0d35e032f6b61c7e15593a88e5f28f" }, + { 4526000, "acaf58df03cd3b896a39ee873da7965787ae49166451f8c22b1f3500f6169423" }, + { 4527000, "a97dbf63288c2ae909e9f0daf702880c117ccc02eba248fed89598b4591de117" }, + { 4528000, "2e218fe99c57320574f8384aab69cc2f14c6afbf5a77e8e0af3703839b9bfd9e" }, + { 4529000, "b551415cbe4c4961ee0c172a11cb40004045787b64ddafd6effc085503062534" }, + { 4530000, "2cebef80fba24e00953bafbca8468ba62632df607c4610a3bca045b75cdd4839" }, + { 4531000, "643433bb116571bfb9ae1e9d6c39b72466379839fc9e588dbddad412e88219ba" }, + { 4532000, "124cc674777a2517aa6eff4e37ccb37c673ac8309ac472607d5d47d8c2f0672f" }, + { 4533000, "990ae92dffc1b9b5cc290dcb3cba4267485b28c8f437dc8e8b66f9bac71b50c1" }, + { 4534000, "f3699beb1cf4c583628cccb5fdeaf72fc3208ba0f970adf242af4afdae73eb0e" }, + { 4535000, "62df684214fc5461a631c2744eb5d43f81808719eb7c9c780f63480a8ea5cbc9" }, + { 4536000, "6d78fc1c8a13a9bc4a02cc62db1be5467f713e46a332014e556a419c4e46d8c0" }, + { 4537000, "144083e855f4e9b1acc433fa76e43578f826177ea68ec91cb9567c7bf034a7bd" }, + { 4538000, "ca98574197164a2e01b264c1f4649ca28303255d7aa31c67123d6cadc497e9d7" }, + { 4539000, "6bec417022853c4f57e40f44c7dfcf1e57b463765577953256664026ef917b0e" }, + { 4540000, "0189fee717502aa049348b4d79ca7128b1f1c4297870f8f8f5da11d45972d0ed" }, + { 4541000, "250f15ac209b094d2e0b6cc6004628eb7a2b25fba0807f367426409a5a826ca6" }, + { 4542000, "9d78e29990bab546867998bb3f9b27f794dae9cad7b2b1bc0f55479958bb9859" }, + { 4543000, "07a560757a37260ffdca277fe7140f000a1771b342e46b2f7f5a4685ee6fb03b" }, + { 4544000, "a1d51243562db785d43e5fe620bf6dc222f7389e3b1d3bc0296d66c62eea1123" }, + { 4545000, "efa0de866b8677f2c1e714e7c5bd23c929c396cb99b7373c3c98de3c9aee45b5" }, + { 4546000, "ee80c57076e5a647d02d91bd09ac4cfee1155261c177717613b301168b3273a6" }, + { 4547000, "657dad1b0ca2f9e709c0c1966518aa15c1fed0e088b7a195d2af9ea866e05384" }, + { 4548000, "3ba096cf7713e6863c295d41d5e4419400ebaff6bd9fc2519402aa31135707b4" }, + { 4549000, "224f509b791b728eb0cbc0b02055a8702eacb69e8ddd5358e18d8a7a87771553" }, + { 4550000, "a7e0648038fa299b413a3ff39511a947016ca647d764628c5f7946649b36f66b" }, + { 4551000, "040d0820a33431a86c9e87019b0bd5e45f64c0e9fe910fe587692bf8f4e7810e" }, + { 4552000, "18af95e1fc8dc69f0222b70517a06fc47c96ada51121be16b9e1925f66a07393" }, + { 4553000, "0fe44bbe6d9485a689bb748cd8c379be87d7423cfef264070aeb2daf12d466db" }, + { 4554000, "3a5dff91d6ce53608a1880fd55f066082d4eee8ce255475895dcd239ed1fc604" }, + { 4555000, "18ed7ee45b9b3fa01262fc3b8b4c31acb20ead813378fd024280c16e26f7e940" }, + { 4556000, "c1f682058ba625a7f5d81f12eb4925887e9774f74076698cae736c4f88d7229a" }, + { 4557000, "357b34747ac51c2bd05982b50d267c74d7d91f5c7d87ddcc9d61872cb81cf4f3" }, + { 4558000, "89ea7be1028ec5008f5de95b39648558e0c1d1fd94f352e5714e1ac86db06f21" }, + { 4559000, "c54483834a7a4da1433cf7c8eaa270298c404f7e4cb574ef40a169cbf549eb84" }, + { 4560000, "d5e6ab7f5697e869c91267f6ef98a1f1ec657236345866467c92e8ca671b9f05" }, + { 4561000, "6bb54f307271d978c421e7eaafbe058d13491f56c09b8a3f6dcf9080978c2ee2" }, + { 4562000, "24115c004b2c74b09a6173029c28328025b0842f0fbade238d7edeba098a06c9" }, + { 4563000, "149d3dcb5e04dda58eec73590c9fc9a6639fe3d578f47c7b14c74a92865db3f5" }, + { 4564000, "4101d46154e1f1f258ae263683588e89277171fa619a74a783b20fadd059cbb4" }, + { 4565000, "07599cc70aa9c71c62e07a3a2346498eaf267ca4ba8c9b0b3fdf8736e5d09220" }, + { 4566000, "eccbea64b705579a9c2e6c1092b81a6e9fce1a80931f1791ad872072d0ad126f" }, + { 4567000, "6dbc0e45b0bd572b15dec2ea757dcef5094cc6e297a6f1da390f95f913714b48" }, + { 4568000, "4f7f3c18155e042725501ca4df5e73aa07402e463d8b48888ec6e886bdefbeaf" }, + { 4569000, "1082aa44f4fce8c5b155b4950f445983d455c291ea05ace5b753d361411a11bb" }, + { 4570000, "46cfdf36586b7cd50b2dfb8dd69dc550bb6a9d53bf1d7dfd06d76504dddc81be" }, + { 4571000, "5276e14d62904678b4f3d34d3a868610f79a370a4b45680b9cacb2eef718964e" }, + { 4572000, "6ab6e20bdb1738b970d4b238c5cbffdf5603187c4d3feba325b116748da2607b" }, + { 4573000, "28ae605ad36745410769bef6b6ff4b9752854719160fcc9ccb50660a6708a9c5" }, + { 4574000, "a497e0afb2c6d29f603981f754be70dcd999b9c21d26a165e08fdd7cadd8aed4" }, + { 4575000, "42faf5d3de236d3ef3666fdc961c2b060b2c2a59e34fdb1c7434ee44eaa20279" }, + { 4576000, "bf94262c437d0d918b510555c3de31ed456fbc11254ee1abd436e0e81c8cfd80" }, + { 4577000, "c6b8fb2a74eb959dbdf42ee87ba5111eab67baa850855450f8abaa3994a6db11" }, + { 4578000, "2df42e59f31ee1dae9510cb0d4e00d3df48ee22faadeb83bca84854604c12362" }, + { 4579000, "6aab92d2beb6a15ebf72400e64631c811efffcdcb7d2a9d1fa8fdd03eb7140ef" }, + { 4580000, "9883964f86dc19b8b9f78d28b58e0d3438c7fc890ea501ff7aafcfaa978911d4" }, + { 4581000, "edeed95f80a6519a2db7e10b8ac94c8a8dde15f0f44ef2f8370cf82f5ba21dfb" }, + { 4582000, "d422e64a7ec7a748cac7f27f8511e28667ac818a3601d14f6cb9e3c96164f6eb" }, + { 4583000, "522817fa32cca3957fbaacff4377c869b47658a6d49e873987a1e30aeaa6d515" }, + { 4584000, "e6210941e451f8a5ec12ff91e5d23ce2a053e778e11af286849d456c5f0e442e" }, + { 4585000, "4de596157d92cf01e4ec8de7ecf31af9a6a41d82e3e7c7b299d7e453f3687b9f" }, + { 4586000, "3654705c0abe608e5172cc8987efe8ebb87783e7bdb90272f789a8af80366444" }, + { 4587000, "884b3d40e8a5f0919010c5970b8e8104f890068d1950f438138c2bf2b888f608" }, + { 4588000, "494aad51014e533f3ccc31cd0e7283a27fa0642260d3859db65044425a4af10e" }, + { 4589000, "84b6677aeb31d97a0cc8a0930a048e607a698ec6741ee45b5d11178f1d12ae91" }, + { 4590000, "a8ee17f655ce5cfd7e8b8e99be3bbf8957e62a5325922fc517e391882ce06152" }, + { 4591000, "c78f6d1f381105203bca79a65f176b6e42a897fabe8012b830b6327d6d1fbc24" }, + { 4592000, "b7a4c138c871525384371e37a4a3b0ba2864a6523d5c8412784a040107f799cc" }, + { 4593000, "477fe0ec04aee0e93934a2df3528d116f3f99f0b0521823ebdad2c22be9aecf2" }, + { 4594000, "325c1fb6eb32086402318c0a5e56246e28cca680ee862add64d74388daf12a3e" }, + { 4595000, "d97ea7c5055921347511a04895f26ebc4499c6b9e0ea61292291f5d0a5e1215b" }, + { 4596000, "ad73dcaa1e392f97ac75071dd0271563750fa6c5d263a7ee9a73947069e5d610" }, + { 4597000, "8ff8ad0397a994d1ba7da94e6d4ba5077410de104e115d2aa9cdc4b65286c24d" }, + { 4598000, "e9fd1ea844b98615d7818b65562a680ed4f8ac03d5517f756744c48024af8bf9" }, + { 4599000, "b63388bcce44d49b9a0a87cf1ad75ebdcf3da500bf5f3dcc9ee24ef013a313ed" }, + { 4600000, "a392ba71538958a3ba400596d5b0dc422bd5c9bdccd85c0d907983e6ae99ae7d" }, + { 4601000, "e44d75d371ffc98971cb9c8814f0c4d876e170db4987d1ef276fe07459e91f51" }, + { 4602000, "c693808d0f938159b10623c083aa18fc1c500cb7ca518f389cc83ba351800760" }, + { 4603000, "34d29e2754556150711028103f2ef13113e8397fc3354d53db68f7f7dea26930" }, + { 4604000, "fca7d86c007d676ec587128495c78369c8388142aba3f2abdd8a2dbb9184da92" }, + { 4605000, "5a7abde153f52bff9f727a4c4bbca117f1690eb86daf86f621d09b58d54ecfa0" }, + { 4606000, "ad493698b0852b200116a59fe38de5d5848dff5c2bf82ed45a6d352b71ef7f5b" }, + { 4607000, "45861bd1226235aac8626c25a540d6ab16a0e08c642b982e19bd641db00f4934" }, + { 4608000, "6d7cfb70494735094c80c7bf37b48f3080e41a6eb153fdb0bddd209c66edc7b1" }, + { 4609000, "38efc2919089c5ca16ab0dd6860dfc2a287e17af38215be7e70b7450b63b80fa" }, + { 4610000, "57dc2ad211a8ce6101a8fee8ed5d96a2ea00cca1afc5fc7047c7b006ed988e1f" }, + { 4611000, "1daae698126cc578edc28973b39b5c63e36ace7e62443473a550372dccccadbf" }, + { 4612000, "625c20442c941af851190170b2085fbf83db41227cad919490ce5886c80b0a86" }, + { 4613000, "d5014df020a5c34263bee430e6a9127d8db5cfb19432a6f29b90d5c47adcb84d" }, + { 4614000, "82bde0a225e523385b743c8c18aa412622622b615f05b8143f5e994263993ebd" }, + { 4615000, "dae723107d37340b8d3cdf627f078fbbf57d4ae73fa0a16dca72e27435b0b34a" }, + { 4616000, "75c8b9d0778dd8f543e1e1bf9ba8ec488e9a2572adf6d9ce409b3444ad527416" }, + { 4617000, "a89de0e22f25a1c7b5eca66c0c4f1fff9508a12d3e056e4b52de82fd7bba699f" }, + { 4618000, "ce1eed7f21976f2e525b2f8102eca77d807c5d3dff534dfa562baa45e0371590" }, + { 4619000, "6739c88b3bd5f6d853566407f2f4af07d59a8eefc05ceb23f80c726d568aeaa5" }, + { 4620000, "7e5157f42c260fbe9ec7c6088b76a92077cebc5341f557203274f2bc7f8644d8" }, + { 4621000, "901a98221a6c9a72f824ed784a4e0356231a221b2a2ea2deafaccecc849c7c4c" }, + { 4622000, "9be124cfad4aee9176d955ba09adb0afc3177657c6ab5144c194572ec7124a91" }, + { 4623000, "311199af4a18fc76abe469a72dafa4ef0dfb1a5b361c0c508fe5556c70394b97" }, + { 4624000, "e5ce76c2c56f45cbbf0a6eb15b5cbed3eeea7695509fcc7b42ae548f9195280f" }, + { 4625000, "e18875ee9cde685d2befab50103dc86ad9e55bf9928de9e2594fbb7e3c1dfdcc" }, + { 4626000, "f1c56c932092bf54db545954bd042b1c409da2e3ab9506e778cde47edc1363b8" }, + { 4627000, "93f715666ed9b40f9215aadaec3d05812a0aa53e3b4b6e7e0ee48776545e27b0" }, + { 4628000, "a3b49735f9d0f52effb5dfddc6469a637decca393eadd750d991fdc1386b6188" }, + { 4629000, "8486d0de1254752d74c3ae62a53273552bd65bf2e6ad025a76dec8e9cf5bdf4e" }, + { 4630000, "c2063b7d4ffe9f3e87b6dd69b82a23984805e6a3216428122bd09a23f0fb10b8" }, + { 4631000, "030475a0fbd81b32feee902650fa5e2ad9507826ef61314974a240f783bfb567" }, + { 4632000, "d7215096a190863b25e3e3315ad485a8fc150cb92e5731fb42e0e5744d44cdec" }, + { 4633000, "df4b2adf2bb39a27a4ac479c85d4e5e90e6e99ee9404e92bc524b33d892be1c4" }, + { 4634000, "e6084d9b60358dbd5b51381ce644400b75d344a897962c49e9f07e34e71a058c" }, + { 4635000, "e904cac1fdb2fc15cdbed585a84be7b1cc76ed0a47f9e75aadbc85e1e20e6c19" }, + { 4636000, "63f0b166fdb61c4c47d883fc1ea1cc153c50b0525e2ea4ebc40d366158698918" }, + { 4637000, "6d4081298c1df9e0439a45ea3b6c2b20c9ae2395d607534e051388fd3e677c3b" }, + { 4638000, "9707864fa555e33a6fae1e26619070b23de14a5c972e5a59453c44f584886f47" }, + { 4639000, "f098fff6a006340b755e32104566aa9efa2457fee0ff58fe724fcc79ff57db4f" }, + { 4640000, "09fb092882393590aa93f2c9a2327c9dae5e1d45b09a2edab18e5a5b750fd090" }, + { 4641000, "c07fc2367e2a6ef690312515f1fdd4214ee1813b722d0d3a4d95432f79dea25f" }, + { 4642000, "9e1d450b6cee1cd16ea872ada15e60b4abf1f1543fe6ada9b510ce0a3835d613" }, + { 4643000, "537da5a4ff7f5c3fb25772de37ef346709dc1c9ec5cbd5c09f5ce5274b59f7b4" }, + { 4644000, "63cd25352a4e91234f4c4d4b3060f2dc3e365be75f6deff64eb9961ca83ee5cf" }, + { 4645000, "387c820ee7812e15dbdae2be79050e448df7565b7edb1d25839e93e516088764" }, + { 4646000, "06f583e64e225d54ca6d09f9d83cdc1e4ef95fd7d394f5f4b55105ce6700f4f3" }, + { 4647000, "e417363a1be9fd2e8a9184ffa2e0cc7ec022a0c3bd5e528a1bd264f269afe88a" }, + { 4648000, "497031ea3158a97f0ae06a0107e3ae096660a5af4478d5e4130c01b1b725625a" }, + { 4649000, "65e55e00a101adba0337fd9f940740e56f168e31fe0951cb88a4618a1c253c92" }, + { 4650000, "543b2d16e5b275dc492756e4f548f7328a080f9bc41a3c2b4bd0601c3eb933ea" }, + { 4651000, "fb49753a3f6477a0583b9e3445bca1b47893bfd421f54356b643a385666118bc" }, + { 4652000, "294f44c46a178f4c369002be79b9e53fce492ac96f6689c1514b624729056988" }, + { 4653000, "817ceb90a849e4eac4606c898b6c007a2150b1f42a76c81f406b392325ec30da" }, + { 4654000, "7fd82b594ee3cf522e043b7a583c401e3f11da8e91c455053843e2dc522245c8" }, + { 4655000, "81dc5a0cf2524dbf96f489b36c1b639507fd0987fc4fbddfa7776307553ce49e" }, + { 4656000, "41eb85fda7a3ad386da86b351b576897daedaa4cb7d309dc51497ca1f89961f3" }, + { 4657000, "a9ee7d151eac3310ff0494c6e5dbd8d29bb7baf96144972f55917bd5cfa27eb0" }, + { 4658000, "38ddb1059fade70b20c1a1e2fae1e17497fb19512a2160dc494d7c95e9b0b7b5" }, + { 4659000, "ccc6daf8f4630e72b3793d824026e5472c455b4ba2f9ce76960cc5db9751d222" }, + { 4660000, "691ddf3ef1a16ef66f759f8760efc40d03e1e24fd6dfc5a596b8ac2926a2c76d" }, + { 4661000, "4e81695d80308997390b71cf8ae810cd6fbe654123dc31ea7735f04078deab6c" }, + { 4662000, "2ef721785ce1f0419ec00e00c3bd6687c87e2261157b6a91ef4a8c3beaa20bcb" }, + { 4663000, "665b96867036902239f005add9632b011984ec57aa71bdd56a90b6e2128f64e5" }, + { 4664000, "c7add414331fb06e50120f72ae60526f89d771107ae980978bd2cccd0d284dec" }, + { 4665000, "1b94e06e6430c1a7a0650c7666e585daaebfe42334af814ab4ba0fdba8849290" }, + { 4666000, "333f221e7b1d5a8d71f02d9a2c3a28ca141e6ec62124f89c72d2839f8ab0232b" }, + { 4667000, "f333553a21fe612fd1ee5e03a0b41362ed26261ba9284a8bf570abb6d324b16d" }, + { 4668000, "0e4307a64e1c48e708eb59a2b0187d2c3a1f96e8d9f04fe363fd3b2d4bfa4898" }, + { 4669000, "71954118a7e2b6310250b4c8d238b7ae8640fb2cbd02524315bafa664c0a876a" }, + { 4670000, "b497acf755089a9fc6ccc2b103d19ac132b1fad380947844d6cafcbc2e800e8c" }, + { 4671000, "1e847854af4c21f4561a3195a105d2c065af419bc3396da9dfc8566f5d2f450c" }, + { 4672000, "8a3e6dde21a18783266722f91bcb97eda316ec6f7974e9ec3c4a4e0acf0cc47f" }, + { 4673000, "fc447c1773b62ddd15697dba2cae5a0dfc8fb928b25d14c927f516dc7f78de9e" }, + { 4674000, "94e3145307e4677e83e58c651db2d7df316b689faf53cd6f1eab502e57b8127b" }, + { 4675000, "24b5dbb37287c4e946b0a8aba33e58be9381c9da40a81786810ca26deb60cffc" }, + { 4676000, "954f48ee11ff98fe0412f59d8b5a1951cb432b01fa714bdb735591153cde54c1" }, + { 4677000, "5bc3dd718fdc56154a411df74333720dc7b4cd7c5386d17f6605f232b7723a4f" }, + { 4678000, "cc7faa0812adb9ed2abb1cc4f187b3bffd8489b60e1cab1456e5dcd70688dc6e" }, + { 4679000, "7e13ce39cbff032b48a135a8e0035aa46037431cfe492aad464cd6f52e06f0ee" }, + { 4680000, "f0159156ff80b12483798d20893a6bdf4d5238ff73f4ef9a180a8b41e8c5d842" }, + { 4681000, "3b6a3f54fc592d165693dd6eeabe6eaca77756aca461dfeed2918c7ae9f37ca7" }, + { 4682000, "7610f0720e132019d02a84076c1ea8023076b5b16ca17b50642ef2ca763bff61" }, + { 4683000, "fa7367c5808437dfd38e7fe5f6e35dc8c6a9692f8a0b4adc626031d8839a40c5" }, + { 4684000, "75f4ddd51c17f5487bbae787c6d52b0680dfa74655c7b75425d7d92b27d88aea" }, + { 4685000, "437a3eb5dad593760a34eaceaf480e0baad6e11baaed5f55ffb9bf06a6cac414" }, + { 4686000, "f6432d479fa102e98afe5caccac6d2f757c9b8deef8aaf5a2e117437b6471403" }, + { 4687000, "117edeba95352ccd944c9445c38486ba753dac9185fbcb2c9a9a4eac29137bc9" }, + { 4688000, "76ba631dd5e5e550e453313bb91fde1ed34839f0b89af49986a06279b023d2a2" }, + { 4689000, "56c931b08535fbfbcab73d341b554f61e645fa9193627c440a9281e920c3596a" }, + { 4690000, "a977427960eb93711f87bc930fa2dd795990a0f64b434f100cab3b56a5a771ed" }, + { 4691000, "405f0c632c8c17d854bd888fd84a85aaa78126f383ad3200cb69bbba11e8b275" }, + { 4692000, "6b5ff6b8caabd0dc61549d6c940b866f29ac2d097fcef185b5173a65603b412e" }, + { 4693000, "ea9a1e8e1e46f5d6e2b28330d70cfb19bd32d222f9c78956572f1a9c2bcf1ff6" }, + { 4694000, "c2dcc1d94165b8d23bb5175eb4d68810ed74bc0b637d290ac30b0abc27e1c70e" }, + { 4695000, "1e808c2b53e39f4807ef747f648690fd05a448cd1e04a68a41ce11f884cc354f" }, + { 4696000, "b47a3c0f287e97975a5e253ce62ecd1eefabbd81c7438dc88ae04762e7b4c9a6" }, + { 4697000, "29543ad2fd5eca7921945b76b1957126305097d88bfa30f02a7010ea7e2bd99f" }, + { 4698000, "b514962bea7476bbf106398a535daeacf66f7658ecec42f05d5cca59b18c10e1" }, + { 4699000, "c11cb2dabf716a3f84049bd9abdbfc33d30c0f839a9b25f552505035f99c105a" }, + { 4700000, "a3e00b58554dd7bca88ae918bec6d0f7be902f404af84c9393bf758cd9773d9b" }, + { 4701000, "5438f1cb7d82d20fad35100a5d018482c06d1267c7b637baa3d8572b922db924" }, + { 4702000, "784c9452ff1b73af6ab79a7a4488a9315574b03e952f8abd8c8a3c6615aefad4" }, + { 4703000, "b6271f17dcb863530d50e47cc2db4fa40fe7a88276d03c04b89b1c77b38cb412" }, + { 4704000, "c759a689938ed605822a7b2d8985b572781d0533349e32b5f88dba1446a5f337" }, + { 4705000, "4e34d1c0f41d5b78531c08cb1915975ad52866c359c000d86694235a507548fe" }, + { 4706000, "f2d0ee4854652f434672549cc51d6d5e7dd5cbc473cc8ef94350eb208b2236a7" }, + { 4707000, "30b453365b3beb710fa553ab3ee7a155958a661928c2b630687c9c552e763816" }, + { 4708000, "44a34a1a38a48f0d0675e647e81968d464b9dc8707a0eadbef99e7bd11815238" }, + { 4709000, "f38cb29a747617bb58b21e911464eb9fdfc58e12ea3b3133b9239a627c5a5c06" }, + { 4710000, "ea613de93d1520321032ccc8e4574d10b14eaaebe0edd4604921285bff88b4dc" }, + { 4711000, "8e79710dfc6aab25fb0e5e287f828cd51845a5b7453ebfce7150363efbeac1bc" }, + { 4712000, "2dd71dcdeecf1db65d39243f40b675a9db9a4824d48732ab68df5974fb157cc7" }, + { 4713000, "4a6a774b7390cb5a2b3cc55af7a3b64c515b9a3a271fdcdeaf0759e4bbddd58f" }, + { 4714000, "bd94ad36097bb10242d2bb46e4a894056c08566e9d42ca51f42bab1a84fb0e75" }, + { 4715000, "b7187ecfd23d1d7c7b8d925566b54cb1d10557bdcbc1a603c8a8b0dcdb5ab441" }, + { 4716000, "d4a8e55a5f4d781387b9b36b87f09a91750b856b9498036cc4ccea62c56c2039" }, + { 4717000, "5bb92c73206c2b508d52d121a6c9de67571bbfd53992f0f29302777d880925c4" }, + { 4718000, "061ca389fd6bf8e210a42e3e4ce299cfdfece8025f8c99d82de766dcab00e469" }, + { 4719000, "6db0585be2f1ef83de5b89639768a216ed8278cad1a2829890096c44a97d28e6" }, + { 4720000, "ed4af16846753121aea1f975aec3013c5981cade57a159d4d38ad32f22d0ebe2" }, + { 4721000, "01ac93ca757454cab16d0440595e1fc4ed7d1b754574978b93db00c752ecceee" }, + { 4722000, "bfbbc4e8007098b8d5cb429a8abb75c55ae66c7d031621eadc7884eaeee65f4a" }, + { 4723000, "4e05aef16272fc57831f8261c7f725df26f67de0368443d82021b92ac1fd92b7" }, + { 4724000, "21685a86d062763db407b5d74dab8b13fdeeabcfb79b2c38693c206b3681083a" }, + { 4725000, "d5b9d5bc720a73279b7ebb1eb8213015d2cc3ca50c665abff2637b82d9de3a54" }, + { 4726000, "407a91a4a344175d9a273e39cc2d136c7c818365a6c5a09324e479f7e8cad280" }, + { 4727000, "6b04c93da4f47d949f3625cabe8229e8c00794023f3eb4c8391f36e063add82b" }, + { 4728000, "63dd4d5ad188909273f8f249e83be22bf5a8115bd1299916c6a1d50f786fd166" }, + { 4729000, "8b1cbc73fd5bb806a229f9a0696d6ef8e01a3dc423fd218baeb568ab56bdb98c" }, + { 4730000, "e70bbec7a4495754d94f20e498f9f348cd5dcb5382f15e93e37cdb600b2e247c" }, + { 4731000, "78e3f6a01d061eb34531e20928cef4ee590d3c6a429765a6fff2a46a20a70749" }, + { 4732000, "7016056c57d7579d6dd40e137bb9c993eecef42c19afba4ecc632ca9e2b76778" }, + { 4733000, "c714010b90c2a1f31d2d35126ec940fb4023863af5c01b2f72dea1407843819b" }, + { 4734000, "036baafa3d3ecb9802438d0b5bda5be09f7cf970e12acff82c310b1a633ade33" }, + { 4735000, "6098981a0159b43239cfc5c648d61e834f06b9f01fc7a8deb9cf7107e1422109" }, + { 4736000, "da69d6e87eff429cacd4c0b2599ab06bdbe54598e6a0a8c72889b8efde56a52d" }, + { 4737000, "f65589963b9553a9a23a10938f4179cab94cbb6082bff12976aa57f7372e0b03" }, + { 4738000, "ec8542b495cba8e18d0c550069d30c8c9779cd1b96514a6e34af97f622d29648" }, + { 4739000, "d9935e0719e5eb7a10f0588be2bc582eb855ba4d82eff018a87639ffbbe8b0b1" }, + { 4740000, "51d6cce6690d072f69afe75957d269f2f7d4de90a82689ff3faa828be3d8c2b5" }, + { 4741000, "1f3b3cbbf85993d0282c4a4341601e16acb84deb2013271ddc16fc34d16ef4c7" }, + { 4742000, "09f905cc15b692375237f7449ae9b5fd2d2bc22ceb64345b3b1d0458c077c48d" }, + { 4743000, "fc2770aa986b7efb991386f59b81289f0b250c8314df8ef26030d3a8464a0e69" }, + { 4744000, "31b33350b279b82873c5a1abc84f442ebf8ced3327169ce5ce0b82aeb027eb3b" }, + { 4745000, "74041c55613e4a7a3b93b0de02b591337f04d184895871f66930e268e8e225db" }, + { 4746000, "a671a0df445e53b08ec66a30961aac5227b8ab1df2186f53076b0a0a1eb50598" }, + { 4747000, "1fcb092d3399429be19efead2c5cfdcc5cd374a61d1c8f83c93667027ad21b3c" }, + { 4748000, "89a960f3f082b649752d5861c02718c5a0af9d5ec91930877c3cef1962087c63" }, + { 4749000, "71e77253dffdaaac32a519429671c000f7b4700abe1164017478b302fe31efe9" }, + { 4750000, "040f666510ac3ddf8a1cd73c55992416061349e576ad8784e7ed628d5e698e98" }, + { 4751000, "1a25ba117b0f2e8583d330bc072438ae36de280e5b31812bd0b23adee77ab2e1" }, + { 4752000, "d78b9b326a8f08257b2653c32dc7dca09861c6162093a13ddc25709b9a11bf89" }, + { 4753000, "06841cce98ac7e6b256d188182b8cf3df309e6d99e46aa02dd36fcc810df882e" }, + { 4754000, "29e63f3cb92b9689762b8e9610b05ccb386b56beb3e8c793255f741e793f0271" }, + { 4755000, "a1ce1717d5a9eedaa81c61577cce0f7099c929a836086e7e767b51bb90ae03d5" }, + { 4756000, "f8998433a6947b2aaa96e19e36acbffa614cf5c959126d8e3aec744ce5a84380" }, + { 4757000, "c466b4de1842e262402b5f5c2973cb2364fb21964159d7129b905778dbe53342" }, + { 4758000, "94f013cebf0f4b0b04b1b2756eaf2c400d22d014ea369899472a781d4ff7f1e3" }, + { 4759000, "9d4e07c62106870002124d116e91d465384642d0140a635f33913faf52102c30" }, + { 4760000, "0624fed6463eb3d51d174a89d59a6a6fb077eec757ea395d8ebe854482503bca" }, + { 4761000, "d8c705a26c77e3e2d27574f249b1dfa2112f9aae3617fc39c33334a7b7471526" }, + { 4762000, "77b1c9126a51e77c60983f0a57c38fba9eb2cba184aaec71b76e46ff94e8e1d5" }, + { 4763000, "afed409dcceea04ebfbdb5f030824ee01230065c35048014f2334d08a43ec5e5" }, + { 4764000, "02f4e7bfdddbc6069d5d4e06ff10d325d1b6f0ffdb77d99ea9cc938dfeb949e8" }, + { 4765000, "d9b37f523fb4890afe6c9dc7b2106b2e8da3ab2fc883fbc93e43d2b2be4b4706" }, + { 4766000, "a27731dd0edb55dfe3d6886ba6e7fc6b8f15c8bc5392e379ead119779d5cb441" }, + { 4767000, "b4ad187b7e45b52f8948c2f038444b580ae5947cd6e6278639c420e47a5f68a1" }, + { 4768000, "eb424cbbd556e3e1173092a5151893edbabdfa59f68ae9072f9c7240dac8c241" }, + { 4769000, "bab5dc28ca6630abe58025a468fb5989b86f5471e335acf677dff5fd244b8693" }, + { 4770000, "8443b7aae5475592536378095054f6d969cfe4b9992c1b6374089fe585abe4a1" }, + { 4771000, "be57f81054674c0b9a8de7e57f1959b06a68954b9424d892d7d55df704533638" }, + { 4772000, "ec05203488c9988e499ceedbc14c78a2b60937fcd6737fd53be1c8fa11192057" }, + { 4773000, "7244619f2b60fb948ca92703bf2f91ca91d08a61f7dd12d51c78f8b65a96547e" }, + { 4774000, "cd214542bdd501f76d84f06057b78615fb0bdb92b482d786a0bb52fe227b3465" }, + { 4775000, "e896755574ffa62507c44616e47ba62229b71cd10f891b2e74767483fa70ab6d" }, + { 4776000, "4d7a1d8fecfe10ce3015eb04c1a41aeb8011c6c77e2e5006a0bfb17d55f841ba" }, + { 4777000, "4fe98d756974c2f0b8b6860f20f61567b7b3cd71e6b5c93c8d7ea2626afef85c" }, + { 4778000, "b2ec95daccb2ec5bd92d27fefa4b44065cc5a68e6c54054f6d24ca0352552cc1" }, + { 4779000, "2724829359083e1b7eaa9e1c9f0f0f7aa27d2bb190bf6a28319b919aaa933183" }, + { 4780000, "2b1a778938e41a5fac2b5c0ecb1c11c450cb0b60d55bd059b7b0725afed7f360" }, + { 4781000, "fbbb83aa04c53818b8f66036edf3895b1fd7dd4b3a37af3041026f3142300671" }, + { 4782000, "42fc80205b793d17e9dd0304de0ca9f8f9137c2801ab1069bab7693ea983992b" }, + { 4783000, "d73e29b02777ee12ded66a8817d4ac77fcd579d716c00b9f75f5b999ac10663d" }, + { 4784000, "f9a791091d9936a0a6f3dcd7107cc40d69768202697f1bb585a2d1553e0e7dfe" }, + { 4785000, "1521054b22854679c52f11ddadfc0cab33385760589786bea9be831477833ccd" }, + { 4786000, "a5c76850c316f4177440f8be09018d102438b213b2c59abc5d04181dce96249e" }, + { 4787000, "801677e4e5ae5d7bcab60a11e5008921173364b2985e5cc85b98c5a4839687da" }, + { 4788000, "fd0e005579f184c3c3eb342673be6e5c74bcfcdfe21fc4d9b4bb7e02219dbda2" }, + { 4789000, "900f1d0271642f2c323e4609d0d3e6ff74385c85b2bc49d0dc4352dfbc4f9f96" }, + { 4790000, "bb2d70f4a75ec8247155b6734b717cbd0ab4375bca4756ea9b72b5039037d19d" }, + { 4791000, "d9809c45d64661785b6a79a877ed4b4fc54ef6861fb122d8fe740fe5406b3d27" }, + { 4792000, "274ce4133a842c9f7dbab0475c9ab593e38039b6289480f2675a28d4d7f203f1" }, + { 4793000, "d8d6141d324d50a597b105abffaf3be4794c976dceb2bb32fce65d1c5bc2c203" }, + { 4794000, "f4d4ff1f44725c66b316ea98632883895358ce315b6d43263033375b051c2f7b" }, + { 4795000, "29447d4684057cf7c314335a83a07a503c613a597d5f0f62b67081042feaf15c" }, + { 4796000, "7889133f412603f043b7b28613a68186c0acf72a499201ac2ca58cf33e15ebb2" }, + { 4797000, "78b0949a095f915831333bab616fffa0cd869d777f44d4929db685f7fd221f17" }, + { 4798000, "ea63d4c4315c30628e1f0f78c167b1ee896357cb4f26710959fc30eefe8ff94f" }, + { 4799000, "50a531d32a2d831919b7ae8ae72d6237f31058c0883f89f5fe9f305ef81f080c" }, + { 4800000, "f0590250dccecc04bf8a6148275451f5c7e14457a266a40975f434940abab6e1" }, + { 4801000, "eb90f1ff5f1fbff4c6b716229fee8bab435e3f468c61c1d28e3ad8a0e0db88e8" }, + { 4802000, "b14045b4f601b9036f1488fe3e646d806b2a0b6676fc63b0c4f0ffaf5a80cbbe" }, + { 4803000, "90cc0bd0329dc89f7a21b16205ab61f07c441d875fc89e722dfc54ae23e25303" }, + { 4804000, "49d672cf38bb00bd18e0d29bb57dd5f66643ad64c76e0e06a9cebfc505f33172" }, + { 4805000, "bd5aa9df6cdc6e9b22c9d7282d1c885d56abed5922b51617f691135c59bb81a8" }, + { 4806000, "e33403d2afa1a13c68a462e33d9ac39c26a5e2d0b64a5fe7f907adee18c3056d" }, + { 4807000, "31fd4b753bfb14bfe2cc02c06e8e1181bbd2b096c2d62ef6a8ee3f54cdd4d636" }, + { 4808000, "6587b26e561e2dcd5261a915602de2bbbc67db602c5b5509217246a8434b10ae" }, + { 4809000, "58603568524011afc0a2fda39bed927546e88f8df85868a193657cdb8af1e1f3" }, + { 4810000, "aa7267b9ddc9e1951c9bc8cbeae801cd701b89add502a5a88f79d8870008dbd4" }, + { 4811000, "698765668268f1c4b2b3af09dffa3b6b79506187b7a773ed5a9ebf8e5579e5f5" }, + { 4812000, "1ce29867e4a990d56967a1037bc1f92d7f4d6460fb34d848e39bb111e315a7c3" }, + { 4813000, "91341eaf795e497a44f119e13e72485145cf3571edc9339d7ffa8152e64ff399" }, + { 4814000, "27699c40354d743e7ae30205f4b22827d687c945bf41154e171c485c6efefbe4" }, + { 4815000, "3963bf20bf47f2b0672482cb753fa13316244ac90c6a49a482098d1f662e8a29" }, + { 4816000, "37abab67e381cfb1aa08d27febfc16ec089862adfb5c484cec71b1c502e95fca" }, + { 4817000, "a7b109ae28f0fc0b99712b6f1146e7e68758a95ee9ef19caee211a82cac2de70" }, + { 4818000, "aaabead18e1cb38d3c034d52417675be2d90cc7d3ca7e1861d94a31383ce520a" }, + { 4819000, "12ac9f17df8dfc80d6db50f85264727e7551f6b2404dd22d9894f63ca2283c4e" }, + { 4820000, "cf593cc69928853a007b992d149b49bbe8b9fd7306b7e71aa444285eb0f9060b" }, + { 4821000, "01845784c527f47f2fc490b113915056aa64b7c2bb18ebb16fc03ca9b214c2ed" }, + { 4822000, "ecff88d4131de598cc2705757b5bd2ddba5ca0d128b7d37f19fd26fcf6fb61c7" }, + { 4823000, "84e5ec81fa9b2c4773458aa397194144bf49c46b35ceab6912f9e93b805d0c4a" }, + { 4824000, "d66e125ef0352bb18c84d0121330510991d9a0a0e3b9038321299da0a08fd63e" }, + { 4825000, "e16118571ab0eecdb8f16edc8f50012a420145ab9846b67caa76cff6840af5d3" }, + { 4826000, "cafc5bbbceda9bca53efe4c7b23115c806ce87c5ddce1003553224800ce3c653" }, + { 4827000, "c3382014fd8638cd477526b89fc36d969022a047d974e8abd075acb7b91e46d4" }, + { 4828000, "9cd6a099f4cada28957868906f39f978c03856f960f1223733aa3593cff4695e" }, + { 4829000, "0b65c550e21fb83ed6f5be7ce37b3434e6eb22e2268afceae15b73914e2c74d5" }, + { 4830000, "b9b464ee2119557c72ad011e5eb72936ea6415cfa685fe53595b0e380556456f" }, + { 4831000, "6cfdb52d578bad7ac0ab9455440192518cccc170de22f250cf3fdcfc46ddec62" }, + { 4832000, "9e3b4536d8cfd8b45e83b9ba3ef87d35365bfd09cecd104a9ed039f2b30db006" }, + { 4833000, "828fab8e10e4aa69c5c7e4ebde6c602e596787988519ecb009b9d2d131470b5f" }, + { 4834000, "b499523b4d118028e40e602c593b33953313b030a01195a3b758a0ade4c00f12" }, + { 4835000, "f09ce6abd826a61007cf70b9588838f5186883fba6c798113fa269cded7dba07" }, + { 4836000, "0f6e5004314e2f86af5880624cac1aa085e9d2ef4ca6bcf9414434cc9c4127b2" }, + { 4837000, "73db3273a1ddfe2deb7903272c6ebb069ba5d6532a642a18ca0131e9fa1a710a" }, + { 4838000, "c83735284def92b227bd7b1322566d519a352360ede9eb42534fa3a80438046f" }, + { 4839000, "d9d0491add38df0fa3792016fa9b51448c6065f6639b655394a8b2d5443a303e" }, + { 4840000, "1aea12fba47dadb0d4d39d8a189d361eb13031d3eca3269153a51b4932d59a60" }, + { 4841000, "d8e7f589808abcfb943d8b6caf392a2030b96c1cf53e6c68f26023a3e7d51f54" }, + { 4842000, "df161b4a485777e7e7a7c9f0ae311a2ac87dcfc450d790f69eb869e5f4b0acc7" }, + { 4843000, "1672f328fd71d35186314daf1d9eb4c24c38415eb2ba9c7537c63cb8bad55e76" }, + { 4844000, "0d1650ecf85f4544da9a624041471f6d3ab2fd12c34c7323f975a1f0f5665828" }, + { 4845000, "318c0ae5add75b28c538af76ac456397d2b33456d446f3459079f7df9e15d8f9" }, + { 4846000, "3f63aba618c4666e7ad01f3c8469b7d6986da5e938dbd40d60c58617d4657961" }, + { 4847000, "8909c7a3981c046c53c4292c90be511f934329f1680fcd950d8b4ca5022cdc5c" }, + { 4848000, "fac36516e3db3665b29b0bb37226a727439f9a109e8725fe6c719934288af532" }, + { 4849000, "e13ed48934711f064404b8eb4ff6325877e7b3c49484b8b5436b5422d7447d42" }, + { 4850000, "c039930b7b3c8cc4578b7a4b89dd22bb0c6eb8294803c3e81e5255eb9ab1e032" }, + { 4851000, "0f456a9ce3b1c58d32f6b926a373b7bad30f710e79effd5ede8a4c1c5982b9d7" }, + { 4852000, "f6f724b0aa10259b229034b18dd87920bc0dedd1c7d37c42f3f14b78ab78d25b" }, + { 4853000, "657db0e82a87516613bf4d64524d361e4bb3a81eb571d36d3bcb1535cdb4e387" }, + { 4854000, "f359700f066ad7745811fbbf91d2af52fbdb2724f71af8760dff0c120ba77561" }, + { 4855000, "9705d1542d8f9882d09f200af8719319c91d84b2f8b120f9fc0a32ab8cc5d076" }, + { 4856000, "addadcc9c3ef3a2fd949d6f6a5eb6c51c1efec7a985e73d1c3428004b1ecc798" }, + { 4857000, "7c96420ff60ec903191efbe4edcdc329ca60aedcd44c9d5572f0c061d5d0ac81" }, + { 4858000, "e06ea82bda686cc9312267be11d1b90a53691a661a33fdeae72dabab2fb2456d" }, + { 4859000, "16331e5d50a7cb28315f3c57d467caff867d17a7942fb2d8b193f9c3450248b4" }, + { 4860000, "694c5c22e78ab81a68c49dfd79c4209ce5c1968de689f221b38aed19486148fe" }, + { 4861000, "a8ba66d88578b76a88358857f3e317de08454f588b0fc2cab59d2655fad0fcb0" }, + { 4862000, "32d8164ff7ff1dea8aa2c435d98fae64f32c88183c656ed46af7496e2b15d790" }, + { 4863000, "6c1212977dc28ff196edf9d6c8fa781f534454927c29765f3846bbd2ea528ded" }, + { 4864000, "4fa53c195dba92a1c131006fd54bae82c0eafdec9b626067fab210e190b7346f" }, + { 4865000, "ebb2039e29fc181f7f2abf6aec21fa3254138f26764579d084dd6493b0831d3e" }, + { 4866000, "163fb75c8473bc7f58763a160343f0524fc705c4b01cfe06869497ca6d0b3454" }, + { 4867000, "17ea6c544ad2321484478d5f405d7e4d5ae108a103f4df9c81b16e28c1aa6077" }, + { 4868000, "e99011dd2fb3d706e9fc1ddf959b0cdf914147ee35165a1c15b4f4551f033d8e" }, + { 4869000, "4e9a0b397b8e71e136981c793d1bb54b9b83c940375b98f3d758063de113eb98" }, + { 4870000, "2034c95e067d4075499f3460a9fd4970e9c686799721ad4b312e43e8541513b5" }, + { 4871000, "1efb715a04288762fd5505d3588a49f9d8d22aee76679ca77827715d841a65dc" }, + { 4872000, "2c172b4ff387ee236138c365394e94323e7494cf2a35539313323a47b1ec9a66" }, + { 4873000, "0f2f3eff1d25300c954b927aec79dcab039b1a5e87733a902640a1a3b96462b1" }, + { 4874000, "1611c09426b7e9c7e53ea335b0bbd2807a63c40898f9b24da88be325799d6411" }, + { 4875000, "83b4b93f7076d8705466f90c7110795a39dda17309c245c838edf7e6af6c0b8e" }, + { 4876000, "193b53428c2e9d7ca68efd46540aab4b54148cf0fbaacbc0ac164a0e45d535a6" }, + { 4877000, "1b9e18471795fb7ceee88461c5a091ba5e6d268cd1e0ee88fadc8f5a00a997f9" }, + { 4878000, "71f632c809441646514971f18819806609e341f11124ca60604e69e0f71ca820" }, + { 4879000, "a714bd47c16ed6d78fdb86c7cef8b27fafa47df54b0fd59dff25f8752b80d4f0" }, + { 4880000, "0c685f14e86b975bf5d565ab940f148a9841a0fe9eb8c8f11789f09fe2a0d1ca" }, + { 4881000, "8328f1bd21d62a350e9edb06bb4d3d9c523ba98157d01edd7f228ee9a766d2f4" }, + { 4882000, "76766156e9c522934a69224b0db1a8321048c1ebd63a5c18ca712cb38895b0aa" }, + { 4883000, "52771624bb0e0059b37be41d795d553a996b1901fe6c0a937486264ca049f2d1" }, + { 4884000, "2ab3d94c5eb7ef1440bd6f0ef584dac4db37f0284e7fed38c301dbc92820eed9" }, + { 4885000, "56623b6a04d6c77385a0907b24fac03ed360a4e05aa8215ac79f8bb1c67ef075" }, + { 4886000, "d2ab8792ed4710cf91876fe14312cef0c5dc38a3b7665ccee1e2d374d08e5258" }, + { 4887000, "e844bb5512153723997a476cf1021819884fb956544a2fc8e4bed98af8dd2f46" }, + { 4888000, "a4cf8e3412e3173bf19b74b5fed6ee848ac3ac37d308ba416de8b36896ceb252" }, + { 4889000, "e2440da2780f43e4cd3b03e9cc2388b650c3f2ea8f3943fd250f92d7debe3787" }, + { 4890000, "b3f0e6a07f6080893ac7e3005ba5a08d30a54c76022ad41e84212119ded27c48" }, + { 4891000, "d551144b89dfa031eb244e6562bc82fc15fcb1d86c02f78480d590ff49ebbb37" }, + { 4892000, "daf4d7feb018a62b65e3e97687de21e16e6b27cce6d06b7b88c3ce000bccb233" }, + { 4893000, "9ff8dd81035caeb144bfe56cef0089fa238d73ed459f7b30c4b4c3edfa65d357" }, + { 4894000, "f982e58027ab19ede45c8dcaf5e926a9ed6916ffddc5612538dbee09a5a5eb2b" }, + { 4895000, "3db1f7c416eda149528673d014f280683d22dfc3081b9576a6326f5f66765de1" }, + { 4896000, "f184fbadf5db96bfcb7c2c97afa76644a5cce26e60f3ef5d9d9cbafba1440e92" }, + { 4897000, "fefa24e0cc83830a0c1776472cd967a9b487c23fa9fc1bad88f89a529213890b" }, + { 4898000, "3c0f97f6e1087568a0dbc87c6926b56cdef1dbad1e7afb73e31b8c9bb3cdb873" }, + { 4899000, "a102f9f0399157ab01b4a7360c3276d0cd1b72500c3ea79f409a0c3dd9f370c9" }, + { 4900000, "df7fb7a7b3340798b50b8b5c8387cacea017c569072de577fe9099be8be51931" }, + { 4901000, "ea8a5841c61ff1faf999d252a320d567d778d2c383ce6aaf61e91e4873ef0233" }, + { 4902000, "144ed2bfe9d76aaa00b4ea16a81a8139f6bb0e75f5dcccc26776b6ec9024ad18" }, + { 4903000, "2311e869256d1083e882162835e1f451244177ef8457d42c749ffb4693731afa" }, + { 4904000, "f855cde11cdd972a23a3498b0e63b8f31684643c86f090c87d35ea03797aa1ba" }, + { 4905000, "b9c71fc1bbc51fd6a4d0a25565a02bb0b727631ba81f29629153ce0d071909b2" }, + { 4906000, "7cf965be9f69ed7d1d04fc44e6d05598c980f5a981622831ac3ef1b107b59643" }, + { 4907000, "d4ec7ce8cd44cd1a163cecd3af07e7847a5086576765ba6111d5e1ef569ad96d" }, + { 4908000, "de140981cd7ed08633d5b555e2bffc0ee30759a8ee50a73a315e111c6b211e90" }, + { 4909000, "6969f00d1560aead39756c9e6f6a701a9bf6e2fc02c87d8acebcf78fdeb9a898" }, + { 4910000, "027a2e1c15f1e6f0aa8d99b0d7de336cc3fa41bc8e679a66b1a47188c19f5457" }, + { 4911000, "dc3b0f3af8778270c291922f337717afc20cbb94cd6abd9801ecd5fff6d4832f" }, + { 4912000, "5966e6774d3d623e26513bf28c02a27119644b8f07345489e369a959fe18f453" }, + { 4913000, "483aa6b05705ae607ebdaf6056ff186314bc5fc97ff37dcb301fe5efa195512e" }, + { 4914000, "a8a611b7bbab5199ca1411f8ae128b385892ef1f93bc7028fdebb08600f6d573" }, + { 4915000, "027d760b08dd6dbc8d7a33162562dbda3453deb7c60d69720ef2c7764bb5f6eb" }, + { 4916000, "2721fc82191bfd78c1bea2f3d78081f8311fe7876562dd72991c15ae2cec3d3f" }, + { 4917000, "7bdf0e55289ea866a63cab6a747e3ae03458f7eb58b43fb5c179670b34704795" }, + { 4918000, "61ce68c441b7d49c3243663a2ebd9a140d95e1455cabaaef7f906d146e05a5d4" }, + { 4919000, "8bdb99a36f9e6d752f1ea59fd27c5e33a1364023324754e15663d1f0a38da9a8" }, + { 4920000, "53c3edfc02c8aad9fa98086736a45d22392bd86c626343fab5086da15efce7c6" }, + { 4921000, "6086557dfccc4a4e8fc76a9f5898bdbbbde076c7f5a429987aaffab54d0db0cd" }, + { 4922000, "59ccd26f9015a86f0b9b88d1e39b38ee2d8d26094cf6069fa570024f747f1fba" }, + { 4923000, "1bfbd71c7c1f2843fc72496aba611b215954cc56d4d27e40cc8c3adf682bad0a" }, + { 4924000, "8c311c248dd32dc1294486a5c6fc449607ea7a042072f26641d0b06c58c1f8ca" }, + { 4925000, "d93884f30eaa9eaaf4446c2caab477946a3954790fc9dd4754f1cf213e1c833e" }, + { 4926000, "eb1e4a9aba3ad38d4884e3ecfc784c483374fd400f86a9eb7ea9ce5dd3ee2fea" }, + { 4927000, "f6349965b9c35c2aa60ce418e873e8937dd862d0a4cdff0443723ac31d5db1cb" }, + { 4928000, "d9b34749bb61cecdd6e7723f2942285f2791e0b9c0a5462573cbb50691c21afd" }, + { 4929000, "f9ef3a7c7b1b693bd2a76374062ed94005a9bccc1fa2e83160beed2a9798b481" }, + { 4930000, "478d46a653f1cd14986d52191838978d85884586a50393e60fcc0f8d976239d5" }, + { 4931000, "8a8a20c23bb7d9ff4eebf5fc1dbced7c39dd59741049cc5863911627942ddbc3" }, + { 4932000, "5f52352944c195f044dfaeb72985c299bc7885fd8b6afee23dadd86476b5424b" }, + { 4933000, "47c60426333926ecc47429c91efa6be8afae7516a6cd9bd70ef0c49cc46994f5" }, + { 4934000, "4599556a374c12b15b421a35d903bf72f38717eec6438075f1576962611d77c9" }, + { 4935000, "b4865b9988165d0f19423bd623c344d569e6f394cec5fdcb95d6a0bfb04667a3" }, + { 4936000, "974142979acabd58e6a5387ed729afebb8920b87809cfd2b4db4213ec4799602" }, + { 4937000, "8df62e79fe18e39142c2fcd76a5a98f809f698a92048a42d67137793d270f206" }, + { 4938000, "c393ad119497a93e9b9e2994dc99c0b5388f80049efe64f868a22f6151a2a4d8" }, + { 4939000, "ffedce22ec5fabe795ec8f38632f8ad6581aca0e0a618c2455ae8795aa9633a5" }, + { 4940000, "0d824dc8d81f88a380b7611eea17ea91900e52271e6a94acf152fd782182b1e1" }, + { 4941000, "1cfd22a6e29e5834afabbf551c7dd1fc604adffc060d023b070d80110bdcc4d0" }, + { 4942000, "6effdbcb2e1cd2cd43346f9d02ba54f5fd63e416543a4ceba97946fb28f5edba" }, + { 4943000, "716de3901300b6b605f39e88c3226f19947dbe9687c66849fbaa75cbb672e2f3" }, + { 4944000, "da9e35d4e24d56cfcd792e375a70b8caafc04c96815e7481633bb26717ad8dca" }, + { 4945000, "92f5ebb92eed70319637e374a6504d5a3c2b9997ffb0732687c5528bc73bd8f3" }, + { 4946000, "9a86dfd9e17c4aa5172785dc7922a1705044b65b3778852914ef13c9643c2ee5" }, + { 4947000, "6e59b6a2772981cf8326944c61f8409b5b0ea8d10e2c9c7240cea63525c9c1e8" }, + { 4948000, "f6c98391a27386794b9048c9224fdb19e5aff44022f9265f04de94654c87fa37" }, + { 4949000, "e5dcbe5ec1ba65a4bed0f1a680d17632415b4880dcda9fa668dead3a32e6e9a7" }, + { 4950000, "4bf87b6887843c153f27febf9c62e0df71af579923d12b39c3277e8b0cea8325" }, + { 4951000, "453569587f322cdba15fdce695f5749e135eb8a5a48a3db01712fd57961b229e" }, + { 4952000, "af6c9e525c823eb488bb7363562b42b9c54c75cd054062266fc8ec5e46832d98" }, + { 4953000, "819e66fba371f6d1203c3610e18cce1b821b2c1981f095ce44ff00e8b8bb337d" }, + { 4954000, "1e4c062bf7a902921450038d7b031ea06c85f3ef30508098d100281009c055c4" }, + { 4955000, "b3d22f51a36ce18df844b40f24437b7180a672fb555ff386cafc2d03f44dfe89" }, + { 4956000, "54ba2892d2a17f63d76084a6277af9244ee3c7bcc54521e91ffa6f4994fb4ec9" }, + { 4957000, "475bcdc3cec655321095918be2bc87633023168297b02b6cf0e31b16ef4a91c9" }, + { 4958000, "766ede06e7d463633c521d020e6bc8042c9a56ce4a710f9a2cc066f12ff9a913" }, + { 4959000, "c02a120481d1960e8aede87bd802e229500757cdf7d4b8962cd6ec9cf7a9e03e" }, + { 4960000, "9914ec29d97189638ada539820d680d4c8ac5c289b1cc0aef1cc1fa6761613b0" }, + { 4961000, "755b375d6650c57ca5e11bb8a5ce41912fea61ee9be0384a26c9835304a1c90c" }, + { 4962000, "7efaef460513898d85150836ed618b3da86b3c28f0724b3212fe28b24b5a2bc5" }, + { 4963000, "37fe93de28aeb2c24d1ee71204110e156951c0914c2abd7515ce5e206824ac97" }, + { 4964000, "b4d7c5274dede2027171eee378d9b039ed00de3bc7bef11362fd4b7f637054f0" }, + { 4965000, "3c5fb396230c85ff2438ffe772b04746ca881f27ee1cf01ef0fc34efa14b487f" }, + { 4966000, "2bedb0aa9b914291b9a8f97c3af0b5b5fac4711c8a2d619078d61e2c3c6041c8" }, + { 4967000, "ce5ee78330a456a25b0d1c508a7836dc578235cbbce72c173708488daed5f016" }, + { 4968000, "46645b663c49360ae985c30bcd830e210bb0e6d0cc06c1657575c991d6096e0c" }, + { 4969000, "61eded53a527b33d1d9e2967bd1bf916750b30aa8dc9d1bd2cfe57ae06043d87" }, + { 4970000, "d4f492bfe32ced4fa412e1ee8f906c34850b5549c7afa3933f80d556fbfbf7fb" }, + { 4971000, "4cde82380efcd007741b45c00889d0f3fb6dd088133f16c1b99709f7092e469a" }, + { 4972000, "e213cd4fb9dbec8d01be92cd95f6b0c42d1e3847884058db4ae39cb6df815907" }, + { 4973000, "83a635486f6094f54a140db38e9661dedd819180ab0df5eebe56fa143dd8f1c9" }, + { 4974000, "35a1ef9643e94783ea879226387442beee868001aeed0c650685263d8fcf88fc" }, + { 4975000, "b8a3dc0652b5403eb23685c9bf5ff1c06f2c8b3e904191f19070726aad0f5b4a" }, + { 4976000, "2e579a94ba1a6f5bd5a3a0b51fcb3c8b6720ca04f726ade8596d9807a3259888" }, + { 4977000, "2b7e28ab5494249ef97d76e4887bc6ad35996fe9a46cd9db048d022a6b288587" }, + { 4978000, "3444c266ba7f7bf2afbd9e38ddba1f12777f5729fd4cbc931752fae6d9f1b050" }, + { 4979000, "8559740ce169fc669ba7e2c164a6164790767db0eb3c3ac6097ae2150a9cb999" }, + { 4980000, "f665c5a59d0ce46102ccfd478148c8152d832e71cd5785985e2b5e8995a02164" }, + { 4981000, "3591b40669e1caa6fb2f70247b468232bad1bd4dfb5d8697819a7cde70c97e50" }, + { 4982000, "015486e35e3349707a945cf8f5af54cca3d7cc249f6d871aa0f92e901346ca00" }, + { 4983000, "6dc291cac238ff0f5ba1c1526b29faa386bd09531188e991571de6915c8f3667" }, + { 4984000, "1c5dd496bda24e58fd813e0e303854d8cac7767b4bb9a2ff84c24e466d96edae" }, + { 4985000, "83069d46897347a53a8ed2e712c4f6056d14243057bf89101c252321d4a17920" }, + { 4986000, "642e34e940c7385553ed4d1d8cb9b4ff66b5429b2a32f1f99bdc0d5a4ef877cb" }, + { 4987000, "7efe221e61f7b03aed7e1fd69380731c13fb7a92e2e68413be50b2d6856f8a6b" }, + { 4988000, "b98ba2945234032207587ce6f2ca16fb28938b0d95e132c02df415a7457e969b" }, + { 4989000, "6e6c3221f1f11c0427abe23eeb714f21bcc4f9d1e656d480064cd25153d16a20" }, + { 4990000, "efd6c582e0a7c4c86a6e4174c87aec5361f88eca4ff9aab80eef8fe3699344fb" }, + { 4991000, "82fedc57b258dee4e02484e54c0bb27fb9b4b3ef99ecb275b241a22965f2fa76" }, + { 4992000, "c7e9ba4662b0e58b43824dcb58dad188c72a74d5d655b3cd0f303b9edc361cad" }, + { 4993000, "bd6b412b853f674077dd03ffcff40817f4b4b0ffaaeab9f11c6edea6b9c2e4a0" }, + { 4994000, "c05f757c1af75863da5c6f299b39c0adf120130c11cef511fed72737934fb13d" }, + { 4995000, "6f5faf36d014bc53771503b15c6b88fb7612e4266583b51dae507a4b7bc247c6" }, + { 4996000, "00f9195a3c50d30ab7fe8e0b0a33f23f37690b7cb82b2f384bb61ee22fab06e4" }, + { 4997000, "d9915e1b2f05c45baa9eacc64b01c042df1769a6c2122e22298d09dbd0fc3eb6" }, + { 4998000, "76a79591b81156901f12e19cb2b50a1bf500414f556daf968075b5ed18e497f2" }, + { 4999000, "eab0de98adb52be4588f61fc099fbd07e882b72ffda9dd9ebd042fe0b378b88d" }, + { 5000000, "71d52466bbc8b854f8b06cbf2d6327748d1617f9c03598b6f035762108983096" }, + { 5001000, "46df82550e6d78455fc875de264e8185a35b860a069e972ea53d14feb0aafcb8" }, + { 5002000, "1f7e1b920541a96f530673f3855752154e241f6b7b19c38bfaab41a50b219e5e" }, + { 5003000, "4d30bed4b5ba3a88ce0a1f856f59dc5f070bb7f43012db7ea8342c4fbc6d2f6e" }, + { 5004000, "0ba32bf28e48844a299a5c121f712918e995f12a3c43ea114e6489718780c838" }, + { 5005000, "fa8380be242b5d3bbdb2786609e22ad46c09c928f532ab010ac86afe7f36e4d7" }, + { 5006000, "9e59c6d0746c6b2e7389f7feac792151fb72129f35a88015fc00c335e3634437" }, + { 5007000, "6096c4eea68bf5ab1fa87ce41d1c3781d65d9ab5c36d653e53a5e8345368a848" }, + { 5008000, "965b6a174916b979175a8f0355d02368ad22aaea5c86e0d39aed95b33d4c3215" }, + { 5009000, "8a54e92f2098aab18c07c2fb988ad7854d7e80fff1de5908b7180a692ed99c2d" }, + { 5010000, "8dec22ae13180e59b27508a6c03329a636d8f6f5c7c9c8ef8fcfc103cc62ac03" }, + { 5011000, "8cf58202104aa66c5a93c79b93fb90f2c5b9f87dc6184b3a1b56ce145198e5a5" }, + { 5012000, "99cd885064e594ec71c57227122979643314af340e578bc36e348476ab587f2e" }, + { 5013000, "1b362b0e1baf317c3db6fa486a05495e489cc62ead67d4c0f5cf84011912a036" }, + { 5014000, "a8f750c56c73921f558ca1bd7b3714847b381479e28eaabd0a5a92e365f28543" }, + { 5015000, "ea3255ea321214d6e75194b8d18f80ca1fe469e0315b27c7846b92acfde1b0be" }, + { 5016000, "014877b46bde0d286360e9538a2a29b680edf62a2253d2e1de2b0bd7cd6a4279" }, + { 5017000, "78252023112205f09da8c3e3d929676b001fbaf7684e187a3ff4823e32c93d21" }, + { 5018000, "2d8388d1b429656aafb99ed8a9d60a274b42a8d5689eb79fe217610d87994585" }, + { 5019000, "c54359c80200b28efac4e1a921d1d3587d1fb3b699fed8683ffd0be66f997d21" }, + { 5020000, "fc955c7b2a0945a872905d78afcf081690a56a40a4968e8dafaf3b3de7324c6a" }, + { 5021000, "1df540ca3775dda8549510a954a7577c2884454549757f4425f535f1f0c014d9" }, + { 5022000, "01ea8a5aa6c54c8b479aebae6bd83b3133db2e146ea55a49bccf1ea6d922dcb4" }, + { 5023000, "b22293c3003b9640f9bed22387dd1a3b1ae008c96acf468b047543f964116b1b" }, + { 5024000, "83c349650a6ebe951aa0e5d95410f48564bbc6f193312465eb514d86f2289b35" }, + { 5025000, "df56717e93585df743076e8593821dc75f69b6c4049bd8bbd075a27edc07baa6" }, + { 5026000, "77a544b3145d14b268ce7f0125822989e7293d210e8cdf196fcc0d1e4850ed9f" }, + { 5027000, "0d5d77ebe2cff4f76ad1902c337d57e7b21fa6dfe7749d83b0f42623acb196d3" }, + { 5028000, "d7add9ec7daf9cabe2807dd0e5a9bde1743df443b49d2bdca3fc2882a31fd6ff" }, + { 5029000, "864c347965e89fad1cb5c696e77fed139a1042ca0e59152ee4ae69fe5d2335b1" }, + { 5030000, "03593ec1d20c8bc57ff2692c7c9c39427b3111709cedfd789c8f59bb777274a3" }, + { 5031000, "b46e0b678843067c79b53e6dfec58edc77b31057f3fb47714e3993b4a16430c7" }, + { 5032000, "24dac47ec629a063eb1bd94ebf54e783198e0599bc27cdc29a608b4f880446b5" }, + { 5033000, "a86712cf49d16caa46d99074913c90c3eee83afce427c019482f0d33e0cc0171" }, + { 5034000, "009bc40e99e723f71c5ac712c82975e3f83189c973649b7b534de22a2ca9cd4a" }, + { 5035000, "b6074805070f0742f3605f957125b48bcc5ec7b8573f8fc5839db115d560f53a" }, + { 5036000, "2d6c8279e971bc4d7289a7d79d2f9c4156b941fc4b35bb347956360bbbbd0814" }, + { 5037000, "1092012c1760849a71aadd330d709498bbe27f376e4e47f3f4af3aa356d4c1a3" }, + { 5038000, "ded5b36efeff4af671b8f2c888a23a38541705a71f3e4e718c6b361a14adda4b" }, + { 5039000, "48fa8210b4b6003cd1aa3b3828b84eb432bbb6ab17fd46ba846e99f923586c6c" }, + { 5040000, "2f1e6b6794136070cd735e3c234878077db887a7889879c1c390f82d9a2b1ace" }, + { 5041000, "211c26f4c772d08f794586f296618ac1fcadd4746311f83e32a6617782c70eff" }, + { 5042000, "d9de001a76536bf0b164c5e951b27a79b80982473f06cb40e8e89c6771d070b4" }, + { 5043000, "efca8255dc93a21d47584e4fa336c747eb3109c0654410a94fb051fb34de6abf" }, + { 5044000, "2e0dcd652b1b42a9c51b1dbae8cef2778a99e081f7643235cc0311b3b4ffa988" }, + { 5045000, "ff91f687ac80fdcbd61b4713a8481fca7d2db5e9c0ac21db1bdebfc802dd6419" }, + { 5046000, "f5d362d33525cb367ce1a9c1c6eb4d18159edfbd7886b832199e932a062fb191" }, + { 5047000, "b97e884047066133e29577646f51ba8d190213b3ce36c946b3363b5925bf571b" }, + { 5048000, "8659ad8fe3941254ad7501c2c2295bc2ec0892557f192530a826595720e112bb" }, + { 5049000, "0c3f80f413e223623465fe408648c84dabb993bd62497ecbb0bef1dcb8b0e92f" }, + { 5050000, "f59d046e63446c0bdd60635f054867f997aeb3a9db4e740d5ed288249601aa7b" }, + { 5051000, "c97f24608462365927623d84344342f6e2c1715b6541da18f1a584f21032c8ec" }, + { 5052000, "57662990169e5cc716793ee6553f36bd8261a47d0aa4e84445922e59b49e99ab" }, + { 5053000, "a65772ce06b5617d1394a6c862703fafd2e61fa62faadd421351fe77d9cd5d98" }, + { 5054000, "2dba8c41a9ac101cb7a82bdc424c576967dca34964010814afb35b2b241501f4" }, + { 5055000, "d7e43519a20b5a52e3cf0f56950b74a1dd9c8929811b73a4e37d959ff90847d9" }, + { 5056000, "3959a91ef4083251a1d4e20c86678254b3da5fba13539df0996cdbcf38e10635" }, + { 5057000, "9eeebac70748bc7311da418fbbcdcdc53b9ff1267abeb0c37d277ebb4f07e6e6" }, + { 5058000, "9b4eac71ca2626b4677eefbe9dd88424264f5a69b9f49b41724004203bba83f2" }, + { 5059000, "90c94e1971aa462d7e9e3b29eb7f964be4106dcb5de55c5641846394c384a3c7" }, + { 5060000, "8c8735efa8bab7e2a9d9f5cb76d9bebf7eeda797f693d3d49ca860c43121000e" }, + { 5061000, "31f226d75a2db51c0287f472f1c8043a25432530f0bc2fcb812683b5718dd2fe" }, + { 5062000, "55cd18ef057cd4f59028080113548e1f5af9f7926c88a188cab105719c80e2e2" }, + { 5063000, "3a7605f7417fa971fda00182b5883b61338985f99022f19fc5c7569595e38569" }, + { 5064000, "921f44e595480b6cd9e98a36ceeef21f0798f73e24d059ae493e441cc06cc587" }, + { 5065000, "733acad0c2bc01fef8c4f677893134490333f0fdc87f07d0872b8b001735975c" }, + { 5066000, "a0d97bd9196e4ced5f72da09dc0643fc8de9b6c493eef8bd7bc3e1fe7b5aa0ab" }, + { 5067000, "a144c834c32a5f0122cc010d455bfa56aaab7820057bea8be55a7d8cd39e0c86" }, + { 5068000, "4a7ad1d01d93aed634f7de6ca054d5a3f86d7790b30cc4d5d0319a9f484dee4f" }, + { 5069000, "934127ea9c5084636c15967877c4703e51081b55c4c9ad27b55aa56050c86b73" }, + { 5070000, "878c9e974747f4750a1dcf5eebfb34a6c3645c0859b28fa523de4a62f3e4b2ea" }, + { 5071000, "aa319a39054baff1119224df3240b2b75588c6926503092164fcb28db20f06a2" }, + { 5072000, "481d4382fdbbe14902945a0ffb0e7f423160eef96983c75a6d0c1e7a34a86fa1" }, + { 5073000, "e766a85f0b8aaf2b1ed1fb38287b166b28c30150c7f04bfaad0669529625e549" }, + { 5074000, "6d366e3e52cb513a8ba10bee719b103678ddd775136997fecb920711db29f59a" }, + { 5075000, "fc9f5bd58d4f0c591c7555dc438ccf837d018644397311fd08480132e691355e" }, + { 5076000, "b0799c950dfb428b55c99b0e24944c18b9df685a042ac8f1109d1c855533d825" }, + { 5077000, "6d079c5032eae72a7acc636534a7c5f5f32d1058e4b3b0165a88fe27fa63ce69" }, + { 5078000, "885b30e1b8208114ed2e14c9aba1550b47fc7760dea2691036cec9ba87a69d44" }, + { 5079000, "61c4cc21eb462f5aa70628f67c342bac2c7085436067554d461a31492dd8e6ca" }, + { 5080000, "43d722a7b1ac6bd432fb2cfc9c8945250fbf6da8184245c4b3e80f0fe3323db7" }, + { 5081000, "55de0571ba19dca2b3c8dcc3a7025bda7f7a317bc9a82843eac8e9e581169d89" }, + { 5082000, "292d6649020683615655e190c002a4f68d3aa28f862532090204dd8e5e3d3d7e" }, + { 5083000, "9ae1d3718facd4642f966356d08fae538198336bb1c288ece9aa49c9723dda70" }, + { 5084000, "4300385aff3df90832ecb2d5484a33eadba88e00de8505986a678800bf9cf724" }, + { 5085000, "3fe7ed0f5bfa041eb7f187b16c9a2c78b46e08e49c259c5b3ed74b6ad6eb94b8" }, + { 5086000, "30f28cbb37844141b1cf7dcdc10e6eed42f0b90c357fca8bfcc94bc3c743fe51" }, + { 5087000, "ec1bc7c60e28e599ac707f06773ee1090a827521bc37cba31ab7762f04910a83" }, + { 5088000, "d73808adbc728e06caeb0dbd89f022a51acd5427b4d8a1b8225bd6cbb46360cd" }, + { 5089000, "277e2f1ba75f09299692a21f8a91b708ac9159cfda8530ae86b3a8c6e1251186" }, + { 5090000, "a72f5f4c4a7aabd9eecf7486d8fc15c38573a82c75175d132864cd7ba30df6fa" }, + { 5091000, "b9a65c9f354fa2270c0898064f062f5eb606ee688446572aedf7e9ee3942aae7" }, + { 5092000, "83e7ac4329c73241b9f5a4935a6fee2dd6c59c3ce6ea8ae2a2972cb9ad3126a3" }, + { 5093000, "b26dad27767f882649f98e18813c482f8e80da7534acdb2a99432d1784eefea3" }, + { 5094000, "5d4058d5f29fa347331ae984cd605c71a5bea8682ef95d47663fcdbacf253646" }, + { 5095000, "d9cda7775a92a3be3b0be688128ddefcbe036ea2a7c645217313e945b72b8a40" }, + { 5096000, "f2a5305b029c2a996464f6a5e47e871d835cb3676653c1ded0f151e63e2eefdd" }, + { 5097000, "ac675688c77b203b62df8d65d4ad7bb0b634a3d3be8157356b3613d7883c870b" }, + { 5098000, "f3c45a65b9a87e553499abd1f9bd4e1a91df884eb6744ca6f01aaedda93d6aaa" }, + { 5099000, "412fbd4f3a22d8704f2ede1b6c858f91f6b2f5578752c35afe71ebe0a8704d57" }, + { 5100000, "d9a205a42d72c7d005ce93391a0e2c32d50aeeedfbdef51e30aec7dff18e2276" }, + { 5101000, "486065dab27289362518c0dff663ba098397995d57fe626053bc3667fe5db77d" }, + { 5102000, "12b4f9f0b908aeb3d2c812867f7bb7786f73e1639999545824a5faf8eb72dfb0" }, + { 5103000, "5d99939e6d001bdf41694770223a214a68fe7912e0bdd25c4eb9881c6da34be4" }, + { 5104000, "a91666269f445b63b2c823e6d3cec797543a612f2a18a2b0f6396c16c517fe56" }, + { 5105000, "13655c46ed04a8b0ece9f106e8d07167ae4f7763dedc5446a377c216973e6aed" }, + { 5106000, "c28939f319c50d337f1fd90ca00db871e76fcdfb2173d9b7dc07778bc1099755" }, + { 5107000, "76693e1687564061617e59a684b712a92e711566668cebe5965d7a3e07aedec7" }, + { 5108000, "06866e515939bfc0e9b4e35188a706826eaab6e871b672420e03dedc5809bceb" }, + { 5109000, "9d6a0eda103b70049a3a178fb6efa3585241e8d601927a9ea2252ad203ca9088" }, + { 5110000, "30de89459d226a62702ba7d2963b49ab83df628494800b7dcc4c139d15f2cf8a" }, + { 5111000, "49117da75ad88a743a97d70eea30bc80c4964f6ec97430aa8eb89aecf6487733" }, + { 5112000, "098a016ffb38d36c5530fde28930258d09016b081af8be9f581558737d469dad" }, + { 5113000, "a89d0808378fa05009ab580241afe3c33fb14f61f196c8e256beae134445a757" }, + { 5114000, "0321bdb45ac9e949d4c53972ed06eb12f55cb5d324ee0cd3bdf339452e45eed6" }, + { 5115000, "4c58136d43c8f100da6077fe51fc439821ddeb75d00a3d117dad074aafb29769" }, + { 5116000, "985de93c0cea79e45891391e28fbcd677cd47e19a0c9bb0ed5a12a57e04a06da" }, + { 5117000, "280a6d711943c0856c2123d4ea75a47baa88c9f01c3a9bec854d426d27679244" }, + { 5118000, "dc35eba31cfa9127f512a8ebcee58e898d513bd14f28ed2b3dd027bf02f7089f" }, + { 5119000, "b2499b1a480a83c85276f6d711d8616a78f79264e96e18bb0687319db00d5dbd" }, + { 5120000, "9f303e8d5b12f52e8cc74402a01a3cc3105a3037eb8ad99588432c644e83fbe9" }, + { 5121000, "ec9eb27f8733c42c6d30919e092e591643e7d5288bb58a121b276b7e4e3881d1" }, + { 5122000, "393d29b78cac21e29c92480ffdce8ee223388251cc34b26f5017003e84a9a4c9" }, + { 5123000, "9423704127f9c29eeea671ec85776d5d61be8c9c065731d32db068e94f5989b9" }, + { 5124000, "10967bcc622972b94a01e2a2606a2fcffbfd209f6a3ef7fee53da9b2023cb305" }, + { 5125000, "9385d3e58bdba12e56cdc173046082a44a928d2b211c33fc1263891e51f589d7" }, + { 5126000, "e79ba6afb5603e9807281fb13cb9f8fc5edce1ee86c68257398e3f66817ff7e2" }, + { 5127000, "7483e60db52f2dc9ab08335f625d687ba390b61858e258d6af724b8825459378" }, + { 5128000, "d02ffa320c5f5e5fc0e143f863a25241f565a603c4442f3f5d70ee364fa9d14d" }, + { 5129000, "3604604333d11dca5ab84c43bd30dcd5a151225fc1f499f1d2ddfa2886326e5d" }, + { 5130000, "b7305de7d8df94ca45381d0bf8e4dad33462c5d26cf7a0f839ba000c59e15ff6" }, + { 5131000, "0622a3aed15c15e9822cd3265a3d17f3f167a8c4e40d562e0f6daf014c1e9881" }, + { 5132000, "7f65dd68d062a5113ad527d4d358ac775493c31f504ff7244f4a9dc8bd230d89" }, + { 5133000, "ec5fcc48e4464605e92b5778f30f4426d341b92e275ac749d160d49d9524a8ff" }, + { 5134000, "cc6d6d4461a9b435d608a8e3fcf8c7c0bdd3183de3e2edff85079d2a8ac8988c" }, + { 5135000, "90360a57344a47047ca1c758bed95abefb0313e10cdc07c93a0dd4e0e750a8b0" }, + { 5136000, "01b89dcc538a6220989e2dd99c739985e58b96a7df9072610c0ac83bb713ec63" }, + { 5137000, "d160e11243fb2634657930efeaa72c7c1f1d05fe609e694d8cc833742fec58a1" }, + { 5138000, "b0e39d4510915cfdc9e67ad33de40d426cffa15aec5ac5bf72d36590cd6fd1a2" }, + { 5139000, "246050d05c63687f5743044063d8cb478fce538e23510e3e253ade455911590c" }, + { 5140000, "a286a51be9924530ee6a7630336bb95819611a6a807cd5d2162f0d065a694ea9" }, + { 5141000, "e66c593c17ed3fac60a501114cbaeaa8c1b6fd1c1da70cb411f9f6bcf77039ed" }, + { 5142000, "f392e9f8e9344147697d224c2bcd8f1ed4229273c0f557bdfb06806b4a7aa028" }, + { 5143000, "c7c1dd946265d5fb571887948088327b16d463b4b5c119846c5ffbd294aa285f" }, + { 5144000, "71fb349f16f518e9e907e6dc414770e1e8d3a5a327e1b78346cabe0e11752dc5" }, + { 5145000, "fe2891ce942c4f387f56a4e16000d3c6a18810b718694250187634a9fca23f23" }, + { 5146000, "e1c4b970067c1e9254344010b27e6ae15501cb73557afe143d9472f6e848daf0" }, + { 5147000, "682fb9a8febe99e0eb101ca1fa54aafc15dea1a64122c51d6d30a86cca426642" }, + { 5148000, "d02f55af8cc7c04ab7db1e72e90b41f65175ee88f926fc7a5db3f62092014f55" }, + { 5149000, "d0d70c79cb265f31a4747cc4819b1714baacffa4318cca446ff1647bd380d0a8" }, + { 5150000, "b8a469257e66e64005d384bea7625399d7c27284c74e70fe5032fecd2a794be9" }, + { 5151000, "3fcabf4f78aea749844a155925575609e654b01ed9cf78d7902c49e4522da325" }, + { 5152000, "de0f2f693b14c382ed275979fffadb1545b3a9bcb49ce8d59fd7c2805c1378ef" }, + { 5153000, "a785045ec8ec486bbc603c67c2f9e0fbd0e3218d411d86fbd2956e8c939878b1" }, + { 5154000, "798622e50cde6f7307c883766e16884a6f1b2256c150bf7eb7d7b8b7734bca1f" }, + { 5155000, "11b612fd740e9eeec9e12185d054dc9a4cf7d46f77e09a98b74b9e2b4ef8fe1e" }, + { 5156000, "d7b190d6e73e2299ca0e792fc1106d6a784c4f191f9509192df4d689fae50201" }, + { 5157000, "7cfcf3ed5ead9c8f7fa3ef8742e23dfa24dc86afb3a9acc8ae6b81d4c65f32e5" }, + { 5158000, "e07379821e9ad9cc14792f20c4153ab00d23d54d5f0608fff140c14bc86f2050" }, + { 5159000, "4eb855d847702aa2400203a9f5944d061b2d0af79326aa7a4a3780cb6983d198" }, + { 5160000, "2b95bdb29dfffe73d59058422f1e279c665b16dfcb5669d1a22f3ded3de2085a" }, + { 5161000, "9da960b07bec88cecb3c73caf86393c52371ef41653ec2479efcfb04ddac8ec8" }, + { 5162000, "1e5e80f5507cd9c2b76571a5215feaf4b411eb2360915f17f55483ce49d2a9f3" }, + { 5163000, "0706f7161895e58f30d48550f6e1fcb34144ada66989306c9cf1456687a1e5d8" }, + { 5164000, "3b71d24045946aac400dfe764fde78dca53f1ddc30a1fe02b627c5a26fa7bf89" }, + { 5165000, "d6e666cff139075f53b0630376f4b1b0c28769192f30074caeb21f7380e2da7f" }, + { 5166000, "c6a6ce3bbd3283287d4513db63f7788a16070384efc3c3f994d590f44b3bda8d" }, + { 5167000, "dcd6f602dd8aeaba60d5d11ac86e9989ed00547c0c4072a4bf1be1ecdf0af798" }, + { 5168000, "86806335945b8d2ac7a581bf555926c4c79546379e49b693f0fda9fd23326589" }, + { 5169000, "e7d65d1af52d5fe206b3781726ee695ff07d56514d0570dd9cfe445425d51e30" }, + { 5170000, "f9af314a616a2fdb05701ce27b80daa8f5a0b9dc90146d6b5247d1057410237f" }, + { 5171000, "b670c6b4f66e3afcb07f5ca72aabd6c7f3fca15a6fe8e19157ede7dba3bb0a0c" }, + { 5172000, "f1870392261afb669174ab8a80482de53ea385569082635e1984d892a51bbdf5" }, + { 5173000, "e5a95e270be8ea36c208002f69da3bbed12c65f4dadea523161b97ead0b6453d" }, + { 5174000, "4fe0e637bb4b3714ba80b31ad3d8b9f39546c028e38191cc05162bba26b99f15" }, + { 5175000, "9274b79620c26cb3f3209f0209c801749b4bdd7312616a77d610b239dcaa43cb" }, + { 5176000, "4422fc28c365ce7352c6b94026e0b1e5094797271167173d69ba540560b05891" }, + { 5177000, "cc6cafd2b236ee778f00dca8eb49fba575b029e022f0d1bc63e51347604c2c74" }, + { 5178000, "627d5a0c795104a9bee2a66bc6e81a5f436e4b3b9410e01a0c68f4587304e35d" }, + { 5179000, "e0da3fc8fa644750761ccd565523e2f66cc790a1956c8cfa7024ba7fab49957e" }, + { 5180000, "d86fc80271793a1824d79566443155ad31d010f5ea6577aa5fef8a5cc36d0e8c" }, + { 5181000, "acb7153788dcac468b240d56715d30ff7164d5131bf6c8dae5055e7375a36687" }, + { 5182000, "c2ac6068442f214e6f187be3fcb72d04d89f1a742e979b002279eca9585ff539" }, + { 5183000, "3395a50b8dce0f599496005456c89e51cfd46ea8bcb90298e50e117ac4d0a563" }, + { 5184000, "56aedaddfa37b4bae80b6648064d2b3f4ed5f1eebd2ef6df139c5d54c11864fc" }, + { 5185000, "07281711f34e034917bb48768bc131b5a0c9cbecf829ee680b1bfbc9b8f1f1af" }, + { 5186000, "814a507e9a1877cbf5dec2bf239fa804f3d7c32f25a3dc5fc8e01fc33588aa5d" }, + { 5187000, "2a2211af39dabe20ccea354d996a5bcfdf8472df5796aebacc3be00ee9a67d26" }, + { 5188000, "46a5c9f4c4211ea2857d6581c9d9dded7515911d8a74d20588b3406c27451e2d" }, + { 5189000, "847056bca80c986903fc60eec0b8f280f974197ef35364f5dfe03f9f02912805" }, + { 5190000, "65adae3958f4f99d19167659c2425e37ca2bd3866ff75e17f8bf3d3fd5f0a0d3" }, + { 5191000, "1e685d230984c0bbd668daf7cf0b7307764fcd73a3c925bd4e82dee99422dcaf" }, + { 5192000, "721100ed92746a717a1e06fb01d0bf671619a30e78de197e7d4d55cb90d96144" }, + { 5193000, "66bcf39c3664571f774ce8166c084b56b216f32d2a9b5026ffb412a9f5d716a2" }, + { 5194000, "fe78b43309f3eec134afc6b8c1ee6131433502bf2c4b7e46d36993e5e8267100" }, + { 5195000, "394ab415e7aa4e8711e21e37db64d7eb64a01a3a1da212b027bf38caa5aea34b" }, + { 5196000, "c792520d6fa59c705e5ee4ff7b03b57c377c25095667bb74bed00781f1348f0f" }, + { 5197000, "6f79644c284d67b89a2081c23c4080aa92c8cd099170d2879b2b9cdb0af3a3c2" }, + { 5198000, "e316edf26f97ccd6a87d7ff9f68c12c65077650ff33193fa488c7d2717a559a7" }, + { 5199000, "52010bc84d103db2842af00dfc8e91acf68dbf8ed75d7912de2038a9ce740357" }, + { 5200000, "3596668ba986f86e7ec94f1a2e33f36c744bdcc83dd372f7fff3910890adce65" }, + { 5201000, "5c68622ac6198b2ee7bb67e37fc4290897b81771e7d6c70a9eb05dc80b2af4dc" }, + { 5202000, "13bd95e31778c970d434d065d61036884d62a2576dc2cb41944120e96b03e77f" }, + { 5203000, "11a5a31aa4485b0104845fa5a7fcb247ca3e3973484b368b556813c42bdb4139" }, + { 5204000, "d3df36e2d3fd952d0c6f87bb8d1d921575b657b1cb651b430c379c1d8668af88" }, + { 5205000, "ff8dd98340cff7c8f09f5f82563f4167e17864568b79e8ee43886e5970d0f0df" }, + { 5206000, "6cb5ce7b6a50f09c9ba81ba9947e56b5df73ac23e78cb604a320a5df34ff1987" }, + { 5207000, "9faf52656bbefd426baacd389ddd98e5653777f4fda93d7a9dde0111b8c0da15" }, + { 5208000, "17a69484d2043cef4e9bd8faf53882f4fa7f959d240c1e1af05d218f58da1da9" }, + { 5209000, "cf48b95d8aa565dbc6ad862fad9d6274a5717a4d1fb786042cdd2db10d7ef394" }, + { 5210000, "24cafeee167c7487cdc5c7cc020c7d49830c4a191a6b73e6b96c89d105149b79" }, + { 5211000, "46d23543f94e773a1ed72300f1bf5297f90daeec7deeb0f7e0d09658177903c6" }, + { 5212000, "b58c4913cb18c67570b037a56d76b0b6f5f02c20f18696789f03bc61ece72644" }, + { 5213000, "a7952c656b87e3383797b502200b734b4dc370a66ec2bf4627696a49e7910847" }, + { 5214000, "4094e3cea6239cc664df2e25f9e272ea1b212977303f53103045457cfbdba10f" }, + { 5215000, "1c54408b34eea526ea2642a840f985261c0ecbcf1003efb26f4204301919704e" }, + { 5216000, "03430578dc5c424ef2372c8456bd1cb55d000592b9d715130a3406c07c88ccf7" }, + { 5217000, "2823facf5daccc2b69beeed1abbac2218b04d034c2ce8df94788f65b0054837a" }, + { 5218000, "831a320c51ae7a3eefe24e0e8b14d770a935ac085636df58983affb6ba56e283" }, + { 5219000, "814603a5fde1946af8817d5ab05b8e2ced09cd38b57992fff8761bb447aadec2" }, + { 5220000, "f1ce1684cf3ee96fcbe59fb55d0ebfed2dbb0c8225d2e87c0fd3df24ef13eace" }, + { 5221000, "01fd9d90eb94bcf27ce9ab0f825856397afa14952bfbdca3586009da4205c9fe" }, + { 5222000, "daa042c9a338f157a1243a6ac16e35fe8cc7efcd7fb540c11de98799372387b7" }, + { 5223000, "f69cfd177b2636726b46da7c0473cf4204f7c170b213f8976ad69286cc90b4dd" }, + { 5224000, "34568e3d95f51888e5c520c5b6421526f46ca2496d3a72b1847dd523d081dc72" }, + { 5225000, "0deb614b0c2e00d73b93fb30a2f7e0d47ef74b6d05884e1f4e9958f7a2f382ec" }, + { 5226000, "1a299c605ef118bb5a04a685173371ba19f656ac0981c5bf2138722b277d9a1d" }, + { 5227000, "c68062c2f514d95a50e92e4244685994193fc9c9db4eb235c5f617369681e561" }, + { 5228000, "5a1390157d86b2a3d10f68cfebdf67b6eb0ae53bd46e04eb94afcdbf3152a2e5" }, + { 5229000, "aa7a645ebdc4b299b3de81bd2028f358e665b75e4725a1f4ef9510a1e1ec9cf7" }, + { 5230000, "41eb4b268043313628cc4e7ca0ba298ceb997a18cc5314bcaed1b976139be9eb" }, + { 5231000, "a1a9cdcd9addcd7b36e52a7566ce289acb46727eef7d4fd760358ccef7eb7399" }, + { 5232000, "7ab0c1651efd375064cfd738cde77b1dc91d9edc5b2966233764dafd1062fca5" }, + { 5233000, "d69095f7cddd632549f4cc2d14093c7965c8285ed1f9e879a072531d93d23288" }, + { 5234000, "2d6742a400917d147fd2e7bb54cff66d520965bd96e7333d19fc52f35579c990" }, + { 5235000, "c9b7670b694246b599767d4229e62ea0e0593eecc6a8e0bd1bdc429890978fa6" }, + { 5236000, "e4421130f8d7123c17ac8995e54815d6ff17b0abc664836946e108926574aa8a" }, + { 5237000, "f440a5e49376e1ed79ed93675c8849929548955cca711f63facb0a5b9b874633" }, + { 5238000, "c002886dc9447059b21927650f0e78de4360580e99fae235c139cc9852eacff5" }, + { 5239000, "0d9af41651c7ed59fce5863bf45a7da0e83126d7c2a9eab8ece53064615e2203" }, + { 5240000, "9c2d6f92f7f32925824d27d8153cae3a0306fb09690a4106e46abbf0a16fba62" }, + { 5241000, "b308a903b6ec3fe3dd6e1a8ab8dc450a1e6a28b651412a01bc698b26f20ea2aa" }, + { 5242000, "5d091b962912ed67f0ceb4a4888de3b05780fb4fb9fa6b1f35b30a97cda706bc" }, + { 5243000, "90f9050bb9103967f5d14282c81250eb94f5235b54737a0fe5f7671f64ccef2f" }, + { 5244000, "cfd202bb99143fcf012f14d49c76ecfc18133010f50b69eb9bc2777d1e686b2e" }, + { 5245000, "0fe0887150d4e4379b213c24cb8fe470e7449d416b4e0a20070e3eda9384f2b2" }, + { 5246000, "b353cbee8e8e8779b62d5ff2d97a98c4af4070732ffd887ee73573e33daad0d6" }, + { 5247000, "28d35f969e6634417bcf09ae731197fd4e26458bc20221e94edf445527e0d194" }, + { 5248000, "8ad472a06b7424cce5bd871ae2484173894986a032522102c90d27d0c98773aa" }, + { 5249000, "030ee59bc440bd04477be29ccd9acab21e38c4b95dbfb975de5834af37d7bc5d" }, + { 5250000, "fc96e8394dd873ecc2fe4751825e52a01340d819b26dfad147f1add99622b7d3" }, + { 5251000, "08f7c7183cee9822869ab511efa691b9645c72210d51b4364728651966175f61" }, + { 5252000, "860dc75ae59206ce31719cdc942b2c18a58e382bf576225af481bfa9a6a22d06" }, + { 5253000, "dcc0c71e0fef788a05ba95813580f3e308f61088ab32ea63ac0a4f2660b0df0a" }, + { 5254000, "c3e182723f6565bcdd3f8e2a5a11c82c8510c28d919dfe9fb0e77c10faf98a12" }, + { 5255000, "a154f1919cb77bb8602b548466bf08573a3c6605b3c9f98beccdba8225762172" }, + { 5256000, "a5e0b9c8381b3b6c2214c01c4a9ccff30620026e508ea6891ce8552de59ad2ee" }, + { 5257000, "c6daac0a72c0fefeef742064c77e36083508e7aa58e721d6128dfd14880e623d" }, + { 5258000, "ad885257ce922bcc645796c24c1ba0cc11607687161b8c2de554667ba591e165" }, + { 5259000, "5c09d1ae40ed18cde36e97feeab753d15c6c7fc21f29e04c85f0556756b7c617" }, + { 5260000, "01b8f32ad9c498c780aba0855f4dc79fab2f785f9e157355ffdb5b8c44e123c0" }, + { 5261000, "a3644053750ac9fa7766ff76d0048d9cd779b541c594b67847e492f610c077cc" }, + { 5262000, "11af92bd791cc6e34a2e3d30f5fac353023dd0e12c1f515d1834a84713c242c0" }, + { 5263000, "04a16835ae4581b5a2a9218d195ba91c7c4f9572cd7f65eb771d4b8fa4fdf363" }, + { 5264000, "556933d0dc2a16118f867c7918fd5969498594d361209688f7839fa7d80d3f67" }, + { 5265000, "02ed73b0deb2f0049ae3eb0e7cb8ff82d4e1b7697fcf7f104e2cd5cd94823bd8" }, + { 5266000, "bc2ab84e9dcde1c5853a9c800102c0efac971a14559c3b3d010cd32be4067c26" }, + { 5267000, "21491fbaf7de0a5a609439bed891e3f209dc62595a2ef5af02a9a1f20690e9e5" }, + { 5268000, "fb1346f74d05b7128f55089df5339a449c15ced72803995c7d8e9b92c28482a6" }, + { 5269000, "b2b9c8dc96bebcc8ad93fac2f128edfa4754317bde943a2b0bfb76dabe24fada" }, + { 5270000, "526e82830ceb979146631f8961d2bf83459c7cf58eaf805304be665fdc6bfdc3" }, + { 5271000, "c250d2c83074707ac5cb2ce08b1943ceef4e2a182c5e33ab1eadf81f43b95efc" }, + { 5272000, "539d81b7917304014f31643064eb62ff2266aba24b55f22d894ccb5edaa196cc" }, + { 5273000, "c303b145421d65a6a1efb80fc318bc6ba6e09dee06c37f062487081db8ef0545" }, + { 5274000, "1c8fe68e45c96ebfb14f250c231a9f2920b120d609a9757fc37cc61e668c70cc" }, + { 5275000, "d5979fdd59aafdd50a40c50690e139289af123fbc86a420af9e72351e1bb2c8f" }, + { 5276000, "4d2c3980cba388e07409a46c91adb51e5c66a146beb0a957cf0742fc90a1aae5" }, + { 5277000, "c0bc19b7d2f41258dcb82d4486df984cfd46f77525e65a117fb93b0dbb13594e" }, + { 5278000, "7a039fdbf2343a63a4cbe029fa957da345cdad27751cfb41ffc814c0b5167578" }, + { 5279000, "4c718ec398f09b39dda69f617a32c9ecc0f3a2976a3b374ad9d7c7333c0e71ca" }, + { 5280000, "d963122fbe78a3c28101698cb7c05b34c4fb9406716aec94fd5add3e38117eab" }, + { 5281000, "85517272a30ece3c63ac3793d1a5299dec95b5d2245ad4f7055da3fd6699d19e" }, + { 5282000, "255820b1d986e15d1f44120fdbdd3c88faac17203b0524dca13ed8fc67bfb437" }, + { 5283000, "164e00f42f9f6608e262b6172ee99941f7289e7e036ef00c0bcbb6ea433fae99" }, + { 5284000, "f9cca9297f6c178fbddddcd54047ec42b21002898f2af850c4d5bed6dbeb212e" }, + { 5285000, "5eac694863b83b518174d79257bba5b4b27154a79ac0c77ce9fdb5f326e0388a" }, + { 5286000, "096faadecce9527b4b73b3cb7e5384e997ea5ec01a90045d23553787afbc3eaf" }, + { 5287000, "f91c79e47b3cf3ecd6eaec0b4e3417dea07856863038fb832cd2346b922d6f2b" }, + { 5288000, "775665db345cbceee9937ee99419c0ebe80d22079553d11e6b92a55abb7af595" }, + { 5289000, "19ebc47f2507d5984fdd70ded2978a2ad8e4e052b85620b8ebf9c1aef17618cf" }, + { 5290000, "a9228d1c491a126f2d166fc64cb4abaa591cd5ece2dc9bcd3c588516d8ff4003" }, + { 5291000, "0ebfa757ebb9ccb15e283b05600479f34382e0e444fe4c705330ae5edb101e15" }, + { 5292000, "e3cd39b22f39897e70646e5227cec355d415f5835caa86d1de24dd53085b0f78" }, + { 5293000, "92a207c3199ea7a7852468c6003e08266eaedd4b1f85988a1094c8d4210df249" }, + { 5294000, "461665b2d49c5221d51948f868876622e1ef9e4b445414573764255f8a84bb27" }, + { 5295000, "b9e555a30e85ad1e715371ff0bbf1c9a3cbfaf6e8a152dbf939c499e198f978e" }, + { 5296000, "c44ff989389a15cdba2907c058da3522d61768072cb1d9cd418edce7e8497e17" }, + { 5297000, "6cd72137e44bc18321b01ee97a7837eac0203b8dcab69a3dc89b103a4a3cc5c8" }, + { 5298000, "a1271b64bde6291202d17b702f88f198ee878167c3165284a62695e21a75eda0" }, + { 5299000, "64418bbcc99ae8effb6a80d1882177a49fdb49a8a0c7723dad58f19f09c7260b" }, + { 5300000, "1efa17e05359640ea5a1cec6b502627a7ffa090a9ddeeb2e326aae97f0ad295b" }, + { 5301000, "c7b413b5d23cebdfc4f0dc332946ab53401ee7631823284a28bd1be4b1ddce81" }, + { 5302000, "bc11251581d505666dd443a9254a02e607772a00ba4ec5a49cfc69a323e98a6a" }, + { 5303000, "fced1ed0576a66d1d2baf1154f4488b1535581d6adfd1b803a53e1db66cf5f88" }, + { 5304000, "3d738f5a3618f207ae41f2ab3b0d92114ce99480c5b2267c00847d435aac4210" }, + { 5305000, "e34b07467abc80adcd553f55a1a2855d23b048747c14d689c6f4bb8e2749aea2" }, + { 5306000, "554e06ae6af7c0f54272008776c4eaf2a7deb9879862279785d5565ca960efbb" }, + { 5307000, "e3550d05653d340353fedc39de68cea432cadf54913a29e34be5c54498f62196" }, + { 5308000, "fcb6b3781a5ca2044e2ec9dd713c54fc8cebed80c85ea5560330dc462dcbcd4d" }, + { 5309000, "273fc620688a617f79489f033f13e6f464148e9e6ca3377c84784ab88c77eabc" }, + { 5310000, "a40c17bc235ce8bd5d9b0ef77f6c86a4d09fddac428bc9bd1a658a48c3f020c3" }, + { 5311000, "3d05e74d5a6c423d0f8a7c3b50fad996096443c594290490e67d5055e8f3ba64" }, + { 5312000, "d699be834e91d34b336ae2c56cdc943d7a8e615ebaffb61793d941cfac34a1a9" }, + { 5313000, "befa26179b8b3354af634cac8d60a0d469a0fa7a3cd6c719e505caa190b62447" }, + { 5314000, "ca7291ef7c99e8afc6f58c1187fcadb65d367b2e053c747fcbadc7f2dc87ae72" }, + { 5315000, "881181355b7c74ef6fcadf080d963c55f7b2b23c442174869b1bb5f6766eb709" }, + { 5316000, "10ca9268c0b536e274c11f93fde934a27a337af632b6587c12a74c44f4b21537" }, + { 5317000, "787e7b229f8db1651ab741d7e4ff760e144f050e89ba8609cd7ffb34e5f5c98c" }, + { 5318000, "ac6a2a38371c1e517f8b777bdf2b5ccbe9341b8476a77a200fc68c47718e40c7" }, + { 5319000, "65f15e969b3373ab2956c90852595e0f325d3a8f78c5730a00fdd092a479e7b0" }, + { 5320000, "4685499fdc28dddd6db23c030375d22ceb1b5ec1b1eebece3029d5b1d674df27" }, + { 5321000, "117689ac787e7b8a0278f65d31f2161f8de556f13b67d82c3f035790b72ef335" }, + { 5322000, "9f213c0c1183cc849db9ca60b2738c266261ed8e06d887ecbfc4f3942aaba47c" }, + { 5323000, "9e59ef44764d4be1df53b81d7ef7375b180bf181c85d790ee6e8d092fa91978f" }, + { 5324000, "8daa3127a2ba51c3edac06dadaa55c2fed3d24b16eeeccb43983a6b7bafa31b0" }, + { 5325000, "6c5c84ebbd206dc4c491d36b74f44d8a97a2d98b98e93cda22b202feae900a70" }, + { 5326000, "8b06d09cc99590ca3b90de66091f0ea02c4bda5d344a2d34dacba4e9a74f40fe" }, + { 5327000, "063c363320539efa5b6b7da3e9df124beb075063aa5f94bc4a8670a62363efbb" }, + { 5328000, "44bd073f50b025400c503be08af7d1297ecf78ba3f4f6fb5db1b1a5a97de48cc" }, + { 5329000, "09cd30931b8828d8111f8974ae79aef05d65afd8ef60877c62ed771b04096264" }, + { 5330000, "921ce727684a6de46b40f703ceb78226a4e0113ab9566b127f55f6dfd37fbb0f" }, + { 5331000, "1df31dfde6a7fb5641073538f29e87b75cf566cbc29a7f18a7f22105c18051d4" }, + { 5332000, "a5c4c042466215d08c806be5c64382349509ddcbdb8b8c04983e4f1e91551812" }, + { 5333000, "ff99a0610da261849a943c94b819b7bd1f8bf7b9c638a8b1d0d60a037ea64969" }, + { 5334000, "5292c3fcf84792e87cd9fad40d101f8b707e61087bd4d9d911071a82668e90fa" }, + { 5335000, "0a7ec01d00e11efa16487447b83e77f4e8a094865cb378602d4726f5a3fc8c3e" }, + { 5336000, "dce4cc15c72e601566ef48f64a3b6fc82f57b74403fcb40373173eb99eca3a5e" }, + { 5337000, "2a8d45ca0e90b6f19156e4c14034470f01bac61849b2a49f39929e6e6f2ac530" }, + { 5338000, "0fab2e36a9fad9bd1c57717513edb50f82b29788ef429dbaeb6ea2e71059637c" }, + { 5339000, "191a45b2d5c1032ec6429c63819421ad47c0f48d5cad105b12110932b8a46d8a" }, + { 5340000, "797c38dd1dbaa596a33e264a64ec18b8fa37375ea1d6c7cf1b2bc10d2713a891" }, + { 5341000, "b790a3d3ea57755be631661e2884e9a8e7392f629a9e933810cbaf809e799664" }, + { 5342000, "925f0a1dc2095d32a07ebde2fd5817e0920cdbf7a124211694b956be0fa89628" }, + { 5343000, "2f48850c0afe381989b4909f46b0b88c049461705e93617db5a8611701aebc55" }, + { 5344000, "013e72bd588928e20cee2413fe1d5ebfdc468c2481c80e9fb31bf7ac386318fe" }, + { 5345000, "f7bb295dcbf931580dc82f07e5716a239ce47bca92eedb1752fe800fb975947b" }, + { 5346000, "2674fcff5775d7c020243d0fb86aa72fdabe42d3467c7aa210b226e387a15598" }, + { 5347000, "4ff64f84ea538ed5bb1f04a903eb66e4d3a5d54f23e66c1a96b7b495bff7df55" }, + { 5348000, "31e23d1c62e981392d65f2db532ab97e7806ab2d58141e257d5e01c9052f17ab" }, + { 5349000, "f0a9fbace1e5849f9c275cb414de69659a7d23ab34384e3d56b4d103a6746fff" }, + { 5350000, "f2c9da46735f7a934e0ddf55e71e454c22d0d0c3618e93ab04c229989b4f0b32" }, + { 5351000, "b131074ce0ea635c42b5967602f7d38e65aadf724bff2e3cfce7b2f1af3c8931" }, + { 5352000, "e61e4cface9e637262db0be334e40d81db88681bef38bc4e12a17c8527627bc6" }, + { 5353000, "0a6a98b4917c5cec314945ea4114cb436de0c3f529d4ce521c610ddd983fdcdc" }, + { 5354000, "81085432c5d6c9f73c85ebfd037ea991cbae70f85f607d098896e794dd91648a" }, + { 5355000, "5f7e09f17f3299ce79e306101146655e5a72abb62ae389df82cb8d1458abd699" }, + { 5356000, "a6ca8079646151d5435567ea2d21214bb5de669e6884a722c2de7e62311926b7" }, + { 5357000, "1d9d3fe0872cadfca1e15515b5b521e2449827a826113ce87cfe5e327ebfeacf" }, + { 5358000, "eab6d0b83b4833310e1cdfe9be85be1fbcd10def07446799f454efaefade761e" }, + { 5359000, "aae85baae3a476d04f0ffc5111b367b55e80c054efedb817da67a6b7b44b16c9" }, + { 5360000, "bf5849c53be86aaeca8b628a19bb625eef4fb49122c1da0b4494f96745043fca" }, + { 5361000, "a803451121a58b49dc187bb24382fd54db3bb2ada6e6f8b62faaee8bef318b2f" }, + { 5362000, "c28437e20b292b4d4c8eb9f8938f6432e411d8fe3c6df7d18a6ab28f9083c0df" }, + { 5363000, "38b805743ab61ece65ab57927eaaaef17ab39962fa17545a0de5cf24b4f7e5d9" }, + { 5364000, "82c5631388751afc169625ba51718a954c0ea68063c9b4e0dc247c96342816da" }, + { 5365000, "bb0fc197ef0fa35212638bc83eb25b64c86766c3b1b14a953e4e37304351a347" }, + { 5366000, "00ab6068d2a15a4d7156c90a55bb9e9fc3d52b7dc8d35e97749a8d4ec05216aa" }, + { 5367000, "b36860a8985783bd3b9713e5d18412b010e784509fa92d6ebf1e088033ddf97a" }, + { 5368000, "d8e410b62fecc1a5759997c9e7e44d1a6e686a7abbf258727646ba93432ff640" }, + { 5369000, "b74972943d1212fda32351c10a44cbadf90ee617de1fe483676d8cf76bf010c4" }, + { 5370000, "7ec833b3f1da886ba3172637af4f1062410c44bc46c30c5af7a46d30224327fa" }, + { 5371000, "85eaa8196940207cf6a75cace58259701e232905a749f3ad65341a22baa68487" }, + { 5372000, "9dcf8ada8d8ac951d93983c9674cb015ac9bc84af72b113f275dde758e09bcf4" }, + { 5373000, "20856e8148d67f88403a647b81644f5f8d47e6a2d4778f725b8c2ea12a27945d" }, + { 5374000, "4acff15b8812a75e4c9cfb5ed49888cda357a6e187cf0cf9cdb03cdf5d77785e" }, + { 5375000, "a808dd5c2a9ca2dee8a927b2261620f77e8f0e822a64e70d6c2852284f0ff6f5" }, + { 5376000, "18db1001b1aae721fc16d8d2ef91aa3db66b11c920f3d8dabbaae3434434b04a" }, + { 5377000, "21484984aa1b6101952fa317e1b3e763408e0a6d64053ae4a2d2be375a84bb80" }, + { 5378000, "7287cce08fd3ab5f1b65acb1c21db04eb9794c748c4ccfed31be698f2288d6ab" }, + { 5379000, "c67d4e940aa379b3e42f5297f5d8d3cf5615e3b2e42e77753396a9b86a0663c9" }, + { 5380000, "2a7b569cd3d67d54f39b8bc7eebd908521e0fcddad837ab7f117fbeee4e5ec1f" }, + { 5381000, "33ef549449ac08d94535c9dd77dc1807c1c2b183df169b5512c35ee4ee5ad12b" }, + { 5382000, "ef6511e6730a119887dd3a579bd381668e5e5cb570e9e2015bc039c2564b66f9" }, + { 5383000, "8941d01163b836289c33b314c3bf5336424e3a833f3c38ad0124dc94002a4eb1" }, + { 5384000, "320ec6cbe943485cc6cba06e7bffe472f544ea87c649cb3aa12958864534fb40" }, + { 5385000, "56836c6f3452d711aaabe73b858dee0069fbf695977518e2e5eb312964bddf01" }, + { 5386000, "65a0eb21684d8900f8ac941412a51ce6e69f1fa39fc622673fb81263a1c7c2f0" }, + { 5387000, "f83f1e2f0e94affa065e1578d678cf0b6d89b2e2f0f15a491e7dc4484afa329a" }, + { 5388000, "73d54e4ed3a0e58867daaef0b28f67a60554b503979e77c6ec3a8666221b8864" }, + { 5389000, "5a58eb74031b81f6b7802fead4084ad5051827f8a363d858f311ac04a763cb49" }, + { 5390000, "6f3f0de9094fb51a452fca0f4d08ebf4cf6993dc3b3a6f174026f2f0be8fa76a" }, + { 5391000, "9768879896f521cdf2364ddaa15cdd98bb97aa6d0b0834081633677bd40b8010" }, + { 5392000, "46eeadd657f7992d92226a69bbc1ddb96fc8d63e724399a7b2d87132fa504dc6" }, + { 5393000, "528eda726ee9cec11694af642884ad81e1698b1230be2807009dbe0786ab765d" }, + { 5394000, "e2f72f839f09e051ea15148e4700220de04ebb79ba4ee20048c948769bdca2fe" }, + { 5395000, "804e715ee148c10013a712b10805b540f36a66d4402e73f684893124ba37965f" }, + { 5396000, "d71cbb4987f368c8451aa090607b707f521f19a98c604c3be02da15a1f814c6c" }, + { 5397000, "c1c8cdf18299992ae157c1900da5a445aa6260dcb33bcf9f3ee5ef0a607e93ce" }, + { 5398000, "5c7e0ae76eff51139df195799bb41cbb2274c18e243f35f1c510139a0df129d7" }, + { 5399000, "1122d0244cd78058e5bd3ac714f873823b41c61c6ee4f6b90d52322129321461" }, + { 5400000, "21956279c52e7f3ecf2c72b8ccd8e514ae54459e03b8b4fdcbb02a81e5916fab" }, + { 5401000, "1f458454d94d99c7c73136035ea522ee1ce3aa47f049567ba9a2fc704aeaf583" }, + { 5402000, "1bdd20d07e15346dfa73a7123ea06bdcc13b854693ee5a17d3f2c9702e06aa08" }, + { 5403000, "9fa37047e61dfb9a5d62f9fadabab29f208dfd6e1778bba86304440b4b26f521" }, + { 5404000, "f17f571ca40e9f66b3f0cce1f6b4333c3e159ca43dcec7ef28bdb3b242ecb692" }, + { 5405000, "99a1656017d730816eaeb327ef0257ef85615dfdb7b7b86a873971f83a864d8d" }, + { 5406000, "fa0c6f5a8ca56b944810f75b78e04e606336e2a786ecc90b726507eb9645446d" }, + { 5407000, "e16e26e3f08d8a0df5b1f3afd1c5e838ec7273a8781a0948403142f16dcd27da" }, + { 5408000, "7fe6d9648d19b7229919fbc1660e4770f9477444ef1a47eac11e09888822fac7" }, + { 5409000, "08e2d5104901c64ea5f44a4dc9485116bd07a94084d9ce09c775089fb4f21f31" }, + { 5410000, "f6aaa5c16b5c4b38792a71d0e08d655ce5e526a1c909254016e9f979951c9ea9" }, + { 5411000, "46e06c001417897d79f8bb77d0c3cc430bbe8604212ede9dbd97e3dda6896355" }, + { 5412000, "1eb76aa5af93a2f5cc2593486fa38ea44cf1c457ba2b442ec4e6702da6783a7a" }, + { 5413000, "bf51f157c677c6d09dd6821f1f71e2dcfe087c0bf75c3a6c069499fdc070c181" }, + { 5414000, "4c83577136a0633db0613b31c91c534ec69fc71d38a39f753b678ddc461259ce" }, + { 5415000, "3df11da409088f4b44a333ac9f814eb3f2e9d05a152e65e64f605f7d8edc093c" }, + { 5416000, "26f14dfd2ef097b40423855037d0f98025c1773f65af6beb01ccde02d719f34b" }, + { 5417000, "61e2454a3394aa6905321001c034b70fdcd6394330d5e8177c11d2d6085ee58b" }, + { 5418000, "cdf8b6df7ee3625446721921415fa570d3213e7a325a09636c1a9b26fb77f165" }, + { 5419000, "3ba37d57bc7f242783a6064446e5cd7944429bfe037fe98e2d42d9bb50432b70" }, + { 5420000, "cdd13daeec0ec8faea285b89a5950e997ef138027bbfef6865d506ece535b1c4" }, + { 5421000, "e904655a9511ecf9b878275dab96ad82009340970cba94cac10faff73da10af1" }, + { 5422000, "fafbed998b0edef1df81c2190db1c62f4542d1a2399424cf4e0bd3a8689e7f5f" }, + { 5423000, "a89eccf384acc67f934dad7d7ccd1b4403ab0d224e8b002a48a8a71eb9946352" }, + { 5424000, "754c707377fcae1f4613bfe72eb081810e7e1029b6cbba99c3b0a72ed971e07a" }, + { 5425000, "a36578936cb6e9ace6d3aee31c35c18da2768eab53177ec0d1a8b57494691ec0" }, + { 5426000, "3b39e0b8e3c6c8462422aab028f4aaba8fc60b450d614c8654acfee7c7ec3447" }, + { 5427000, "fe5e4c6307880d7323da35cd5e40abd04dbcf4ae078b725b97e1a74ab44470ba" }, + { 5428000, "ca8bd3e8905874cec5a0767a8bb61c671da6f8ca8cd37f2b2459c9a77b912849" }, + { 5429000, "4e41949a5d0346cb0a9a3d7e1e95f9a7fc28fe1b06a92a674d7aca5771dd617b" }, + { 5430000, "b2ffeac1e566e6a8fe89b78bf3670bccbec865ece7f5f5a32ef1b7965fb2d382" }, + { 5431000, "b5295612d4723f3d6bf9b7e58cd429c89708e82b6ec6f6ca2d341aec74430598" }, + { 5432000, "d59e9f1542df71808ae6f3048080ec80f29f9ca41aa0105734988b50f30c3f32" }, + { 5433000, "0226b5d74c31214e7db6eaeefc63722d039808e568ec65c680fd036b0c6861b9" }, + { 5434000, "d8fdcb4c42a3515de0f89ea5257cb739f2426a420dace7c20ffefc369d5a5198" }, + { 5435000, "aaf94ff587e2750cc4881fd6337493067ca1279b50266cdc57721bc18aa855d5" }, + { 5436000, "feb745128b58238f86283447427def67223bd35361fac38bd748878e4b23a59c" }, + { 5437000, "472be3180b50b1db1ce9a4bee6ba3439040a11d6def89bf221b61c604ae441c0" }, + { 5438000, "a94cb9d3d096d7b010570d3fc768f77b71c8606b27238fd67c8e31d161d394c4" }, + { 5439000, "79efa36310514aaf064cdc724f05dd7339f657628d66930ac3335818adc55cd2" }, + { 5440000, "eb3ee5af1469b0c5b55cee42a8b68c9b708dcdd7bebec595c02246b455145645" }, + { 5441000, "c1abe92fa04b0f18c427794be29fd649d582f8a9bfebb50bf595f6194085fc3b" }, + { 5442000, "f982e88aa94d5a3a1b49a75a86c4c671c86a2920336bea54ce44f9a53ccba3d6" }, + { 5443000, "dc1a7090fd42ab99f838c9460c5dfc3216435b62403a6a752c86721101bd3fb5" }, + { 5444000, "d503228eba1a10d124105e2cb64e880c3e67d4149a93e4df1c569c890e7b003a" }, + { 5445000, "d181f385b140bcf6083d60bfa84faf09c532ea924ac101f389934a737fd67e86" }, + { 5446000, "d91aad2785710977ba938d2e51420e877cff3f231fb2b21e8443ccfc8d3a527f" }, + { 5447000, "6bf8d3fb879bd6ff07faaf8351665ba0f39a0983954bad7000ea75fd71451973" }, + { 5448000, "193693f24302e4aa05b0e830313eae7362c7ababecc52356a31a5e60d203f31e" }, + { 5449000, "ca9e79086e0bbace545e15a3b4a75d0f5f267957ccff98c383aedb51f8f73eb8" }, + { 5450000, "fc19a8338643cb33128d72ca4fe0ef7248abaf7844a588564a9161ce5490fb20" }, + { 5451000, "a376c948d7d09674adeaa826a5922d03ac25e8e2e863fd18d2a634a00e60b007" }, + { 5452000, "4e272c85ba5c2c8eec983e9fef25127f6d6b60133944dd2744917ec748092191" }, + { 5453000, "8f883ba06b7ab3c5cba4be4de616cbe8b339fe3c8a49e1c76f30a6650ccd145e" }, + { 5454000, "de6695ab222b1a3da8351665d8d23d521844627ee02b26ce5f0c5d4c64f10cd9" }, + { 5455000, "de2477078733787abf450dc6baa329e02cda54284ecdaeaf28439db0b5e50ce2" }, + { 5456000, "16610347c85a1999b5e3886e2ff349a1d6bc5778ff5d719cdc7814fab3dd0956" }, + { 5457000, "ce26d9683ad2a45054c616d13f35f0339a868e22632a433b8d0c6c1d56daa198" }, + { 5458000, "0995438a7bafdec81ec4f5e7c00a952e4c35fe8486ba71686cadae44bc97b162" }, + { 5459000, "829be983cceaf13c2db8fb6d392f7dc907089e738b1d16671a53213e6bd2d8a9" }, + { 5460000, "341d736c40e6ea651c877678f428598cdcde5496f1cb24e5866ed8be7d44c32c" }, + { 5461000, "10fb12dbd286d0eee2c8427d9ba00aba9cfb5be9bbf4b516b863d271bdbbac3d" }, + { 5462000, "a07af8c380a4c6d260a3db52405183607f8c816b579530518a71ef02750cba79" }, + { 5463000, "df49ff37ccdcb86f04a26d38e4f652f41d3419148fe5675a3b37990268f74e12" }, + { 5464000, "59d7300f564b8c4d15f77c39afe5e876373cbb1a8c66642bd156b92e8702c4b3" }, + { 5465000, "94c793a0a30349889f72ee9af3d22ee8b85d02bb63c6b2e4b3640cd0ef825eaf" }, + { 5466000, "33badf3682ab073853bceb5fa903c9afa55ece3bb052a6e38bf36b8338d4327d" }, + { 5467000, "fd459334799102ffa335f6cfad9e033fdd4fb47d57f3a064bbe39b0992077529" }, + { 5468000, "a3844e993078e14f6bc9da2bb4975ead9f7a4d76b91bb3ed9676000460460b74" }, + { 5469000, "6566ce076df8d37d4da0858aa42da30295d12add76374b120b15c920a8d5698d" }, + { 5470000, "202e189e776d8b0d7d9245af6629d8f18c10ef69ebc8d73183a1b7269c04fd38" }, + { 5471000, "71b1b6acf22e6418e8a72f9d235dfb6abe72218782e699e19a1326cfe52a1183" }, + { 5472000, "5c4f230e84c21c25b8ba6b6f45d9fb426291397181f99aa27432559d503937c1" }, + { 5473000, "9a537f877c5302410f3b9f4dcfb491f75b11496a57fc86140712d8ce34ab941e" }, + { 5474000, "fda70f14c11ddc0ba38e44fabf7b42728fb042a749ce63d5d3fc425952897a40" }, + { 5475000, "d01d9850b5e6d6bff76ae3a441e93c671ff20ba7b066e2ea9d734b5d20fc2549" }, + { 5476000, "49d7a2291f05c2dd4648b507db42c3036759a8ac4e0bed40c1ffe05988ebdd07" }, + { 5477000, "164d76bfdc2376483923e67211a0e00dc439a25a682a2304fcd89238982d3c67" }, + { 5478000, "7ee3e2ffe4dd7ec1e2d27c2156cb7786c7c7361af0103aae626d115d2a67c2a5" }, + { 5479000, "57589e7e8d84c7cb1ecbf7fb019fde32b52e578dc8d1ee8dd665359fb97bd513" }, + { 5480000, "df6188f3a45eaaff78884c893a44ce7a43e20f34884ea0294ed955c36334a898" }, + { 5481000, "ad2b81299a1b0c88f04a0b987f80baad3a84bc8825b71ce9f7e01270f5a34665" }, + { 5482000, "c2568020147aff7b4bb23959282af7b246f55beaee949f1f0314fe8bf8bdd309" }, + { 5483000, "7d935836405f2eb2396e0f610ddba98d725046728ab90a79240d6565e57a665e" }, + { 5484000, "4e4e7414a61d20e2c3fbfddaaa68bdcaab58f5e9a4be5f97e5c0d471e5b13603" }, + { 5485000, "5c27eab3cb12b032c6fe2feb2cd1bf21ccab03d176c548df2f3a2f1d96220882" }, + { 5486000, "66dedff26c1ee597911ad991dc91de7ce92124811487d71a13a2dd894806af3a" }, + { 5487000, "30c9a19f24d8b0aa3a7e77e110f121ed7b6c7fc698788406465356b1794b0a36" }, + { 5488000, "f114fe39a0be967ef73faf932ef27f34283be12473f7fc0471ff4b9c198118bf" }, + { 5489000, "b51721c58addbd161a2c9a71d6890ac8d3d5bdee5b125638e5664df1f026c1dd" }, + { 5490000, "cae5a20122b0eb4f794e4644db39bb8b28575b79655e44ce3462f6d1d2ad8047" }, + { 5491000, "4ba8f644adaa11f704ed88625a50927f0adf7b9d64bd63bd57bdb680dfd177c0" }, + { 5492000, "f2b5e0ac5153a6cdc4b0f60b6dd8f55bfca186eb1bb28f61626a97cc463ea5f7" }, + { 5493000, "66ab2b2f248151d0ec91b4da55cdb63b7fc90e1da19def0c2cc0b35afcaaf846" }, + { 5494000, "e8bf884f9068da594d970832af4b00a2836f362898562a4264968167669f7a70" }, + { 5495000, "3edaa78db8271a1063ab1912c8b287aa97dff39b7a002fde5d7022592050ef56" }, + { 5496000, "2c2be01569515b2fd8b1af99906546a89ad5c791fa99dbfbe586da42d87dbd28" }, + { 5497000, "2c30a527be54ff4f4b30feef62bf3e229a9c3ff50377a3d02058b5b9f7e2b493" }, + { 5498000, "b468ed77421e900d2f8d14f9c337f9890725f31960cd5ded15c02a20fda926e4" }, + { 5499000, "6faa10ef38a1dc41bafee4395f142dbbb6149151e96b338e31f9101d4cd76f7b" }, + { 5500000, "0b2fa39ff57c3941a778f3ff18f8492bf841ee538949265756f739b58a597e53" }, + { 5501000, "4b2a8cf411dabad6b2bac64d334d587e2ff8da5368954c2bebc162ab05943e68" }, + { 5502000, "4ed0f1f2dbbabaed0cc65e18f767818c7f6a73bedc61fe074f09d02e03f8de7d" }, + { 5503000, "6cee032af37482de3b7d98e2be950a250164c1936bc18209e953f2480febd215" }, + { 5504000, "a992a12a5cd909fa80727a12d83a4ec885f820d921063f592641635f1b65bc19" }, + { 5505000, "21b725888f6e025794283876b5287ace2c3715b14b059c31becfce12d99aa106" }, + { 5506000, "a87683e62af7813abf9075918ca00f8f42d9aa995bd55123a96c00bba80691ec" }, + { 5507000, "6696b4cc2cd72859095cfb3a1366e005c9bd18b480d75df6bede8585e92a9407" }, + { 5508000, "643f4ce670358ae4bee5497c068000408e41f8a745da231d9f2c6fa1b7fee5e0" }, + { 5509000, "1d216b43a2cfb36e28a8f302f8a04573bd60a4a5f7476175f494034b665a18bf" }, + { 5510000, "25de9ed78f055abe21480ac39e674241fa4eca1eab64732509c977808cdd47d9" }, + { 5511000, "cdb06c5dcda30c58da3f4b9f08100bef843f8b464a13d96e2b10af8f0725733d" }, + { 5512000, "04632b44160722895b5422f493a81fafff3f164ddcdb9bb5741807f80f45de22" }, + { 5513000, "276f61a3ef3f615498a05626e1c122db1253e36a23df21e1cfc3790b1fa01f15" }, + { 5514000, "b56b35df5d86462348ecfe50b3bab5dfd34449cf8cf34d1e8337dd38e18eb82f" }, + { 5515000, "0cf8be6971adb8cf829cf86708f5901cfb1f7da18e484fc5b36b65f30cd45a39" }, + { 5516000, "c2e21fc5e4d9d57a12414b676be3b3926ce09b50281ebf75dbe541907d8901c9" }, + { 5517000, "c89f538270c846abec2cbe311e8f93821754c415dc8a3cf20c4b5f547250ebb1" }, + { 5518000, "282744a10c3a6d9d219671ac17daff5ee65f8c7d6e2140c48c96f13dc9579c95" }, + { 5519000, "def3d12e1e4034bb884d0d38e3092a0889a4eaa6712edceefa40f91f8a0719e9" }, + { 5520000, "1ff24fa1d9dcd7c41776ff87fac6b832bee8981d1fe8b65cc338fb5efede10e8" }, + { 5521000, "43a0b556441b0247291a17dfc319600f7cd66645e840c6c2e17272e543aad895" }, + { 5522000, "4a6022185f154a8623059290d8e9c09ac2e8f1eee9414516d477d747ef0df586" }, + { 5523000, "6d02346a84a9dfc45d8cf4eef457bf41224bec4665bec5b7d711ba0f5d83d991" }, + { 5524000, "2f69dd48662dc854a3c3c0c519275b366b86bea8fe845820763722f9309af52e" }, + { 5525000, "088516428a6f21306bc0c37b0934de94ee10164036d9f1b8d5998a7415655cbc" }, + { 5526000, "038520b594654b6854e81f758f0ba8f684577bfe2854514f36b8aa97b0ff8470" }, + { 5527000, "b5a882d6586b643a7e65723c7692a24c9f6cc129c6e0d3cfadda2ffebe9b2591" }, + { 5528000, "540e559ad2652ffbaa3c8c1c6d48fd1fd1b89e27dcd2363280a9525327b4c3d2" }, + { 5529000, "a37a01e8f16d596217d4e79bc3b01958b99b711c2155afb50392fa4e20f0dd19" }, + { 5530000, "38455ca91de6cf306ee463ad6b2db25325961931778361270953a8edbc3e1a94" }, + { 5531000, "4a8e53254bd514480a3b6b1e5d14d2454242ea4b891aa103541f559b27542394" }, + { 5532000, "a2bf9dbd7d8198c35ac02f5922123dd3469fea5dcf093fa1e93564fe6c3689a3" }, + { 5533000, "303c2ad45b2a4184beaa5649b36d744afaaf7c2403595e038d3468df46ded188" }, + { 5534000, "edbbaaf6072f6acb5e63974a37d92e0675fcb316251abda5fba075b163fbf920" }, + { 5535000, "1b6287490b0252a03452da8b12903f0a3c1cf16206e8a91b22f84decc3107baf" }, + { 5536000, "4483635c88610d6c708247875c981db64c5d8052abf6c2da85b2e5fe630fb8c1" }, + { 5537000, "a5ce69556c1cf41d89cf0a932756955f0417af061f1add84f17f2041da20be40" }, + { 5538000, "104eb3f78ec9320f9a8c98428434e985195c27399a61fd307994787a6401cfb5" }, + { 5539000, "eae9de497525d94f4ce055e258d3be82bb3fb004cf515d3afd9ef232f2a35882" }, + { 5540000, "7d3986f17150f49e2a24bb814743be6788441fbe02377fcacf5c89d8368ac416" }, + { 5541000, "d1cde1db85d0bd78e788cc6a1bc06e9a4688fc4cda105d5c538f63dc98d541b8" }, + { 5542000, "b348663002beaae006edc7caef916d154ae6c1b496ee20d7c165cef9843f3b5f" }, + { 5543000, "5c0ffed08927470c3e5ed3cc7ed09c62d12dcb8455e8c7919ce6b16189f5aab2" }, + { 5544000, "f27e1bb26e00519b095bd64c56113be9ffb23a1ff5bf5fb8332ccfd373be7de0" }, + { 5545000, "fb788d23abccd3015d6e6c48dbc5064a3408338c0313e32684f6b0ce6dce1ba5" }, + { 5546000, "494e77ae90cd832b398a22dd31f96fa5969a6b4f787b15a74716953f7edf22c0" }, + { 5547000, "dda3221e911bb4492a390a24d477d8908cdcba8c067359b4a7f46d0e936720f9" }, + { 5548000, "076e8ed8354403a4a0356d827fa151a46955d10766049d10e94afb49aa502136" }, + { 5549000, "db04d526b5444b235f4b2adb15b18823252e337ced355447a07358aed979a3f0" }, + { 5550000, "bb9a1bf26441f230b04b3bbfe5fc32ee35b6443cacac3f9b9edf32f5ea928fa7" }, + { 5551000, "5b5a9ccf692555ba72ce959ae210435b8bb410ff4fc27ee3d73263432c1b53d0" }, + { 5552000, "5debfa070e0ff9fe5972f46ab6648cfca1f13bee65ee0d7181811210e593f94f" }, + { 5553000, "3a9c54217be24caab51d2275d8774f4c6da8a5623ed24d9d59e88c501950c4ff" }, + { 5554000, "df5d9cfa4ac71dcc4e0fdfe70f589f92a9398965744b45bdd51c7e8472c29481" }, + { 5555000, "92a78e3c4d28a7eb02560a5e72fae81eec9a449c0c1fc2b9ecee81e65ae29787" }, + { 5556000, "357278b459fb36f091790c2d52518bbfc70c21937c62b4dca52699724e6a590c" }, + { 5557000, "1a127d2f7acbcc927d07295fb089268c8259e1df399f5f9575ecb95f17d54b74" }, + { 5558000, "76d2842270994702301d93425f46090563a2081a7d4632a6618873e13aa15b45" }, + { 5559000, "91a294a2df15ff0923fd3c67295e4e6effb96cb136109b55bf6e614bd35edbe1" }, + { 5560000, "d4158d7d21fbd60055a0b5cb780bb6d7dd67d02075ecab029be7286a011c0670" }, + { 5561000, "78d2242948ad223aa01e5eea95a584aa0c2b41d24d2dc42fb204e31a4a1afc20" }, + { 5562000, "dacd9ed94c648d60347c48002274d34793513a3c7b4d9072ddb5c0e115c8100b" }, + { 5563000, "6927a7884bda558f9b5d27177f6bb19e0284d6f04d789b1ba030a918ccae8243" }, + { 5564000, "d28229def359eb0a80f08cd881cf656fc0c783212be7bc6fe0daa4b9e100000e" }, + { 5565000, "847438d24687f2d5906860834a5d350d7dbdbe0169696312e4f605333c0a8c57" }, + { 5566000, "fa724d1a31e1777a1cad514234ea668a3009a8c7c348a54e4228a714606ebc37" }, + { 5567000, "26f831403f59d08a137a54645ff2397801e68fe61d83f171b8ca038122adfe22" }, + { 5568000, "3545a0937b564a7650e21c873cf3e12d09f9ec74bd964a94f3c368c116c19209" }, + { 5569000, "c57fd624e648dccf0c40aff75cf12011b7501c8f8fbe998916127beb3c11c2a0" }, + { 5570000, "c2e249344020136fcb351f4ae0599d2e19245050b82acaabe641d21bc82322e1" }, + { 5571000, "efa1d76ac10c14c7e951a24cc6535a6632a5074ace8e984e206919574bb71582" }, + { 5572000, "b43fa369e96c5cc6333433e11a737fc40f33811083e54b5d9a83fdf50cca4748" }, + { 5573000, "44715d9c36550a9a595663bc8f7781afd99aa8796b516c31416828be736a46f8" }, + { 5574000, "8cad62b7e8dfc8c87aea5343648fc88027c7c05351ab9d902119fb4fd71c514e" }, + { 5575000, "44bf3e50dde2e9165434ee48172b6190ee1cc2fa3fcd75c123f48fb4bd1d333d" }, + { 5576000, "4df747800d05da06267010dbe5933ceceafad44f68d757ec44ecd2b0762c3d2d" }, + { 5577000, "6f03a10557d27abfaf5ea2ec99fc4ed18488ba7680aa3a8fd9b6592db8ef072e" }, + { 5578000, "45cad03443b320aa0e37988461436aee29a05e5b130bd1be3d18624e6ffd39cc" }, + { 5579000, "7e73ec6c975aeeb6b6852d514aeb3c6e338acf9bc7aa33b6a8759f5ba0922f96" }, + { 5580000, "189d051ca9fe119ade5eb7e906a4cfbbbe142e6de49b31c12d24e571360c981b" }, + { 5581000, "2db4bed46ee0cc226d5add6c95fa18f05318c6e49d46c8617472b0533f4fcd8d" }, + { 5582000, "cfb281d42a188f2c8533c8ac43c58e2975121ed086f0d8ff0e751464b5f24283" }, + { 5583000, "67ccd0bbeb6127a46a21e110d97a75fda7b5a0bd4ad274285562c927ec4d10dd" }, + { 5584000, "9e02a834a5a74430c2b94e72f059c0f7fea7af6b554b8a6377032424d46fdbc5" }, + { 5585000, "3765577f7c53d57db535799a31cee0db07d9507e5c12ad6bf869ebfc91d67e05" }, + { 5586000, "2bd65ce137baaf2b08aabf57f0110ccb95096a0325a16bca160e2137285b80cf" }, + { 5587000, "db99ad0648b41a0e883291811de970952497167006db3e9312ede9148e52a981" }, + { 5588000, "e5400c3f0a42131e33fa0e39976e53be86111dfaa682e98fe2e221b09bff9713" }, + { 5589000, "cfc765fd7ba542a3759275a4265a5bf2dfb65ef86406fb5ce3afa94446c99507" }, + { 5590000, "ca5aa6587266842101196c26d90a6ceafaf1ee6f3f7b3a52fe71dd98b50ac626" }, + { 5591000, "f8766199193768df556f6691eaafb650958e5fb9a39f244309f153433179081f" }, + { 5592000, "a55dfc97af32df02a34cc45be261be8f728d85f009f8ecf290732b5380b726bc" }, + { 5593000, "5d5eb6a437e33f074c6a684885fba440ebd2b7dcec4dc7b93da2ed9df33480df" }, + { 5594000, "4d7316c09a94a18f69e7a1498ab88f5f8500a378e9093df7f5d797cbaaa34754" }, + { 5595000, "7d18bcfdf175bb51ebe2b0c159c23a47af8cd5514c8e2123db83534d649ae6fa" }, + { 5596000, "14511ec594721f108d5df1bc764d75922239fe12cb74234b17c6498194d460b5" }, + { 5597000, "1c5ff9436853cffd739f53e31293a310fd702ee9e1059af57fd8c52a4e15adac" }, + { 5598000, "aa40fe93a8082e922e7e76fd5cb0c8573682297d15216f8fcafda9ca74669df3" }, + { 5599000, "c3857c80b8716222424eb1cb25de3280e8d79668312c699a13c27b9702aa8d74" }, + { 5600000, "7966d4855c4bbb9835e828a6a7b021039779b35fee5ae2af6d77508d4ff5b545" }, + { 5601000, "7d7d76f3486a5897b15d13f9b9dd1fc32af2739f863bdd0e801e74c68f39bab0" }, + { 5602000, "a240cafd8ee334acd47ffd3803da6ab77c810bd1679b1ddb68594d8320248c1d" }, + { 5603000, "fb892608f29ae22705ae964d648d8af95b05d7f43eb8df171ac8485679ec8448" }, + { 5604000, "621530da7fe307ec102b100e2e9d2b22d658882a63e145414f11ca0ea513dc6c" }, + { 5605000, "73341c675a782f3493e5497b978d1cfc897cc1d35f7569533e4dbb81ef737fbb" }, + { 5606000, "4c87c3ad00d372d6a1b04c7411f4c1ceac0ae3b88f18a5e8a23946fecc2299df" }, + { 5607000, "6c36fb62dba056b679cdd186d86af0e1f3fe5d11f84a46623e87131939486c72" }, + { 5608000, "1b6fad9dd61ab166462cb71d327f561c7d94f994c140ef31b5fb11bc23f1091c" }, + { 5609000, "55f15711bd80e4262df4730649ba7272839096148b17a9f35dc9b6b00cfe8896" }, + { 5610000, "fb550f35f71a66a40522fc56f7eb9a85ab8eaff664a520c885805a91fb1231ef" }, + { 5611000, "59cec427c19e7be89703661d6d16ec32d8ce189003b8f6d4c5b2640cc8ac5507" }, + { 5612000, "9bdd19b61bbc683f1932996c629d315ac5a44f77b396cd5e15bb9b95c50289d5" }, + { 5613000, "2694328b1090cb1a551d907636de47c1f544bd98b9daeb6c24ba855b18928e57" }, + { 5614000, "ba8d64671e062fa5dfb7c3bb2dd57dd9ffe226c5d12cf7f7b35da0a9437e9356" }, + { 5615000, "c854fbe4f1556751f0ad33f426ca78651227f59fd02662e0614eda8aadc6f1b6" }, + { 5616000, "44db5ef91094e3d76e8b4fee98e2d1c2a5cdd25320088f0f7195de9e8f08248d" }, + { 5617000, "fe794e193682667f234ef210c2e7ca19a9cc1a3256b6dc98bf8b265c5b0157bd" }, + { 5618000, "3213c9e7bb7a670ccd65d79120d3423f689780d5bee781f1d814be0ef416344c" }, + { 5619000, "e75c9276eaf1acc24521d1128401d52ca564cfbd19d0d1e4a0e8d38a3ae1648a" }, + { 5620000, "5c5858d554a4ee738f80bc7ebbf2c8ba5989f2afcc829eac07d731be89646c87" }, + { 5621000, "efd39521bc4735d708cd965500ae7ebe2fa132a154630f932fe6ef7cda34c8a9" }, + { 5622000, "6ada3bffc36c4d6102920aac0363d3aa444abe90190bb1bb02edfb4b85fa7a14" }, + { 5623000, "c04acef94e292ce69638c19ed35d6b3b456240620bb583e53b911f7107e10d18" }, + { 5624000, "312716db931fbcba06e3f279196884b1cd590701575bc54848434f6fc0c24144" }, + { 5625000, "ac5d5a5c98164d08a3a084939e18074a0163bdcb0c1dd28dd7c4c3ec06832622" }, + { 5626000, "6917bc5bd6093918cb0b3fc61281287f2e773dd354112b10f350d480b417f8c0" }, + { 5627000, "c194801ae279533a546a9ed9a6c098bd7909d3a93b9441530739f3dc71f382df" }, + { 5628000, "dc956f28ff8756c9b72a345c1f2b8277434fb317c291ec2e182dcf63022a115e" }, + { 5629000, "aaca9a965824c353ea2c03c2b06f9502c8c5d2c75da9d00b238af21b239e81b9" }, + { 5630000, "56f9bf5f33f3d817f315ff5212b0d6c3305ff58e0e0eb663f5adc0a5e33b34d4" }, + { 5631000, "c6a8f221f2b17c5964b044b350379babfa302735bdb1bfdebfe2d32df04e0de8" }, + { 5632000, "31d24ae96d6e2b0bf78a578bdd8b9a78c69a14f76adc48e0c46410abe6851806" }, + { 5633000, "16e2b0482c1c2b144439fa0f50e5d17582899438215f6fed1ac0d23883f6b01d" }, + { 5634000, "3ccd1ea63dc6d1fc853c4da3690a4e79d52ef672da0bce2ca35a142bb12d5e2d" }, + { 5635000, "046a271169b78e1dffb16d2f82c7c4ca27be987d809b50b69d80c01ef66369b6" }, + { 5636000, "1182001eabcf439ed62d6a5b905c42754748c68413926045b074f8aa2588bb23" }, + { 5637000, "eadeb7c4fea4f1b349d2961e80a00c20488f0f783d8167111f8ade47a9646528" }, + { 5638000, "9f3e64b2057161b7d5f1e4c67bb9f0d6d128b6b6109ade55f1149398570acd96" }, + { 5639000, "9a100245beb64d5e4934edaf888519416e69053ea2e3e186ba734851327ebb26" }, + { 5640000, "298f2f8bd4cc3ecb00a3b1ed7783868ee4f8dcd690592da003cc08f28164e87d" }, + { 5641000, "84e496e208f3279a5ef877fc772f1fb7d8a84e11e51c656e1d0b93b13c2746dd" }, + { 5642000, "4ad075303f144ca607dc6cb66da6388317353746a030312cb268ee32245de004" }, + { 5643000, "4e3723204e3ed76ae0c99ec9d2237044b66d1e19bd55c02f363c4e7b34c2a2bb" }, + { 5644000, "b53b3d48b9e92b25e7fc90851c73817bfebf4b6a4066b20785bed6e1c5c22e6d" }, + { 5645000, "defab34c439caba94fb94caa0aef2c6b60c044c0818554fda0af3490c0877b7d" }, + { 5646000, "a34669a6969f12d9f5daede49124f4a9e7f5b9a9ef1337c942349ed3776baba0" }, + { 5647000, "86f2614cf41533d4d65fafb3c8604a46d79613605882f36222430ec63975f935" }, + { 5648000, "56d79ef8bf1937c891ff00e7dafd029d8e094073edc17f59cb3cf481947afae6" }, + { 5649000, "ff005e36286d3ca8ba134b0b15ce9a8fa43907576876319e159e765c38f4f825" }, + { 5650000, "cf69d269f9145b5cd7fc33522b360b3c7589a31b44c7c57736f4e388b7fb167c" }, + { 5651000, "587f3c81ddcc90c2928c21457270b91ce25dba1fdac8f82aac4398fdb098867c" }, + { 5652000, "e46b3771a2980d4083e4dedc1abd8eaa3077a391a07307b8a065f4ba90cebe84" }, + { 5653000, "27b95f115ce239f0a3a8df1e658c361b5133aebdaf17d4f68caa4ab947023428" }, + { 5654000, "c528465c02fc90006b0b03c1a79f392e55493bd0720e1e6d4cee2667cc49f249" }, + { 5655000, "0335bb261045db7976d2a6c62ecfd45890ffb805a3067079642b8cf3899cfcf0" }, + { 5656000, "4b4fcdd345873f1d7dbcc1ea824cf610699931c07d59344353b4e10af4a802be" }, + { 5657000, "7a8aea71697d64bdf9d9fc29f16a54470905d4107c4bd6860a37ac2f7b03d51b" }, + { 5658000, "9f253de52cc682b178930274fe8797c257f5788dc5a30b27291e1d44c3156ce6" }, + { 5659000, "142231ea77ee3ede0d43a3b47e5c6f3858a59566fdc7bdd2025e04912703bf08" }, + { 5660000, "2d3785bae68f56f50a912568db92dad44f373cd205dbdfaa3efb3c8b0c9ca746" }, + { 5661000, "79e2c3d52b0655a830bfefc6de52cb9c3def6fd2041d18ce4312119c521eda7e" }, + { 5662000, "9fd013d1c3959a43c8f852f0ca96fc3797346c184a81a4d77d80269a17eaa22e" }, + { 5663000, "41e594fd48c2f34d268eadba2c8944e0af37df9105320929571058fce6e63426" }, + { 5664000, "c2d54815f9310af0429fdb607b78ccf96f207e21302aaff0088fe7ec27b5f038" }, + { 5665000, "745aebe277953e721222ec47a2c4a7d41091e9331a83fb8e7f30344476e0a2b7" }, + { 5666000, "5d669e47ee5f1e36c2c802489768b61a0766dacde0609529a1040a36fb41e839" }, + { 5667000, "6e2474a37c6adc1520567ebf1084e46a15e6066b00651c8e0bca06488b4d0216" }, + { 5668000, "c133fbfdba02446417ff18716f590fa14e0e500983c02be659b1eef35c108650" }, + { 5669000, "5ed2b24fbc85a6bee59d8629f0e3959812e112356640b88e040b7e7ef14ef059" }, + { 5670000, "0e2319eece4af1ddfc9e238fed813602c660b8d3ba4c062f3a6ebbdf594d4d32" }, + { 5671000, "f8befb010b210f29044645d87c4edd57f808eec9bd0337b5d573b241c3ec4408" }, + { 5672000, "0a99f39acd64985d933fc7646ff26713b9cc826fcb53082cfd5776e63e0bfbda" }, + { 5673000, "66d9abda7e3ccf394f067ca8be63ab1e58e6965fcc1a21598f61cac4184a35f3" }, + { 5674000, "a29819096103dde605eeb0665c3933902c0918c803302f84597aa744d49a8700" }, + { 5675000, "01cebb3b30e5897e25f18e5b07ab4338c34878145adf04dd321a1719a57f766d" }, + { 5676000, "b1150c1bce5e276f26f9633bc853ebb0d0a2197ad9242c9a8dcca67fef1a5511" }, + { 5677000, "f2aede0564e5158cb739762109dfe3ef2dda671119fd15c48a4b76af9a9f820a" }, + { 5678000, "653a034a0a62bd41727c10164912518beccacd343053992ce5ed80258b53fd64" }, + { 5679000, "3e2e8669eb50c0665089100ce199fb800bb4ff71dafe225f744a8f019fce4640" }, + { 5680000, "193697b8983fab6c47c996958f33685aadbaeec39261e5e67b0eb5ea019b41fc" }, + { 5681000, "d24dc9850b79f175bc62899bf2106c6b81c853f9e1edf65d42610fef0e965a80" }, + { 5682000, "46aadc8fdc7fa5b6f9fd4a95c1193af504fac198f21e4abc7cd9095c8fe001bf" }, + { 5683000, "8264a1856606905b557a5c5c2c30c5dcf2cec64b6fa204efa7c73899899a4548" }, + { 5684000, "de5173f8f216e1c98e579716669362dceece04c49381ac946d348bcc86fc7f01" }, + { 5685000, "9e1a6eef88f1295171c01572c2cde124d2bae27e7a418b10602ffbc177cc25c4" }, + { 5686000, "7a81d5d029688982718548e6ae585cd0d3a94d0104f283ea9baf524d4ecd4c62" }, + { 5687000, "c6cdff250cd97c59cba858379699f48cac859854c1bcbaedff00c9a171dc98b6" }, + { 5688000, "68977e3c08a262060954b31d4c15e064cab63546ebd03cb8b71cf3e879e8612b" }, + { 5689000, "be1952a6b162bbd7bd2f820f09a26cf6181a31f91c7c0df39536b1effafe56be" }, + { 5690000, "75aea3a293c125ea9bf69671bf9ac005fbff3bce5d0e4f700b29c2d525b61c77" }, + { 5691000, "7b6c820470bee36716966a3012c2b8c7bc29df5400e2b64bbb3831f407965260" }, + { 5692000, "ff2fc0ec8557c53598da7e444a40c74d15bc54c368f0fcb48c8eca039248af13" }, + { 5693000, "ba268fee5f46eb20a1dab7bcb85607174e46bf4b888744389d88834ac9d789a7" }, + { 5694000, "c766ca8531529f6b340678f330bc826053f383d70fa0bc002c6d80fe5464feb1" }, + { 5695000, "55ca20e2026a041153ab817bd254fb7c33edf1fe48b1995d887ce327aad2a73f" }, + { 5696000, "6aeee35b1d88dbe71b788557210ed803623ed90503665826341be40ecbaa0ae1" }, + { 5697000, "36394c2e43bdd5f14405a4d6f49f271774aa7fdafde59354b6f9d3934ecfd1e4" }, + { 5698000, "b9419896867a46686b431a878c467a8fa04140dcb9e90e0ccfb08f2b0e6a65cd" }, + { 5699000, "659d2def44271f84c4915ca5fbcfb1171d4a6b2682ba97637c422d869af2127c" }, + { 5700000, "8aa5036343f806cb08cd581caaa5aec716989d17de2c7cc0a75279fddaa5df7f" }, + { 5701000, "ad3602458df2215cfe93f4e39bea902d1532da60863c4904c9c5ba3ccb36caee" }, + { 5702000, "d04a4e6867b572ccae8b47aa1fae59f1f497a8678e476138fb1125ecf87a436f" }, + { 5703000, "d9b220dbfb040336eafc4539493508442e0ccb3d094a4170d9d02ef667f0dc55" }, + { 5704000, "9d1b2aec8e93b6d850a940b06521259053f6c100a0496471d2269572db713eca" }, + { 5705000, "da6c0e248a1cb4baedb340a5d48302ca955fdb23c41554e730b70f69f937af4e" }, + { 5706000, "c4d1e77e4bea8ddf965343399c8ad9054e43f8dc3534e363d47e348e2df9e00e" }, + { 5707000, "471c1412c225ae98a29d0d4f866d7bb7bfeb0e6631c8bc441d12778337c915ab" }, + { 5708000, "5cc2e05f5c1d13095b6afa16da19bb22a4bf1bef289089f5ea632b1e19649471" }, + { 5709000, "4d0cb9718528b82849546f40bf7710f0fe9332fa59ecf57c3837525c82573643" }, + { 5710000, "da0b73a36d141d86183e6119879fbae32d325c4084e1a6bdbb722feda1f07174" }, + { 5711000, "f7839e6fa6e4aa2ba15eb7cbb63d49ccf061d9081e9bfea9d31a7e1911c0c5e4" }, + { 5712000, "c33f7d48fb271f40add38e19335ca96525cb7d8181e46cc3ba61b663a961553f" }, + { 5713000, "690b353cd628ee2657c87e94855edcf5c95537412d9de5475c946b093df412a5" }, + { 5714000, "d31cdf9922219c34f0908db2e1cac113e276dc9b8ba0ef11917d331f760ce9f9" }, + { 5715000, "a614f0bdaf70d4b62d25b6e516c1968dcacd3528b127e0c931af07c704b5415d" }, + { 5716000, "b3204fa04723d804f1e9f3c996042a22dbc1ca6790b5d78fc7a318db4f3ced46" }, + { 5717000, "43ab09f54fa4ee121153d0118cc0c713abe5cf18f9ef50b7456dad9ac28b55a8" }, + { 5718000, "0403e78ba69decc75a7053ebf4d3e84243e732b378f6a61c8b74053b88760d08" }, + { 5719000, "16cf89e2865445996b270e4df7c02567739456bc337e3a11f6ae0ab0e259508d" }, + { 5720000, "d482408673824fc37233f3f4350bd833a2b6a30334a21ceb69b9ce041a5599c9" }, + { 5721000, "a677e6a03a13c3203c8c5a750ca84774e2d9d0a8f995bc427334c27055f60539" }, + { 5722000, "c9a74a06cea9008fc6cfddd914c879fcfd1e0bd604c240a6a7a2dc0d5befd0b3" }, + { 5723000, "1b01082a16e4fad95ca0a49aa914c0b362433086cc4b979430b846521d2e5302" }, + { 5724000, "bb5b5ba969b3142741fdfce938cb66e0e45fe602ed062fad3f11d5ce4f4a46db" }, + { 5725000, "da68878c126859da1e911c8473945d54dcc87ff991659f1db5df651a6b8a57ea" }, + { 5726000, "81ff65b5649d1f9c46d4b9c31ed709b261b055f0c0e2abb35fc9d4ab2f630716" }, + { 5727000, "a38033718b8ca61b2b17b6eb01e739deb4f1071b7f6acbc1432630201a6db1f2" }, + { 5728000, "ce87689fb03710c0f04d4ddf5cd277531717a8da9f01578e6dfb7f69a9b8cf97" }, + { 5729000, "b53c7f1cd9ba3ccfdeae9535b88c336c329b30415c8d06a3c976d1f38028fef9" }, + { 5730000, "ed048b6620e5ce1c5177357db998697b135e348d7f38fbaee52da6c44e37d7b4" }, + { 5731000, "cf01eff170311a0927d04c9d71edb7de79a5e1a1aa099954cda4c9bab36dd93e" }, + { 5732000, "11fe4e296251f32cae0a20ec0a3e72025bd95a94d5979b5ce2354139c5477db5" }, + { 5733000, "70a94d727eb3de14e0c70efde21f6e1a9effc4289cc5bdd1c295518908559871" }, + { 5734000, "7a40a4e02c2bf7a4ea1b0a250e04d58c97011751eb49edf5c1fc688e8a200c95" }, + { 5735000, "a8526caf7aff087803ac138e400f18acaa8c9490e556d881e774b365e7b7efd8" }, + { 5736000, "a40dfbb728c7fe92401c9385e0aa9f381078e97cd3641bf835cac4755e586861" }, + { 5737000, "30c59141fe1ad4a42fa97ac73a33f862c8cfc5c8c009dfc636034fca7bd40db3" }, + { 5738000, "27c3693e48343f5e63c4910d9a6204b0823e0ba40bfbee05a87e03ab22b13485" }, + { 5739000, "4c8b8db9cf66f88dbc459fbe8154889d428a62646a8ff324f62b145c61dfe823" }, + { 5740000, "7a5103f8d47639a6ed94a5a70c3dc0303d4386426d2e46031fb37bbe404109ca" }, + { 5741000, "afd16e3728989660119ca2847efa6649a3fbd491335e7006e16cad54842c5c8c" }, + { 5742000, "c208111b42a9141985ac5caa05d0552d2fe8a2e74e9fd6990e23fc88d433dff3" }, + { 5743000, "0df8d3b48249dc38ef9c5cde690402cf233c7fe4e3ff83693f958f2e7902b7fc" }, + { 5744000, "0cf0210e0727aef64b8bc15c97f31bea1d8926e6242939d57b637000aec09818" }, + { 5745000, "15f7b5cc4541d3c5debbcfcc57fd4854af4c68da74a8566babd64eec1d00cd1b" }, + { 5746000, "d4070c06907fbb6d3a2ae531319daa728ed093984d39ccbe3ecd25c88b37c3e9" }, + { 5747000, "3aeab126dd821a856c803e644f6d0d689b9d90a57d23b49d7428aa8693a42c9f" }, + { 5748000, "4f78f83abd5634f2c142fd108398fb6bf508e52c74a8839a1d04f7945d95f177" }, + { 5749000, "052a3f9df5d912aac4c3fe572d0d6b370c97d2418f109d187016b27e182ddb2d" }, + { 5750000, "2fb9a96155b607fd7ac38b7195988d77961456c905d3f5cb7b9ad0da1504adfa" }, + { 5751000, "11b52452f034b69adc97cd0d7888015aa77ed8578a9ab83ad967a2413e305866" }, + { 5752000, "bfa9c55a2b0d464f1fe02ddda40730074a49e4f0384f8501345fc7c90c6ea74d" }, + { 5753000, "e0be1ae26c4f31fa1f0b2f314c8abd14e4f02dde6067f301775b5de33a57017d" }, + { 5754000, "2d27472cd57fb8470ffc7d6353822be57090af61378ea30093cd4c90e8012694" }, + { 5755000, "a32d2da9d5cbcdbe3cdf5fbec2f5e7797fec473260c4848052c043b8bcc69709" }, + { 5756000, "52099f3b715772d2098c052d8058bc1e81399ab4b5ba5b5b8828cf275d572d1c" }, + { 5757000, "7c6b42f6c7614c78ca3bf193ad15ba8aa013e0d8367ca5cdb29fd56af71bd8af" }, + { 5758000, "7a74fa3517505565a2e765575a43436ca4486dc232933a2012ed14dbd13fcbc4" }, + { 5759000, "3a407b2b5a2b30f5cce4961ab891b9ef5e068ab6228b55add09ef196af650b6f" }, + { 5760000, "4a59ea0a138035857916a17a8e3b8d97226baffaffe2a22133356fa136ba5069" }, + { 5761000, "f4e0b209b2ba3f8bb3abec9a86dcfa0870bb4c2591995358f46de6f049db7c10" }, + { 5762000, "def06f162678dbf520e8408756c10694a02d9784f6d1563a8a5930d7dbf7b2b0" }, + { 5763000, "d8473fa9729db195433f5c4f6b3d9680da38e6d4f4eabcbb6d77ba31b5c70f8e" }, + { 5764000, "8d98510a77271014c7929284c92fad68508dfe28e90f90ac002d0b843ca00ff1" }, + { 5765000, "01424f5749aad879f3d5f5be65ec7044e984b3b5fd1f3afa754af2f83a7bfa14" }, + { 5766000, "f6ab720975970b7da797faedde3c459943675e0063968bb2c7f354c05676b4ad" }, + { 5767000, "5326acf624d042aa12bc3457e12aebdf1d46fa4513ea4a0e9a4c8b84caa2da0b" }, + { 5768000, "8727431c8c8b574aecd9022c4438b9c07b5283235c21acbb54c9da114bbb907b" }, + { 5769000, "83f8ff518582f050cd23defdf2b08a526e6b8d9ea4ed62166c4629812f10660b" }, + { 5770000, "49d0018ac6653b70e4c5f85437cbebec7f15feea8a481b289eaa1ef63e340f97" }, + { 5771000, "acaa32cbbdfc0e840ee9a375a54c58839a77579cadafe2dabc26777d61ea20f9" }, + { 5772000, "a4d3eacc3a69ead1e710d48943aa25ef1f62bcfdc268cd4bddc78cffb16fd591" }, + { 5773000, "f2b3c926dccb11ff3b35b6f12fbef26d5cf100d7dbdae7ca279ce153e0eb5a3a" }, + { 5774000, "00bcca1e18721e8997541f1eaab3600288a59c4e3ac88543c7fada6a0df86606" }, + { 5775000, "04c8030c8c87611a59e3fe0c8825a4fc719f9719fd8411bf8cc239d9dd64027d" }, + { 5776000, "65fe4a291883e47af80e224f4a850e8ab3aae560efaef9ba5f9b2ca3cac0694d" }, + { 5777000, "02fb0e446fd81242492b143c5bd96b214586996028a663a0ae89edf0a8021c22" }, + { 5778000, "45f8f6aefad9b5eaf7a3949384629a90e74866eb5cd48dc0504ca449759e171d" }, + { 5779000, "57ffdbe762fa0b5586bf58c6a6e500789889b3ed9c3460166f2636e76e440e9b" }, + { 5780000, "3bb3fe6a6a9927cc2fe7faeb39ca15312384bb034bfb216ea9198142350e191a" }, + { 5781000, "d8893224e6dca08435f60c356fcf69601e0dc56c8e7e7a399ecf32dc68b1f8b1" }, + { 5782000, "a43cbe0fd1200a5b2c860041f66970116b056db4d2d3be232273d65e2e80dcee" }, + { 5783000, "17ff07ad9f523f99d96a4681ffbb74b0e575c4f0d8203dccc5e395f08e71fb9b" }, + { 5784000, "ab59783a86b1ce5c384a95c147ba355185f1327f5c60f8207a0821bcbdb656a5" }, + { 5785000, "e1f2e130e4fa083a190539518e1881e97148f33f98c2aff1d47acf47e9d9f821" }, + { 5786000, "e856482aef8e77ddb266f2e9b464f73cf981126ba1afd2c0d897b051ef6db1f2" }, + { 5787000, "8c257b3510f28c3a486876015a49e6876ac223d27139607a6ee2ae7595a90440" }, + { 5788000, "69fd492b2c85ce55f307c0cd4813a286915b2228c4fdb30263f7de923523b37a" }, + { 5789000, "d95421ade8f1378a33eff724527efac43b73e33559d6903b201f1c4d0c7cf8d4" }, + { 5790000, "023527cefe66171b3015f43067802752982ddda999f9a00ba0861a5b5b753b8f" }, + { 5791000, "6c83e82060939f26a39de225a9da6afba4b83c5451080b1d794095ddd9c77ed1" }, + { 5792000, "56ea6e0f250bad29d218d11a7e70f6bf77a020b05aa1f381f24dbdf0f17b108d" }, + { 5793000, "54776e9e8a7cf2a343542b9691b3f164bb3ad26e6f3385ebeb243761e2086385" }, + { 5794000, "c0e05f2cc5e2f5ac969cc9fcfd9ded2befa00183a519ea240507ce834d201ee8" }, + { 5795000, "329d66af280863332af71fd108a4e0315915865b0fd7df02cb0c7f7c0ba3cde2" }, + { 5796000, "0c90c933a9d6ea72bbbc0a64e4115b4b3157bf4a6944af4d7a3d44dd1a93faf0" }, + { 5797000, "e06c4df0bd5ee93fce976b950f54f513b6f6a472a0c9aefa12b68be56e240c74" }, + { 5798000, "8805378b3e2d4f92a711508ca9d2b44f7e5b666540c824f63e994733eee32b01" }, + { 5799000, "9b4f33bbd26f18d9fe5ea170d603a720f76e718886b75b4fdbcbce5376081183" }, + { 5800000, "98ba02d82a69f91ec1b4d84d8ba0aa315a6eb25a4eed9f083d71f933d29d3ff8" }, + { 5801000, "0c25841beaef17c5e74f9748c9084b238ceee8c9a470b6fbff13c597421e4f2f" }, + { 5802000, "02df05ad844feff05c934abcc559a385c94fa24e9d541767963031752ddd32d4" }, + { 5803000, "ed5ddcfda23b7da898690778b9ba3a8444a52ebb7bdfd8851bb024f0fe993d5a" }, + { 5804000, "b20dff67543be3a142cee27f7195d6acf12a9c77eefc804d104afc73c711ac39" }, + { 5805000, "64c64c68eb16af832241b7ddd2c624f920ce8059e7acac0d5b997f8f59d144a2" }, + { 5806000, "a28c810e1efaa18196071cb29a520e538b8aafd4755b64f3d4f1edbe7fbf0871" }, + { 5807000, "738ab121b14ecc285f0d08b5633e9c4c5e8516995986846134ad64a344dcd9b7" }, + { 5808000, "d26ad1b607393a55428d96ad694743fbc2b813da72319a2884049766090f078b" }, + { 5809000, "528152cb4d6ef861e1628a225d8e2cedee569e946fb4d7dfe8a03738cba8517a" }, + { 5810000, "b7ffc28bd16f463c9687cdf74890f74339968525bed721c40fa845d6df35f5e4" }, + { 5811000, "5e1191694d41a7df9e6dc229223f3edbd35d21596c15190280c9b8aa8ffd67e7" }, + { 5812000, "f415ee6bc7db90bc8f492f353f95b67964b59326c624bf9f989a9dc1a0b0447a" }, + { 5813000, "eed9341867559bae9453955c42c568a2b5a01f8aa6cf654b94fb0d7acc19a1d9" }, + { 5814000, "56596e31549b89aa6e47e2391b80b750f0df3369c7b5cf07e81ffe0ba6122824" }, + { 5815000, "3c52ddaf7efacee073af3ba12edb5b778cf79b73282f90968458a5ee8781a0d3" }, + { 5816000, "861e5c76fc6e54b82606d1d67bf48fa5bb581cbaff1a01d224804293156d1c0a" }, + { 5817000, "5e03ae411a1155996b7685414941dfa36335cf2fe4e9f02be5f0110850cbf2b3" }, + { 5818000, "40e482aafea013a396734f39bd8c958b7d7d1b46e5650b9da2ccbd3bf9f778f1" }, + { 5819000, "01244257d3aaadcc13e9b1a3c3612ff7ea110bff9fa1fabc43a87c9da7d710ed" }, + { 5820000, "b08d5f50fb98a787a24cd9bd6ec7411a8dcba24dc764f87a9ebb03e032bf449b" }, + { 5821000, "298877f7b2146d6404de1189ec55fb625d71668d21dd73752dabd25ab349b11e" }, + { 5822000, "4bba1e9040ed450f975e32577f7c0e9c55a82dbb9e88953de4d1230714933dbe" }, + { 5823000, "b69320ab914fb91884235ea316c00bd2dabc04a85406b0696a8bf63a4e7ca47b" }, + { 5824000, "4eff278df8f86cfad3832db15d1e7feaaf0ab3db5b66d4ce0df397625d8e42f0" }, + { 5825000, "748c76effe40af6f9da2ccaf8a48dc65416220abc32a65980c27fba396a50457" }, + { 5826000, "7544b39e42abb8e8039edaa18ede885d4c9b5d05bd8e3b9880582ce2211aedeb" }, + { 5827000, "ca0290cd84896f9c2fdb9bed17389c8760192bd221f5bf4a8bb735bb8842d9ae" }, + { 5828000, "206e83e87b733bbf83fd8dc67ee0adb70f0791a0c1bd4435530307b83137e7ee" }, + { 5829000, "8e9f1eba228d2da5de3ec509b2c8a9399125e318da3f6b9c41a3a9070e9219fc" }, + { 5830000, "4ab3d825407f335218f2306b38764748ae17985ee27af396c981de0723ea83dc" }, + { 5831000, "ec4f5712b242e746b08a1e4c2b5969239ee4c47abd0c904d8e81db979aed2d13" }, + { 5832000, "19a41d9855f7b53884697a81f35ae68cfd6bd8c9bf12165047ebf9153d3bc6ab" }, + { 5833000, "5821ab14c83b26859c0c3536709823c1353b20dde1b484a8d44f5742f0781210" }, + { 5834000, "ff732a6f2ddd8baf4325c2ebffff8cb88f3d743ac77ceca2aa5db55a31369456" }, + { 5835000, "604a984d84182ad4d74fc277430033ba11cc1a808a414902be4443a42b8d63d2" }, + { 5836000, "a3704ad919c8d14a080918b8e2c39a4ac6d2ae7e9c575c8967c8442538332851" }, + { 5837000, "13bff322bdc4fbf3d11be9e1e913bf6cdc6a41ff6e7366884997032b7764620b" }, + { 5838000, "6c30bc473a85a0e021f54873d07097965fa8b4b11f022314d72d8445a4c7c17f" }, + { 5839000, "e84c5d7da9bf7d5aaff80cd4ed11b557329d8de1516a2b3bae6c0edc3957a9f9" }, + { 5840000, "d71611d25dd8073f722eb39dfd19deb5bb76bfb95ce70f41876c5098599aece6" }, + { 5841000, "4bb9f2fcebcb15b3f7883262e33c75a06e10e1d698910d903d8b4ec79db7f38d" }, + { 5842000, "2dc9f962e287262f26f7bd01959cc1249955fad5b3ea0333ed609b1f437f66dd" }, + { 5843000, "906909deb805d55acfb6592b3a6f3a87601b1fbd5bbfb4fc8b7421d7faeeb140" }, + { 5844000, "8d4a2746553d518961d270730822de3a75360afcdbd39c719e649937c341a07e" }, + { 5845000, "e1a9d9b598cbeed3ffe00cb8ac19dc01b7fec29aea462d9dadd90b923c58618b" }, + { 5846000, "139e1e086246d97e300ce01d521856a48f2170ad267a77ba2f06773befd33960" }, + { 5847000, "b63fffe2448baafecd2dc88a9f5355e2fd6760314a2f3058819ed014afc1bd27" }, + { 5848000, "72f7acf34d72490b41d1959f12afacf6741ab7290bbf326d6ca16a2942b26cd5" }, + { 5849000, "abc3a17f74bac5a387b13d77ffe35e31306cbab2dfce985edb5e7e3a046d2e9d" }, + { 5850000, "04d8a4cfbef73dd264ff538308c12e9e5fac9f729941653abff030a33d7b4c0d" }, + { 5851000, "c550eea3e7438519496bdef1d215d94c3b90843d5d927d10dd6c32837a6e461b" }, + { 5852000, "b5db42e7a9fa3bf698896caeb260b96e25048cc87f931065ae4cef6d2ce37f1d" }, + { 5853000, "9e0268833b975e8e2a94b905f7cc9077f2696e616836981c0dba425526ac7479" }, + { 5854000, "5a10d1ab4eb8b76b47194d3db1e4f7c33de48bbf928a3c33ccd24c7ef8c0635d" }, + { 5855000, "3885da95209cd3c19b9e73539afdd49ef231bc16f8218073f7ff60bb35379347" }, + { 5856000, "d6c6f432ee1f6e21b90727765751f6682276b8abfb6ff205c7a165e85cc639b4" }, + { 5857000, "228f8c8a97cda77488ecc57ba1a7e92b8bdd2c1ba06b0ad6e7a17b82eb013e08" }, + { 5858000, "b820dfcb2d57be0d07bb8bd2cacc97495d7976edd15391a153b8284539d996ed" }, + { 5859000, "1ec533fe7576d3d63d5ba5c6ab66d5b0d8e0517c499576d18fb9cb6bc6676043" }, + { 5860000, "9f050fd9d6df3e6b04ce677582a29f705a9b13aabe8c428ae21216b3a1bd7613" }, + { 5861000, "e6db3d11441a7e5f951ec3e553864b4b778e9dd27a98ccc5efea4f3c96d7990a" }, + { 5862000, "16bb4defe978820c47c603c9a7428f0a1606ac9ac5875ddbe27951533fa43266" }, + { 5863000, "be9d41796954ad2d0fe245a87e5d4a59dec9affb331a44e31ab88aa28ecc6474" }, + { 5864000, "33af334a2146cea4970f8ace7d01afc8a6a1d63e20d821042a95450300147e8e" }, + { 5865000, "5d73dbe5903e4876c5de2ab0425018fb712a26aad65587238ca7eafe50f66ff7" }, + { 5866000, "a5f862fe3292126f90fecc899b59217b55bc86dc69058d3146c5a3e8cb8f3c37" }, + { 5867000, "7658bdcf17355808e0c4de794641406c82429825a0a1940587383100391379fb" }, + { 5868000, "52045d24451dcb494b1a4e1b4ee2d5587491e0e2fc14d8565a2e6b64166d7307" }, + { 5869000, "bff7eca93985178b90988dd8dc9c4f67d3476c502f0583898f00714bc8290e72" }, + { 5870000, "1f5b7061de297e7e65e65d42c3437b95f26ffc50d2a0c0434b70816ae4be4047" }, + { 5871000, "0388cd49ced9c0e1448a3af5d18e647eb1e345588e695f446f2ba7151610e31c" }, + { 5872000, "86cfb3a98f24c7dd2b216194e1b6205811584407b24aa12a8e438059f56d33bc" }, + { 5873000, "96bee7d2274162d7f13043895de0224e4332359def9b2d74e455503193f27f1e" }, + { 5874000, "42aeca005fe94092428d00b76c0f81cbd938607c5c8b2bf001633048b6429f27" }, + { 5875000, "ae938108d34763435a01ddad9aec82725a191d65dc5d251cca6165eb82867b1b" }, + { 5876000, "c427609c3868c3b7727a27e3891116c48b7609977954719f03034eff3a11e517" }, + { 5877000, "ec03de913c89bbca61ba64d8d870447525f05bac7e1e9c33ccc26f762d204a38" }, + { 5878000, "4963926e68494a5aaf4588496a537733041a29f53ab5b22f0f3f8ad79849baef" }, + { 5879000, "e8a9a21e54545a05418130e2c923e17c95b6ec11fec5af03dfb4958e6bd244d4" }, + { 5880000, "4f895f5e50d307de77d32a2c0b2cf30c288f0fce1dedcb8a3811a69405762601" }, + { 5881000, "0182d485e4a428fc6c6372db8ae9f0f375ccc5a68060770d3dc32194c819a4d3" }, + { 5882000, "817dfc3e435a903d9ed44e1df8347c3f3b766887f4acbb21ccac34210db2d242" }, + { 5883000, "cb3d19b474faed23b3699a5e03d73cee5a6449f606319df9a20621fe1fbfbfbf" }, + { 5884000, "1481d909c02702d07494fa89e0a2f1946972dcb56b65acc683420057a3cd8716" }, + { 5885000, "93fca484bf7a9e5e13d0a930775621e07829a2828c1bfa04c10a072f84a678a8" }, + { 5886000, "365b178994d94cfe81909a1614030f566ae3da03e6399f2d367b4f9bf4b60b00" }, + { 5887000, "49b6e1806a73101386d06fa4cd2a28dcb57cbeb25c3db2ad9295a61fcd9bb29c" }, + { 5888000, "4099d0fe4b7b1b5fb01b4eedcc9434295996fede0da74ab3549c64057763561a" }, + { 5889000, "185ef8b20cfee160bede76fa851c9815e373916e27184833d86b6887e02afcbb" }, + { 5890000, "eeb3953b79f097f0ead2743101d6451d75aca3ae865b2ccedd8b643d6865f58c" }, + { 5891000, "93f418574f3b61eeef188486e6b336c0e93b56998de6bc1dbc59a30be710ada8" }, + { 5892000, "0bf6e371a9658d3c1aec3b2ce858d58c09c5eac894282b82d6b53c5e2cb644a1" }, + { 5893000, "1e6b3ba9c2f1d13f941e47a5e8561dede561819af71986183517cec03a23f480" }, + { 5894000, "dd4c76ff80b0df8535c2d451889246db2f4e865723392ef0b5d7e6a698e7c1fd" }, + { 5895000, "79d3e1ae25bcc9ac554bc3b90d8945b28835176e0b27cb7163b0f328df7d46bf" }, + { 5896000, "e14a9b33e31be7922a30bab27fa5826184bb6a854adeee6db427e9fd8a86f0e7" }, + { 5897000, "104c3665626206d40f18bdc585892b5890fd1f9428cdbfeea05f4498ab9877f2" }, + { 5898000, "63bc0da45477f0d4df994ff84c5ccef3c1d1bf60955bdc7db95972af3e82c00f" }, + { 5899000, "56dc11972eaf0f8863374f8918f2b13f7aacd660acd989818c3525d5cb17f505" }, + { 5900000, "c57e3cd34d9e47f902185c3d185ec3035f7662b573696e27a9da29f62ad952dd" }, + { 5901000, "4605690d24d014f0d6a0584a864f815b22bbc5b40d5d41ad99cc901d5bc576b6" }, + { 5902000, "f1277515ec5b02f2ec088e97729dde504cc11fcec46cac5232bb9c00f70d6d18" }, + { 5903000, "6ade96ca0dd1f1d796c2b11ede8861b5b6c9007e6777a656f131e3f7e2d2ef49" }, + { 5904000, "08a85ccbe19837a03286082ecff00b354bb1a641bce0f94a0255b9c966ef0334" }, + { 5905000, "69d9cd83db0bea668eb54e4ea21077650fd3e814b1aa8c474540591dafd14fce" }, + { 5906000, "9cdf2321a91d52bb548ed71de546fbd92a307d0300b73a177d92db51ff9472e8" }, + { 5907000, "a120a9c4906535cc005bf356051162b672c44d2a902e78892f561f17d1fafbe7" }, + { 5908000, "7300bc4dfe25ce39cd449b58c8bb7d73d4798bfb54e9a44170a52f2b5e048ab5" }, + { 5909000, "6bcff782b2557a6a658cf468a34ab8ec2881ed9d527afe6d1a71ca6073636be3" }, + { 5910000, "c48248c006bb27b3379c7d5cf913a44b800fc47f9f4fe8b1b6a9c5593c804791" }, + { 5911000, "0d686fc7ac363402da0317e5693c888b9dc9ae88c2e42790669770d292dd19f4" }, + { 5912000, "820db9fd0c361ed2188ed15e0abd4b96c56e74a4974c01748e62bb0fe9799324" }, + { 5913000, "4e825e1a2988ba8ed79cc1dbb1565d9a8156b2cca237e2716d33f0d069c2eacf" }, + { 5914000, "28328cf4f99431cd6690ec297a86e817baace9c9aabb26fc1920410157beb7c5" }, + { 5915000, "4e8362010fe929bb2049e99d0da714b13ee28298f0c96471c408825fd192143f" }, + { 5916000, "78b372b9acc6f580e0d286e297eb9006f98b3863b8e438a882d22cc623458c5e" }, + { 5917000, "cce5e1285fdd421f62cee640d6b4bc0a7ca83aaf47f7272724bbfe07cce51403" }, + { 5918000, "19f58f3163fbf79784be66d53aa4638c38617e04cecc7a00072c2c45fea904ff" }, + { 5919000, "94a2ea73980dd0c935b0a13ae8461d34e3cf4ee7cd4706e7c693cc7569ad39dc" }, + { 5920000, "ecee04f5e29219106aed847bbd7359b1af1028df3ec2d88f935a4da4aa23b587" }, + { 5921000, "da1bdd8654488513fc77117f61d4746482a40dfd8db3dd13d23bae44312f59ad" }, + { 5922000, "1390328fcf44195376bcbbb583f65813a1beacdac08fa2d91e65c8428a75d84f" }, + { 5923000, "3453ef9316c5843535d8b7e4b5288e75809c294724a75cda30a04d5c8e279c0a" }, + { 5924000, "f1ff4e27203a4be952a4308d93add9f617a0d98ccccac5bfe750ac106c3aeee8" }, + { 5925000, "a59423d403aaab16174dd1c4e0ffb701cf28581147650f142de71bec81cfe252" }, + { 5926000, "83982817ed5f8346251e06149401c7bf2de254a3fe509ba2b6fbc842aa018d3d" }, + { 5927000, "65dab6f7de1cce3f1bafcb3816110da66c6e3ec2fc073229d1a0dadb8ce4ac43" }, + { 5928000, "1deba7ff15abda2df93bd5ee28821858ed3f8ffdaf248791d2feb3b31f0666fd" }, + { 5929000, "cbfc8b9666ca1bd2c5c757fdcec215feda040be1f904d5c109423d0ebdf618dd" }, + { 5930000, "3fccf9c0643b4f9f1c5c6363700ba9b2437cb5ccb435a82b2bfc93171b604e28" }, + { 5931000, "3761f12c3f6117dc9d3fdb7dc40095f76cd224bc57bbffb0ca52371c2d128a31" }, + { 5932000, "7ae9e162664c21b00e03058df9feaaa7a286938262df4e05751a30864e041513" }, + { 5933000, "1a1f6f8b9d293ef23633ebc608bc163e7fc69af8862d1810c37b20d627e89572" }, + { 5934000, "00b7d03273351b5f8f0f10ab7844d684bfadd2a55988f402d538f7849d78bafa" }, + { 5935000, "2ac144ee803d029cc417f4dc6a21d8ff92c072b271e9aecb07441c0759a78733" }, + { 5936000, "a1bdbcffbf0c8eb2e57df67557e0aa50be913683e86b3cb4a4582139f9d9885c" }, + { 5937000, "06bf7cb9b39d64c2d6035119d4634c9d974ccae5b09bc49ddd9cb09708f7a03c" }, + { 5938000, "ebbc8a43a1a6ce6f3169e3aa0fc5d365d5cd040c1564b3ce23d806ed3356db45" }, + { 5939000, "0c7f3eaf4217a82dac6497165508fc5f8bc8fda653419f29749759e6888149c0" }, + { 5940000, "27e437424f5d7b01b58f029548749a57564459ecd964036e28f814bc4d588658" }, + { 5941000, "697b787ba7ed53fcd78d487fe7e4d165eda87e77574ce678175841c74eddcef8" }, + { 5942000, "36812f1997b415b408f6a09bdbc5720537db38eef98f0100f64b9213fb578ac5" }, + { 5943000, "d193b2ee07d6bf212a2bbc657f68f3c15ed437e31f43a03bb92f92dbf6603f47" }, + { 5944000, "d444d76c5de4bfec6bf7bf98613c00e3afd589603155ab53fedb53e3e00e4896" }, + { 5945000, "13d1ea92d9cf06e9e1932ac8d7f524944b6b27571c7c92babc66c9767b7a32b5" }, + { 5946000, "2cff5d6d681b1f03e2e4fb1ab63ac250226232e1f2f0c9297e20d61b29f5c3c3" }, + { 5947000, "3f64a5f5e61126e72141a9bc2b422e7fa7f193f6e06abb8cd189d3062474146f" }, + { 5948000, "120642462f7b8e4b0e71007fd9c48c8f00aaeb506580722079eb1fb63d1e9dd9" }, + { 5949000, "591fca24c0bf087c33b1926baa930e777a9fe07b6369ba7ccfcd6cdbbe9de5d2" }, + { 5950000, "65f048ebe22c2287dec0039477edb86d4f2135bc5cd690ba8346f849b6ff8640" }, + { 5951000, "3aaa93eff5d2b11d6548c9c84dce76346a6ad569e268e457e20bedaf16a08eaa" }, + { 5952000, "7d4e05aa10548d804910bc147dd8364df20236378f9f18cb741e319ae980fa42" }, + { 5953000, "be99edf2def23c0be840d5e3ea03de17bb401c34a95624d857ecc5c7f7800bd1" }, + { 5954000, "c081123fd35bb56bd982f653ecf6e440843c473e44d0ae1bb4d7d6653936292e" }, + { 5955000, "c3c1dede07ef3af343516a9665a0d80ba1b7ba69f68a0dfe374bb58fbebaa210" }, + { 5956000, "56bf7ab61b0caed0596ad9ea613ac9267cb953d1bc86bc287a07051942c20729" }, + { 5957000, "a30816d6a58a6fe5d64a38c712356c5f9e55959b65785070290cb91f3541346c" }, + { 5958000, "d6f092a18c08fbc5ef123a8b9999d5736e726dcacc15b0858e4135c6b695b570" }, + { 5959000, "133144775f22d454ec39ff59a1cc98bc8e38d401171a8ff98773889da2c72f06" }, + { 5960000, "7a49fe4e8f9298a5081c277308be7dfe91dbf40874e55eab28248347bf12defc" }, + { 5961000, "642313b5d91746dfa80a8c1b3d42207ba89b97b04b9997a4efb68992d81d2f7f" }, + { 5962000, "bb17b93903f727906efec1cfe51ba30ba13a2dcd885cddf24034055220fb6aa6" }, + { 5963000, "d7653894475c1739f96204ad9afa3bd543276a319541ebc377e7a7244b908e90" }, + { 5964000, "24871f39bd15373dc2982b7d302de445325685c74bf04cb319ab556f41ed57d5" }, + { 5965000, "dd6151c223bba5524d23022beff39d8a69f935efed056ac359e0daa2d7bbb22b" }, + { 5966000, "0030f9ed51ece1d3e70c1563aa1ea44ea84dfbae1587bae4bbe1dd4f3610b1b9" }, + { 5967000, "4788b814395c8a6a93903e0c9843b061fb39894ff6baddea6c979f1f80c9977f" }, + { 5968000, "5f6007bca3871071e4a2354c19542ebd7c125da323a1a087f258e2c8d7dca355" }, + { 5969000, "09b01cfb6f4a2079f3cba6d4628bcaab3db25764c5603e3f5479ec0e0a638b38" }, + { 5970000, "7f2c7e4a336fe815f4b4e035e3ae40ac70904ec3a59ac9beeb39220d1aa31ded" }, + { 5971000, "ddd638ea77a2518fa337e9c4c2ff28988abc49dba418e4311f4846a018f704c4" }, + { 5972000, "b2da35755848786f65e25f6254d59835673890a4217de06fc755c6bf7283976f" }, + { 5973000, "8766fa1ec329a407129fa4edffb6fbca2cd5f909cda58b8e38ee19c5015cd664" }, + { 5974000, "de8e94a4d0a81c12f4071f33f4b0b1c5aa2f4ca3a7ee742d88cbadb732ca72ee" }, + { 5975000, "419f77006d55c896a266c2ba56a97d473a41bd33c7720c5c9fec00b3a02e4277" }, + { 5976000, "d2d35cd6176687704dfabefbe618005d436f345f5ce407492bbc65d08ba878d7" }, + { 5977000, "a4971e91617f28953ddaea2334ff9003a3975dba75d060ae2d04ebf1b60c4fd9" }, + { 5978000, "1139213ffb1bf80baa026abf1fc58576da9d54ed41d4f200b3885ccb0e60b5bf" }, + { 5979000, "a6c0a2b610b6fa2cab075d57870ce78efbe1ca0c56a8b8306aad354ed7f01ff9" }, + { 5980000, "220c3f079490b0bb26a266a75320453473dbe5a3e9f919a1dd06f94a5efd5a5d" }, + { 5981000, "8c5eff84a877869f0d5913aee53ae3da6fa0168ee9c0b1c374991b429a41ab97" }, + { 5982000, "f74937cd6ea4eaccdbc498e7ee38eb4898d8b6b6a77ce7d9e276f7f50146c444" }, + { 5983000, "6984b3ec7e70e68a1f41734b58627105bf07c1d7afcb70ac3912cfc84efa5466" }, + { 5984000, "5a5ce31b4e1fa99d7a9a83bcdfe79395d84b52ad61afee0e55fd7556441e4191" }, + { 5985000, "993ded01bbdeb3a989d2fe9615685ce539b576311359684a2a7f837e990088d6" }, + { 5986000, "a560d16d87ea3952c0fb47fd43c1f7dbff6cdec853b85abc7312fa94fd55df83" }, + { 5987000, "11560d429e911ca3765927a88476aab5dbf63cb2753cd2e539d861ef2162e7bc" }, + { 5988000, "05f855b93b1df74da931822394576347c8b2cd6ed2d744d3344bab4e717fd532" }, + { 5989000, "5be19f5cec976e115c94baee973ae5e13b95ddccc249683be2312ea66d83554c" }, + { 5990000, "7a8e6c4ff9fffb423e95654b987a3f8a0173c9121546f89adaf660dd57ad8328" }, + { 5991000, "898f01998430340a16f74b3b9d7093bb807f2e160b45b9b0eb8f63d69e9712b9" }, + { 5992000, "74fedf3d3b96c58684e729d263ce30051714ac4cd227c0749841b8cb3a9c6724" }, + { 5993000, "21a4d65a46bcdb7be95925d28544a5edd64882ac48fcb4a50574ce3a0c53c996" }, + { 5994000, "ed65dbc1e4603c2a7dee5051bf2bbc195983c805f4dba15eab2e7550b2261a8d" }, + { 5995000, "5389974a8ab1c20f6f1cac92cdc2a8ce30ad3eff7edaa6d56ec79524be10cfb6" }, + { 5996000, "a2eff3ec6b29033205213b0440af61b69729f285dbc21aa49d317fa4446b9d55" }, + { 5997000, "34f2b0ad06d407fa9fb011345664ac51a01e1adb839b9aed89d1adf9736c6cba" }, + { 5998000, "2b3ec17f1bb835b633fb589fa43faa970d759e1cd7d7b80fd8aff9b3a6ca2566" }, + { 5999000, "e1c0e1014d41920d7cd8dd833cc477934272556f678b3c8e2882623c0a2b443f" }, + { 6000000, "6b0f77218c7a95404a148cc34fd7b011b0fcd15ce3b70ef2b220145a3f207c44" }, + { 6001000, "157f2f0a9793e74c1a614053bdf5c979654a55b2ffd1147b66fa89da5cc7b7c6" }, + { 6002000, "de980f74a4a5bfb3ac0d807e4713650333a09c0bd34176a3db0c1e902493bba4" }, + { 6003000, "797d448d0270878f94b05abd46f7e8dc949bd6c7b2df9ad7600c012c0753d845" }, + { 6004000, "69bcf74869de0e349c27c3ec2df1a208e3a7cfb74876208d94b044032af5201e" }, + { 6005000, "1e4b68735e755adb4076da9fa8dfb8e69df7d1367cb7fa16cdd7ca113419d478" }, + { 6006000, "c1432d69073669f5dedf10c01141a2e09cc8ff134f159978bd83326c3d704226" }, + { 6007000, "8a3fa06ebca75ba7fb6b3750e8847c7887f4ae3c2838ef4aa472230ab06b031e" }, + { 6008000, "707dec1df100a4590b543ff6558321850974a4e0d3584f6105845299f33aef54" }, + { 6009000, "e054c29ae0333131fb009fd64021f449e8f0ca029c9a4f4fc5b2d06429f988f0" }, + { 6010000, "e70571bc80965b2828c4b1f97bfea74c878e3e4b5a6285b5d1313aeb5bf1157f" }, + { 6011000, "31a36bcfe9eeedfa254d5b3f058e16bee8a34853e92d23a4512b87186be0e9fe" }, + { 6012000, "df258cb18d983626f182a7f867128a98097549289b8294d1f3d8b7dedb0650d9" }, + { 6013000, "1a740bed0241ae0a080b9bf3ef8c26d05060c01e904852b65b53140f1659c2fa" }, + { 6014000, "dd00b72f990083a8bb470c3d779a02ee4597c787e6818c427785ca04db88b205" }, + { 6015000, "e44d2ff57b74ab6e1203d8b6d3e9da18ad8f5e85d032088ff8ea6b606ba8e34d" }, + { 6016000, "271acc98b653600248a0621ac2d351eaccaa8a2caee3d86b4cae7a4c71749871" }, + { 6017000, "b929b8b48a22f29e640ebad9c1010f9ba9d7af8824585965ebd068734c6be747" }, + { 6018000, "9d0945957e41adf68a9c6f669180a61de8f2a685dd1ca125b78fb30773fdb87f" }, + { 6019000, "f8cd5c24db48801d5f3f1ccfb9adf66b4b13999336361f09e9441b6860e45952" }, + { 6020000, "ffe9c4ddb502c4e614ce32866dd110a0acd7d7ee6585e5018cba6100a6a17937" }, + { 6021000, "b528b402608e3c8de5d4a9087b8c66188794e50b3807a861e15fffcd99374abc" }, + { 6022000, "f3ae14c61318ec12664cc93b645b241d9db49172c6d70043bcbd2491b469b347" }, + { 6023000, "6a8852ce0f3c9aa5075cd303546e8c955543270c9eb4225f3ec2f741ad7f1111" }, + { 6024000, "7a4934d72bb4dc2c453bee61f008e39176d0caabd7b12ffe2de780ae93c449b0" }, + { 6025000, "a28232e418371a3336905de18de3f750fb8d4d4290b817bb07dcbd77f67e6654" }, + { 6026000, "053ba52ce8520319dd4f4f4d2981a5e6ead622ad0a67bd5cc64a0807efb58d18" }, + { 6027000, "6cf819cfd32627dab97201efa914f9bcf8cb4080a8f0bc8134e8aa47ccbf21f9" }, + { 6028000, "c2f0e90629a160e7570807775d09002d779e024bf04aa047fced5e57814f8310" }, + { 6029000, "1f737823080e17a95ee58b000c26cd43f4bb6dfe6d0530f74fb8042b8fb9d355" }, + { 6030000, "8088a4cc4b5a486250130812fcf3d0c2d22440a4dab20fb91886ce49732ca0e3" }, + { 6031000, "bea9c675af188a400d20cb69e00b1b3fb42187fd05c129de3e7d8efd4c288c6f" }, + { 6032000, "063827f656ac84d9cabddd0e12cbce64d86f5b313f78231572314381ac2d64af" }, + { 6033000, "d5c51e3def062c6760ff27b12e4b84e38f72a7959857de73c1a5ec5afd2d8243" }, + { 6034000, "9e433b83092f92f5665dff618d871c26ccd1d072cdb71c0f0950ad7f61c2dd32" }, + { 6035000, "7362fac1351d7097c59f84046d5b18f60196d1732ac229d44af529e9a8bddb9f" }, + { 6036000, "fc8830f11b635d74dfdf172f4d7e16afcddb0675266bb34732c02819d33fbfe5" }, + { 6037000, "264c6a82f4e015e2fa3317620d8cde786e2d30f47729745e439c6f2b2708dcb9" }, + { 6038000, "492728950e10faebb847f622191a8b65c9973e7a36dc7651b100a89fc06eed8f" }, + { 6039000, "770865269664a76da46726def82bf2903746dab74348ba6fab3d9a4ef7be76b4" }, + { 6040000, "5e25799c6bf07a9781e7acf6a38c2b16cfcc807414fa0e9c7ae08700e4b9f047" }, + { 6041000, "e1007f8aa3861e127d1ace4ca90a6bdb8a565c6d8ca00bc6b550070e7a543e27" }, + { 6042000, "0851f0fbbcb199896cd60950d6de2a158db6ce329da26b80c0898e5a1fd984f6" }, + { 6043000, "92afb3c2c912b937a15f4c1e3f99e5c3c1e49114b9fe013c80ab00013141d60a" }, + { 6044000, "a4109a7f1ae542d4490e5bfb6385fa52180c1c28767c5e6e95f93ebc0ed267e1" }, + { 6045000, "8b75e3337e0ed12b09ea6a12080d0a6bd77bd018e9f9093f72d25c1e883f92e0" }, + { 6046000, "543a5ce6f2dd46eeefb537bf6ceb91686fb6471486e7b4b9332fafa73c5e690a" }, + { 6047000, "9bd9c989f811bce3d4c5c3ad0ac6ea990943c934418927fd5d1ccc7a9e6ed6be" }, + { 6048000, "e49fcbb9125562e2a07b496093a2c517404b36f57fca4a58b513ebf544033377" }, + { 6049000, "f18e7ab2db4e14699967a18c621f2c08ae6517157323f53905ba2b4920a995d1" }, + { 6050000, "f0ae2583f14b5f021d1070e0202c578710950edfbd0ac1de5249c1d8f35e7863" }, + { 6051000, "2bae8fd53792f9feb0333512debe11c8c942351b83cf4c97d9d558095ab51b52" }, + { 6052000, "0ceca076c85bb7faf0ec97100e9b01314c8bcce6df37d9259b94cb8a0315f87c" }, + { 6053000, "16ac82e5cb38c0e5d0d65556d2a22996f80153a0374c232d0cfdfab0c0cecb5b" }, + { 6054000, "39a597867f56831e8068468ac9229b6d18dce72a67727d691b4f0aeeec97996d" }, + { 6055000, "69f7be279d8d0a2a63111f577ce4067dc1cb38727b69d449c999a06dbfa58792" }, + { 6056000, "ae3f87c5be0b992f3dc49eac5038c58110b7ee2e5d86d977acd7e79310b6c232" }, + { 6057000, "edbf56a266c1faa8cb2718a1f064750080cdcce63b25a26c6657302e5c6cd84e" }, + { 6058000, "70cdae575ecdfbf7be1905d48b28a0e4812d556dc9f8d0d8c57c519ef462353f" }, + { 6059000, "78c2e344355f6f72f78ccf271ea7e53e54bc771e9181c471f57a0373f21e1177" }, + { 6060000, "63e896283d61641e9cb3764d86ae69cd96a06dd0d99af32cc104f3aa8da76a6e" }, + { 6061000, "bdde3c0102795dbc3f48afb86c4704a3b69516a35e152e2031c4e6fc016d798b" }, + { 6062000, "58e111116b87604f9fa344b481e396e1fdbd71d2c5de6cc8bfff7d2028b970d8" }, + { 6063000, "951f3412916e7a1c937127340d8c3b0b492a0d6018787e181c307bddd7e902fb" }, + { 6064000, "81094ac4c544f52f0c826aca0436b7487e3f4c574c9d0365914c2935b9aca2b0" }, + { 6065000, "5a68d0badaabda45e31d049c6cf44a44fba4c76ce9eecc7ed78d9717cc2c79e6" }, + { 6066000, "199e747e25bc86a588bb5aaf2b0297f2afbb7f6e3ce231b0ba43e581c3cdfdca" }, + { 6067000, "355b72ffd1e2bf3815e893570dc9c75cc4183dec8626b1add0ee27ac2dcca523" }, + { 6068000, "d56454cd6d29abcc9fb571e4d89add0dd8e9fd76a2a91096cb07a2776bba30d2" }, + { 6069000, "2597ff0b5155679371159f31fde737f4fdcd8e19c17cfbdedb8708a0dc16625e" }, + { 6070000, "6965271053ab06ac86fc4f6eb7bf5a58c39bfc3318db5ec9c481ddcf490d69df" }, + { 6071000, "15d803c78b9e54119f1716f0bafa1949ffbfbc598d7bc4fa3ff2fa0e8e00204e" }, + { 6072000, "c5c99bb876287f4eeacdcb28a17d096851158dd9b4d40d0231118d296ce16ea2" }, + { 6073000, "8e4d6fbffdecbe44b2777f766b53d8f1c1a845470ffa7521a1a0b969f0edf780" }, + { 6074000, "188cfe17f41a2c891f852c1fe16a52e30d1f18d9279b4ed110685d5948f9fb26" }, + { 6075000, "0749967a6bf828f1ba7e55092370cac05844345127d392696753a18e915e11d0" }, + { 6076000, "2e37b3ba03143a45258c9d674cd7c0efbcac7d1675f2a8b7ca6c9d54c29d99ae" }, + { 6077000, "9208290f7e1bfce0a89d647b35da151250b6262c4aea36e88c54cac3276a1ad2" }, + { 6078000, "8e61e8bb69eed6897d14f0427870b6764aababa491e69a3c8bec7aa886181769" }, + { 6079000, "0f5379510fe04bd3bf6ddd685050954d9a78de0b387a02b875130a60927cf75d" }, + { 6080000, "e0504af3d4de3c5b875f69e153978cbf858a138fb5db95a515cf0e9b183506e5" }, + { 6081000, "d23cd33b2a3b15726ee636cbb61a390520978501e089948649cbdd9a2632d457" }, + { 6082000, "747488c94419940a0459c12add0591c66914dc5370af9e563e6549203f72928a" }, + { 6083000, "f05793b73f30339b1858eac2b6364193b6c73a3fa3d97d7520847fb701f28e04" }, + { 6084000, "bebc70390044071a66f8a59f757e4f224339d2400c977d02cb20bad598ed1221" }, + { 6085000, "f34edf864db017f522652039febe978ac9da88fe7164d34dbdcf2178a1082b02" }, + { 6086000, "f89248c63f50df3c9141137ff4478490fbc4eead3f9c6501043c8dba98891121" }, + { 6087000, "9c3d2a5989af9f4d2a9955b94bd74a057ada11475f6a5a87b2c5ea3d212d8639" }, + { 6088000, "8bbb69b2dbf8fbf8726aa2c51459d4efc5ac25f74f46c4f1b254fa7486aa7456" }, + { 6089000, "779424bcab8d845cd892ecfc1c2b8f603ad05ffa40e3c04d640aa785c1773910" }, + { 6090000, "e917943b5de0e7b843b6dbec5b16dee16935df379f1d65d05f2cadb8c5936d2a" }, + { 6091000, "1b17e8e64764ace50dacb8da6d23ba5002864db4c5b1f79211d09bb63eb27e15" }, + { 6092000, "76e904e7e82bddc31e274161483589ab177e47e80d383324d355a2b323cf7201" }, + { 6093000, "e4060c35a002f58d93f0bc63646a646178ca4f5bd8fa92c77cd95f666e601460" }, + { 6094000, "a2d4662b44f133436141bd9f41628550d292a86fd219f709399a06fa8ae64098" }, + { 6095000, "b3b6939a098bc6f7af226488eeaf5d784e52951811e1e1324360bd91e82c81c4" }, + { 6096000, "002f50e5b6b938b916de56832435bb6e8b7ec0bec43f5ddcc73a7aed1eaf03f7" }, + { 6097000, "ec0d6c072901071b1f910561620fc996ade07ef99ff64abfcbece3ad7d68a349" }, + { 6098000, "6247c5d9fac39b95812a864cc05a1a5f76150c89ce94e4fcdec16c85184d8266" }, + { 6099000, "a7dd032a8dc083d78474bedc627ba20013cdc9e51fb9c248157c79f3241b2f05" }, + { 6100000, "0d4b5fc268c0affc29549b8e2e7f8143d6fabb7f0dbd71c8fce7dd7751c281f6" }, + { 6101000, "c16d3346b3915d7013d3d5c6a03058b59a53c659543d326752b2a75078625313" }, + { 6102000, "166f2cbdbae26f9aa30e90a6fd113f91695068d1b4b5e674383500542ef2e761" }, + { 6103000, "5e40c83857c5647cc1d8c50f267fafe5f2c2c0029b6844ca9744508250c80dcb" }, + { 6104000, "14689d81fa096ea20adee5b27ce757d9ab8cf05463a7220113f35420aba551cf" }, + { 6105000, "74961aea606758bb29c011b4a00240c48dbccb3092ae4adeefe0cd3523f335f2" }, + { 6106000, "08b20413d75ae428e13971bd281244d0f50721d524e292a7dffb1c6b067731b6" }, + { 6107000, "d4eb70cffaf92a666fd6b1c3ade48e6e5fd38e323adde9353e7b9aa1dccbe7ac" }, + { 6108000, "a91a7033f30e42f9d774e272b125747e04855dc21edb2ca0945a6d2a33e2d8e3" }, + { 6109000, "56caeb8598c1e9460798f0a7e79e1c35144a687a469c3d22cf2bd774e3f98055" }, + { 6110000, "4bbecf66923bc5a8b70069d9b90a55b6a89f889912f12f92a4a20a97d56cb2c7" }, + { 6111000, "a9c553fa6d477992e51429cf163fd2c51a5631643bf3c8e978a52dffc053274e" }, + { 6112000, "64fedf56b392feeb77c8d1fee219d77dc375f2ec0e1487cafb5dad3b944d49d9" }, + { 6113000, "6c3ef7ccda041cb97e3f9117e3651ee34332f0ce2ba70330c1c444988569b90d" }, + { 6114000, "a6b922b85c4978d922d53d9a7bdaa21265e7e2f05907c7b14e46260d3dc02ac6" }, + { 6115000, "2c1c86bae363ecd77f6ed7e551fa85a8129ced5adb11a7ddb21e4f132cf82c41" }, + { 6116000, "05d0f9d8790f9049c0281c3e7d20493c0261bd8354a82ae1bbad089e8fc1b933" }, + { 6117000, "718577590e50c8063a7f23026c3c7c621b3888c17aa459e5da57950b0e6a4b70" }, + { 6118000, "d2f49f9bfb3e61205266ca1013a08a6f58e7581a72745dfed12f27cfb0ea73ab" }, + { 6119000, "b6868f2145f5db6aaafd9cdafaf60f91bb0161c9645de83982f14088951b8b8b" }, + { 6120000, "496a7ef08b2055cce5a7f9d1f89a197354ce113ac680d866e4ec86a70fb4fc8e" }, + { 6121000, "500c672b20102ba50bf28ff428dd15725a269e442fecff85e38144fa20b716b4" }, + { 6122000, "543c69ea9f1bb74c9a4737b0bf4b4359bf67c3ce8d7a1906d1236aafbd60d6d8" }, + { 6123000, "ced9f0cd3cc5d442217e5e8cb016f4cd24ee2d3c0a2db334e9e72ee1be34523a" }, + { 6124000, "77dc8ddf5e18b2fcb3b535d8cdfc1c5b456adfd76333a5c0f2ddb21d187bcb18" }, + { 6125000, "193acb5d929c2568f81d8c91543776f6ccd6095a120c5c0cfb959a774a600955" }, + { 6126000, "3f9dade0bdf8dc01ba46b2dcc0965c8e9794fc48c7951c5ed34fe9047915eb1a" }, + { 6127000, "2311a64499b16450c0180f87c34b9e2647727a5a730a74fb2c5637da5aea4a77" }, + { 6128000, "02fb586bae5cd598844539105f051a1592cb4ac203d574f2bffd012f85c130fe" }, + { 6129000, "9178c4729d0703f5a625314d769ca0b2c93a5f40cb95b8788d1bfea15ff5cc5a" }, + { 6130000, "ddf30491eb7640531d66d6565a5bd62a9aee73e28b94a24d086fc45daa528388" }, + { 6131000, "4a3c69ca506bca2446982ce0a2f45659402b8bbea689bede002cb8d883f1bae0" }, + { 6132000, "0c1e1e5f02148eb2b768bd9f3b86960ad1d79824c908f8526e01c5534c71c092" }, + { 6133000, "5b27978a5eb02a8432d693aa7d3b9ac2b16e695e80697a8b92c611b1d3c87c4a" }, + { 6134000, "b74fac142d12014b285ab76a6caf8146ae6f610463048629ec5960ffe5dde4eb" }, + { 6135000, "90c925de21ffd81965012a93629535a473b60e0e994f8909320f209298c9bb0e" }, + { 6136000, "609044ef959746cc97518919af182e2bd284d7188b5baa36d5e0905a40e5e12a" }, + { 6137000, "339b45b45a4e412463bf94c2932b52982bfbeef126a37f7cdbda0d9cf934f043" }, + { 6138000, "17a6d621143d654b36a46142919440386ce8f7b3c6a083ddd4c3758fe15c4be8" }, + { 6139000, "8977e17bf8d63dc368bd0459b961be2890ae74cc5923e92766bff38210a4df95" }, + { 6140000, "c1816015de883c8f2d179151caa7f5998117b4e268c08438801a8bddf746e73d" }, + { 6141000, "16da29a2090ec3d2b6bc3074afbf62a4ea462411a8ef9a328a379b7c26cd3dd3" }, + { 6142000, "f712aa643ca2488695ed67358b22a708351af2523f48cc9c00db8c0172c5eb6b" }, + { 6143000, "3677b79ae4c31064fc7e286299e66a40f132f980be709a09068a168e2eab38f3" }, + { 6144000, "c3ebb5369c360a812a58dcaadb59a62097bc598afdee865bd70588120d38f839" }, + { 6145000, "5997f2393b9c54fdaf69305b79ad74ad65757fab02489bc9a992fd135cead619" }, + { 6146000, "75f27a324d4b867a57d22ecf0b8ff6cb3903c43f1729eb85271ee6637c80bd34" }, + { 6147000, "cdfaab7163181a7acbbe5e50c34c8d90387faefa81bbe695e05521e5978e8f5b" }, + { 6148000, "c141842ce8204f4a60ffaacde0442d1d56e9987c89b92431c510edf7793e9f12" }, + { 6149000, "8c0e7dcddfc126b140cbad767c2b4449e1e1b7268a52f9c3eda85ad83f6de5d2" }, + { 6150000, "dac0ee180ffebf1cf295ae35cb61d07c660004dced7f155a73bbe80b977371ac" }, + { 6151000, "48e14b58d1c021c1169b665f0fef1c3a79fdb4bb98f0ddd51a227d91371d5076" }, + { 6152000, "ce3f9a5fa6f1f8e446a1624e176d55657d1da03707476de47b85e148879ac9c5" }, + { 6153000, "5b66e7f118ceffabe4042a553168528f9b6fe1b051d5db69ce460a3835c1a540" }, + { 6154000, "b5d2131bca10a6a78b72b719263a1812af33e6721285ff9a7911d917363f439f" }, + { 6155000, "ead38411226afde560705995a3c4d003fcb1d37afd7f71c0e14925ce2545d725" }, + { 6156000, "b0d9f210372c72af23b6b7b80e398e6116a633427385555c1784c6da475becf0" }, + { 6157000, "ec8543155239455e66384092400cedcf21c81c5f4adcf7a8d7488a6754b19bca" }, + { 6158000, "ba251a521e7eec45b7a5f21ce5d9b8fe99309ccf1a721c96ccddb38d5e0fc656" }, + { 6159000, "1572fb130a3a463cc14e03f48ed9fd46dd23e25cfa935926ff69c526c0da470a" }, + { 6160000, "972d32261388d8fe8196cc015937635720d7da2ff3ed5646375655cd8503a4aa" }, + { 6161000, "cad1474628c8c671c9d792c7d65286653dda9799a22d5ce9b9cb22437971df9e" }, + { 6162000, "255effd5487fb9425247713c4f343bf26c5811c4acc77f27505b306d713034cc" }, + { 6163000, "be950bdc2a4bd2eb3aa300685ef90df2b4743591a08cc6b0a31bbf5909ab59fc" }, + { 6164000, "dc99e8122bbb244026f361a1d4c2fa7397e13f17fab0fd3ba887e7d8eb5ef257" }, + { 6165000, "c73a75e8e042f28cfbc8abcb5ea9bc40e6f7723f73b20b47672287ee9781046d" }, + { 6166000, "6065d6f4554a97eda9a9dca4b60156e11d6856a6ddffe64197b5bb5941f44840" }, + { 6167000, "cd749602cb3b1b43bff05723c81215213bc68c71fa33439db697111b7b376969" }, + { 6168000, "81d1840ea4f861f11e8a8ae80ae6c1307463a92efa55d1b054c984efbf6bbd2d" }, + { 6169000, "dd30a97b6069a6b6e92c8605d7ce5622a19315e113ba550a391d53e36e22beb3" }, + { 6170000, "81c472f7073f05ead36c5e4aa9dc162ea26107d74180f00387ac90fc6540f717" }, + { 6171000, "cb2f969e3370af289dabea55b4d22f1bec4b942fb85ff04d9ae5d6c8ac445d0a" }, + { 6172000, "c1a8d500b6e389370771b940cdca54118593b3031e38c7206a32d5d6d852b365" }, + { 6173000, "5a94106b8dd5e5d82f607d566ae2bcabe2f47f0f5bb7c25e9f4f229615eb9962" }, + { 6174000, "4b564bbf1dc09b631b53cdb3a4d854906f2f76181c04f772dc552a9ce301f5b3" }, + { 6175000, "1986e9bd55b66c19094be103ced76706ff5e0c4800f87014139feced5c50b2d7" }, + { 6176000, "f1801743205864729f9eadae01e395bd66e09d73dbddc7b84aada1b817c332dd" }, + { 6177000, "dd8a6d00a6287ee9bf32c0fac0a58e7aab69fec08b67f8ccd5ec8a94f52587c6" }, + { 6178000, "f69052e08781bd70c1c546ef01cd0dde79e9bf6299e80cab3b4cc4d4d37c251f" }, + { 6179000, "dd911dc465954d5d79ef27b757b991fe15ea7739ee74c166bc87fe9cacda0a76" }, + { 6180000, "d85058ec5d35f66afeb70722410975dd25436669c31280b37f32f2e235670536" }, + { 6181000, "eee037023b3522b3e5153a20da84c2876e7873df2e66e0b2e320cde62aa3c1ec" }, + { 6182000, "ee94215286236538ed54d5a29d99f60ab4f603f81b71948301c20b85eaf9d93c" }, + { 6183000, "3c3d20fd4af204a2484734f88c5c577b9bd3d86bf2e98bde8118d5efa2734b47" }, + { 6184000, "a3b6266d7f5788984142618039929fe2ed4f4e03f70d7428ffe08826c075b2f3" }, + { 6185000, "3a81a787c64f0c01a7deb1c61c7cd2059e7d62807d344a30070743c45ac6ebc5" }, + { 6186000, "1252f3de7a55064440f51cb351f3aed2588b39626af40940aae6f22703c99aca" }, + { 6187000, "8fea78a7898eb13477fb8a04756a2e827112d178220d156854aa4455c281e8eb" }, + { 6188000, "98c6bce09be42aae16ae233a8f34ca2b565c8ad3ca24c87f33146b638b94bfed" }, + { 6189000, "55c7859b03df4169b4a91a05250f510bcca4cbff7c295df7c8e5dc63cac2703f" }, + { 6190000, "86e175f896589a062942583868dbe1c418ab8922c5fe6096804ba165eee32e50" }, + { 6191000, "eea5b490931af375e4c6e03a3f3ab8a80496103a5ae5ab15ba3a48867cffb33e" }, + { 6192000, "8eea132dd647b047eed8c4e6a443aca3d413b5ddd6d64942111c27047ad62d31" }, + { 6193000, "b8542097e842af5dc97395d9204d1298ce73bcc8e60934f6d65901665054c332" }, + { 6194000, "89d5d402b9113fe3bbd18c48796787b94923a1c3bc34054b11f1d084444ec349" }, + { 6195000, "3ba0c573594f7eab06b207ce7e770381f71e0bf0360c870aeefe13c584c9bb19" }, + { 6196000, "9590dcd792b6e9924aef33037ff7f5cdd3df0aa87656553fb64e10023a6c94be" }, + { 6197000, "34264ae7688274325652ae8c20c529677a5ba9144a40c076b96f060d8b08bd40" }, + { 6198000, "f29c48bb8c295594c959d8d09aa72e064d2b355603a3ee9b8159f7ba42cffb4c" }, + { 6199000, "129ff29abf77495f1248a0400c02d229480b67fa04247ee812d2ed66e933bac1" }, + { 6200000, "b56a4e462182208430d89736df4cd4f42fa3ba9f47bc43ff8c373ab0623c74ba" }, + { 6201000, "99edc4b98f74e0395f5781f536b953abe71cf36a841cbd32fc3f8e10b87f4c5e" }, + { 6202000, "0944ae37fce54d015bc7e940b42d62343feb376202bd30f925080549f5c51f9e" }, + { 6203000, "3637acc5aa37c26fa661cd63674676bf596708821ef31f792f07d2629bc2a0c5" }, + { 6204000, "7c7934438db8b6411e7b8c39acfe9e9292b602b21037d29d9b82da8e55e3c835" }, + { 6205000, "12ffe18a2b1671df3995391e4bc0831221cd8dc4bfbf1f698ad02ace34c27e87" }, + { 6206000, "9a7953ecbc3e3c40379f0913f37df2247ccff1209c3838dc6ffcb9c98b7dd949" }, + { 6207000, "e14d854533d8277eedebadc550b124f84f2bcfbde690a2d2a9fcac0f20d09260" }, + { 6208000, "a1e5dc58d6b2c4e2b21f3515a94a4fa8a12964bcf75c216959e440b7f355bac9" }, + { 6209000, "47d0dd8e7e6ff0d953f0bf8dded4535147f036f1f83b949f678a6a8a275b9d88" }, + { 6210000, "8e967a41c0c4dd69680bc9ce2aa0b2821965ed2d19264b35685063f0cd4d823a" }, + { 6211000, "affa94997895f9ec28c70dc2779ffb1df3985e62758a504e3a6cfd28d5a00957" }, + { 6212000, "642a96b0da3eb121ec58a1c680c1fd0dd82b4ab174496bf57afca3e5bcb082be" }, + { 6213000, "eced61c107924caa682d8b9b55438f611bef183a101668fefa793a3d8b4330ad" }, + { 6214000, "e6353d81d503787459055dc21f1dd763a3678d33b5a931a92507617ba61f04a4" }, + { 6215000, "0b95893d179b9f634b5def14654489f0de006907c9fd55b72981113326375435" }, + { 6216000, "053ece771ca6c4af1937519638a2fcc3b7df89d9c8592aba073029905947debe" }, + { 6217000, "406e92d47dd01351fe14bf9160e297224e9e29f50230c2b4fe7fc0d63b869d99" }, + { 6218000, "78748128bdd51981faef28a0fe15eeb3a3d32ba34850b26c2609375cbc2e9212" }, + { 6219000, "41b0c86440ca203511c9aa2f62fe2f61e913e0b8fbd07ad0ef5753f8b89df311" }, + { 6220000, "fae33d2ca3bb83b57e91ec87b603d8ceb11858c1ca015b1472bd9b3c5acd2400" }, + { 6221000, "d655372c0e5125180c3a35d46a25aeeba4927ac2f6b12b9dbf2709d44d7c2af4" }, + { 6222000, "117eb9e784072bf039bfffe2c2e1477b993659f715a9e128262ef2cef6bffe7b" }, + { 6223000, "e181576b467b6ee047b86182411321d6b7173a8a4b129db4d7fb719c0b5a7009" }, + { 6224000, "bcf8f07b004739b8329c29e7d9a644ab469af3a34e56cbe421280d45317fee55" }, + { 6225000, "972ea0220361e5bf65d5e5d1ef7fa2f6dcb819e6c767453ce0303e6fd9668198" }, + { 6226000, "8c5389665db6b36e6bede3a39aa34ffb3e4838ae49170c6d1e6aba26e2db82d5" }, + { 6227000, "1041d8c510124ee3ef984878d27fa8d62c9e540e0eaf6f19668946a419c4b2a6" }, + { 6228000, "7c116477b6ae592f721842a13bf7b40d084479f15b9ee1ad8259806ede5431a2" }, + { 6229000, "5a91311a04b843734ed3d6202bb7b81e3bc07aedefee80d546fc677db675debc" }, + { 6230000, "a10e16fb4567c1710e49191efc28b57cd1dd4507d99dd0b7b4669c2bc4afaba0" }, + { 6231000, "b7e61ad7adf6b30101fe2bc09a2bee799da9e6a810a2ea151cc0100a58ff9f6a" }, + { 6232000, "440fd9566e663df265635368a4d7b98edde6e1a51eb8bef5fbd22bd6fd68fdc5" }, + { 6233000, "33f94bc6a7a78a65d5a0070d9eb92f898b5600efb78dcc26a2233fbae8ba8ff3" }, + { 6234000, "3d4939458fbea760fc83ed26d19a432b6d9c34c2a00b53332b8c0831e13d9b47" }, + { 6235000, "28c7abb10a5607862e4ea3d43926e350df0cfdbc62136ed7cff140b9c209b825" }, + { 6236000, "845c44cc6459616fbf3ccdd84e6cfeea87a752d017142aff31715394b4066076" }, + { 6237000, "4c2e6be4a042b6ab341f329820bd1c812ad79db20f961bf83d2320de5ddbd07d" }, + { 6238000, "85fd5a093a29a978d628afb35074ba0374531a0aafdeb1fea0f3f3c9bd962f06" }, + { 6239000, "b71bd7595e0ab26fbcc456a583e20689942276dc2cfe4cf2a42b454123a85af5" }, + {0, NULL} /* sentinel */ +}; +const size_t dogecoin_mainnet_cf_checkpoint_count = 6239; + +const dogecoin_cf_checkpoint dogecoin_testnet_cf_checkpoint_array[] = { + {0, NULL} +}; +const size_t dogecoin_testnet_cf_checkpoint_count = 0; + +/* Regtest has no published filter-header checkpoints: chains are generated per + test run, so there is nothing stable to pin. Left empty deliberately. */ +const dogecoin_cf_checkpoint dogecoin_regtest_cf_checkpoint_array[] = { + { 0, "0000000000000000000000000000000000000000000000000000000000000000" } +}; +const size_t dogecoin_regtest_cf_checkpoint_count = 0; diff --git a/src/cfheadersdb_file.c b/src/cfheadersdb_file.c new file mode 100644 index 000000000..b25127572 --- /dev/null +++ b/src/cfheadersdb_file.c @@ -0,0 +1,561 @@ +/* + + The MIT License (MIT) + + Copyright (c) 2026 bluezr + Copyright (c) 2026 The Dogecoin Foundation + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES + OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + +*/ + +#include +#ifdef _WIN32 +#include +#include +#define MKDIR_ONE(p) _mkdir(p) +#define CF_FTRUNCATE(fd, sz) _chsize((fd), (long)(sz)) +#define CF_FILENO(f) _fileno(f) +#else +#include +#define MKDIR_ONE(p) mkdir(p, 0755) +#define CF_FTRUNCATE(fd, sz) ftruncate((fd), (off_t)(sz)) +#define CF_FILENO(f) fileno(f) +#endif + +#include +#include + +#include +#include +#include +#include +#include +#include + +/* Magic bytes and current file format version. + * v2 format: magic(4) + version(4) + genesis_filter_header(32) + records(N*36) + * v1 format: magic(4) + version(4) + records(N*36) [obsolete, triggers rebuild] */ +static const uint8_t cfhdr_magic[4] = {0xCF, 0x68, 0x44, 0x52}; /* "CfhDR" */ +static const uint8_t cfdata_magic[4] = {0xCF, 0xDA, 0x54, 0x41}; /* "CfDATA" */ +static const uint32_t cf_file_version = 2; + +/* ================================================================ */ +/* Internal helpers */ +/* ================================================================ */ + +/** + * Create a single directory, ignoring EEXIST. + * Returns true on success (directory exists or was created). + */ +static dogecoin_bool mkdir_one(const char *path) +{ + if (MKDIR_ONE(path) == 0) + return true; +#ifdef _WIN32 + return (errno == EEXIST); +#else + return (errno == EEXIST); +#endif +} + +/** + * Ensure /filter/basic/ exists, creating subdirectories as needed. + * @p base must be a NUL-terminated path with no trailing slash. + */ +/* Build /filter/basic/, creating each level. + * + * The chain component is not cosmetic. Without it every network shares one + * cache: a regtest or testnet client loads the *mainnet* cfheaders/cfilters at + * startup, rescans them, and matches mainnet blocks its peer has never heard of + * -- then blocks forever waiting for them. It also writes its own filters back + * into the mainnet files, corrupting them for the next mainnet run. */ +static dogecoin_bool ensure_filter_dir(const char *base, const dogecoin_chainparams *params) +{ + const char *chain = (params && params->chainname[0]) ? params->chainname : "main"; + size_t blen = strlen(base); + char *dir = dogecoin_calloc(blen + 32 + strlen(chain), 1); + if (!dir) return false; + memcpy(dir, base, blen); + + strcpy(dir + blen, "/filter"); + if (!mkdir_one(dir)) { dogecoin_free(dir); return false; } + + strcpy(dir + blen, "/filter/basic"); + if (!mkdir_one(dir)) { dogecoin_free(dir); return false; } + + sprintf(dir + blen, "/filter/basic/%s", chain); + dogecoin_bool ok = mkdir_one(dir); + dogecoin_free(dir); + return ok; +} + +/** + * Build the default path for a filter file and store it in @p path_out. + * Caller must call cstr_free(path_out, true) when done. + */ +/* /filter/basic// -- see ensure_filter_dir() for + * why the chain component matters. */ +static void default_filter_path(cstring **path_out, + const dogecoin_chainparams *params, + const char *filename) +{ + const char *chain = (params && params->chainname[0]) ? params->chainname : "main"; + *path_out = cstr_new_sz(512); + dogecoin_get_default_datadir(*path_out); + /* Strip trailing NUL that dogecoin_get_default_datadir may append */ + while ((*path_out)->len > 0 && + (*path_out)->str[(*path_out)->len - 1] == '\0') + (*path_out)->len--; + cstr_append_buf(*path_out, "/filter/basic/", 14); + cstr_append_buf(*path_out, chain, strlen(chain)); + cstr_append_c(*path_out, '/'); + cstr_append_buf(*path_out, filename, strlen(filename)); + cstr_append_c(*path_out, '\0'); +} + +/* Legacy chain-agnostic location, /filter/basic/, used + * before the layout was segregated per network. Any such file was written by + * whichever network happened to run last; only mainnet is migrated (below), + * because only mainnet data is meaningful to keep. */ +static void legacy_filter_path(cstring **path_out, const char *filename) +{ + *path_out = cstr_new_sz(512); + dogecoin_get_default_datadir(*path_out); + while ((*path_out)->len > 0 && + (*path_out)->str[(*path_out)->len - 1] == '\0') + (*path_out)->len--; + cstr_append_buf(*path_out, "/filter/basic/", 14); + cstr_append_buf(*path_out, filename, strlen(filename)); + cstr_append_c(*path_out, '\0'); +} + +/* One-time migration of the pre-segregation cache into the mainnet directory. + * Only runs for mainnet, only when the new path is absent and the legacy file + * exists, and only via rename() -- so it is a no-op on a fresh install and + * never silently discards data. */ +static void migrate_legacy_filter_file(const dogecoin_chainparams *params, + const char *filename, + const char *new_path) +{ + struct stat sb; + if (!params || strcmp(params->chainname, "main") != 0) return; + if (stat(new_path, &sb) == 0) return; /* already migrated */ + + cstring *old_obj = NULL; + legacy_filter_path(&old_obj, filename); + if (stat(old_obj->str, &sb) == 0 && sb.st_size > 0) { + if (rename(old_obj->str, new_path) == 0) { + printf("cfdb: migrated %s to per-chain location %s\n", + old_obj->str, new_path); + } else { + fprintf(stderr, "cfdb: could not migrate %s to %s: %s\n", + old_obj->str, new_path, strerror(errno)); + } + } + cstr_free(old_obj, true); +} + +/** + * Write the v2 file header: magic(4) + version(4) + genesis_filter_header(32). + * genesis bytes are initialised to zero; call dogecoin_cfheaders_db_write_genesis + * to fill them in once the first cfheaders batch arrives. + */ +static dogecoin_bool write_file_header(FILE *f, const uint8_t *magic) +{ + if (fwrite(magic, 4, 1, f) != 1) return false; + uint32_t v = htole32(cf_file_version); + if (fwrite(&v, 4, 1, f) != 1) return false; + uint8_t zeros[32]; + memset(zeros, 0, 32); + return (fwrite(zeros, 32, 1, f) == 1); +} + +/** + * Read the file header and return the version number. + * Returns 0 on bad magic or read error; callers treat anything < 2 as stale. + */ +static uint32_t read_file_version(FILE *f, const uint8_t *expected_magic) +{ + uint8_t buf[8]; + rewind(f); + if (fread(buf, 8, 1, f) != 1) return 0; + if (memcmp(buf, expected_magic, 4) != 0) return 0; + return le32toh(*(uint32_t *)(buf + 4)); +} + +/* ================================================================ */ +/* cfheaders DB */ +/* ================================================================ */ + +dogecoin_cfheaders_db* dogecoin_cfheaders_db_new(const dogecoin_chainparams *params, dogecoin_bool inmem_only) +{ + dogecoin_cfheaders_db *db = dogecoin_calloc(1, sizeof(*db)); + db->params = params; + db->read_write = !inmem_only; + db->tip_height = 0; + memset(db->tip_header, 0, 32); + return db; +} + +void dogecoin_cfheaders_db_free(dogecoin_cfheaders_db *db) +{ + if (!db) return; + if (db->file) { + dogecoin_file_commit(db->file); + fclose(db->file); + db->file = NULL; + } + dogecoin_free(db); +} + +dogecoin_bool dogecoin_cfheaders_db_load( + dogecoin_cfheaders_db *db, + const char *file_path, + dogecoin_compact_filter_state *state) +{ + if (!db || !state) return false; + if (!db->read_write) return true; /* inmem_only: nothing to do */ + + /* Resolve file path */ + cstring *path_obj = NULL; + const char *path = file_path; + if (!path) { + cstring *datadir = cstr_new_sz(512); + dogecoin_get_default_datadir(datadir); + while (datadir->len > 0 && datadir->str[datadir->len - 1] == '\0') + datadir->len--; + cstr_append_c(datadir, '\0'); + ensure_filter_dir(datadir->str, db->params); + cstr_free(datadir, true); + + default_filter_path(&path_obj, db->params, "cfheaders.dat"); + path = path_obj->str; + migrate_legacy_filter_file(db->params, "cfheaders.dat", path); + } + + struct stat sb; + dogecoin_bool create = (stat(path, &sb) != 0) || (sb.st_size < (long)CF_HEADERS_FILE_HDR_LEN); + + if (!create) { + db->file = fopen(path, "r+b"); + if (db->file) { + uint32_t ver = read_file_version(db->file, cfhdr_magic); + if (ver >= 2) { + /* v2 file: read genesis_filter_header then records */ + if (fread(state->genesis_filter_header, 32, 1, db->file) == 1) { + size_t loaded = 0; + uint32_t first_height = 0; + uint8_t rec[CF_HEADERS_FILE_REC_LEN]; + printf("Loading compact filter headers from disk...\n"); + while (fread(rec, CF_HEADERS_FILE_REC_LEN, 1, db->file) == 1) { + uint32_t height; + memcpy(&height, rec, 4); + height = le32toh(height); + if (loaded == 0) first_height = height; + uint256_t *fh = dogecoin_calloc(1, 32); + memcpy(fh, rec + 4, 32); + vector_add(state->filter_headers, fh); + db->tip_height = height; + memcpy(db->tip_header, fh, 32); + loaded++; + if (loaded % 100000 == 0) { + printf("\r %zu filter headers loaded (height %u)", loaded, height); + fflush(stdout); + } + } + if (loaded > 0) { + printf("\r %zu filter headers loaded, heights %u..%u\n", + loaded, first_height, db->tip_height); + state->cfheaders_tip_height = db->tip_height; + state->cfheaders_base_height = first_height; + memcpy(state->cfheaders_tip_hash, db->tip_header, 32); + } + fseek(db->file, 0, SEEK_END); + if (path_obj) cstr_free(path_obj, true); + return true; + } + } + /* v1 or unreadable: close and delete, will recreate below */ + if (ver < 2) + fprintf(stderr, "cfheadersdb: v%u file detected; rebuilding as v2 " + "(cfheaders will re-download)\n", ver); + fclose(db->file); + db->file = NULL; + } + remove(path); + } + + /* Create fresh v2 file */ + db->file = fopen(path, "w+b"); + if (!db->file) { + /* `path` aliases path_obj->str, so it must outlive this message -- + * freeing path_obj before the fprintf was a heap-use-after-free. */ + fprintf(stderr, "cfheadersdb: cannot open %s: %s\n", path, strerror(errno)); + if (path_obj) cstr_free(path_obj, true); + return false; + } + if (path_obj) cstr_free(path_obj, true); + if (!write_file_header(db->file, cfhdr_magic)) { + fprintf(stderr, "cfheadersdb: failed to write file header\n"); + fclose(db->file); + db->file = NULL; + return false; + } + return true; +} + +dogecoin_bool dogecoin_cfheaders_db_write( + dogecoin_cfheaders_db *db, + uint32_t height, + const uint256_t filter_header) +{ + if (!db || !db->read_write || !db->file) return true; /* no-op when inmem */ + + uint8_t rec[CF_HEADERS_FILE_REC_LEN]; + uint32_t h_le = htole32(height); + memcpy(rec, &h_le, 4); + memcpy(rec + 4, filter_header, 32); + + if (fwrite(rec, CF_HEADERS_FILE_REC_LEN, 1, db->file) != 1) { + fprintf(stderr, "cfheadersdb: write failed at height %u\n", height); + return false; + } + + db->tip_height = height; + memcpy(db->tip_header, filter_header, 32); + return true; +} + +dogecoin_bool dogecoin_cfheaders_db_flush(dogecoin_cfheaders_db *db) +{ + if (!db || !db->read_write || !db->file) return true; + dogecoin_file_commit(db->file); + return true; +} + +dogecoin_bool dogecoin_cfheaders_db_write_genesis( + dogecoin_cfheaders_db *db, + const uint256_t genesis_filter_header) +{ + if (!db || !db->read_write || !db->file) return true; + + long saved = ftell(db->file); + if (fseek(db->file, 8, SEEK_SET) != 0) return false; + dogecoin_bool ok = (fwrite(genesis_filter_header, 32, 1, db->file) == 1); + dogecoin_file_commit(db->file); + fseek(db->file, saved, SEEK_SET); + return ok; +} + +dogecoin_bool dogecoin_cfheaders_db_reset(dogecoin_cfheaders_db *db) +{ + if (!db || !db->read_write || !db->file) return true; + + fflush(db->file); + if (CF_FTRUNCATE(CF_FILENO(db->file), (long)CF_HEADERS_FILE_HDR_LEN) != 0) { + fprintf(stderr, "cfheadersdb: truncate failed: %s\n", strerror(errno)); + return false; + } + fseek(db->file, 0, SEEK_END); + db->tip_height = 0; + memset(db->tip_header, 0, 32); + return true; +} + +/* ================================================================ */ +/* cfilters DB */ +/* ================================================================ */ + +dogecoin_cfilters_db* dogecoin_cfilters_db_new(const dogecoin_chainparams *params, dogecoin_bool inmem_only) +{ + dogecoin_cfilters_db *db = dogecoin_calloc(1, sizeof(*db)); + db->params = params; + db->read_write = !inmem_only; + db->tip_height = 0; + return db; +} + +void dogecoin_cfilters_db_free(dogecoin_cfilters_db *db) +{ + if (!db) return; + if (db->file) { + dogecoin_file_commit(db->file); + fclose(db->file); + db->file = NULL; + } + dogecoin_free(db); +} + +dogecoin_bool dogecoin_cfilters_db_load( + dogecoin_cfilters_db *db, + const char *file_path) +{ + if (!db) return false; + if (!db->read_write) return true; + + cstring *path_obj = NULL; + const char *path = file_path; + if (!path) { + cstring *datadir = cstr_new_sz(512); + dogecoin_get_default_datadir(datadir); + while (datadir->len > 0 && datadir->str[datadir->len - 1] == '\0') + datadir->len--; + cstr_append_c(datadir, '\0'); + ensure_filter_dir(datadir->str, db->params); + cstr_free(datadir, true); + + default_filter_path(&path_obj, db->params, "cfilters.dat"); + path = path_obj->str; + migrate_legacy_filter_file(db->params, "cfilters.dat", path); + } + + struct stat sb; + dogecoin_bool create = (stat(path, &sb) != 0) || (sb.st_size < 8); + + db->file = fopen(path, create ? "w+b" : "r+b"); + + if (!db->file) { + /* Same aliasing rule as the cfheaders path above: `path` points into + * path_obj, so it cannot be freed before this message is formatted. */ + fprintf(stderr, "cfiltersdb: cannot open %s: %s\n", path, strerror(errno)); + if (path_obj) cstr_free(path_obj, true); + return false; + } + if (path_obj) cstr_free(path_obj, true); + + if (create) { + if (!write_file_header(db->file, cfdata_magic)) { + fprintf(stderr, "cfiltersdb: failed to write file header\n"); + fclose(db->file); + db->file = NULL; + return false; + } + return true; + } + + /* Existing file — verify header and seek to end for appends */ + if (read_file_version(db->file, cfdata_magic) == 0) { + fprintf(stderr, "cfiltersdb: bad magic or unsupported version\n"); + fclose(db->file); + db->file = NULL; + return false; + } + + /* Skip the remaining 32 bytes of the file header (magic+version already + * consumed by read_file_version; seek to the first record). */ + if (fseek(db->file, CF_HEADERS_FILE_HDR_LEN, SEEK_SET) != 0) { + fclose(db->file); + db->file = NULL; + return false; + } + + /* Scan records to find the tip height (variable-length; must iterate) */ + while (true) { + uint8_t hdr[CF_FILTERS_FILE_REC_HDR_LEN]; + if (fread(hdr, CF_FILTERS_FILE_REC_HDR_LEN, 1, db->file) != 1) break; + uint32_t height, data_len; + memcpy(&height, hdr, 4); height = le32toh(height); + memcpy(&data_len, hdr + 36, 4); data_len = le32toh(data_len); + db->tip_height = height; + if (fseek(db->file, (long)data_len, SEEK_CUR) != 0) break; + } + + fseek(db->file, 0, SEEK_END); + return true; +} + +dogecoin_bool dogecoin_cfilters_db_write( + dogecoin_cfilters_db *db, + uint32_t height, + const uint256_t block_hash, + const cstring *filter_data) +{ + if (!db || !db->read_write || !db->file) return true; + if (!filter_data) return false; + + uint8_t hdr[CF_FILTERS_FILE_REC_HDR_LEN]; + uint32_t h_le = htole32(height); + uint32_t dl_le = htole32((uint32_t)filter_data->len); + + memcpy(hdr, &h_le, 4); + memcpy(hdr + 4, block_hash, 32); + memcpy(hdr + 36, &dl_le, 4); + + if (fwrite(hdr, CF_FILTERS_FILE_REC_HDR_LEN, 1, db->file) != 1) + return false; + if (filter_data->len > 0 && + fwrite(filter_data->str, filter_data->len, 1, db->file) != 1) + return false; + + dogecoin_file_commit(db->file); + db->tip_height = height; + return true; +} + +dogecoin_bool dogecoin_cfilters_db_iterate( + dogecoin_cfilters_db *db, + dogecoin_bool (*cb)(uint32_t height, const uint256_t block_hash, + const uint8_t *filter_data, uint32_t data_len, + void *ctx), + void *ctx) +{ + if (!db || !db->file || !cb) return false; + + /* Rewind past the file header to the first record. */ + if (fseek(db->file, CF_HEADERS_FILE_HDR_LEN, SEEK_SET) != 0) + return false; + + uint8_t hdr[CF_FILTERS_FILE_REC_HDR_LEN]; + while (fread(hdr, CF_FILTERS_FILE_REC_HDR_LEN, 1, db->file) == 1) { + uint32_t height, data_len; + uint256_t block_hash; + memcpy(&height, hdr, 4); height = le32toh(height); + memcpy(block_hash, hdr + 4, 32); + memcpy(&data_len, hdr + 36, 4); data_len = le32toh(data_len); + + if (data_len == 0) { + if (!cb(height, block_hash, NULL, 0, ctx)) break; + continue; + } + + /* data_len comes straight off disk, so it is only as trustworthy as the + file. A cfilter record cannot legitimately be larger than the P2P + message that delivered it, so reject anything beyond that rather than + asking the allocator for up to 4 GiB on a corrupt or tampered file + (CWE-400). The subsequent short fread would fail, but only after the + allocation has already been attempted. */ + if (data_len > DOGECOIN_MAX_P2P_MSG_SIZE) + return false; + + uint8_t *buf = dogecoin_malloc(data_len); + if (!buf) return false; + if (fread(buf, data_len, 1, db->file) != 1) { + dogecoin_free(buf); + return false; + } + dogecoin_bool cont = cb(height, block_hash, buf, data_len, ctx); + dogecoin_free(buf); + if (!cont) break; + } + + /* Restore write position at end of file. */ + fseek(db->file, 0, SEEK_END); + return true; +} diff --git a/src/cli/spvnode.c b/src/cli/spvnode.c index 1d17a1659..042b5bce6 100644 --- a/src/cli/spvnode.c +++ b/src/cli/spvnode.c @@ -179,7 +179,8 @@ become_daemon(int flags) static struct option long_options[] = { {"testnet", no_argument, NULL, 't'}, {"regtest", no_argument, NULL, 'r'}, - {"ips", no_argument, NULL, 'i'}, + {"ips", required_argument, NULL, 'i'}, + {"host", required_argument, NULL, 'i'}, {"debug", no_argument, NULL, 'd'}, {"maxnodes", no_argument, NULL, 'm'}, {"mnemonic", no_argument, NULL, 'n'}, @@ -200,6 +201,12 @@ static struct option long_options[] = { {"filtered_blocks", no_argument, NULL, 'g'}, {"select_checkpoint", no_argument, NULL, 'q'}, {"daemon", no_argument, NULL, 'z'}, + {"no_cfilters", no_argument, NULL, 'e'}, + {"export_cfcheckpts", no_argument, NULL, 'o'}, + {"logfile", required_argument, NULL, 'L'}, + {"cf_workers", required_argument, NULL, 'W'}, + {"cfheaders_path", required_argument, NULL, 257}, + {"cfilters_path", required_argument, NULL, 258}, {NULL, 0, NULL, 0} }; /** @@ -214,7 +221,7 @@ static void print_version() { */ static void print_usage() { print_version(); - printf("Usage: spvnode (-c|continuous) (-i|--ips ) (-m[--maxpeers] ) (-f ) \ + printf("Usage: spvnode (-c|continuous) (-i|--ips|-H|--host ) (-m[--maxpeers] ) (-f ) \ (-a|--address
) (-n|--mnemonic ) (-s|[--pass_phrase]) (-y|--encrypted_file ) \ (-w|--wallet_file ) (-h|--headers_file ) (-l|[--no_prompt]) (-b[--full_sync]) (-p[--checkpoint]) (-k[--master_key]) (-j[--use_tpm]) \ (-u|--http_server ) (-x|--smpv) (-g|--filtered_blocks) (-q|--select_checkpoint) (-t|--testnet) (-r|--regtest) (-d|--debug) \n"); @@ -281,6 +288,34 @@ dogecoin_bool spv_header_message_processed(struct dogecoin_spv_client_* client, } static dogecoin_bool quit_when_synced = true; +static FILE *g_logfile = NULL; + +static int spvnode_log_file(const char* format, ...) { + if (!g_logfile) return 0; + va_list args; + va_start(args, format); + fprintf(g_logfile, "DEBUG: "); + vfprintf(g_logfile, format, args); + va_end(args); + fflush(g_logfile); + return 1; +} + +static int spvnode_log_both(const char* format, ...) { + va_list args, args2; + va_start(args, format); + va_copy(args2, args); + printf("DEBUG: "); + vprintf(format, args); + va_end(args); + if (g_logfile) { + fprintf(g_logfile, "DEBUG: "); + vfprintf(g_logfile, format, args2); + fflush(g_logfile); + } + va_end(args2); + return 1; +} static dogecoin_bool spv_enable_filtered_blocks = false; static dogecoin_bool spv_select_checkpoint = false; static int spv_filter_oldest_utxo_height = 0; @@ -478,7 +513,13 @@ int main(int argc, char* argv[]) { char* http_server = NULL; int file_num = NO_FILE; dogecoin_bool smpv_cli_enable = false; + dogecoin_bool no_cfilters = false; + dogecoin_bool export_cfcheckpts = false; int selected_checkpoint_index = -1; + char* logfile = NULL; + int cf_workers = 0; + char* cfheaders_path = NULL; + char* cfilters_path = NULL; if (argc <= 1 || strlen(argv[argc - 1]) == 0 || argv[argc - 1][0] == '-') { /* exit if no command was provided */ print_usage(); @@ -487,7 +528,7 @@ int main(int argc, char* argv[]) { data = argv[argc - 1]; /* get arguments */ - while ((opt = getopt_long_only(argc, argv, "i:ctrdsm:n:f:y:u:w:h:a:lbpzkj:xgq", long_options, &long_index)) != -1) { + while ((opt = getopt_long_only(argc, argv, "i:ctrdsm:n:f:y:u:w:h:a:lbpzkj:xgqeoW:L:", long_options, &long_index)) != -1) { switch (opt) { case 'c': quit_when_synced = false; @@ -568,6 +609,24 @@ int main(int argc, char* argv[]) { spv_select_checkpoint = true; use_checkpoint = true; break; + case 'e': + no_cfilters = true; + break; + case 'o': + export_cfcheckpts = true; + break; + case 'W': + cf_workers = atoi(optarg); + break; + case 'L': + logfile = optarg; + break; + case 257: + cfheaders_path = optarg; + break; + case 258: + cfilters_path = optarg; + break; default: print_usage(); exit(EXIT_FAILURE); @@ -580,6 +639,15 @@ int main(int argc, char* argv[]) { in_memory_headers = (dbfile && ((strcmp(dbfile, "0") == 0) || (strcmp(dbfile, "no") == 0))); dogecoin_spv_client* client = dogecoin_spv_client_new(chain, debug, in_memory_headers, use_checkpoint, full_sync, maxnodes, http_server); + if (logfile) { + g_logfile = fopen(logfile, "a"); + if (!g_logfile) { + fprintf(stderr, "Cannot open logfile '%s': %s\n", logfile, strerror(errno)); + } else { + client->nodegroup->log_write_cb = debug ? spvnode_log_both : spvnode_log_file; + } + } + if (http_server) { evhttp_set_gencb(client->nodegroup->http_server, dogecoin_http_request_cb, client); } @@ -587,6 +655,38 @@ int main(int argc, char* argv[]) { dogecoin_spv_enable_smpv(client, true); printf("[smpv] enabled via CLI flag\n"); } + if (cfheaders_path) + client->cfheaders_path = strdup(cfheaders_path); + if (cfilters_path) + client->cfilters_path = strdup(cfilters_path); + + if (cf_workers > 1) { + /* Cap at 8: each worker is a separate TCP connection to the same + peer, and past a handful the bottleneck is the peer, not us. */ + client->cf_num_workers = (uint8_t)(cf_workers > 8 ? 8 : cf_workers); + printf("[bip157-par] parallel cfilter workers: %u\n", + (unsigned int)client->cf_num_workers); + } + + if (no_cfilters || full_sync) { + /* Disable BIP157 compact filter sync when: + * - user explicitly passed --no_cfilters (-e) + * - full_sync (-b) is requested: we need full blocks anyway, + * and Dogecoin peers don't advertise NODE_COMPACT_FILTERS yet, + * so BIP157 sync would stall indefinitely. */ + dogecoin_spv_enable_compact_filters(client, false); + if (no_cfilters) { + printf("[bip157] compact filters disabled via CLI flag (--no_cfilters)\n"); + } else { + printf("[bip157] compact filters disabled (full_sync mode uses direct block download)\n"); + } + } else { + printf("[bip157] compact block filters enabled (default)\n"); + } + if (export_cfcheckpts) { + client->cf_export_enabled = true; + printf("[bip157] filter header checkpoint export enabled; lines prefixed '[cfcheckpt-export]' will appear as headers sync\n"); + } client->header_message_processed = spv_header_message_processed; client->sync_completed = spv_sync_completed; #if WITH_WALLET @@ -657,7 +757,20 @@ int main(int argc, char* argv[]) { } /* Optional BIP37 filter setup using filterload with fixed-size bloom. */ - if (spv_enable_filtered_blocks && (wallet->waddr_vector->len > 0 || HASH_COUNT(wallet->utxos) > 0)) { + if (spv_enable_filtered_blocks && client->compact_filters_enabled) { + /* BIP37 and BIP157 are mutually exclusive here, for privacy: a bloom + * filter hands the watched scripts to every peer, which is exactly what + * compact filters avoid. Compact filters are on by default, so -g on + * its own is a contradiction; dogecoin_spv_client_filterload() fails + * closed in that state. Say why here -- its explanation goes through + * the nodegroup logger, which is not printing this early, so the user + * would otherwise see only an unexplained "Failed to send filterload". */ + printf("-g/--filtered_blocks (BIP37) needs -e/--no_cfilters.\n" + "A BIP37 bloom filter would leak the watched addresses to peers, which is\n" + "what compact filters (BIP157, enabled by default) exist to prevent, so the\n" + "two are mutually exclusive. Re-run with -e to use BIP37, or drop -g to use\n" + "compact filters.\n"); + } else if (spv_enable_filtered_blocks && (wallet->waddr_vector->len > 0 || HASH_COUNT(wallet->utxos) > 0)) { dogecoin_bip37_filter* filter = dogecoin_bip37_filter_new(0, 1); /* random tweak, UPDATE_ALL */ if (!filter) { printf("Failed to initialize BIP37 bloom filter\n"); @@ -715,6 +828,71 @@ int main(int argc, char* argv[]) { printf("Filtered block mode disabled (use -g/--filtered_blocks to enable)\n"); } + /* BIP157 compact-filter address watching: add each wallet address's + * P2PKH scriptPubKey via filteradd so cfilters are matched against + * real wallet outputs. Two sources: + * 1. waddr_vector — HD-derived keys controlled by this wallet. + * 2. wallet->utxos — previously discovered UTXOs whose script_pubkey + * may cover watch-only or externally-derived addresses not present + * in waddr_vector. */ + if (client->compact_filters_enabled) { + unsigned int wi; + for (wi = 0; wi < wallet->waddr_vector->len; wi++) { + dogecoin_wallet_addr* waddr = vector_idx(wallet->waddr_vector, wi); + if (!waddr || waddr->ignore) continue; + /* P2PKH scriptPubKey: OP_DUP OP_HASH160 <20-byte hash> OP_EQUALVERIFY OP_CHECKSIG */ + uint8_t spk[25]; + spk[0] = 0x76; /* OP_DUP */ + spk[1] = 0xa9; /* OP_HASH160 */ + spk[2] = 0x14; /* push 20 bytes */ + memcpy(spk + 3, waddr->pubkeyhash, sizeof(uint160_t)); + spk[23] = 0x88; /* OP_EQUALVERIFY */ + spk[24] = 0xac; /* OP_CHECKSIG */ + dogecoin_spv_client_filteradd(client, spk, sizeof(spk)); + char addr_str[P2PKHLEN]; + if (dogecoin_p2pkh_addr_from_hash160(waddr->pubkeyhash, chain, addr_str, sizeof(addr_str))) { + printf("[bip157] watching address: %s\n", addr_str); + } + } + /* Also watch addresses supplied via -a/--address on the CLI. */ + if (address && address[0] != '\0') { + char* addr_copy = strdup(address); + char* saveptr = NULL; + char* tok = strtok_r(addr_copy, " ", &saveptr); + while (tok) { + uint8_t dec[64]; + size_t dec_len = dogecoin_base58_decode_check(tok, dec, sizeof(dec)); + if (dec_len == 21) { /* 1-byte version + 20-byte hash160 */ + uint8_t spk[25]; + spk[0] = 0x76; /* OP_DUP */ + spk[1] = 0xa9; /* OP_HASH160 */ + spk[2] = 0x14; /* push 20 bytes */ + memcpy(spk + 3, dec + 1, 20); + spk[23] = 0x88; /* OP_EQUALVERIFY */ + spk[24] = 0xac; /* OP_CHECKSIG */ + dogecoin_spv_client_filteradd(client, spk, sizeof(spk)); + dogecoin_wallet_add_watchonly_addr(wallet, tok); + printf("[bip157] watching address (cli): %s\n", tok); + } + tok = strtok_r(NULL, " ", &saveptr); + } + dogecoin_free(addr_copy); + } + /* Also watch script_pubkeys from previously-tracked UTXOs (hex → raw). */ + dogecoin_utxo* utxo; + dogecoin_utxo* tmp_utxo; + HASH_ITER(hh, wallet->utxos, utxo, tmp_utxo) { + if (!utxo->script_pubkey[0]) continue; + size_t spk_hex_len = strlen(utxo->script_pubkey); + size_t spk_raw_len = spk_hex_len / 2; + const uint8_t *spk_raw = utils_hex_to_uint8(utxo->script_pubkey); + if (!spk_raw) continue; + dogecoin_spv_client_filteradd(client, spk_raw, spk_raw_len); + printf("[bip157] watching utxo script (%s): %s\n", + utxo->address, utxo->script_pubkey); + } + } + client->sync_transaction = dogecoin_wallet_check_transaction; client->sync_transaction_ctx = wallet; #endif @@ -746,6 +924,11 @@ int main(int argc, char* argv[]) { } dogecoin_free(headersfile); + + /* Load auxiliary hash-lookup DB for filter IBD from genesis. + * Use open_for_scan instead of load() to avoid reading 1M+ records + * into the in-memory tree — only the file handle is needed for the + * sequential block-hash scan done by get_block_hash_at_height(). */ if (!response) { printf("Could not load or create headers database...aborting\n"); #if WITH_WALLET @@ -818,8 +1001,35 @@ int main(int argc, char* argv[]) { #endif } printf("done\n"); + + /* Rescan any cfilters cached from a prior run before entering the + * network runloop — finds matches immediately without waiting for + * the cfheaders sync to complete. */ + if (client->compact_filters_enabled) + dogecoin_spv_client_rescan_cached_filters(client); + printf("Discover peers...\n"); - dogecoin_spv_client_discover_peers(client, ips); + + /* Each parallel worker is one TCP connection, so the peer list is + repeated N times: the nodegroup opens one connection per entry. */ + char *par_ips = NULL; + if (client->cf_num_workers > 1 && ips) { + size_t par_n = client->cf_num_workers; + size_t host_len = strlen(ips); + par_ips = (char *)dogecoin_calloc(par_n * (host_len + 1) + 1, 1); + if (par_ips) { + size_t wi; + for (wi = 0; wi < par_n; wi++) { + if (wi > 0) strcat(par_ips, ","); + strcat(par_ips, ips); + } + client->nodegroup->desired_amount_connected_nodes = (int)par_n; + printf("[bip157-par] connecting %u workers to %s\n", + (unsigned int)par_n, ips); + } + } + dogecoin_spv_client_discover_peers(client, par_ips ? par_ips : ips); + dogecoin_free(par_ips); printf("Connecting to the p2p network...\n"); printf("Press CTRL+C or send SIGINT/SIGTERM to disconnect.\n"); diff --git a/src/compact_filter.c b/src/compact_filter.c new file mode 100644 index 000000000..792c2637d --- /dev/null +++ b/src/compact_filter.c @@ -0,0 +1,569 @@ +/* + + The MIT License (MIT) + + Copyright (c) 2018 Bitcoin Core developers + Copyright (c) 2026 bluezr + Copyright (c) 2026 The Dogecoin Foundation + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES + OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + +*/ + +/** + * @file compact_filter.c + * @brief BIP 157 Client Side Block Filtering protocol implementation. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include + +/* Wrapper for cstr_free to use as vector element free callback */ +static void cstr_free_void(void *ptr) { + cstr_free((cstring *)ptr, true); +} + +/* ================================================================ */ +/* Message Serialization */ +/* ================================================================ */ + +void dogecoin_p2p_msg_getcfilters_ser(const dogecoin_getcfilters_msg *msg, cstring *out) { + if (!msg || !out) return; + ser_bytes(out, &msg->filter_type, 1); + ser_u32(out, msg->start_height); + ser_u256(out, msg->stop_hash); +} + +void dogecoin_p2p_msg_getcfheaders_ser(const dogecoin_getcfheaders_msg *msg, cstring *out) { + if (!msg || !out) return; + ser_bytes(out, &msg->filter_type, 1); + ser_u32(out, msg->start_height); + ser_u256(out, msg->stop_hash); +} + +void dogecoin_p2p_msg_getcfcheckpt_ser(const dogecoin_getcfcheckpt_msg *msg, cstring *out) { + if (!msg || !out) return; + ser_bytes(out, &msg->filter_type, 1); + ser_u256(out, msg->stop_hash); +} + +/* ================================================================ */ +/* Message Deserialization */ +/* ================================================================ */ + +dogecoin_bool dogecoin_p2p_msg_cfilter_deser(dogecoin_cfilter_msg *msg, struct const_buffer *buf) { + if (!msg || !buf) return false; + + /* filter_type (1 byte) -- BIP157: FilterType | BlockHash | NumFilterBytes | FilterBytes */ + if (buf->len < 1) return false; + deser_bytes(&msg->filter_type, buf, 1); + + /* block_hash (32 bytes) */ + if (!deser_u256(msg->block_hash, buf)) return false; + + /* filter_data (var_bytes: compact_size + data) */ + uint32_t filter_len; + if (!deser_varlen(&filter_len, buf)) return false; + + if (buf->len < filter_len) return false; + + if (msg->filter_data) { + cstr_free(msg->filter_data, true); + } + msg->filter_data = cstr_new_buf(buf->p, filter_len); + buf->p = (const uint8_t *)buf->p + filter_len; + buf->len -= filter_len; + + return true; +} + +dogecoin_bool dogecoin_p2p_msg_cfheaders_deser(dogecoin_cfheaders_msg *msg, struct const_buffer *buf) { + if (!msg || !buf) return false; + + /* filter_type (1 byte) */ + if (buf->len < 1) return false; + deser_bytes(&msg->filter_type, buf, 1); + + /* stop_hash (32 bytes) */ + if (!deser_u256(msg->stop_hash, buf)) return false; + + /* prev_filter_header (32 bytes) */ + if (!deser_u256(msg->prev_filter_header, buf)) return false; + + /* filter_hashes_length (compact_size) */ + uint32_t n_hashes; + if (!deser_varlen(&n_hashes, buf)) return false; + + /* n_hashes is an attacker-controlled count read straight off the wire (up to + 0xFFFFFFFF). Each hash that follows is 32 bytes, so a message can declare at + most buf->len / 32 of them. Without this check vector_new() below allocates + n_hashes pointers -- and it rounds the reservation *up* to a power of two, so + 0xFFFFFFFF becomes a 2^32 * sizeof(void*) (~34 GB) calloc -- before a single + hash is read: a memory-exhaustion DoS from a ~10-byte cfheaders message. + BIP157 also caps a getcfheaders span at 2000 blocks, so bound by that too. */ + if (n_hashes > buf->len / DOGECOIN_HASH_LENGTH) return false; + if (n_hashes > MAX_GETCFHEADERS_SIZE) return false; + + /* Deserialize each 32-byte filter hash */ + if (msg->filter_hashes) { + vector_free(msg->filter_hashes, true); + } + msg->filter_hashes = vector_new(n_hashes, dogecoin_free); + if (!msg->filter_hashes) return false; + + uint32_t i; + for (i = 0; i < n_hashes; i++) { + uint256_t *hash = dogecoin_calloc(1, sizeof(uint256_t)); + if (!deser_u256(*hash, buf)) { + dogecoin_free(hash); + return false; + } + vector_add(msg->filter_hashes, hash); + } + + return true; +} + +dogecoin_bool dogecoin_p2p_msg_cfcheckpt_deser(dogecoin_cfcheckpt_msg *msg, struct const_buffer *buf) { + if (!msg || !buf) return false; + + /* filter_type (1 byte) */ + if (buf->len < 1) return false; + deser_bytes(&msg->filter_type, buf, 1); + + /* stop_hash (32 bytes) */ + if (!deser_u256(msg->stop_hash, buf)) return false; + + /* filter_headers_length (compact_size) */ + uint32_t n_headers; + if (!deser_varlen(&n_headers, buf)) return false; + + /* Same unbounded-allocation hazard as cfheaders above: n_headers comes off the + wire and feeds vector_new(), which reserves a power-of-two number of pointers + (~34 GB at 0xFFFFFFFF) before any header is read. Each checkpoint is a 32-byte + hash, so reject any count the remaining buffer cannot possibly hold. Checkpoints + are one per 1000 blocks, so the buffer bound is the meaningful limit here. */ + if (n_headers > buf->len / DOGECOIN_HASH_LENGTH) return false; + + /* Deserialize each 32-byte filter header checkpoint */ + if (msg->filter_headers) { + vector_free(msg->filter_headers, true); + } + msg->filter_headers = vector_new(n_headers, dogecoin_free); + if (!msg->filter_headers) return false; + + uint32_t i; + for (i = 0; i < n_headers; i++) { + uint256_t *hdr = dogecoin_calloc(1, sizeof(uint256_t)); + if (!deser_u256(*hdr, buf)) { + dogecoin_free(hdr); + return false; + } + vector_add(msg->filter_headers, hdr); + } + + return true; +} + +/* ================================================================ */ +/* Message Lifecycle */ +/* ================================================================ */ + +void dogecoin_cfilter_msg_init(dogecoin_cfilter_msg *msg) { + if (!msg) return; + msg->filter_type = GCS_BASIC_FILTER_TYPE; + dogecoin_mem_zero(msg->block_hash, sizeof(uint256_t)); + msg->filter_data = NULL; +} + +void dogecoin_cfilter_msg_free(dogecoin_cfilter_msg *msg) { + if (!msg) return; + if (msg->filter_data) { + cstr_free(msg->filter_data, true); + msg->filter_data = NULL; + } +} + +void dogecoin_cfheaders_msg_init(dogecoin_cfheaders_msg *msg) { + if (!msg) return; + msg->filter_type = GCS_BASIC_FILTER_TYPE; + dogecoin_mem_zero(msg->stop_hash, sizeof(uint256_t)); + dogecoin_mem_zero(msg->prev_filter_header, sizeof(uint256_t)); + msg->filter_hashes = NULL; +} + +void dogecoin_cfheaders_msg_free(dogecoin_cfheaders_msg *msg) { + if (!msg) return; + if (msg->filter_hashes) { + vector_free(msg->filter_hashes, true); + msg->filter_hashes = NULL; + } +} + +void dogecoin_cfcheckpt_msg_init(dogecoin_cfcheckpt_msg *msg) { + if (!msg) return; + msg->filter_type = GCS_BASIC_FILTER_TYPE; + dogecoin_mem_zero(msg->stop_hash, sizeof(uint256_t)); + msg->filter_headers = NULL; +} + +void dogecoin_cfcheckpt_msg_free(dogecoin_cfcheckpt_msg *msg) { + if (!msg) return; + if (msg->filter_headers) { + vector_free(msg->filter_headers, true); + msg->filter_headers = NULL; + } +} + +/* ================================================================ */ +/* Compact Filter State Management */ +/* ================================================================ */ + +dogecoin_compact_filter_state* dogecoin_compact_filter_state_new(void) { + dogecoin_compact_filter_state *state = dogecoin_calloc(1, sizeof(dogecoin_compact_filter_state)); + if (!state) return NULL; + state->enabled = false; + state->filter_type = GCS_BASIC_FILTER_TYPE; + state->cfheaders_tip_height = 0; + dogecoin_mem_zero(state->cfheaders_tip_hash, sizeof(uint256_t)); + dogecoin_mem_zero(state->genesis_filter_header, sizeof(uint256_t)); + state->filter_headers = vector_new(4096, dogecoin_free); + state->checkpoints = vector_new(64, dogecoin_free); + state->cfheaders_base_height = 1; + state->filters_tip_height = 0; + state->cfilter_batch_end = 0; + state->pending_start_height = 0; + dogecoin_mem_zero(state->pending_stop_hash, sizeof(uint256_t)); + state->awaiting_response = false; + state->last_request_time = 0; + state->watched_scripts = vector_new(16, cstr_free_void); + state->matched_block_hashes = vector_new(64, dogecoin_free); + state->matched_block_heights = vector_new(64, dogecoin_free); + state->matched_blocks_fetched = 0; + state->cf_block_fetch_active = false; + state->par_num_workers = 0; + state->par_next_height = 0; + state->par_flush_height = 0; + state->par_bufs = NULL; + state->cfh_par_n = 0; + state->cfh_par_done = 0; + state->cfh_par_data = NULL; + state->cfh_par_base = 1; + state->cfh_par_total = 0; + state->cfh_par_chunks = NULL; + state->filter_headers_flat = NULL; + state->filter_headers_flat_base = 1; + state->filter_headers_flat_len = 0; + return state; +} + +void dogecoin_compact_filter_state_free(dogecoin_compact_filter_state *state) { + if (!state) return; + if (state->filter_headers) { + vector_free(state->filter_headers, true); + state->filter_headers = NULL; + } + if (state->checkpoints) { + vector_free(state->checkpoints, true); + state->checkpoints = NULL; + } + if (state->watched_scripts) { + vector_free(state->watched_scripts, true); + state->watched_scripts = NULL; + } + if (state->matched_block_hashes) { + vector_free(state->matched_block_hashes, true); + state->matched_block_hashes = NULL; + } + if (state->matched_block_heights) { + vector_free(state->matched_block_heights, true); + state->matched_block_heights = NULL; + } + if (state->par_bufs) { + uint8_t pi; + for (pi = 0; pi < state->par_num_workers; pi++) { + cf_par_buf *b = &state->par_bufs[pi]; + if (b->records) { + uint32_t cnt = (b->batch_end >= b->batch_start) ? (b->batch_end - b->batch_start + 1) : 0; + uint32_t ri; + for (ri = 0; ri < cnt; ri++) { + if (b->records[ri].filter_data) + cstr_free(b->records[ri].filter_data, true); + } + dogecoin_free(b->records); + b->records = NULL; + } + } + dogecoin_free(state->par_bufs); + state->par_bufs = NULL; + } + if (state->cfh_par_data) { + dogecoin_free(state->cfh_par_data); + state->cfh_par_data = NULL; + } + if (state->cfh_par_chunks) { + dogecoin_free(state->cfh_par_chunks); + state->cfh_par_chunks = NULL; + } + if (state->filter_headers_flat) { + dogecoin_free(state->filter_headers_flat); + state->filter_headers_flat = NULL; + } + dogecoin_free(state); +} + +void dogecoin_compact_filter_state_reset(dogecoin_compact_filter_state *state) { + if (!state) return; + state->cfheaders_tip_height = 0; + dogecoin_mem_zero(state->cfheaders_tip_hash, sizeof(uint256_t)); + dogecoin_mem_zero(state->genesis_filter_header, sizeof(uint256_t)); + if (state->filter_headers) { + vector_free(state->filter_headers, true); + state->filter_headers = vector_new(4096, dogecoin_free); + } + if (state->checkpoints) { + vector_free(state->checkpoints, true); + state->checkpoints = vector_new(64, dogecoin_free); + } + state->cfheaders_base_height = 1; + state->filters_tip_height = 0; + state->pending_start_height = 0; + dogecoin_mem_zero(state->pending_stop_hash, sizeof(uint256_t)); + state->awaiting_response = false; + state->last_request_time = 0; + /* Keep watched_scripts - they don't change on reset */ + if (state->matched_block_hashes) { + vector_free(state->matched_block_hashes, true); + state->matched_block_hashes = vector_new(64, dogecoin_free); + } + if (state->matched_block_heights) { + vector_free(state->matched_block_heights, true); + state->matched_block_heights = vector_new(64, dogecoin_free); + } + state->matched_blocks_fetched = 0; + state->cf_block_fetch_active = false; + /* Free parallel cfheaders download state */ + if (state->cfh_par_data) { + dogecoin_free(state->cfh_par_data); + state->cfh_par_data = NULL; + } + if (state->cfh_par_chunks) { + dogecoin_free(state->cfh_par_chunks); + state->cfh_par_chunks = NULL; + } + state->cfh_par_n = 0; + state->cfh_par_done = 0; + state->cfh_par_total = 0; + if (state->filter_headers_flat) { + dogecoin_free(state->filter_headers_flat); + state->filter_headers_flat = NULL; + state->filter_headers_flat_len = 0; + } + + /* Reset parallel cfilter state but keep par_num_workers and par_bufs allocation */ + state->par_next_height = 0; + state->par_flush_height = 0; + if (state->par_bufs) { + uint8_t pi; + for (pi = 0; pi < state->par_num_workers; pi++) { + cf_par_buf *b = &state->par_bufs[pi]; + if (b->records) { + uint32_t cnt = (b->batch_end >= b->batch_start) ? (b->batch_end - b->batch_start + 1) : 0; + uint32_t ri; + for (ri = 0; ri < cnt; ri++) { + if (b->records[ri].filter_data) + cstr_free(b->records[ri].filter_data, true); + } + dogecoin_free(b->records); + b->records = NULL; + } + b->node_id = -1; + b->received = 0; + b->complete = false; + } + } +} + +/* ================================================================ */ +/* Compact Filter Validation and Header Computation */ +/* ================================================================ */ + +void dogecoin_compact_filter_compute_header(const cstring *filter_data, const uint256_t prev_filter_header, uint256_t header_out) { + if (!filter_data) { + dogecoin_mem_zero(header_out, sizeof(uint256_t)); + return; + } + + /* filter_hash = dbl_sha256(filter_data) */ + uint256_t filter_hash; + dogecoin_hash((const unsigned char *)filter_data->str, filter_data->len, filter_hash); + + /* filter_header = dbl_sha256(filter_hash || prev_filter_header) */ + uint8_t combined[64]; + memcpy(combined, filter_hash, 32); + memcpy(combined + 32, prev_filter_header, 32); + dogecoin_hash(combined, 64, header_out); +} + +dogecoin_bool dogecoin_compact_filter_validate(const cstring *filter_data, const uint256_t prev_filter_header, const uint256_t expected_filter_header) { + if (!filter_data) return false; + + uint256_t computed_header; + dogecoin_compact_filter_compute_header(filter_data, prev_filter_header, computed_header); + + return memcmp(computed_header, expected_filter_header, 32) == 0; +} + +/* ================================================================ */ +/* BIP 157 Hardcoded Checkpoint Helpers */ +/* ================================================================ */ + +const dogecoin_cf_checkpoint* dogecoin_cf_get_checkpoints( + const dogecoin_chainparams *chain, size_t *count_out) +{ + if (!chain || !count_out) return NULL; + + if (chain == &dogecoin_chainparams_main) { + *count_out = dogecoin_mainnet_cf_checkpoint_count; + return dogecoin_mainnet_cf_checkpoint_array; + } else if (chain == &dogecoin_chainparams_test) { + *count_out = dogecoin_testnet_cf_checkpoint_count; + return dogecoin_testnet_cf_checkpoint_array; + } else if (chain == &dogecoin_chainparams_regtest) { + *count_out = dogecoin_regtest_cf_checkpoint_count; + return dogecoin_regtest_cf_checkpoint_array; + } + + /* Unknown chain — fallback: try chainname comparison */ + if (strcmp(chain->chainname, "main") == 0) { + *count_out = dogecoin_mainnet_cf_checkpoint_count; + return dogecoin_mainnet_cf_checkpoint_array; + } else if (strcmp(chain->chainname, "testnet3") == 0) { + *count_out = dogecoin_testnet_cf_checkpoint_count; + return dogecoin_testnet_cf_checkpoint_array; + } else if (strcmp(chain->chainname, "regtest") == 0) { + *count_out = dogecoin_regtest_cf_checkpoint_count; + return dogecoin_regtest_cf_checkpoint_array; + } + + *count_out = 0; + return NULL; +} + +dogecoin_bool dogecoin_cf_validate_checkpoints( + const dogecoin_chainparams *chain, const vector_t *peer_checkpoints) +{ + if (!chain || !peer_checkpoints) return false; + + size_t hardcoded_count = 0; + const dogecoin_cf_checkpoint *hardcoded = dogecoin_cf_get_checkpoints(chain, &hardcoded_count); + + /* No hardcoded checkpoints: nothing to validate against — pass */ + if (!hardcoded || hardcoded_count == 0) return true; + + /* + * Dogecoin Core (and Bitcoin Core) sends checkpoints at heights 1000, 2000, 3000 ... + * peer_checkpoints[i] = filter header at height (i+1) * CFCHECKPT_INTERVAL. + * Index mapping: cp_idx = height / CFCHECKPT_INTERVAL - 1. + * So hardcoded height 1000 → cp_idx 0, height 2000 → cp_idx 1, etc. + */ + for (size_t i = 0; i < hardcoded_count; i++) { + if (hardcoded[i].height == 0 || hardcoded[i].filter_header == NULL) break; + + uint32_t cp_idx = hardcoded[i].height / CFCHECKPT_INTERVAL - 1; + + if (cp_idx >= peer_checkpoints->len) continue; /* peer's chain is shorter */ + + /* Convert hardcoded hex → uint256_t for comparison */ + uint256_t hardcoded_hash; + utils_uint256_sethex((char *)hardcoded[i].filter_header, hardcoded_hash); + + const uint256_t *peer_hash = (const uint256_t *)vector_idx(peer_checkpoints, cp_idx); + if (memcmp(hardcoded_hash, peer_hash, 32) != 0) { + return false; /* mismatch — peer data is invalid */ + } + } + + return true; +} + +size_t dogecoin_cf_load_hardcoded_checkpoints( + dogecoin_compact_filter_state *state, const dogecoin_chainparams *chain) +{ + if (!state || !chain) return 0; + + size_t hardcoded_count = 0; + const dogecoin_cf_checkpoint *hardcoded = dogecoin_cf_get_checkpoints(chain, &hardcoded_count); + + if (!hardcoded || hardcoded_count == 0) return 0; + + /* Free existing checkpoints if any */ + if (state->checkpoints) { + vector_free(state->checkpoints, true); + } + + /* + * Determine the highest checkpoint index we need. + * The vector must be contiguous from index 0..max_cp_idx. + * Find the max height, compute max_cp_idx, and size the vector. + */ + uint32_t max_height = 0; + for (size_t i = 0; i < hardcoded_count; i++) { + if (hardcoded[i].height == 0 || hardcoded[i].filter_header == NULL) break; + if (hardcoded[i].height > max_height) max_height = hardcoded[i].height; + } + + if (max_height == 0) { + state->checkpoints = vector_new(1, dogecoin_free); + return 0; + } + + uint32_t max_cp_idx = max_height / CFCHECKPT_INTERVAL - 1; + uint32_t n_slots = max_cp_idx + 1; + + state->checkpoints = vector_new(n_slots, dogecoin_free); + + /* Pre-fill all slots with zero hashes */ + for (uint32_t j = 0; j < n_slots; j++) { + uint256_t *slot = dogecoin_calloc(1, sizeof(uint256_t)); + vector_add(state->checkpoints, slot); + } + + /* Now fill in the hardcoded values */ + size_t loaded = 0; + for (size_t i = 0; i < hardcoded_count; i++) { + if (hardcoded[i].height == 0 || hardcoded[i].filter_header == NULL) break; + + uint32_t cp_idx = hardcoded[i].height / CFCHECKPT_INTERVAL - 1; + if (cp_idx >= state->checkpoints->len) continue; + + uint256_t *slot = (uint256_t *)vector_idx(state->checkpoints, cp_idx); + utils_uint256_sethex((char *)hardcoded[i].filter_header, *slot); + loaded++; + } + + return loaded; +} diff --git a/src/golomb.c b/src/golomb.c new file mode 100644 index 000000000..94ccf751a --- /dev/null +++ b/src/golomb.c @@ -0,0 +1,513 @@ +/* + + The MIT License (MIT) + + Copyright (c) 2018 Bitcoin Core developers + Copyright (c) 2026 bluezr + Copyright (c) 2026 The Dogecoin Foundation + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES + OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + +*/ + +/** + * @file golomb.c + * @brief BIP 158 Golomb-Coded Set (GCS) compact block filter implementation. + */ + +#include +#include +#include + +#include +#include +#include +#include +#include + +/* ================================================================ */ +/* Internal helpers */ +/* ================================================================ */ + +/** + * @brief Wrapper for cstr_free to be used as a vector element free function. + */ +static void cstr_free_void(void *ptr) { + cstr_free((cstring *)ptr, true); +} + +/** + * @brief 128-bit multiply helper: returns (a * b) >> 64. + * + * This maps a 64-bit siphash into the range [0, F) without bias, + * as specified by BIP 158. + */ +static uint64_t map_to_range(uint64_t x, uint64_t F) { + /* Compute (x * F) >> 64 using 64x64->128 multiply */ + uint64_t x_hi = x >> 32; + uint64_t x_lo = x & 0xFFFFFFFFULL; + uint64_t F_hi = F >> 32; + uint64_t F_lo = F & 0xFFFFFFFFULL; + + uint64_t lo_lo = x_lo * F_lo; + uint64_t lo_hi = x_lo * F_hi; + uint64_t hi_lo = x_hi * F_lo; + uint64_t hi_hi = x_hi * F_hi; + + uint64_t carry = ((lo_lo >> 32) + (lo_hi & 0xFFFFFFFFULL) + (hi_lo & 0xFFFFFFFFULL)) >> 32; + + return hi_hi + (lo_hi >> 32) + (hi_lo >> 32) + carry; +} + +/** + * @brief Comparison function for qsort of uint64_t values. + */ +static int compare_uint64(const void *a, const void *b) { + uint64_t va = *(const uint64_t *)a; + uint64_t vb = *(const uint64_t *)b; + if (va < vb) return -1; + if (va > vb) return 1; + return 0; +} + +/* ================================================================ */ +/* Bitwriter Implementation */ +/* ================================================================ */ + +void gcs_bitwriter_init(gcs_bitwriter *writer, size_t initial_size) { + writer->data = cstr_new_sz(initial_size); + writer->accumulator = 0; + writer->n_bits = 0; +} + +void gcs_bitwriter_write_bit(gcs_bitwriter *writer, uint8_t bit) { + writer->accumulator |= ((bit & 1) << (7 - writer->n_bits)); + writer->n_bits++; + if (writer->n_bits == 8) { + cstr_append_buf(writer->data, &writer->accumulator, 1); + writer->accumulator = 0; + writer->n_bits = 0; + } +} + +void gcs_bitwriter_write_bits_be(gcs_bitwriter *writer, uint64_t value, int n_bits) { + int i; + for (i = n_bits - 1; i >= 0; i--) { + gcs_bitwriter_write_bit(writer, (uint8_t)((value >> i) & 1)); + } +} + +void gcs_bitwriter_flush(gcs_bitwriter *writer) { + if (writer->n_bits > 0) { + cstr_append_buf(writer->data, &writer->accumulator, 1); + writer->accumulator = 0; + writer->n_bits = 0; + } +} + +/* ================================================================ */ +/* Bitreader Implementation */ +/* ================================================================ */ + +void gcs_bitreader_init(gcs_bitreader *reader, const void *data, size_t len) { + reader->data.p = data; + reader->data.len = len; + reader->accumulator = 0; + reader->n_bits = 0; +} + +int gcs_bitreader_read_bit(gcs_bitreader *reader) { + if (reader->n_bits == 0) { + if (reader->data.len == 0) return -1; + reader->accumulator = *(const uint8_t *)reader->data.p; + reader->data.p = (const uint8_t *)reader->data.p + 1; + reader->data.len--; + reader->n_bits = 8; + } + reader->n_bits--; + return (reader->accumulator >> reader->n_bits) & 1; +} + +dogecoin_bool gcs_bitreader_read_bits_be(gcs_bitreader *reader, int n_bits, uint64_t *out) { + uint64_t result = 0; + int i; + for (i = 0; i < n_bits; i++) { + int bit = gcs_bitreader_read_bit(reader); + if (bit < 0) return false; + result = (result << 1) | (uint64_t)bit; + } + *out = result; + return true; +} + +/* ================================================================ */ +/* Golomb-Rice Coding */ +/* ================================================================ */ + +void golomb_rice_encode(gcs_bitwriter *writer, uint64_t value, int P) { + uint64_t quotient = value >> P; + uint64_t remainder = value & ((1ULL << P) - 1); + + /* Write quotient in unary: quotient 1-bits followed by a 0-bit */ + uint64_t i; + for (i = 0; i < quotient; i++) { + gcs_bitwriter_write_bit(writer, 1); + } + gcs_bitwriter_write_bit(writer, 0); + + /* Write remainder in P bits (MSB first) */ + gcs_bitwriter_write_bits_be(writer, remainder, P); +} + +dogecoin_bool golomb_rice_decode(gcs_bitreader *reader, int P, uint64_t *out) { + /* Read unary-encoded quotient */ + uint64_t quotient = 0; + for (;;) { + int bit = gcs_bitreader_read_bit(reader); + if (bit < 0) return false; + if (bit == 0) break; + quotient++; + } + + /* Read P-bit remainder */ + uint64_t remainder = 0; + if (!gcs_bitreader_read_bits_be(reader, P, &remainder)) return false; + + *out = (quotient << P) | remainder; + return true; +} + +/* ================================================================ */ +/* GCS Key Derivation and Hashing */ +/* ================================================================ */ + +void gcs_derive_key(const uint256_t blockhash, uint8_t key[GCS_SIPHASH_KEY_SIZE]) { + /* Per BIP 158: The first 16 bytes of the block hash (in standard + * byte order) are used as the SipHash key. */ + memcpy(key, blockhash, GCS_SIPHASH_KEY_SIZE); +} + +uint64_t gcs_hash_element(const uint8_t key[GCS_SIPHASH_KEY_SIZE], uint64_t F, const uint8_t *data, size_t data_len) { + /* Extract k0 and k1 from the 16-byte key (little-endian) */ + uint64_t k0 = 0, k1 = 0; + memcpy(&k0, key, 8); + memcpy(&k1, key + 8, 8); + + /* SipHash-2-4 the data element */ + struct siphasher sh; + siphasher_set(&sh, k0, k1); + siphasher_hash(&sh, data, data_len); + uint64_t hash = siphasher_finalize(&sh); + + /* Map into [0, F) using fast range reduction */ + return map_to_range(hash, F); +} + +/* ================================================================ */ +/* GCS Filter Lifecycle */ +/* ================================================================ */ + +gcs_filter* gcs_filter_new(void) { + gcs_filter *filter = dogecoin_calloc(1, sizeof(gcs_filter)); + if (!filter) return NULL; + filter->filter_type = GCS_BASIC_FILTER_TYPE; + filter->P = GCS_BASIC_FILTER_P; + filter->M = GCS_BASIC_FILTER_M; + filter->N = 0; + filter->F = 0; + filter->encoded = NULL; + return filter; +} + +void gcs_filter_free(gcs_filter *filter) { + if (!filter) return; + if (filter->encoded) { + cstr_free(filter->encoded, true); + filter->encoded = NULL; + } + dogecoin_free(filter); +} + +/* ================================================================ */ +/* GCS Filter Building */ +/* ================================================================ */ + +dogecoin_bool gcs_filter_build(gcs_filter *filter, uint8_t filter_type, const uint256_t blockhash, const vector_t *elements) { + if (!filter || !elements) return false; + + filter->filter_type = filter_type; + filter->P = GCS_BASIC_FILTER_P; + filter->M = GCS_BASIC_FILTER_M; + filter->N = (uint32_t)elements->len; + filter->F = (uint64_t)filter->N * (uint64_t)filter->M; + + /* Derive the SipHash key from the block hash */ + gcs_derive_key(blockhash, filter->key); + + /* Handle empty filter */ + if (filter->N == 0) { + filter->encoded = cstr_new_sz(0); + return true; + } + + /* Hash all elements and collect into a sorted array */ + uint64_t *hashes = dogecoin_calloc(filter->N, sizeof(uint64_t)); + if (!hashes) return false; + + unsigned int i; + for (i = 0; i < filter->N; i++) { + cstring *elem = (cstring *)vector_idx(elements, i); + hashes[i] = gcs_hash_element(filter->key, filter->F, (const uint8_t *)elem->str, elem->len); + } + + /* Sort hashes */ + qsort(hashes, filter->N, sizeof(uint64_t), compare_uint64); + + /* Golomb-Rice encode the sorted deltas */ + gcs_bitwriter writer; + gcs_bitwriter_init(&writer, filter->N * 2); /* rough estimate */ + + uint64_t prev = 0; + for (i = 0; i < filter->N; i++) { + uint64_t delta = hashes[i] - prev; + golomb_rice_encode(&writer, delta, filter->P); + prev = hashes[i]; + } + gcs_bitwriter_flush(&writer); + + dogecoin_free(hashes); + + filter->encoded = writer.data; + return true; +} + +/* ================================================================ */ +/* GCS Filter Matching */ +/* ================================================================ */ + +dogecoin_bool gcs_filter_match(const gcs_filter *filter, const uint8_t *data, size_t data_len) { + if (!filter || !filter->encoded) return false; + if (filter->N == 0) return false; + + /* Hash the query element */ + uint64_t target = gcs_hash_element(filter->key, filter->F, data, data_len); + + /* Decode the filter and check for a match */ + gcs_bitreader reader; + gcs_bitreader_init(&reader, filter->encoded->str, filter->encoded->len); + + uint64_t value = 0; + unsigned int i; + for (i = 0; i < filter->N; i++) { + uint64_t delta; + if (!golomb_rice_decode(&reader, filter->P, &delta)) return false; + value += delta; + + if (value == target) return true; + if (value > target) return false; + } + + return false; +} + +dogecoin_bool gcs_filter_match_any(const gcs_filter *filter, const vector_t *elements) { + if (!filter || !filter->encoded || !elements) return false; + if (filter->N == 0 || elements->len == 0) return false; + + /* Hash all query elements and sort */ + size_t n_queries = elements->len; + uint64_t *query_hashes = dogecoin_calloc(n_queries, sizeof(uint64_t)); + if (!query_hashes) return false; + + size_t qi; + for (qi = 0; qi < n_queries; qi++) { + cstring *elem = (cstring *)vector_idx(elements, qi); + query_hashes[qi] = gcs_hash_element(filter->key, filter->F, (const uint8_t *)elem->str, elem->len); + } + + qsort(query_hashes, n_queries, sizeof(uint64_t), compare_uint64); + + /* Walk through both the filter and the sorted queries simultaneously */ + gcs_bitreader reader; + gcs_bitreader_init(&reader, filter->encoded->str, filter->encoded->len); + + uint64_t filter_value = 0; + size_t query_idx = 0; + unsigned int filter_idx = 0; + + /* Decode the first filter element */ + if (filter_idx < filter->N) { + uint64_t delta; + if (!golomb_rice_decode(&reader, filter->P, &delta)) { + dogecoin_free(query_hashes); + return false; + } + filter_value += delta; + filter_idx++; + } + + while (query_idx < n_queries && filter_idx <= filter->N) { + if (filter_value == query_hashes[query_idx]) { + dogecoin_free(query_hashes); + return true; + } + + if (filter_value < query_hashes[query_idx]) { + /* Advance filter */ + if (filter_idx >= filter->N) break; + uint64_t delta; + if (!golomb_rice_decode(&reader, filter->P, &delta)) break; + filter_value += delta; + filter_idx++; + } else { + /* Advance query */ + query_idx++; + } + } + + dogecoin_free(query_hashes); + return false; +} + +/* ================================================================ */ +/* BIP 158 Basic Filter Construction */ +/* ================================================================ */ + +dogecoin_bool gcs_build_basic_filter(gcs_filter *filter, const uint256_t blockhash, const vector_t *txs, const vector_t *prev_output_scripts) { + if (!filter || !txs) return false; + + /* Collect all scriptPubKeys */ + vector_t *elements = vector_new(64, cstr_free_void); + + unsigned int ti; + for (ti = 0; ti < txs->len; ti++) { + dogecoin_tx *tx = (dogecoin_tx *)vector_idx(txs, ti); + + /* Add all output scriptPubKeys */ + unsigned int oi; + for (oi = 0; oi < tx->vout->len; oi++) { + dogecoin_tx_out *txout = (dogecoin_tx_out *)vector_idx(tx->vout, oi); + if (txout->script_pubkey && txout->script_pubkey->len > 0) { + /* Skip OP_RETURN (0x6a) outputs per BIP 158 */ + if (txout->script_pubkey->len > 0 && (uint8_t)txout->script_pubkey->str[0] == 0x6a) { + continue; + } + cstring *elem = cstr_new_buf(txout->script_pubkey->str, txout->script_pubkey->len); + vector_add(elements, elem); + } + } + } + + /* Add all previous output scripts (scripts being spent by inputs) */ + if (prev_output_scripts) { + unsigned int pi; + for (pi = 0; pi < prev_output_scripts->len; pi++) { + cstring *script = (cstring *)vector_idx(prev_output_scripts, pi); + if (script && script->len > 0) { + cstring *elem = cstr_new_buf(script->str, script->len); + vector_add(elements, elem); + } + } + } + + /* Remove duplicates: sort by content and deduplicate */ + /* For simplicity, we let the GCS handle duplicates - they just + * result in zero-deltas which encode efficiently. The BIP says + * to deduplicate, so we do a simple O(n^2) check for small sets. */ + /* TODO: optimize for large sets with a hash set */ + + dogecoin_bool result = gcs_filter_build(filter, GCS_BASIC_FILTER_TYPE, blockhash, elements); + + vector_free(elements, true); + return result; +} + +/* ================================================================ */ +/* Filter Header Computation */ +/* ================================================================ */ + +dogecoin_bool gcs_filter_compute_header(const gcs_filter *filter, const uint256_t prev_header, uint256_t header_out) { + if (!filter) return false; + + /* Compute filter_hash = dbl_sha256(N (compact size) || encoded_data) */ + cstring *serialized = cstr_new_sz(filter->encoded ? filter->encoded->len + 5 : 5); + ser_varlen(serialized, filter->N); + if (filter->encoded && filter->encoded->len > 0) { + cstr_append_buf(serialized, filter->encoded->str, filter->encoded->len); + } + + uint256_t filter_hash; + dogecoin_hash((const unsigned char *)serialized->str, serialized->len, filter_hash); + cstr_free(serialized, true); + + /* Compute filter_header = dbl_sha256(filter_hash || prev_header) */ + uint8_t combined[64]; + memcpy(combined, filter_hash, 32); + memcpy(combined + 32, prev_header, 32); + dogecoin_hash(combined, 64, header_out); + + return true; +} + +/* ================================================================ */ +/* Filter Serialization / Deserialization */ +/* ================================================================ */ + +void gcs_filter_serialize(const gcs_filter *filter, cstring *out) { + if (!filter || !out) return; + + /* Serialize as: N (CompactSize) || encoded_filter_data */ + ser_varlen(out, filter->N); + if (filter->encoded && filter->encoded->len > 0) { + cstr_append_buf(out, filter->encoded->str, filter->encoded->len); + } +} + +dogecoin_bool gcs_filter_deserialize(gcs_filter *filter, uint8_t filter_type, const uint256_t blockhash, struct const_buffer *buf) { + if (!filter || !buf) return false; + + filter->filter_type = filter_type; + filter->P = GCS_BASIC_FILTER_P; + filter->M = GCS_BASIC_FILTER_M; + + /* Derive the key from the block hash */ + gcs_derive_key(blockhash, filter->key); + + /* Deserialize: N (CompactSize) || encoded_filter_data */ + uint32_t N; + if (!deser_varlen(&N, buf)) return false; + filter->N = N; + filter->F = (uint64_t)N * (uint64_t)filter->M; + + /* Remaining data is the encoded filter */ + if (filter->encoded) { + cstr_free(filter->encoded, true); + } + + if (buf->len > 0) { + filter->encoded = cstr_new_buf(buf->p, buf->len); + /* Consume the rest of the buffer */ + buf->p = (const uint8_t *)buf->p + buf->len; + buf->len = 0; + } else { + filter->encoded = cstr_new_sz(0); + } + + return true; +} diff --git a/src/headersdb_file.c b/src/headersdb_file.c index a851c413c..33b473690 100644 --- a/src/headersdb_file.c +++ b/src/headersdb_file.c @@ -211,13 +211,12 @@ dogecoin_bool dogecoin_headers_db_load(dogecoin_headers_db* db, const char *file size_t connected_headers_count = 0; if (db->headers_tree_file && !create) { - printf("Loading headers from disk, this may take several minutes...\n"); + printf("Loading headers from disk...\n"); while (!feof(db->headers_tree_file)) { - // print progress - if (connected_headers_count % 1000 == 0) + if (connected_headers_count % 100000 == 0 && connected_headers_count > 0) { - printf("\r%ld headers loaded", connected_headers_count); + printf("\r%zu headers loaded", connected_headers_count); fflush(stdout); } @@ -225,8 +224,6 @@ dogecoin_bool dogecoin_headers_db_load(dogecoin_headers_db* db, const char *file if (fread(buf_all, sizeof(buf_all), 1, db->headers_tree_file) == 1) { struct const_buffer cbuf_all = {buf_all, sizeof(buf_all)}; - //load all - uint256_t hash; uint32_t height; arith_uint256 chainwork = {0}; @@ -266,10 +263,46 @@ dogecoin_bool dogecoin_headers_db_load(dogecoin_headers_db* db, const char *file } } } - printf("\nConnected %ld headers, now at height: %d\n", connected_headers_count, db->chaintip->height); + printf("\nConnected %zu headers, now at height: %d\n", connected_headers_count, db->chaintip->height); return (db->headers_tree_file != NULL); } +/** + * Open an existing headers DB file for sequential hash lookup only. + * + * Unlike dogecoin_headers_db_load(), this function does NOT read any block + * records or build the in-memory tree. It simply opens the file, verifies + * the 8-byte magic+version header, and leaves the file handle ready for + * dogecoin_headers_db_get_block_hash_at_height(). Use this for the aux + * hash-lookup DB in BIP157 genesis filter IBD — no tree needed. + */ +dogecoin_bool dogecoin_headers_db_open_for_scan(dogecoin_headers_db *db, const char *filename) +{ + if (!db || !filename) return false; + + db->headers_tree_file = fopen(filename, "rb"); + if (!db->headers_tree_file) { + fprintf(stderr, "headers_db: cannot open '%s' for scan: %s\n", filename, strerror(errno)); + return false; + } + + uint8_t buf[sizeof(file_hdr_magic) + sizeof(current_version)]; + if (fread(buf, sizeof(buf), 1, db->headers_tree_file) != 1 || + memcmp(buf, file_hdr_magic, sizeof(file_hdr_magic)) != 0) { + fprintf(stderr, "headers_db: bad magic in '%s'\n", filename); + fclose(db->headers_tree_file); + db->headers_tree_file = NULL; + return false; + } + if (le32toh(*(uint32_t *)(buf + sizeof(file_hdr_magic))) > current_version) { + fprintf(stderr, "headers_db: unsupported version in '%s'\n", filename); + fclose(db->headers_tree_file); + db->headers_tree_file = NULL; + return false; + } + return true; +} + /** * The function takes a block index and writes it to the headers database * @@ -558,6 +591,108 @@ dogecoin_bool dogecoin_headersdb_has_checkpoint_start(dogecoin_headers_db* db) { return (db->chainbottom->height != 0); } +/** + * Find a block hash by height, first in the in-memory prev chain and then by + * scanning the on-disk header file. Used by the BIP157 cfheaders batcher to + * compute a valid stop_hash without needing a height-indexed block index. + */ +dogecoin_bool dogecoin_headers_db_get_block_hash_at_height(dogecoin_headers_db *db, uint32_t target_height, uint256_t hash_out) +{ + if (!db) return false; + + /* Fast path: walk the in-memory prev chain (works for the last max_hdr_in_mem entries) */ + dogecoin_blockindex *bi = db->chaintip; + while (bi && (uint32_t)bi->height > target_height) + bi = bi->prev; + if (bi && (uint32_t)bi->height == target_height) { + memcpy_safe(hash_out, bi->hash, sizeof(uint256_t)); + return true; + } + + /* Slow path: scan the on-disk file. + * Records are written in ascending height order (one getheaders batch at a time). + * Record layout: hash(32) + height(4 LE) + chainwork(32) + header(80) = 148 bytes. + * + * cfheaders batches request heights in ascending order (2000, 4000, ...). + * Scanning from offset 0 each time would be O(N²) over a 6M-block file. + * Instead, resume from the last scan position when target_height is beyond + * what was found before; reset to the beginning only when scanning backwards. */ + if (!db->headers_tree_file) return false; + + long saved_pos = ftell(db->headers_tree_file); + + long start_pos = SPV_HEADERS_FILE_HDR_LEN; + if (db->scan_resume_height > 0 && target_height >= db->scan_resume_height) + start_pos = db->scan_resume_pos; /* continue forward from last find */ + + fseek(db->headers_tree_file, start_pos, SEEK_SET); + + uint8_t rec[SPV_HEADERS_FILE_REC_LEN]; + dogecoin_bool found = false; + while (fread(rec, SPV_HEADERS_FILE_REC_LEN, 1, db->headers_tree_file) == 1) { + uint32_t h; + memcpy(&h, rec + 32, 4); /* height field is at offset 32 (after the hash) */ + h = le32toh(h); + if (h == target_height) { + memcpy_safe(hash_out, rec, sizeof(uint256_t)); + /* Remember this position so the next forward lookup can skip ahead. */ + db->scan_resume_pos = ftell(db->headers_tree_file); + db->scan_resume_height = h; + found = true; + break; + } + } + + fseek(db->headers_tree_file, saved_pos, SEEK_SET); + return found; +} + +/* Sequential variant used during the cfilter rescan: like + * dogecoin_headers_db_get_block_hash_at_height but never restores the file + * position. The caller (spv_rescan_cb) visits heights in strictly ascending + * order so the file pointer advances forward only, keeping I/O O(N) instead + * of O(N²) that the save/restore pattern would produce. */ +dogecoin_bool dogecoin_headers_db_get_block_hash_at_height_seq(dogecoin_headers_db *db, uint32_t target_height, uint256_t hash_out) +{ + if (!db) return false; + + /* Fast path: in-memory prev chain — only useful for heights near the tip. + * Skip if target is more than max_hdr_in_mem below the tip to avoid + * walking the full 1440-entry chain 6M+ times during a bulk rescan. */ + if (db->chaintip && + (uint32_t)db->chaintip->height <= target_height + db->max_hdr_in_mem) { + dogecoin_blockindex *bi = db->chaintip; + while (bi && (uint32_t)bi->height > target_height) + bi = bi->prev; + if (bi && (uint32_t)bi->height == target_height) { + memcpy_safe(hash_out, bi->hash, sizeof(uint256_t)); + return true; + } + } + + if (!db->headers_tree_file) return false; + + long start_pos = SPV_HEADERS_FILE_HDR_LEN; + if (db->scan_resume_height > 0 && target_height >= db->scan_resume_height) + start_pos = db->scan_resume_pos; + + fseek(db->headers_tree_file, start_pos, SEEK_SET); + + uint8_t rec[SPV_HEADERS_FILE_REC_LEN]; + while (fread(rec, SPV_HEADERS_FILE_REC_LEN, 1, db->headers_tree_file) == 1) { + uint32_t h; + memcpy(&h, rec + 32, 4); + h = le32toh(h); + if (h == target_height) { + memcpy_safe(hash_out, rec, sizeof(uint256_t)); + db->scan_resume_pos = ftell(db->headers_tree_file); + db->scan_resume_height = h; + return true; + } + } + return false; +} + /** * Set the checkpoint block to the given hash and height * diff --git a/src/spv.c b/src/spv.c index ffab9d4a9..00aa4148e 100644 --- a/src/spv.c +++ b/src/spv.c @@ -39,6 +39,7 @@ #endif #include +#include #include #include #include @@ -48,8 +49,12 @@ #include #include +#include #include +#include +#include #include +#include #include #include #include @@ -121,6 +126,798 @@ static dogecoin_bool spv_send_filterload_to_node(dogecoin_node* node, return true; } +static uint32_t spv_elapsed(const dogecoin_spv_client *client) { + return (uint32_t)((uint64_t)time(NULL) - client->start_ts); +} + +/* ================================================================ */ +/* Parallel cfheaders download helpers */ +/* ================================================================ */ + +static dogecoin_bool spv_cf_par_assign(dogecoin_spv_client *client, dogecoin_node *node); +static uint32_t cf_find_checkpoint_stop(const dogecoin_chainparams *params, uint32_t target_height, uint256_t hash_out); + +/* Send one GETCFHEADERS batch for a chunk, clamped to batch_max. + * Fills stop_hash from headers DB / cfcheckpt fallback. */ +static void cfh_par_send_batch(dogecoin_spv_client *client, dogecoin_node *node, + cfh_par_chunk *ch, dogecoin_blockindex *tip_bi) +{ + uint32_t start = ch->req_next; + uint32_t end = start + MAX_GETCFHEADERS_SIZE - 1; + if (end > ch->end) end = ch->end; + + uint256_t stop_hash; + if (tip_bi && end == (uint32_t)tip_bi->height) { + memcpy(stop_hash, tip_bi->hash, 32); + } else { + dogecoin_headers_db *hdb = (dogecoin_headers_db *)client->headers_db_ctx; + if (!dogecoin_headers_db_get_block_hash_at_height(hdb, end, stop_hash)) { + dogecoin_bool aux_found = false; + if (client->aux_hash_db && client->aux_hash_db_ctx) { + dogecoin_headers_db *aux = (dogecoin_headers_db *)client->aux_hash_db_ctx; + aux_found = dogecoin_headers_db_get_block_hash_at_height(aux, end, stop_hash); + } + if (!aux_found && tip_bi) + memcpy(stop_hash, tip_bi->hash, 32); + } + } + + dogecoin_getcfheaders_msg msg; + msg.filter_type = GCS_BASIC_FILTER_TYPE; + msg.start_height = start; + memcpy(msg.stop_hash, stop_hash, 32); + + cstring *payload = cstr_new_sz(64); + dogecoin_p2p_msg_getcfheaders_ser(&msg, payload); + cstring *p2pmsg = dogecoin_p2p_message_new( + node->nodegroup->chainparams->netmagic, + DOGECOIN_MSG_GETCFHEADERS, payload->str, payload->len); + cstr_free(payload, true); + dogecoin_node_send(node, p2pmsg); + cstr_free(p2pmsg, true); + + ch->req_next = end + 1; + + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157-cfh-par] node %d: getcfheaders [%u..%u] [%us elapsed]\n", + node->nodeid, start, end, spv_elapsed(client)); +} + +/* Assign the next unassigned cfheaders chunk to @node. */ +static dogecoin_bool cfh_par_assign(dogecoin_spv_client *client, dogecoin_node *node) +{ + dogecoin_compact_filter_state *cfstate = client->cfilter_state; + if (!cfstate || cfstate->cfh_par_n == 0) return false; + + dogecoin_blockindex *tip_bi = + client->headers_db->getchaintip(client->headers_db_ctx); + + uint8_t wi; + for (wi = 0; wi < cfstate->cfh_par_n; wi++) { + cfh_par_chunk *ch = &cfstate->cfh_par_chunks[wi]; + if (ch->node_id != -1) continue; /* already assigned or no-work */ + ch->node_id = node->nodeid; + cfh_par_send_batch(client, node, ch, tip_bi); + return true; + } + return false; +} + +/* Initialise parallel cfheaders download and assign to available CF nodes. */ +static void cfh_par_init(dogecoin_spv_client *client, + dogecoin_blockindex *tip_bi, + uint32_t cfh_start) +{ + dogecoin_compact_filter_state *cfstate = client->cfilter_state; + uint8_t n_workers = client->cf_num_workers; + uint32_t tip = (uint32_t)tip_bi->height; + + /* Every chunk after the first anchors on the cfcheckpt filter header at + * (start - 1), so start - 1 has to land exactly on a CFCHECKPT_INTERVAL + * boundary. Chunk size is already a multiple of the interval, so that holds + * for every chunk iff it holds for the first: snap cfh_start down to the + * nearest k*CFCHECKPT_INTERVAL + 1. + * + * Without this, a resume start such as 6314590 gives chunk 1 a start of + * 6315590, and (6315590 - 1) / 1000 = 6315 selects the checkpoint for + * height 6315000 -- an anchor 589 blocks off. Every header the chunk + * derives is then wrong, surfacing as a checkpoint failure at the next + * boundary rather than at the point the anchor was chosen. A genesis sync + * starts at 1 and satisfies the precondition by accident, which is why this + * only appears when resuming. */ + if (cfh_start > 1) { + uint32_t aligned = ((cfh_start - 1) / CFCHECKPT_INTERVAL) * CFCHECKPT_INTERVAL + 1; + if (aligned < 1) aligned = 1; + cfh_start = aligned; + } + + /* Chunk size rounded up to CFCHECKPT_INTERVAL so boundaries align with + * cfcheckpt anchors, enabling independent per-chunk validation. */ + uint32_t total = tip - cfh_start + 1; + uint32_t raw_chunk = (total + n_workers - 1) / n_workers; + uint32_t chunk_sz = ((raw_chunk + CFCHECKPT_INTERVAL - 1) / CFCHECKPT_INTERVAL) + * CFCHECKPT_INTERVAL; + if (chunk_sz < CFCHECKPT_INTERVAL) chunk_sz = CFCHECKPT_INTERVAL; + + cfstate->cfh_par_n = n_workers; + cfstate->cfh_par_done = 0; + cfstate->cfh_par_base = cfh_start; + cfstate->cfh_par_total = total; + cfstate->cfh_par_data = (uint8_t *)dogecoin_calloc(total, 32); + cfstate->cfh_par_chunks = (cfh_par_chunk *)dogecoin_calloc(n_workers, sizeof(cfh_par_chunk)); + if (!cfstate->cfh_par_data || !cfstate->cfh_par_chunks) { + /* OOM — fall back to sequential */ + dogecoin_free(cfstate->cfh_par_data); cfstate->cfh_par_data = NULL; + dogecoin_free(cfstate->cfh_par_chunks); cfstate->cfh_par_chunks = NULL; + cfstate->cfh_par_n = 0; + return; + } + + uint8_t wi; + uint8_t effective_n = 0; + for (wi = 0; wi < n_workers; wi++) { + cfh_par_chunk *ch = &cfstate->cfh_par_chunks[wi]; + uint32_t start = cfh_start + (uint32_t)wi * chunk_sz; + if (start > tip) { + ch->node_id = -2; /* no work for this slot */ + cfstate->cfh_par_done++; + continue; + } + ch->start = start; + ch->end = start + chunk_sz - 1; + if (ch->end > tip) ch->end = tip; + ch->req_next = ch->start; + ch->node_id = -1; /* unassigned */ + ch->n_received = 0; + ch->complete = false; + effective_n++; + + if (wi == 0) { + /* Genesis anchor comes from the first CFHEADERS response's + * prev_filter_header field; initialise to zero for now. */ + memset(ch->prev_fh, 0, 32); + } else { + /* Anchor = cfcheckpt filter header immediately before start. + * start - 1 must be a multiple of CFCHECKPT_INTERVAL. */ + uint32_t prev_h = ch->start - 1; + uint32_t cp_idx = prev_h / CFCHECKPT_INTERVAL; + if (cp_idx > 0 && (cp_idx - 1) < cfstate->checkpoints->len) { + memcpy(ch->prev_fh, + vector_idx(cfstate->checkpoints, cp_idx - 1), 32); + } else { + memset(ch->prev_fh, 0, 32); + } + } + } + + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157-cfh-par] starting parallel cfheaders: %u workers, " + "chunk_sz=%u, heights %u..%u [%us elapsed]\n", + (unsigned int)effective_n, chunk_sz, cfh_start, tip, + spv_elapsed(client)); + + /* Assign one chunk to each connected CF node */ + unsigned int ni; + for (ni = 0; ni < client->nodegroup->nodes->len; ni++) { + dogecoin_node *wn = (dogecoin_node *)vector_idx(client->nodegroup->nodes, ni); + if (!wn || !(wn->state & NODE_CONNECTED) || !wn->version_handshake) continue; + if (!(wn->services & DOGECOIN_NODE_COMPACT_FILTERS)) continue; + cfh_par_assign(client, wn); + } + + cfstate->awaiting_response = false; +} + +/* Callback context for spv_rescan_cached_cfilters. */ +typedef struct { + dogecoin_spv_client *client; + uint32_t up_to_height; /* only rescan heights < this */ + uint32_t scanned; + uint32_t matched; +} rescan_ctx; + +/* Iterator callback: match one cached cfilter against watched_scripts. */ +static dogecoin_bool spv_rescan_cb(uint32_t height, const uint256_t block_hash, + const uint8_t *filter_data, uint32_t data_len, + void *ctx_) +{ + rescan_ctx *ctx = (rescan_ctx *)ctx_; + if (height >= ctx->up_to_height) return false; /* stop; network takes over here */ + + dogecoin_compact_filter_state *cfstate = ctx->client->cfilter_state; + if (!cfstate->watched_scripts || cfstate->watched_scripts->len == 0) return true; + + ctx->scanned++; + + /* The block_hash stored in cfilters.dat may be corrupted by an old deser bug + * (filter_type byte prepended, last hash byte zeroed). The GCS SipHash key is + * derived directly from the block hash, so a wrong hash produces wrong match + * results. Look up the authoritative hash from the headers DB BEFORE + * deserializing the filter so that the correct key is used for matching. + * Use the _seq variant which never restores the file pointer, keeping sequential + * ascending-order lookups O(N) rather than O(N²). */ + uint256_t correct_hash; + dogecoin_bool hash_ok = false; + if (ctx->client->headers_db && ctx->client->headers_db_ctx) { + dogecoin_headers_db *hdb = (dogecoin_headers_db *)ctx->client->headers_db_ctx; + hash_ok = dogecoin_headers_db_get_block_hash_at_height_seq(hdb, height, correct_hash); + } + if (!hash_ok && ctx->client->aux_hash_db && ctx->client->aux_hash_db_ctx) { + dogecoin_headers_db *aux = (dogecoin_headers_db *)ctx->client->aux_hash_db_ctx; + hash_ok = dogecoin_headers_db_get_block_hash_at_height_seq(aux, height, correct_hash); + } + const uint8_t *hash_for_gcs = hash_ok ? (const uint8_t *)correct_hash + : (const uint8_t *)block_hash; + + gcs_filter *gcs = gcs_filter_new(); + struct const_buffer fbuf = { filter_data, data_len }; + if (gcs_filter_deserialize(gcs, GCS_BASIC_FILTER_TYPE, hash_for_gcs, &fbuf)) { + if (gcs_filter_match_any(gcs, cfstate->watched_scripts)) { + if (ctx->client->nodegroup && ctx->client->nodegroup->log_write_cb) + ctx->client->nodegroup->log_write_cb( + "[bip157] MATCH (rescan) at height %u\n", height); + uint256_t *matched_hash = dogecoin_calloc(1, sizeof(uint256_t)); + memcpy(matched_hash, hash_for_gcs, sizeof(uint256_t)); + vector_add(cfstate->matched_block_hashes, matched_hash); + uint32_t *matched_height = dogecoin_calloc(1, sizeof(uint32_t)); + *matched_height = height; + vector_add(cfstate->matched_block_heights, matched_height); + ctx->matched++; + } + } + gcs_filter_free(gcs); + return true; +} + +/* Rescan cached cfilters (heights 1..cf_scan_start-1) against watched_scripts. + * Called before starting the network download so that already-stored filters + * are not skipped when scripts were registered after the previous sync. */ +static void spv_rescan_cached_cfilters(dogecoin_spv_client *client, uint32_t cf_scan_start) +{ + if (!client->cfilters_db) return; + dogecoin_compact_filter_state *cfstate = client->cfilter_state; + if (!cfstate || !cfstate->watched_scripts || cfstate->watched_scripts->len == 0) return; + + /* Skip partial rescan if a full startup rescan already covered everything. */ + if (cfstate->rescan_done) return; + + if (cf_scan_start <= 1) return; + + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157] rescanning cached filters heights 1..%u against %u watched scripts\n", + cf_scan_start - 1, (unsigned int)cfstate->watched_scripts->len); + + rescan_ctx ctx = { client, cf_scan_start, 0, 0 }; + dogecoin_cfilters_db_iterate(client->cfilters_db, spv_rescan_cb, &ctx); + + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157] rescan complete: %u filters checked, %u matched\n", + ctx.scanned, ctx.matched); +} + +/* Repair cfilters.dat records whose block_hash was written with an off-by-one + * deserialization bug (old code read the 32-byte hash before the 1-byte + * filter_type, so stored hashes contain the filter_type byte prepended and the + * last hash byte replaced with 0x00). The symptom: stored_hash[31] == 0x00. + * We correct each such record in-place using the authoritative hash from the + * headers DB. Only records opened read-write are touched. */ +static void spv_repair_cfilters_hashes(dogecoin_spv_client *client) +{ + dogecoin_cfilters_db *db = client->cfilters_db; + if (!db || !db->file || !db->read_write) return; + + dogecoin_headers_db *hdb = client->headers_db ? (dogecoin_headers_db *)client->headers_db_ctx : NULL; + dogecoin_headers_db *aux = client->aux_hash_db ? (dogecoin_headers_db *)client->aux_hash_db_ctx : NULL; + if (!hdb && !aux) return; + + if (fseek(db->file, CF_HEADERS_FILE_HDR_LEN, SEEK_SET) != 0) return; + + uint32_t repaired = 0; + uint8_t hdr[CF_FILTERS_FILE_REC_HDR_LEN]; + while (fread(hdr, CF_FILTERS_FILE_REC_HDR_LEN, 1, db->file) == 1) { + uint32_t height, data_len; + memcpy(&height, hdr, 4); height = le32toh(height); + memcpy(&data_len, hdr + 36, 4); data_len = le32toh(data_len); + + /* Quick corruption check: the old bug always left byte 31 of the hash + * as 0x00 (zero-initialised, never written). Real hashes end in 0x00 + * ~1/256 of the time so we'll do a few unnecessary lookups, but those + * will match and no write will be issued. */ + if (hdr[35] == 0x00) { + uint256_t correct; + dogecoin_bool ok = hdb && dogecoin_headers_db_get_block_hash_at_height(hdb, height, correct); + if (!ok && aux) ok = dogecoin_headers_db_get_block_hash_at_height(aux, height, correct); + if (ok && memcmp(hdr + 4, correct, 32) != 0) { + long rec_start = ftell(db->file) - (long)CF_FILTERS_FILE_REC_HDR_LEN; + if (fseek(db->file, rec_start + 4, SEEK_SET) == 0) { + fwrite(correct, 32, 1, db->file); + fseek(db->file, rec_start + (long)CF_FILTERS_FILE_REC_HDR_LEN, SEEK_SET); + repaired++; + } + } + } + + if (data_len > 0 && fseek(db->file, (long)data_len, SEEK_CUR) != 0) break; + } + + fseek(db->file, 0, SEEK_END); + + if (repaired > 0 && client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157] repaired %u cfilter block hashes (old deserialization bug)\n", repaired); +} + +void dogecoin_spv_client_rescan_cached_filters(dogecoin_spv_client *client) +{ + if (!client || !client->cfilters_db) return; + dogecoin_compact_filter_state *cfstate = client->cfilter_state; + if (!cfstate || !cfstate->watched_scripts || cfstate->watched_scripts->len == 0) return; + + uint32_t tip = client->cfilters_db->tip_height; + if (tip == 0) return; + + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157] startup rescan: checking all %u cached filters against %u watched scripts\n", + tip, (unsigned int)cfstate->watched_scripts->len); + + rescan_ctx ctx = { client, UINT32_MAX, 0, 0 }; + dogecoin_cfilters_db_iterate(client->cfilters_db, spv_rescan_cb, &ctx); + + cfstate->rescan_done = true; + + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157] startup rescan complete: %u filters checked, %u matched\n", + ctx.scanned, ctx.matched); +} + +/* Called when all cfheaders chunks are complete: populate filter_headers + * from the flat array and transition to cfilter download. */ +static void cfh_par_finish(dogecoin_spv_client *client, dogecoin_node *node) +{ + dogecoin_compact_filter_state *cfstate = client->cfilter_state; + dogecoin_blockindex *tip_bi = + client->headers_db->getchaintip(client->headers_db_ctx); + + cfstate->cfheaders_tip_height = cfstate->cfh_par_base + cfstate->cfh_par_total - 1; + cfstate->cfheaders_base_height = cfstate->cfh_par_base; + memcpy(cfstate->cfheaders_tip_hash, + cfstate->cfh_par_data + (cfstate->cfh_par_total - 1) * 32, 32); + + /* Persist filter headers to disk — single flush after the batch */ + if (client->cfheaders_db) { + uint32_t h; + for (h = 0; h < cfstate->cfh_par_total; h++) { + dogecoin_cfheaders_db_write(client->cfheaders_db, + cfstate->cfh_par_base + h, + cfstate->cfh_par_data + h * 32); + } + dogecoin_cfheaders_db_flush(client->cfheaders_db); + } + + /* Transfer cfh_par_data ownership to filter_headers_flat for O(1) cfilter lookups. + * This avoids 6M+ individual calloc calls that would otherwise stall here. */ + if (cfstate->filter_headers_flat) + dogecoin_free(cfstate->filter_headers_flat); + cfstate->filter_headers_flat = cfstate->cfh_par_data; + cfstate->filter_headers_flat_base = cfstate->cfh_par_base; + cfstate->filter_headers_flat_len = cfstate->cfh_par_total; + + /* Free parallel cfheaders state (data pointer now owned by filter_headers_flat) */ + cfstate->cfh_par_data = NULL; + dogecoin_free(cfstate->cfh_par_chunks); cfstate->cfh_par_chunks = NULL; + cfstate->cfh_par_n = 0; + cfstate->cfh_par_done = 0; + cfstate->cfh_par_total = 0; + + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157-cfh-par] all cfheaders complete (tip=%u), starting cfilter scan [%us elapsed]\n", + cfstate->cfheaders_tip_height, spv_elapsed(client)); + + /* Start cfilter download */ + dogecoin_headers_db *hdb_cf = (dogecoin_headers_db *)client->headers_db_ctx; + uint32_t cf_scan_start = 1; + if (client->cf_start_height > 0) { + /* --cf_from_genesis or API override: honour the requested start height */ + cf_scan_start = client->cf_start_height; + } else if (hdb_cf && hdb_cf->chainbottom && hdb_cf->chainbottom->height > 0) { + cf_scan_start = hdb_cf->chainbottom->height; + } + + /* Clamp cf_scan_start so we only download cfilters we can validate. + * filter_headers_flat covers cfheaders_base_height..cfheaders_tip_height; + * heights below that were already scanned by the startup rescan. */ + if (cfstate->cfheaders_base_height > 0 && + cf_scan_start < cfstate->cfheaders_base_height) + cf_scan_start = cfstate->cfheaders_base_height; + + /* If startup rescan already covered the cached cfilter range, + * only download filters beyond that tip. */ + if (cfstate->rescan_done && client->cfilters_db && + client->cfilters_db->tip_height > 0 && + cf_scan_start <= client->cfilters_db->tip_height) + cf_scan_start = client->cfilters_db->tip_height + 1; + + /* Rescan any cached filters (heights 1..cf_scan_start-1) that were stored + * in a prior run before these watched scripts were registered. */ + spv_rescan_cached_cfilters(client, cf_scan_start); + + cfstate->cf_scan_start_height = cf_scan_start; + if (client->cf_num_workers > 1) { + cfstate->par_num_workers = client->cf_num_workers; + cfstate->par_next_height = cf_scan_start; + cfstate->par_flush_height = cf_scan_start; + cfstate->filters_tip_height = (cf_scan_start > 1) ? cf_scan_start - 1 : 0; + if (!cfstate->par_bufs) { + cfstate->par_bufs = (cf_par_buf *)dogecoin_calloc( + cfstate->par_num_workers, sizeof(cf_par_buf)); + uint8_t pi; + for (pi = 0; pi < cfstate->par_num_workers; pi++) + cfstate->par_bufs[pi].node_id = -1; + } + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157-par] assigning %u parallel cfilter workers from height %u\n", + (unsigned int)cfstate->par_num_workers, cf_scan_start); + unsigned int ni; + for (ni = 0; ni < client->nodegroup->nodes->len; ni++) { + dogecoin_node *wn = (dogecoin_node *)vector_idx( + client->nodegroup->nodes, ni); + if (!wn || !(wn->state & NODE_CONNECTED) || !wn->version_handshake) + continue; + spv_cf_par_assign(client, wn); + } + } else { + cfstate->filters_tip_height = (cf_scan_start > 1) ? cf_scan_start - 1 : 0; + dogecoin_spv_request_cfilters(client, node, cf_scan_start, tip_bi->hash); + } +} + +/* Handle a CFHEADERS message in parallel cfheaders download mode. */ +static void cfh_par_handle_response(dogecoin_spv_client *client, + dogecoin_node *node, + dogecoin_cfheaders_msg *cfh_msg) +{ + dogecoin_compact_filter_state *cfstate = client->cfilter_state; + + /* Find the chunk assigned to this node */ + cfh_par_chunk *ch = NULL; + uint8_t wi; + for (wi = 0; wi < cfstate->cfh_par_n; wi++) { + if (cfstate->cfh_par_chunks[wi].node_id == node->nodeid) { + ch = &cfstate->cfh_par_chunks[wi]; + break; + } + } + if (!ch) return; + + /* For chunk 0 (genesis anchor), capture genesis_filter_header from first batch */ + if (ch->n_received == 0 && ch->start == cfstate->cfh_par_base) { + memcpy(cfstate->genesis_filter_header, cfh_msg->prev_filter_header, 32); + memcpy(ch->prev_fh, cfh_msg->prev_filter_header, 32); + if (client->cfheaders_db) + dogecoin_cfheaders_db_write_genesis(client->cfheaders_db, + cfh_msg->prev_filter_header); + } + + uint8_t prev_fh[32]; + memcpy(prev_fh, ch->prev_fh, 32); + + dogecoin_bool valid = true; + unsigned int i; + for (i = 0; i < cfh_msg->filter_hashes->len; i++) { + uint32_t height = ch->start + ch->n_received; + if (height > ch->end) { valid = false; break; } + + uint256_t *filter_hash = (uint256_t *)vector_idx(cfh_msg->filter_hashes, i); + + uint8_t combined[64]; + memcpy(combined, filter_hash, 32); + memcpy(combined + 32, prev_fh, 32); + uint256_t new_header; + dogecoin_hash(combined, 64, new_header); + + /* Validate against cfcheckpt at checkpoint boundaries */ + if (cfstate->checkpoints && cfstate->checkpoints->len > 0 && + height > 0 && (height % CFCHECKPT_INTERVAL) == 0) { + uint32_t cp_idx = height / CFCHECKPT_INTERVAL - 1; + if (cp_idx < cfstate->checkpoints->len) { + uint256_t *checkpoint = (uint256_t *)vector_idx(cfstate->checkpoints, cp_idx); + if (memcmp(new_header, checkpoint, 32) != 0) { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157-cfh-par] cfheader at height %u FAILED checkpoint\n", height); + valid = false; + break; + } + } + } + + /* Store in flat array */ + uint32_t idx = height - cfstate->cfh_par_base; + memcpy(cfstate->cfh_par_data + idx * 32, new_header, 32); + memcpy(prev_fh, new_header, 32); + ch->n_received++; + } + + if (!valid) { + dogecoin_node_misbehave(node); + ch->node_id = -1; /* free slot for reassignment */ + return; + } + + /* Update anchor for next batch */ + memcpy(ch->prev_fh, prev_fh, 32); + + dogecoin_blockindex *tip_bi = client->headers_db->getchaintip(client->headers_db_ctx); + + if (ch->req_next <= ch->end) { + /* More batches needed for this chunk */ + cfh_par_send_batch(client, node, ch, tip_bi); + } else { + /* Chunk complete */ + ch->complete = true; + cfstate->cfh_par_done++; + + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157-cfh-par] node %d chunk %u..%u done (%u/%u workers) [%us elapsed]\n", + node->nodeid, ch->start, ch->end, + (unsigned int)cfstate->cfh_par_done, + (unsigned int)cfstate->cfh_par_n, + spv_elapsed(client)); + + if (cfstate->cfh_par_done >= cfstate->cfh_par_n) + cfh_par_finish(client, node); + else + cfh_par_assign(client, node); /* reuse this node for the next unassigned chunk */ + } +} + +/* ------------------------------------------------------------------ */ +/* Assign the next getcfilters batch to a parallel worker node. */ +/* Returns true if a batch was assigned and getcfilters was sent. */ +/* ------------------------------------------------------------------ */ +static dogecoin_bool spv_cf_par_assign(dogecoin_spv_client *client, dogecoin_node *node) +{ + dogecoin_compact_filter_state *cfstate = client->cfilter_state; + uint32_t start = cfstate->par_next_height; + uint32_t tip = cfstate->cfheaders_tip_height; + + if (start > tip) return false; + + /* Find a free slot */ + int slot = -1; + uint8_t pi; + for (pi = 0; pi < cfstate->par_num_workers; pi++) { + if (cfstate->par_bufs[pi].node_id == -1) { slot = (int)pi; break; } + } + if (slot < 0) return false; + + uint32_t end = start + MAX_GETCFILTERS_SIZE - 1; + if (end > tip) end = tip; + + /* Resolve stop hash BEFORE allocating records so end can be adjusted. */ + uint256_t stop_hash; + dogecoin_blockindex *tip_bi = client->headers_db->getchaintip(client->headers_db_ctx); + if (tip_bi && end == (uint32_t)tip_bi->height) { + memcpy(stop_hash, tip_bi->hash, 32); + } else { + dogecoin_headers_db *hdb = (dogecoin_headers_db *)client->headers_db_ctx; + if (!dogecoin_headers_db_get_block_hash_at_height(hdb, end, stop_hash)) { + dogecoin_bool resolved = false; + if (client->aux_hash_db && client->aux_hash_db_ctx) { + dogecoin_headers_db *aux = (dogecoin_headers_db *)client->aux_hash_db_ctx; + resolved = dogecoin_headers_db_get_block_hash_at_height(aux, end, stop_hash); + } + if (!resolved) { + uint32_t cp_h = cf_find_checkpoint_stop(client->chainparams, end, stop_hash); + if (cp_h > 0 && cp_h <= tip) { + end = cp_h; + } else if (tip_bi) { + /* checkpoint beyond tip or not found — use tip */ + memcpy(stop_hash, tip_bi->hash, 32); + end = (uint32_t)tip_bi->height; + } + } + } + } + + uint32_t count = end - start + 1; + cf_par_buf *buf = &cfstate->par_bufs[slot]; + buf->node_id = node->nodeid; + buf->batch_start = start; + buf->batch_end = end; + buf->received = 0; + buf->complete = false; + buf->assign_time = time(NULL); + buf->records = (cf_par_record *)dogecoin_calloc(count, sizeof(cf_par_record)); + if (!buf->records) { buf->node_id = -1; return false; } + + node->cf_batch_start = start; + node->cf_batch_end = end; + node->cf_cur_height = start; + cfstate->par_next_height = end + 1; + + dogecoin_getcfilters_msg gcf_msg; + gcf_msg.filter_type = GCS_BASIC_FILTER_TYPE; + gcf_msg.start_height = start; + memcpy(gcf_msg.stop_hash, stop_hash, 32); + + cstring *payload = cstr_new_sz(64); + dogecoin_p2p_msg_getcfilters_ser(&gcf_msg, payload); + cstring *p2pmsg = dogecoin_p2p_message_new( + node->nodegroup->chainparams->netmagic, DOGECOIN_MSG_GETCFILTERS, + payload->str, payload->len); + cstr_free(payload, true); + dogecoin_node_send(node, p2pmsg); + cstr_free(p2pmsg, true); + + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157-par] node %d: getcfilters [%u..%u] [%us elapsed]\n", + node->nodeid, start, end, spv_elapsed(client)); + return true; +} + +/* ------------------------------------------------------------------ */ +/* Request full blocks for all BIP157 matched block hashes via P2P. */ +/* ------------------------------------------------------------------ */ +static void spv_cf_request_matched_blocks(dogecoin_spv_client *client) +{ + dogecoin_compact_filter_state *cfstate = client->cfilter_state; + if (!cfstate || !cfstate->matched_block_hashes || cfstate->matched_block_hashes->len == 0) + return; + + /* Collect all connected peers (prefer CF-capable, then any) */ + /* enum, not `const unsigned int`: in C a const object is not a constant + * expression, so `peers[MAX_PEERS]` was a variable-length array. MSVC does + * not implement VLAs and rejected it outright (C2057 / C2133 / C2466). */ + enum { MAX_PEERS = 8 }; + dogecoin_node *peers[MAX_PEERS]; + unsigned int num_peers = 0; + unsigned int ni; + for (ni = 0; ni < client->nodegroup->nodes->len && num_peers < MAX_PEERS; ni++) { + dogecoin_node *n = (dogecoin_node *)vector_idx(client->nodegroup->nodes, ni); + if (!n || !(n->state & NODE_CONNECTED) || !n->version_handshake) continue; + if (n->services & DOGECOIN_NODE_COMPACT_FILTERS) { + /* insert CF peers at the front */ + if (num_peers < MAX_PEERS) { peers[num_peers++] = n; } + } else { + if (num_peers < MAX_PEERS) { peers[num_peers++] = n; } + } + } + if (num_peers == 0) { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb("[bip157] no peer available for matched block fetch\n"); + return; + } + + uint32_t total = (uint32_t)cfstate->matched_block_hashes->len; + cfstate->cf_block_fetch_active = true; + cfstate->matched_blocks_fetched = 0; + + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157] requesting %u matched full blocks across %u peers [%us elapsed]\n", + total, num_peers, spv_elapsed(client)); + + /* Distribute blocks round-robin across peers in batches of 8 */ + const uint32_t batch_max = 8; + uint32_t peer_idx = 0; + uint32_t sent = 0; + while (sent < total) { + dogecoin_node *peer = peers[peer_idx % num_peers]; + peer_idx++; + + uint32_t batch = total - sent; + if (batch > batch_max) batch = batch_max; + + cstring *payload = cstr_new_sz(9 + (size_t)batch * 36); + if (!payload) break; + + ser_varlen(payload, batch); + uint32_t bi; + for (bi = 0; bi < batch; bi++) { + uint32_t type = DOGECOIN_INV_TYPE_BLOCK; + ser_u32(payload, type); + ser_bytes(payload, + (const uint8_t *)vector_idx(cfstate->matched_block_hashes, sent + bi), 32); + } + + cstring *p2p_msg = dogecoin_p2p_message_new( + peer->nodegroup->chainparams->netmagic, + DOGECOIN_MSG_GETDATA, + (const uint8_t *)payload->str, payload->len); + dogecoin_node_send(peer, p2p_msg); + cstr_free(p2p_msg, true); + cstr_free(payload, true); + sent += batch; + } +} + +/* ------------------------------------------------------------------ */ +/* Flush contiguous complete batches to disk in height order. */ +/* ------------------------------------------------------------------ */ +static void spv_cf_par_try_flush(dogecoin_spv_client *client) +{ + dogecoin_compact_filter_state *cfstate = client->cfilter_state; + uint8_t n = cfstate->par_num_workers; + dogecoin_bool flushed; + + do { + flushed = false; + uint8_t pi; + for (pi = 0; pi < n; pi++) { + cf_par_buf *buf = &cfstate->par_bufs[pi]; + if (buf->node_id == -1 || !buf->complete) continue; + if (buf->batch_start != cfstate->par_flush_height) continue; + + /* Flush this batch sequentially */ + uint32_t count = buf->batch_end - buf->batch_start + 1; + uint32_t ri; + for (ri = 0; ri < count; ri++) { + uint32_t h = buf->batch_start + ri; + cf_par_record *rec = &buf->records[ri]; + if (rec->filter_data) { + if (client->cfilters_db) + dogecoin_cfilters_db_write(client->cfilters_db, h, + rec->block_hash, rec->filter_data); + cstr_free(rec->filter_data, true); + rec->filter_data = NULL; + } + } + + cfstate->filters_tip_height = buf->batch_end; + cfstate->par_flush_height = buf->batch_end + 1; + + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157-par] flushed [%u..%u], progress %u/%u [%us elapsed]\n", + buf->batch_start, buf->batch_end, + buf->batch_end, cfstate->cfheaders_tip_height, + spv_elapsed(client)); + + dogecoin_free(buf->records); + buf->records = NULL; + buf->node_id = -1; + buf->complete = false; + flushed = true; + break; + } + } while (flushed); + + if (cfstate->filters_tip_height >= cfstate->cfheaders_tip_height) { + if (client->nodegroup && client->nodegroup->log_write_cb) { + uint32_t scan_start = cfstate->cf_scan_start_height > 0 ? cfstate->cf_scan_start_height : 1; + client->nodegroup->log_write_cb( + "[bip157] all filters processed: scanned heights %u..%u (of %u), %u matched blocks [%us elapsed]\n", + scan_start, cfstate->filters_tip_height, cfstate->cfheaders_tip_height, + (unsigned int)cfstate->matched_block_hashes->len, spv_elapsed(client)); + if (scan_start > 1) + client->nodegroup->log_write_cb( + "[bip157] WARNING: scan started at height %u (checkpoint), not genesis — " + "transactions before height %u are not covered; use --filter_hash_db for full history\n", + scan_start, scan_start); + } + cfstate->awaiting_response = false; + client->stateflags &= ~SPV_CFILTER_SYNC_FLAG; + if (cfstate->matched_block_hashes->len > 0 && !cfstate->cf_block_fetch_active) { + spv_cf_request_matched_blocks(client); + } else if (!client->called_sync_completed && client->sync_completed) { + if (client->smpv_enabled) dogecoin_net_spv_request_mempool(client); + client->sync_completed(client); + client->called_sync_completed = true; + } + } +} + static dogecoin_bool spv_lookup_headersdb_height_by_hash(dogecoin_spv_client* client, const uint8_t hash[32], uint32_t* out_height) @@ -188,6 +985,7 @@ static dogecoin_bool spv_log_merkle_match(const uint8_t txid[32], uint32_t pos, static const unsigned int HEADERS_MAX_RESPONSE_TIME = 120; static const unsigned int MIN_TIME_DELTA_FOR_STATE_CHECK = 5; +static const unsigned int CF_RESPONSE_TIMEOUT = 30; static const unsigned int BLOCK_GAP_TO_DEDUCT_TO_START_SCAN_FROM = 5; static const unsigned int BLOCKS_DELTA_IN_S = 60; static const unsigned int COMPLETED_WHEN_NUM_NODES_AT_SAME_HEIGHT = 2; @@ -430,7 +1228,9 @@ void dogecoin_net_spv_node_handshake_done(dogecoin_node *node); void dogecoin_node_connection_state_changed_cb(dogecoin_node *node) { if (node->nodegroup->should_connect_to_more_nodes_cb) { if (node->nodegroup->should_connect_to_more_nodes_cb(node)) { - dogecoin_spv_client_discover_peers((dogecoin_spv_client*)node->nodegroup->ctx, NULL); + dogecoin_spv_client *client = (dogecoin_spv_client*)node->nodegroup->ctx; + /* Use explicit peer IPs when provided; fall back to DNS seeds otherwise. */ + dogecoin_spv_client_discover_peers(client, client->peer_ips); dogecoin_node_group_connect_next_nodes(node->nodegroup); } } @@ -587,6 +1387,29 @@ dogecoin_spv_client* dogecoin_spv_client_new(const dogecoin_chainparams *params, client->smpv_ctx = NULL; client->smpv_enabled = false; + // BIP157 compact filter sync (on by default; disable with --no_cfilters) + client->compact_filters_enabled = true; + client->cfilter_state = dogecoin_compact_filter_state_new(); + if (client->cfilter_state) { + client->cfilter_state->enabled = true; + } + dogecoin_mem_zero(client->cf_prev_filter_header, sizeof(uint256_t)); + client->cf_computed_height = 0; + client->cf_export_enabled = false; + + /* BIP157 persistent filter storage (opened in dogecoin_spv_client_load) */ + client->cfheaders_db = NULL; + client->cfilters_db = NULL; + client->cfheaders_path = NULL; + client->cfilters_path = NULL; + + client->peer_ips = NULL; + + client->aux_hash_db_ctx = NULL; + client->aux_hash_db = NULL; + client->cf_start_height = 0; + client->cf_num_workers = 0; + return client; } @@ -598,6 +1421,19 @@ dogecoin_spv_client* dogecoin_spv_client_new(const dogecoin_chainparams *params, */ void dogecoin_spv_client_discover_peers(dogecoin_spv_client* client, const char *ips) { +#ifndef _WIN32 + // set stdin to non-blocking for quit command + int stdin_flags = fcntl(STDIN_FILENO, F_GETFL); + fcntl(STDIN_FILENO, F_SETFL, stdin_flags | O_NONBLOCK); +#endif + + /* Remember explicit peer IPs so reconnects reuse them instead of DNS seeds. */ + if (ips) { + if (client->peer_ips) dogecoin_free(client->peer_ips); + client->peer_ips = strdup(ips); + } + + dogecoin_node_group_add_peers_by_ip_or_seed(client->nodegroup, ips); } @@ -653,6 +1489,40 @@ void dogecoin_spv_client_free(dogecoin_spv_client *client) client->merkle_match_active = false; client->merkle_match_blockindex = NULL; + if (client->cfilter_state) { + dogecoin_compact_filter_state_free(client->cfilter_state); + client->cfilter_state = NULL; + } + client->compact_filters_enabled = false; + + if (client->cfheaders_db) { + dogecoin_cfheaders_db_free(client->cfheaders_db); + client->cfheaders_db = NULL; + } + if (client->cfilters_db) { + dogecoin_cfilters_db_free(client->cfilters_db); + client->cfilters_db = NULL; + } + if (client->cfheaders_path) { + dogecoin_free(client->cfheaders_path); + client->cfheaders_path = NULL; + } + if (client->cfilters_path) { + dogecoin_free(client->cfilters_path); + client->cfilters_path = NULL; + } + + if (client->peer_ips) { + dogecoin_free(client->peer_ips); + client->peer_ips = NULL; + } + + if (client->aux_hash_db && client->aux_hash_db_ctx) { + client->aux_hash_db->free(client->aux_hash_db_ctx); + client->aux_hash_db_ctx = NULL; + client->aux_hash_db = NULL; + } + if (client->headers_db) { if (client->headers_db_ctx) @@ -722,8 +1592,29 @@ dogecoin_bool dogecoin_spv_client_load(dogecoin_spv_client *client, const char * if (!client->headers_db) return false; - return client->headers_db->load(client->headers_db_ctx, file_path, prompt); + if (!client->headers_db->load(client->headers_db_ctx, file_path, prompt)) + return false; + + /* Open BIP157 persistent filter databases when compact filter sync is enabled */ + if (client->compact_filters_enabled && client->cfilter_state) { + dogecoin_bool inmem = (file_path && strcmp(file_path, ":memory:") == 0); + client->cfheaders_db = dogecoin_cfheaders_db_new(client->chainparams, inmem); + if (!dogecoin_cfheaders_db_load(client->cfheaders_db, client->cfheaders_path, client->cfilter_state)) { + fprintf(stderr, "spv: failed to open cfheaders.dat; continuing without persistence\n"); + dogecoin_cfheaders_db_free(client->cfheaders_db); + client->cfheaders_db = NULL; + } + + client->cfilters_db = dogecoin_cfilters_db_new(client->chainparams, inmem); + if (!dogecoin_cfilters_db_load(client->cfilters_db, client->cfilters_path)) { + fprintf(stderr, "spv: failed to open cfilters.dat; continuing without persistence\n"); + dogecoin_cfilters_db_free(client->cfilters_db); + client->cfilters_db = NULL; + } + } + + return true; } /** @@ -778,6 +1669,142 @@ void dogecoin_net_spv_periodic_statecheck(dogecoin_node *node, uint64_t *now) if ((client->stateflags & SPV_FULLBLOCK_SYNC_FLAG) == SPV_FULLBLOCK_SYNC_FLAG) { dogecoin_net_spv_request_headers(client); + + /* Recovery: if our chaintip is far below the global-best peer and no + * BLOCKSYNC node has a block request in-flight, we're deadlocked — + * the inv handler won't request blocks because we're too far behind, + * and dogecoin_net_spv_request_headers early-returns because BLOCKSYNC + * nodes exist. Force all nodes back to header sync. */ + dogecoin_blockindex *sc_tip = client->headers_db->getchaintip(client->headers_db_ctx); + uint32_t sc_best = 0; + size_t sc_i; + for (sc_i = 0; sc_i < client->nodegroup->nodes->len; sc_i++) { + dogecoin_node *sc_n = vector_idx(client->nodegroup->nodes, sc_i); + if ((sc_n->state & NODE_CONNECTED) && sc_n->bestknownheight > sc_best) + sc_best = sc_n->bestknownheight; + } + if (sc_tip && sc_best > (uint32_t)sc_tip->height + 1440) { + dogecoin_bool any_pending = false; + for (sc_i = 0; sc_i < client->nodegroup->nodes->len; sc_i++) { + dogecoin_node *sc_n = vector_idx(client->nodegroup->nodes, sc_i); + if ((sc_n->state & NODE_BLOCKSYNC) && (sc_n->state & NODE_CONNECTED) && sc_n->time_last_request > 0) + any_pending = true; + } + if (!any_pending) { + for (sc_i = 0; sc_i < client->nodegroup->nodes->len; sc_i++) { + dogecoin_node *sc_n = vector_idx(client->nodegroup->nodes, sc_i); + if (sc_n->state & NODE_BLOCKSYNC) sc_n->state &= ~NODE_BLOCKSYNC; + } + client->stateflags &= ~SPV_FULLBLOCK_SYNC_FLAG; + client->stateflags |= SPV_HEADER_SYNC_FLAG; + client->nodegroup->log_write_cb( + "[spv] stale BLOCKSYNC (height=%d global_best=%d) — forcing header sync\n", + sc_tip->height, sc_best); + dogecoin_net_spv_request_headers(client); + } + } + } + + /* BIP157: recover from stalled awaiting_response when a peer disconnected + * mid-download without clearing the flag. */ + if (client->compact_filters_enabled && client->cfilter_state) { + dogecoin_compact_filter_state *cfstate = client->cfilter_state; + dogecoin_bool cf_incomplete = + ((uint32_t)pindex->height > 0) && + (cfstate->cfheaders_tip_height < (uint32_t)pindex->height || + cfstate->filters_tip_height < cfstate->cfheaders_tip_height); + /* Only retry here when not already in a live parallel cfilter download. */ + dogecoin_bool par_active = (cfstate->cfh_par_n > 0) || + (cfstate->par_num_workers > 0 && + cfstate->filters_tip_height < cfstate->cfheaders_tip_height); + /* Par cfilter stall recovery: if a worker has been assigned longer than + * CF_RESPONSE_TIMEOUT and has received nothing, free the slot and + * re-assign from the next available node. */ + if (cfstate->par_num_workers > 0 && cfstate->par_bufs) { + int64_t stall_deadline = *now - CF_RESPONSE_TIMEOUT; + uint8_t pi; + for (pi = 0; pi < cfstate->par_num_workers; pi++) { + cf_par_buf *buf = &cfstate->par_bufs[pi]; + if (buf->node_id == -1 || buf->complete) continue; + if (buf->received > 0) continue; /* making progress */ + if (buf->assign_time == 0 || buf->assign_time > stall_deadline) continue; + + client->nodegroup->log_write_cb( + "[bip157-par] worker slot %u (node %d, [%u..%u]) stalled — reassigning\n", + (unsigned int)pi, buf->node_id, buf->batch_start, buf->batch_end); + + /* Reset slot and re-issue from the stalled start height */ + int stalled_node_id = buf->node_id; + uint32_t retry_start = buf->batch_start; + dogecoin_free(buf->records); + buf->records = NULL; + buf->node_id = -1; + buf->complete = false; + buf->received = 0; + cfstate->par_next_height = retry_start; /* back up */ + + /* Find any connected peer OTHER than the stalled one to take over */ + unsigned int ni; + dogecoin_bool reassigned = false; + for (ni = 0; ni < client->nodegroup->nodes->len; ni++) { + dogecoin_node *rn = (dogecoin_node *)vector_idx( + client->nodegroup->nodes, ni); + if (!rn || !(rn->state & NODE_CONNECTED) || !rn->version_handshake) + continue; + if (rn->nodeid == stalled_node_id) continue; /* skip stalled peer */ + if (spv_cf_par_assign(client, rn)) { reassigned = true; break; } + } + /* No alternative peer available — fall back to the stalled node */ + if (!reassigned) { + for (ni = 0; ni < client->nodegroup->nodes->len; ni++) { + dogecoin_node *rn = (dogecoin_node *)vector_idx( + client->nodegroup->nodes, ni); + if (!rn || !(rn->state & NODE_CONNECTED) || !rn->version_handshake) + continue; + if (spv_cf_par_assign(client, rn)) break; + } + } + } + } + + if (cf_incomplete && !par_active && cfstate->awaiting_response) { + /* Fast-path: if no CF-capable peer is connected right now, the peer + * we sent the request to has disconnected. Clear awaiting_response + * immediately so the postcmd trigger can fire as soon as any CF peer + * reconnects — no need to wait the full CF_RESPONSE_TIMEOUT. */ + dogecoin_bool any_cf_connected = false; + for (unsigned int ni = 0; ni < client->nodegroup->nodes->len; ni++) { + dogecoin_node *n = (dogecoin_node *)vector_idx(client->nodegroup->nodes, ni); + if ((n->state & NODE_CONNECTED) && + (n->services & DOGECOIN_NODE_COMPACT_FILTERS)) { + any_cf_connected = true; + break; + } + } + if (!any_cf_connected) { + client->nodegroup->log_write_cb( + "[bip157] CF peer gone — clearing awaiting_response to retry on reconnect\n"); + cfstate->awaiting_response = false; + } else if (cfstate->last_request_time > 0 && + *now > cfstate->last_request_time + CF_RESPONSE_TIMEOUT) { + /* Full timeout: CF peer is connected but not responding. */ + client->nodegroup->log_write_cb( + "[bip157] CF response timeout after %us — retrying\n", + (unsigned int)(*now - cfstate->last_request_time)); + cfstate->awaiting_response = false; + dogecoin_node *cf_node = NULL; + for (unsigned int ni = 0; ni < client->nodegroup->nodes->len; ni++) { + dogecoin_node *n = (dogecoin_node *)vector_idx(client->nodegroup->nodes, ni); + if ((n->state & NODE_CONNECTED) && + (n->services & DOGECOIN_NODE_COMPACT_FILTERS)) { + cf_node = n; + break; + } + } + if (cf_node) + dogecoin_spv_request_cfcheckpt(client, cf_node); + } + } } client->last_statecheck_time = *now; @@ -891,6 +1918,27 @@ void dogecoin_net_spv_node_request_headers_or_blocks(dogecoin_node *node, dogeco * * @return dogecoin_bool */ +/* True while compact-filter sync can still make progress: a peer advertising + * NODE_COMPACT_FILTERS is connected, or matched blocks from a rescan are still + * being fetched. Sync completion is deferred to the filter path only in that + * case. When filters are enabled (the default) but no peer serves them, nothing + * would ever advance the CF state machine, and gating completion purely on + * compact_filters_enabled left the client waiting forever -- `spvnode scan` + * never printed "Sync completed" and never exited. */ +static dogecoin_bool spv_cf_sync_pending(dogecoin_spv_client *client) +{ + if (!client->compact_filters_enabled || !client->cfilter_state) return false; + if (client->cfilter_state->cf_block_fetch_active) return true; + if (!client->nodegroup || !client->nodegroup->nodes) return false; + unsigned int i; + for (i = 0; i < client->nodegroup->nodes->len; i++) { + dogecoin_node *n = (dogecoin_node *)vector_idx(client->nodegroup->nodes, i); + if (n && (n->state & NODE_CONNECTED) && (n->services & DOGECOIN_NODE_COMPACT_FILTERS)) + return true; + } + return false; +} + dogecoin_bool dogecoin_net_spv_request_headers(dogecoin_spv_client *client) { size_t i; @@ -961,7 +2009,8 @@ dogecoin_bool dogecoin_net_spv_request_headers(dogecoin_spv_client *client) } } - if (nodes_at_same_height >= COMPLETED_WHEN_NUM_NODES_AT_SAME_HEIGHT && !client->called_sync_completed && client->sync_completed) + if (nodes_at_same_height >= COMPLETED_WHEN_NUM_NODES_AT_SAME_HEIGHT && !client->called_sync_completed && client->sync_completed + && !spv_cf_sync_pending(client)) { client->sync_completed(client); client->called_sync_completed = true; @@ -992,7 +2041,13 @@ void dogecoin_net_spv_node_handshake_done(dogecoin_node *node) } } - dogecoin_net_spv_request_headers((dogecoin_spv_client*)node->nodegroup->ctx); + dogecoin_spv_client *hsclient = (dogecoin_spv_client*)node->nodegroup->ctx; + dogecoin_net_spv_request_headers(hsclient); + + if (hsclient->compact_filters_enabled && hsclient->cfilter_state && + hsclient->cfilter_state->cfh_par_n > 0 && + (node->services & DOGECOIN_NODE_COMPACT_FILTERS)) + cfh_par_assign(hsclient, node); } /** @@ -1662,6 +2717,87 @@ void dogecoin_net_spv_post_cmd(dogecoin_node *node, dogecoin_p2p_msg_hdr *hdr, s } else { + /* BIP157 matched-block path: block already in headers DB; process its txns */ + dogecoin_compact_filter_state *cfstate_mb = + (client->compact_filters_enabled && client->cfilter_state) + ? client->cfilter_state : NULL; + dogecoin_bool is_cf_match = false; + unsigned int cf_match_idx = 0; + if (cfstate_mb && cfstate_mb->cf_block_fetch_active && pindex) { + unsigned int mbi; + for (mbi = 0; mbi < cfstate_mb->matched_block_hashes->len; mbi++) { + if (memcmp(vector_idx(cfstate_mb->matched_block_hashes, mbi), + pindex->hash, 32) == 0) { + is_cf_match = true; + cf_match_idx = mbi; + break; + } + } + } + + if (is_cf_match) { + /* Get real in-memory pindex with correct height from B-tree. + * For historical blocks pruned from the tree, recover the height + * from the stored matched_block_heights vector instead. */ + dogecoin_headers_db *db_mb = (dogecoin_headers_db *)client->headers_db_ctx; + dogecoin_blockindex *real_pindex = dogecoin_headersdb_find(db_mb, pindex->hash); + dogecoin_bool pindex_is_heap = false; /* track if we need to free pindex */ + if (real_pindex) { + dogecoin_free(pindex); /* dummy from connect_hdr; tree owns real_pindex */ + pindex = real_pindex; + } else { + /* Block pruned from in-memory tree — recover height from stored value */ + if (cfstate_mb->matched_block_heights && + cf_match_idx < cfstate_mb->matched_block_heights->len) { + uint32_t *h = (uint32_t *)vector_idx(cfstate_mb->matched_block_heights, cf_match_idx); + if (h) pindex->height = *h; + } + pindex_is_heap = true; /* we own this allocation */ + } + + uint32_t amount_of_txs_cf = 0; + if (!pindex || !deser_varlen(&amount_of_txs_cf, buf)) { + if (pindex_is_heap) dogecoin_free(pindex); + return; + } + + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157] processing %u txs from matched block height=%u [%us elapsed]\n", + amount_of_txs_cf, (unsigned)pindex->height, spv_elapsed(client)); + + size_t cf_consumed = 0; + unsigned int cfi; + for (cfi = 0; cfi < amount_of_txs_cf; cfi++) { + dogecoin_tx *tx = dogecoin_tx_new(); + if (!dogecoin_tx_deserialize(buf->p, buf->len, tx, &cf_consumed)) { + dogecoin_tx_free(tx); + break; + } + deser_skip(buf, cf_consumed); + if (client->sync_transaction) + client->sync_transaction(client->sync_transaction_ctx, tx, cfi, pindex); + dogecoin_tx_free(tx); + } + + cfstate_mb->matched_blocks_fetched++; + if (cfstate_mb->matched_blocks_fetched >= + (uint32_t)cfstate_mb->matched_block_hashes->len) { + cfstate_mb->cf_block_fetch_active = false; + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157] all %u matched blocks processed [%us elapsed]\n", + cfstate_mb->matched_blocks_fetched, spv_elapsed(client)); + if (!client->called_sync_completed && client->sync_completed) { + if (client->smpv_enabled) dogecoin_net_spv_request_mempool(client); + client->sync_completed(client); + client->called_sync_completed = true; + } + } + if (pindex_is_heap) dogecoin_free(pindex); + return; + } + client->nodegroup->log_write_cb("Got invalid block (not in sequence) from node %d\n", node->nodeid); node->state &= ~NODE_BLOCKSYNC; node->nodegroup->node_connection_state_changed_cb(node); @@ -1674,7 +2810,8 @@ void dogecoin_net_spv_post_cmd(dogecoin_node *node, dogecoin_p2p_msg_hdr *hdr, s // we check if the height is greater than or equal to the node's bestknown height minus 5 minutes if (client->headers_db->getchaintip(client->headers_db_ctx)->height >= node->bestknownheight - 5) { // last requested block reached, consider stop syncing - if (!client->called_sync_completed && client->sync_completed) { + if (!client->called_sync_completed && client->sync_completed + && !spv_cf_sync_pending(client)) { /* BIP157: defer only while filter sync can progress */ // enable mempool requests if smpv is enabled if (client->smpv_enabled) dogecoin_net_spv_request_mempool(client); client->sync_completed(client); @@ -1692,11 +2829,23 @@ void dogecoin_net_spv_post_cmd(dogecoin_node *node, dogecoin_p2p_msg_hdr *hdr, s uint32_t amount_of_headers; if (!deser_varlen(&amount_of_headers, buf)) return; uint64_t now = time(NULL); - client->nodegroup->log_write_cb("Got %d headers (took %d s) from node %d\n", amount_of_headers, now - client->last_headersrequest_time, node->nodeid); + client->nodegroup->log_write_cb("Got %d headers (took %d s) from node %d [%us elapsed]\n", amount_of_headers, now - client->last_headersrequest_time, node->nodeid, spv_elapsed(client)); // flag off the request stall check client->last_headersrequest_time = 0; + /* Use global-best height so we don't switch to BLOCKSYNC prematurely when + * the peer we're syncing from has a low tip but other peers are further ahead. */ + uint32_t global_best_height = node->bestknownheight; + { + unsigned int gni; + for (gni = 0; gni < (unsigned int)client->nodegroup->nodes->len; gni++) { + dogecoin_node *gn = (dogecoin_node*)vector_idx(client->nodegroup->nodes, gni); + if ((gn->state & NODE_CONNECTED) && gn->bestknownheight > global_best_height) + global_best_height = gn->bestknownheight; + } + } + unsigned int connected_headers = 0; unsigned int i; for (i = 0; i < amount_of_headers; i++) @@ -1721,7 +2870,7 @@ void dogecoin_net_spv_post_cmd(dogecoin_node *node, dogecoin_p2p_msg_hdr *hdr, s } else { if (client->header_connected) { client->header_connected(client); } connected_headers++; - if (pindex->height >= node->bestknownheight - 5) { + if (pindex->height >= global_best_height - 5) { client->stateflags &= ~SPV_HEADER_SYNC_FLAG; client->stateflags |= SPV_FULLBLOCK_SYNC_FLAG; node->state &= ~NODE_HEADERSYNC; @@ -1735,7 +2884,7 @@ void dogecoin_net_spv_post_cmd(dogecoin_node *node, dogecoin_p2p_msg_hdr *hdr, s dogecoin_blockindex *chaintip = client->headers_db->getchaintip(client->headers_db_ctx); client->nodegroup->log_write_cb("Connected %d headers\n", connected_headers); - client->nodegroup->log_write_cb("Chaintip at height %d\n", chaintip->height); + client->nodegroup->log_write_cb("Chaintip at height %d [%us elapsed]\n", chaintip->height, spv_elapsed(client)); if (client->header_message_processed && client->header_message_processed(client, node, chaintip) == false) return; @@ -1746,6 +2895,56 @@ void dogecoin_net_spv_post_cmd(dogecoin_node *node, dogecoin_p2p_msg_hdr *hdr, s client->nodegroup->log_write_cb("chain size: %d, last time %s", chaintip->height, ctime(&lasttime)); dogecoin_net_spv_node_request_headers_or_blocks(node, false); } + else if (client->compact_filters_enabled && client->cfilter_state && + !client->cfilter_state->awaiting_response && + /* CF sync not yet complete: cfheaders or cfilters behind chain tip */ + (client->cfilter_state->cfheaders_tip_height < (uint32_t)chaintip->height || + client->cfilter_state->filters_tip_height < client->cfilter_state->cfheaders_tip_height) && + /* Not already in a live parallel cfilter download */ + !(client->cfilter_state->par_num_workers > 0 && + client->cfilter_state->filters_tip_height < client->cfilter_state->cfheaders_tip_height) && + chaintip->height > 0 && + chaintip->height >= node->bestknownheight - 5) { + /* Headers are at tip — find a BIP157-capable peer (NODE_COMPACT_FILTERS) */ + dogecoin_node *cf_node = NULL; + for (unsigned int ni = 0; ni < (unsigned int)client->nodegroup->nodes->len; ni++) { + dogecoin_node *n = (dogecoin_node *)vector_idx(client->nodegroup->nodes, ni); + if ((n->state & NODE_CONNECTED) && (n->services & DOGECOIN_NODE_COMPACT_FILTERS)) { + cf_node = n; + break; + } + } + if (cf_node) { + client->nodegroup->log_write_cb("[bip157] headers synced to tip (height=%d), sending getcfcheckpt to node %d (compact-filters peer)\n", + chaintip->height, cf_node->nodeid); + dogecoin_spv_request_cfcheckpt(client, cf_node); + } else { + client->nodegroup->log_write_cb("[bip157] headers at tip (height=%d) but no NODE_COMPACT_FILTERS peer connected\n", + chaintip->height); + /* Completion is not handled here on purpose. Headers reaching the tip + * is not the end of the sync -- the last few blocks still arrive over + * BLOCKSYNC afterwards -- so finishing at this point reports a height + * short of the real tip. spv_cf_sync_pending() lets the normal + * headers/blocks completion run instead, at the right moment. */ + } + } + + /* Blocks matched by the startup rescan of already-cached cfilters have to be + * requested independently of the cfheaders/cfilters network sync above. That + * sync only covers heights not already on disk, so when the cache already spans + * the chain its completion hook (spv_cf_par_try_flush) never fires and the + * matched blocks would never be fetched -- the scan reported matches but the + * wallet stayed empty. Trigger here once headers are at tip, whichever CF + * branch above was taken; cf_block_fetch_active keeps it to one dispatch. */ + if (client->compact_filters_enabled && client->cfilter_state && + client->cfilter_state->rescan_done && + client->cfilter_state->matched_block_hashes && + client->cfilter_state->matched_block_hashes->len > 0 && + !client->cfilter_state->cf_block_fetch_active && + chaintip->height > 0 && + chaintip->height >= node->bestknownheight - 5) { + spv_cf_request_matched_blocks(client); + } } if (strcmp(hdr->command, DOGECOIN_MSG_MERKLEBLOCK) == 0) { @@ -1998,7 +3197,8 @@ void dogecoin_net_spv_post_cmd(dogecoin_node *node, dogecoin_p2p_msg_hdr *hdr, s if (dogecoin_hash_equal((uint8_t *)node->last_requested_inv, (uint8_t *)pindex->hash)) { if (client->headers_db->getchaintip(client->headers_db_ctx)->height >= node->bestknownheight - 5) { - if (!client->called_sync_completed && client->sync_completed) { + if (!client->called_sync_completed && client->sync_completed + && !spv_cf_sync_pending(client)) { /* BIP157: defer only while filter sync can progress */ if (client->smpv_enabled) dogecoin_net_spv_request_mempool(client); client->sync_completed(client); client->called_sync_completed = true; @@ -2131,6 +3331,645 @@ void dogecoin_net_spv_post_cmd(dogecoin_node *node, dogecoin_p2p_msg_hdr *hdr, s } } + /* ================================================================ */ + /* BIP157: cfilter response handler */ + /* ================================================================ */ + if (strcmp(hdr->command, DOGECOIN_MSG_CFILTER) == 0) + { + if (!client->compact_filters_enabled || !client->cfilter_state) { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb("[bip157] compact filters not enabled, ignoring cfilter\n"); + } else { + dogecoin_cfilter_msg cfilter_msg; + dogecoin_cfilter_msg_init(&cfilter_msg); + + struct const_buffer deser_buf = { buf->p, buf->len }; + if (dogecoin_p2p_msg_cfilter_deser(&cfilter_msg, &deser_buf)) { + dogecoin_compact_filter_state *cfstate = client->cfilter_state; + + if (cfilter_msg.filter_data) { + dogecoin_bool parallel = (cfstate->par_num_workers > 1); + + /* Determine the height this cfilter corresponds to. */ + uint32_t filter_height; + cf_par_buf *par_buf = NULL; + + if (parallel) { + /* Per-node height tracking: validate node has an active batch */ + if (node->cf_batch_end == 0 || + node->cf_cur_height > node->cf_batch_end) { + /* Stale or unassigned — drop */ + goto cfilter_handler_done; + } + filter_height = node->cf_cur_height; + node->cf_cur_height++; + + /* Find the buffer for this node whose range covers filter_height. + * A node can have two slots temporarily: one complete-but-pending-flush + * and one newly-assigned. Match by height range to avoid OOB write. */ + uint8_t pi; + for (pi = 0; pi < cfstate->par_num_workers; pi++) { + if (cfstate->par_bufs[pi].node_id == node->nodeid && + filter_height >= cfstate->par_bufs[pi].batch_start && + filter_height <= cfstate->par_bufs[pi].batch_end) { + par_buf = &cfstate->par_bufs[pi]; + break; + } + } + if (!par_buf) goto cfilter_handler_done; + } else { + if (cfstate->filters_tip_height >= cfstate->cfheaders_tip_height) + goto cfilter_handler_done; + filter_height = cfstate->filters_tip_height + 1; + } + + /* + * filter_headers[i] = filter header for block at height (cfheaders_base_height + i). + * For block at height h: + * vec_idx = h - cfheaders_base_height + * expected_fh = filter_headers[vec_idx] + * prev_fh = filter_headers[vec_idx - 1] (or genesis_filter_header when vec_idx == 0) + */ + uint256_t prev_fh; + uint32_t base = cfstate->cfheaders_base_height; + dogecoin_bool have_fh = cfstate->filter_headers_flat + ? (cfstate->filter_headers_flat_len > 0) + : (cfstate->filter_headers->len > 0); + if (filter_height <= base || !have_fh) { + memcpy(prev_fh, cfstate->genesis_filter_header, 32); + } else { + uint32_t prev_idx = filter_height - base - 1; + if (cfstate->filter_headers_flat) { + if (prev_idx < cfstate->filter_headers_flat_len) + memcpy(prev_fh, cfstate->filter_headers_flat + prev_idx * 32, 32); + else + memcpy(prev_fh, cfstate->cfheaders_tip_hash, 32); + } else { + if (prev_idx < cfstate->filter_headers->len) + memcpy(prev_fh, vector_idx(cfstate->filter_headers, prev_idx), 32); + else + memcpy(prev_fh, cfstate->cfheaders_tip_hash, 32); + } + } + + uint32_t vec_idx = (filter_height >= base) ? filter_height - base : UINT32_MAX; + uint256_t flat_fh; + uint256_t *expected_fh_ptr = NULL; + if (cfstate->filter_headers_flat) { + if (vec_idx < cfstate->filter_headers_flat_len) { + memcpy(flat_fh, cfstate->filter_headers_flat + vec_idx * 32, 32); + expected_fh_ptr = &flat_fh; + } + } else if (vec_idx < cfstate->filter_headers->len) { + expected_fh_ptr = (uint256_t *)vector_idx(cfstate->filter_headers, vec_idx); + } + if (expected_fh_ptr) { + uint256_t *expected_fh = expected_fh_ptr; + + if (dogecoin_compact_filter_validate(cfilter_msg.filter_data, prev_fh, *expected_fh)) { + if (parallel) { + /* Buffer the validated record; disk flush happens in-order via spv_cf_par_try_flush */ + uint32_t offset = filter_height - par_buf->batch_start; + cf_par_record *rec = &par_buf->records[offset]; + rec->filter_data = cstr_new_buf(cfilter_msg.filter_data->str, + cfilter_msg.filter_data->len); + memcpy(rec->block_hash, cfilter_msg.block_hash, 32); + + /* Match watched scripts now (before buffering loses the data reference) */ + if (cfstate->watched_scripts && cfstate->watched_scripts->len > 0) { + gcs_filter *gcs = gcs_filter_new(); + struct const_buffer fbuf = { cfilter_msg.filter_data->str, + cfilter_msg.filter_data->len }; + if (gcs_filter_deserialize(gcs, cfilter_msg.filter_type, + cfilter_msg.block_hash, &fbuf)) { + if (gcs_filter_match_any(gcs, cfstate->watched_scripts)) { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157] MATCH at height %u\n", filter_height); + uint256_t *matched_hash = dogecoin_calloc(1, sizeof(uint256_t)); + memcpy(matched_hash, cfilter_msg.block_hash, sizeof(uint256_t)); + vector_add(cfstate->matched_block_hashes, matched_hash); + uint32_t *matched_height = dogecoin_calloc(1, sizeof(uint32_t)); + *matched_height = filter_height; + vector_add(cfstate->matched_block_heights, matched_height); + } + } + gcs_filter_free(gcs); + } + + par_buf->received++; + if (par_buf->received == par_buf->batch_end - par_buf->batch_start + 1) { + par_buf->complete = true; + spv_cf_par_try_flush(client); + /* Get next batch for this worker (no-op if all work assigned) */ + spv_cf_par_assign(client, node); + } + } else { + /* Sequential mode: write immediately */ + cfstate->filters_tip_height = filter_height; + + if (client->cfilters_db) + dogecoin_cfilters_db_write(client->cfilters_db, + filter_height, + cfilter_msg.block_hash, + cfilter_msg.filter_data); + + /* Match watched scripts */ + if (cfstate->watched_scripts && cfstate->watched_scripts->len > 0) { + gcs_filter *gcs = gcs_filter_new(); + struct const_buffer fbuf = { cfilter_msg.filter_data->str, + cfilter_msg.filter_data->len }; + if (gcs_filter_deserialize(gcs, cfilter_msg.filter_type, + cfilter_msg.block_hash, &fbuf)) { + if (gcs_filter_match_any(gcs, cfstate->watched_scripts)) { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157] MATCH at height %u\n", filter_height); + uint256_t *matched_hash = dogecoin_calloc(1, sizeof(uint256_t)); + memcpy(matched_hash, cfilter_msg.block_hash, sizeof(uint256_t)); + vector_add(cfstate->matched_block_hashes, matched_hash); + uint32_t *matched_height = dogecoin_calloc(1, sizeof(uint32_t)); + *matched_height = filter_height; + vector_add(cfstate->matched_block_heights, matched_height); + } + } + gcs_filter_free(gcs); + } + + /* Request next batch when current is consumed */ + dogecoin_blockindex *cf_tip = + client->headers_db->getchaintip(client->headers_db_ctx); + if (cfstate->filters_tip_height >= cfstate->cfheaders_tip_height) { + if (client->nodegroup && client->nodegroup->log_write_cb) { + uint32_t scan_start = cfstate->cf_scan_start_height > 0 ? cfstate->cf_scan_start_height : 1; + client->nodegroup->log_write_cb( + "[bip157] all filters processed: scanned heights %u..%u, %u matched blocks [%us elapsed]\n", + scan_start, cfstate->filters_tip_height, + (unsigned int)cfstate->matched_block_hashes->len, + spv_elapsed(client)); + if (scan_start > 1) + client->nodegroup->log_write_cb( + "[bip157] WARNING: scan started at height %u (checkpoint), not genesis — " + "transactions before height %u are not covered; use --filter_hash_db for full history\n", + scan_start, scan_start); + } + cfstate->awaiting_response = false; + client->stateflags &= ~SPV_CFILTER_SYNC_FLAG; + if (cfstate->matched_block_hashes->len > 0) { + spv_cf_request_matched_blocks(client); + } else if (!client->called_sync_completed && client->sync_completed) { + if (client->smpv_enabled) dogecoin_net_spv_request_mempool(client); + client->sync_completed(client); + client->called_sync_completed = true; + } + } else if (cfstate->filters_tip_height >= cfstate->cfilter_batch_end) { + cfstate->awaiting_response = false; + dogecoin_spv_request_cfilters(client, node, + cfstate->filters_tip_height + 1, cf_tip->hash); + } + } + } else { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157] filter at height %u FAILED validation\n", filter_height); + dogecoin_node_misbehave(node); + } + } + } + cfilter_handler_done:; + } else { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb("[bip157] failed to deserialize cfilter from node %d\n", node->nodeid); + } + dogecoin_cfilter_msg_free(&cfilter_msg); + } + } + + /* ================================================================ */ + /* BIP157: cfheaders response handler */ + /* ================================================================ */ + if (strcmp(hdr->command, DOGECOIN_MSG_CFHEADERS) == 0) + { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb("[bip157] received cfheaders from node %d\n", node->nodeid); + + if (!client->compact_filters_enabled || !client->cfilter_state) { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb("[bip157] compact filters not enabled, ignoring cfheaders\n"); + } else { + dogecoin_cfheaders_msg cfh_msg; + dogecoin_cfheaders_msg_init(&cfh_msg); + + struct const_buffer deser_buf = { buf->p, buf->len }; + if (dogecoin_p2p_msg_cfheaders_deser(&cfh_msg, &deser_buf)) { + dogecoin_compact_filter_state *cfstate = client->cfilter_state; + + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb("[bip157] cfheaders: type=%u n_hashes=%u\n", + cfh_msg.filter_type, (unsigned int)cfh_msg.filter_hashes->len); + + if (cfstate->cfh_par_n > 0) { + cfh_par_handle_response(client, node, &cfh_msg); + dogecoin_cfheaders_msg_free(&cfh_msg); + return; + } + + uint256_t prev_header; + memcpy(prev_header, cfh_msg.prev_filter_header, 32); + uint32_t height = cfstate->cfheaders_tip_height; + + /* On the first cfheaders batch, prev_filter_header is the filter header + * immediately before our starting height — store it for cfilter validation + * and persist it so restarts don't need to re-download cfheaders. */ + if (cfstate->filter_headers->len == 0) { + memcpy(cfstate->genesis_filter_header, cfh_msg.prev_filter_header, 32); + if (client->cfheaders_db) + dogecoin_cfheaders_db_write_genesis(client->cfheaders_db, + cfh_msg.prev_filter_header); + } + + unsigned int i; + dogecoin_bool valid = true; + + for (i = 0; i < cfh_msg.filter_hashes->len; i++) { + uint256_t *filter_hash = (uint256_t *)vector_idx(cfh_msg.filter_hashes, i); + height++; + + /* filter_header = dbl_sha256(filter_hash || prev_header) */ + uint8_t combined[64]; + memcpy(combined, filter_hash, 32); + memcpy(combined + 32, prev_header, 32); + + uint256_t *new_header = dogecoin_calloc(1, sizeof(uint256_t)); + dogecoin_hash(combined, 64, *new_header); + + /* Validate against checkpoint if at a boundary. + * Dogecoin Core checkpoints are at heights 1000, 2000, ... + * cp_idx = height / CFCHECKPT_INTERVAL - 1: 1000→0, 2000→1, etc. */ + if (cfstate->checkpoints && cfstate->checkpoints->len > 0 && + height > 0 && (height % CFCHECKPT_INTERVAL) == 0) { + uint32_t cp_idx = (height / CFCHECKPT_INTERVAL) - 1; + if (cp_idx < cfstate->checkpoints->len) { + uint256_t *checkpoint = (uint256_t *)vector_idx(cfstate->checkpoints, cp_idx); + if (memcmp(*new_header, checkpoint, 32) != 0) { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb("[bip157] cfheader at height %u does NOT match checkpoint!\n", height); + valid = false; + dogecoin_free(new_header); + break; + } + } + } + + vector_add(cfstate->filter_headers, new_header); + memcpy(prev_header, *new_header, 32); + + if (client->cf_export_enabled && + height > 0 && (height % CF_EXPORT_INTERVAL) == 0) { + char *hex = utils_uint8_to_hex(*new_header, 32); + printf("[cfcheckpt-export] { %u, \"%s\" },\n", height, hex); + fflush(stdout); + } + } + + if (valid) { + cfstate->cfheaders_tip_height = height; + memcpy(cfstate->cfheaders_tip_hash, prev_header, 32); + + if (client->cfheaders_db) + dogecoin_cfheaders_db_flush(client->cfheaders_db); + + dogecoin_blockindex *tip = client->headers_db->getchaintip(client->headers_db_ctx); + cfstate->awaiting_response = false; + if (height < (uint32_t)tip->height) { + dogecoin_spv_request_cfheaders(client, node, height + 1, tip->hash); + } else { + dogecoin_headers_db *hdb_cf = (dogecoin_headers_db *)client->headers_db_ctx; + uint32_t cf_scan_start = 1; + if (client->cf_start_height > 0) { + cf_scan_start = client->cf_start_height; + } else if (hdb_cf && hdb_cf->chainbottom && hdb_cf->chainbottom->height > 0) { + cf_scan_start = hdb_cf->chainbottom->height; + } + + /* Clamp to cfheaders_base_height: filters below that were scanned at startup. */ + if (cfstate->cfheaders_base_height > 0 && + cf_scan_start < cfstate->cfheaders_base_height) + cf_scan_start = cfstate->cfheaders_base_height; + + /* If startup rescan already covered the cached cfilter range, + * only download filters beyond that tip — avoids re-scanning + * heights that are already in matched_block_hashes. */ + if (cfstate->rescan_done && client->cfilters_db && + client->cfilters_db->tip_height > 0 && + cf_scan_start <= client->cfilters_db->tip_height) + cf_scan_start = client->cfilters_db->tip_height + 1; + + /* Rescan any cached filters stored before these scripts were registered. */ + spv_rescan_cached_cfilters(client, cf_scan_start); + + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157] all cfheaders received (tip=%u), starting cfilter scan from %u with %u workers [%us elapsed]\n", + cfstate->cfheaders_tip_height, cf_scan_start, + (unsigned int)(client->cf_num_workers > 1 ? client->cf_num_workers : 1), + spv_elapsed(client)); + + /* Record where the scan actually began. The completion log + * falls back to 1 when this is unset, which reported + * "scanned heights 1..tip" for a run that only covered the + * checkpoint tail -- overstating coverage in exactly the way + * that hides a gap. Both arms below need it. */ + cfstate->cf_scan_start_height = cf_scan_start; + + if (client->cf_num_workers > 1) { + /* Parallel mode: assign batches to all connected nodes */ + cfstate->par_num_workers = client->cf_num_workers; + cfstate->par_next_height = cf_scan_start; + cfstate->par_flush_height = cf_scan_start; + cfstate->filters_tip_height = (cf_scan_start > 1) ? cf_scan_start - 1 : 0; + + if (!cfstate->par_bufs) { + cfstate->par_bufs = (cf_par_buf *)dogecoin_calloc( + cfstate->par_num_workers, sizeof(cf_par_buf)); + uint8_t pi; + for (pi = 0; pi < cfstate->par_num_workers; pi++) + cfstate->par_bufs[pi].node_id = -1; + } + + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157-par] assigning %u parallel workers from height %u\n", + (unsigned int)cfstate->par_num_workers, cf_scan_start); + + unsigned int ni; + for (ni = 0; ni < client->nodegroup->nodes->len; ni++) { + dogecoin_node *wn = (dogecoin_node *)vector_idx(client->nodegroup->nodes, ni); + if (!wn || !(wn->state & NODE_CONNECTED) || !wn->version_handshake) + continue; + spv_cf_par_assign(client, wn); + } + } else { + /* Sequential mode: single node, existing path */ + cfstate->filters_tip_height = (cf_scan_start > 1) ? cf_scan_start - 1 : 0; + dogecoin_spv_request_cfilters(client, node, cf_scan_start, tip->hash); + } + } + } else { + dogecoin_node_misbehave(node); + cfstate->awaiting_response = false; + } + } else { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb("[bip157] failed to deserialize cfheaders\n"); + } + dogecoin_cfheaders_msg_free(&cfh_msg); + } + } + + /* ================================================================ */ + /* BIP157: cfcheckpt response handler */ + /* ================================================================ */ + if (strcmp(hdr->command, DOGECOIN_MSG_CFCHECKPT) == 0) + { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb("[bip157] received cfcheckpt from node %d\n", node->nodeid); + + if (!client->compact_filters_enabled || !client->cfilter_state) { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb("[bip157] compact filters not enabled, ignoring cfcheckpt\n"); + } else { + dogecoin_cfcheckpt_msg cfcp_msg; + dogecoin_cfcheckpt_msg_init(&cfcp_msg); + + struct const_buffer deser_buf = { buf->p, buf->len }; + if (dogecoin_p2p_msg_cfcheckpt_deser(&cfcp_msg, &deser_buf)) { + dogecoin_compact_filter_state *cfstate = client->cfilter_state; + + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb("[bip157] cfcheckpt: type=%u n_checkpoints=%u\n", + cfcp_msg.filter_type, (unsigned int)cfcp_msg.filter_headers->len); + + if (cfstate->checkpoints) { + vector_free(cfstate->checkpoints, true); + } + cfstate->checkpoints = vector_new(cfcp_msg.filter_headers->len, dogecoin_free); + + unsigned int i; + for (i = 0; i < cfcp_msg.filter_headers->len; i++) { + uint256_t *cp = dogecoin_calloc(1, sizeof(uint256_t)); + memcpy(cp, vector_idx(cfcp_msg.filter_headers, i), 32); + vector_add(cfstate->checkpoints, cp); + } + + if (!dogecoin_cf_validate_checkpoints(client->chainparams, cfstate->checkpoints)) { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb("[bip157] cfcheckpt FAILED hardcoded validation — misbehaving node %d\n", node->nodeid); + dogecoin_node_misbehave(node); + dogecoin_cfcheckpt_msg_free(&cfcp_msg); + return; + } + + /* Export checkpoint filter headers directly from cfcheckpt response. + * Checkpoints are at heights 999, 1999, 2999 ... (cp_idx * 1000 + 999). */ + /* Export filter headers directly from cfcheckpt response. + * Dogecoin Core checkpoints are at heights 1000, 2000, ... + * peer_checkpoints[i] = filter header at height (i+1)*CFCHECKPT_INTERVAL. */ + if (client->cf_export_enabled) { + printf("[cfcheckpt-export] /* Dogecoin Core cfcheckpt: %u entries */\n", + (unsigned int)cfcp_msg.filter_headers->len); + for (unsigned int ci = 0; ci < (unsigned int)cfcp_msg.filter_headers->len; ci++) { + uint32_t cp_height = (ci + 1) * CFCHECKPT_INTERVAL; + uint256_t *fh = (uint256_t *)vector_idx(cfcp_msg.filter_headers, ci); + /* P2P bytes are LE; chainparams.c uses big-endian display (same as RPC). + * Reverse the 32 bytes before hex-encoding. */ + uint8_t reversed[32]; + for (int ri = 0; ri < 32; ri++) reversed[ri] = (*fh)[31 - ri]; + char *hex = utils_uint8_to_hex(reversed, 32); + printf("[cfcheckpt-export] { %u, \"%s\" },\n", cp_height, hex); + fflush(stdout); + } + printf("[cfcheckpt-export] /* end */\n"); + fflush(stdout); + } + + dogecoin_blockindex *tip = client->headers_db->getchaintip(client->headers_db_ctx); + + /* Determine where cfheaders download starts. + * cf_start_height overrides everything (set via --cf-from-genesis or API). + * Otherwise: start at chainbottom (checkpoint-based sync) unless an aux + * hash-lookup DB is available, in which case we can go back to genesis. */ + uint32_t cfh_start; + if (client->cf_start_height > 0) { + cfh_start = client->cf_start_height; + } else if (client->aux_hash_db && client->aux_hash_db_ctx) { + /* aux DB covers early heights — download filters from genesis. */ + cfh_start = 1; + } else { + dogecoin_headers_db *hdb = (dogecoin_headers_db *)client->headers_db_ctx; + cfh_start = (hdb && hdb->chainbottom && hdb->chainbottom->height > 0) + ? hdb->chainbottom->height : 1; + } + + /* Use cfheaders already loaded from disk if they are valid and cover + * the needed range. The v2 DB stores genesis_filter_header so we can + * validate cfilters without re-downloading all cfheaders. */ + uint8_t gfh_zeros[32]; + memset(gfh_zeros, 0, 32); + dogecoin_bool genesis_valid = + (memcmp(cfstate->genesis_filter_header, gfh_zeros, 32) != 0); + /* base_height <= cfh_start matters: the loaded range has to start at or + * below where we want filters from, because the resume path can only + * append forward and cannot fill a gap *below* the loaded base. + * + * A gap *above* the loaded tip is not a reason to discard anything -- + * that is precisely what resuming is for. Requiring + * cfheaders_tip_height >= cfh_start - 1 here meant that whenever the + * on-disk cfheaders stopped short of cfh_start, the whole cache was + * declared unusable and the fresh-start branch below wiped it, along + * with genesis_filter_header -- after which every subsequent cfilter + * failed validation. That is the normal case with -p/--checkpoint, + * where cfh_start comes from chainbottom near the chain tip while the + * cfheaders file legitimately ends wherever the last sync stopped: + * headers 1..6269574 on disk against a cfh_start of 6311582 threw away + * 6.27M valid headers to re-download a 42k-block gap. */ + dogecoin_bool have_loaded = + (cfstate->filter_headers->len > 0 && + cfstate->cfheaders_base_height > 0 && + cfstate->cfheaders_base_height <= cfh_start); + + if (have_loaded && genesis_valid) { + uint32_t cfh_resume = cfstate->cfheaders_tip_height + 1; + if (cfh_resume > (uint32_t)tip->height) { + /* cfheaders already at chain tip: skip directly to cfilters */ + dogecoin_headers_db *hdb_cf = (dogecoin_headers_db *)client->headers_db_ctx; + uint32_t cf_scan_start = 1; + if (client->cf_start_height > 0) { + cf_scan_start = client->cf_start_height; + } else if (hdb_cf && hdb_cf->chainbottom && hdb_cf->chainbottom->height > 0) { + cf_scan_start = hdb_cf->chainbottom->height; + } + /* Clamp to cfheaders_base_height: filters below that were scanned at startup. */ + if (cfstate->cfheaders_base_height > 0 && + cf_scan_start < cfstate->cfheaders_base_height) + cf_scan_start = cfstate->cfheaders_base_height; + /* If startup rescan already covered the cached cfilter range, + * only download filters beyond that tip. */ + if (cfstate->rescan_done && client->cfilters_db && + client->cfilters_db->tip_height > 0 && + cf_scan_start <= client->cfilters_db->tip_height) + cf_scan_start = client->cfilters_db->tip_height + 1; + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157] cfheaders at tip (base=%u tip=%u), starting cfilter scan from %u with %u workers [%us elapsed]\n", + cfstate->cfheaders_base_height, cfstate->cfheaders_tip_height, + cf_scan_start, + (unsigned int)(client->cf_num_workers > 1 ? client->cf_num_workers : 1), + spv_elapsed(client)); + cfstate->cf_scan_start_height = cf_scan_start; + cfstate->awaiting_response = false; + if (client->cf_num_workers > 1) { + cfstate->par_num_workers = client->cf_num_workers; + cfstate->par_next_height = cf_scan_start; + cfstate->par_flush_height = cf_scan_start; + cfstate->filters_tip_height = (cf_scan_start > 1) ? cf_scan_start - 1 : 0; + if (!cfstate->par_bufs) { + cfstate->par_bufs = (cf_par_buf *)dogecoin_calloc( + cfstate->par_num_workers, sizeof(cf_par_buf)); + uint8_t pi; + for (pi = 0; pi < cfstate->par_num_workers; pi++) + cfstate->par_bufs[pi].node_id = -1; + } + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157-par] assigning %u parallel workers from height %u\n", + (unsigned int)cfstate->par_num_workers, cf_scan_start); + unsigned int ni; + for (ni = 0; ni < client->nodegroup->nodes->len; ni++) { + dogecoin_node *wn = (dogecoin_node *)vector_idx( + client->nodegroup->nodes, ni); + if (!wn || !(wn->state & NODE_CONNECTED) || + !wn->version_handshake) + continue; + spv_cf_par_assign(client, wn); + } + } else { + cfstate->filters_tip_height = (cf_scan_start > 1) ? cf_scan_start - 1 : 0; + dogecoin_spv_request_cfilters(client, node, cf_scan_start, tip->hash); + } + } else { + /* Resume cfheaders download from where the DB left off */ + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157] resuming cfheaders from %u (base=%u disk_tip=%u) [%us elapsed]\n", + cfh_resume, cfstate->cfheaders_base_height, + cfstate->cfheaders_tip_height, spv_elapsed(client)); + cfstate->awaiting_response = false; + dogecoin_spv_request_cfheaders(client, node, cfh_resume, tip->hash); + } + } else { + /* Fresh start: clear any stale loaded data and re-download */ + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157] cfheaders fresh start at height %u [%us elapsed]\n", + cfh_start, spv_elapsed(client)); + if (cfstate->filter_headers->len > 0) { + vector_free(cfstate->filter_headers, true); + cfstate->filter_headers = vector_new(4096, dogecoin_free); + } + if (cfstate->filter_headers_flat) { + dogecoin_free(cfstate->filter_headers_flat); + cfstate->filter_headers_flat = NULL; + cfstate->filter_headers_flat_len = 0; + } + dogecoin_mem_zero(cfstate->cfheaders_tip_hash, sizeof(uint256_t)); + dogecoin_mem_zero(cfstate->genesis_filter_header, sizeof(uint256_t)); + cfstate->cfheaders_tip_height = (cfh_start > 1) ? cfh_start - 1 : 0; + cfstate->cfheaders_base_height = cfh_start; + if (client->cfheaders_db) + dogecoin_cfheaders_db_reset(client->cfheaders_db); + cfstate->awaiting_response = false; + if (client->cf_num_workers > 1) + cfh_par_init(client, tip, cfh_start); + else + dogecoin_spv_request_cfheaders(client, node, cfh_start, tip->hash); + } + } else { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb("[bip157] failed to deserialize cfcheckpt\n"); + } + dogecoin_cfcheckpt_msg_free(&cfcp_msg); + } + } + + // Check for a 'Q' or 'q' on stdin, to quit. +#ifdef _WIN32 + if (_kbhit()) { + char c = fgetc(stdin); + if (c == 'Q' || c == 'q') { + printf("Disconnecting...\n"); + dogecoin_node_group_shutdown(client->nodegroup); + + // exit the event loop immediately + if (client->nodegroup && client->nodegroup->event_base) + event_base_loopbreak(client->nodegroup->event_base); + } + } +#else + char c = fgetc(stdin); + if (c == 'Q' || c == 'q') { + // Reset standard input back to blocking mode + int stdin_flags = fcntl(STDIN_FILENO, F_GETFL); + fcntl(STDIN_FILENO, F_SETFL, stdin_flags & ~O_NONBLOCK); + + printf("Disconnecting...\n"); + dogecoin_node_group_shutdown(client->nodegroup); + + // exit the event loop immediately + if (client->nodegroup && client->nodegroup->event_base) + event_base_loopbreak(client->nodegroup->event_base); + } +#endif } static void smpv_tx_cb(const dogecoin_smpv_tx* tx, const char* addr, void* user) @@ -2450,6 +4289,25 @@ LIBDOGECOIN_API dogecoin_bool dogecoin_spv_client_filterload( { if (!client || !filter || filter_len == 0) return false; + /* BIP37 and BIP157 are mutually exclusive, and this is a privacy control, + * not an optimisation: a FILTERLOAD hands the peer a bloom filter of the + * exact scripts being watched, which is the fingerprint compact filters + * exist to avoid. Compact filters are enabled by default, so silently + * honouring a filterload here would leak the wallet to every connected + * peer of a client that chose BIP157 precisely to prevent that. Fail + * closed and send nothing; callers wanting BIP37 must first disable + * compact filters via dogecoin_spv_enable_compact_filters(client, false). + * dogecoin_spv_client_filteradd() applies the same rule. */ + if (client->compact_filters_enabled) { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[spv] refusing filterload: compact filters (BIP157) are enabled; " + "a BIP37 bloom filter would leak the watched scripts to peers. " + "To use BIP37 anyway, call dogecoin_spv_enable_compact_filters(client, false) " + "first (spvnode: -e/--no_cfilters).\n"); + return false; + } + if (client->bloom_filter) { dogecoin_free(client->bloom_filter); client->bloom_filter = NULL; @@ -2485,6 +4343,16 @@ LIBDOGECOIN_API dogecoin_bool dogecoin_spv_client_filteradd( uint32_t data_len) { if (!client || !data || data_len == 0) return false; + + /* BIP157: populate watched_scripts for compact filter matching */ + if (client->compact_filters_enabled && client->cfilter_state && + client->cfilter_state->watched_scripts) { + cstring *script = cstr_new_buf(data, data_len); + if (script) + vector_add(client->cfilter_state->watched_scripts, script); + return true; /* skip BIP37 bloom filter and P2P FILTERADD when using compact filters */ + } + if (client->bloom_filter && client->bloom_filter_len > 0) { dogecoin_bip37_filter local_filter; memset(&local_filter, 0, sizeof(local_filter)); @@ -2563,3 +4431,246 @@ LIBDOGECOIN_API dogecoin_bool dogecoin_spv_client_filterclear(dogecoin_spv_clien return true; } + +/* ================================================================ */ +/* BIP157: enable/disable compact filter sync */ +/* ================================================================ */ +LIBDOGECOIN_API void dogecoin_spv_enable_compact_filters(dogecoin_spv_client *client, dogecoin_bool enable) +{ + if (!client) return; + + if (enable && !client->compact_filters_enabled) { + client->cfilter_state = dogecoin_compact_filter_state_new(); + if (client->cfilter_state) { + client->cfilter_state->enabled = true; + client->compact_filters_enabled = true; + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb("[bip157] compact filter sync enabled\n"); + } + return; + } + + if (!enable && client->compact_filters_enabled) { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb("[bip157] compact filter sync disabled\n"); + if (client->cfilter_state) { + dogecoin_compact_filter_state_free(client->cfilter_state); + client->cfilter_state = NULL; + } + client->compact_filters_enabled = false; + } +} + +/* ================================================================ */ +/* BIP157: request helper functions */ +/* ================================================================ */ + +/* Find the first block-header checkpoint at height >= target_height and write + * its hash in P2P (internal LE) byte order to hash_out. + * Returns the checkpoint height, or 0 if no suitable checkpoint exists. */ +static uint32_t cf_find_checkpoint_stop(const dogecoin_chainparams *params, + uint32_t target_height, uint256_t hash_out) +{ + const dogecoin_checkpoint *arr = NULL; + size_t cnt = 0; + if (!params) return 0; + if (strcmp(params->chainname, "main") == 0) { + arr = dogecoin_mainnet_checkpoint_array; + cnt = sizeof(dogecoin_mainnet_checkpoint_array) / sizeof(dogecoin_mainnet_checkpoint_array[0]); + } else if (strcmp(params->chainname, "test") == 0) { + arr = dogecoin_testnet_checkpoint_array; + cnt = sizeof(dogecoin_testnet_checkpoint_array) / sizeof(dogecoin_testnet_checkpoint_array[0]); + } + for (size_t i = 0; i < cnt; i++) { + if (arr[i].height >= target_height) { + /* chainparams hashes are display-order hex; utils_uint256_sethex reverses to LE */ + utils_uint256_sethex((char *)arr[i].hash, hash_out); + return arr[i].height; + } + } + return 0; +} + +LIBDOGECOIN_API dogecoin_bool dogecoin_spv_request_cfcheckpt(dogecoin_spv_client *client, dogecoin_node *node) +{ + if (!client || !node || !client->cfilter_state) return false; + + dogecoin_blockindex *tip = client->headers_db->getchaintip(client->headers_db_ctx); + if (!tip) return false; + + dogecoin_getcfcheckpt_msg msg; + msg.filter_type = GCS_BASIC_FILTER_TYPE; + memcpy(msg.stop_hash, tip->hash, sizeof(uint256_t)); + + cstring *payload = cstr_new_sz(64); + dogecoin_p2p_msg_getcfcheckpt_ser(&msg, payload); + + cstring *p2p_msg = dogecoin_p2p_message_new( + node->nodegroup->chainparams->netmagic, + DOGECOIN_MSG_GETCFCHECKPT, + payload->str, payload->len); + cstr_free(payload, true); + dogecoin_node_send(node, p2p_msg); + cstr_free(p2p_msg, true); + + client->cfilter_state->awaiting_response = true; + client->cfilter_state->last_request_time = (uint64_t)time(NULL); + + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb("[bip157] sent getcfcheckpt to node %d\n", node->nodeid); + return true; +} + +LIBDOGECOIN_API dogecoin_bool dogecoin_spv_request_cfheaders(dogecoin_spv_client *client, dogecoin_node *node, uint32_t start_height, const uint256_t stop_hash) +{ + if (!client || !node || !client->cfilter_state) return false; + + dogecoin_blockindex *tip = client->headers_db->getchaintip(client->headers_db_ctx); + if (!tip) return false; + + uint32_t tip_height = (uint32_t)tip->height; + + /* BIP157: servers reject requests with stop_height - start_height >= MAX_GETCFHEADERS_SIZE. + * Clamp the stop to one batch of MAX_GETCFHEADERS_SIZE filter headers. */ + uint32_t batch_stop_height = start_height + MAX_GETCFHEADERS_SIZE - 1; + if (batch_stop_height >= tip_height) + batch_stop_height = tip_height; + + uint256_t batch_stop_hash; + if (batch_stop_height == tip_height) { + /* Last (or only) batch ends exactly at the tip. */ + memcpy(batch_stop_hash, tip->hash, sizeof(uint256_t)); + } else { + /* Find the block hash at batch_stop_height. + * Try the in-memory prev chain first; fall back to a file scan. */ + dogecoin_headers_db *hdb = (dogecoin_headers_db *)client->headers_db_ctx; + if (!dogecoin_headers_db_get_block_hash_at_height(hdb, batch_stop_height, batch_stop_hash)) { + /* Primary DB miss — try aux hash-lookup DB (genesis headers for filter IBD). */ + dogecoin_bool aux_found = false; + if (client->aux_hash_db && client->aux_hash_db_ctx) { + dogecoin_headers_db *aux = (dogecoin_headers_db *)client->aux_hash_db_ctx; + aux_found = dogecoin_headers_db_get_block_hash_at_height(aux, batch_stop_height, batch_stop_hash); + } + if (!aux_found) { + uint32_t cp_h = cf_find_checkpoint_stop(client->chainparams, + batch_stop_height, batch_stop_hash); + if (cp_h > 0) { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157] getcfheaders: no hash at %u, using checkpoint %u\n", + batch_stop_height, cp_h); + batch_stop_height = cp_h; + } else { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157] getcfheaders: cannot find hash at height %u, using tip\n", + batch_stop_height); + memcpy(batch_stop_hash, tip->hash, sizeof(uint256_t)); + batch_stop_height = tip_height; + } + } + } + } + + dogecoin_getcfheaders_msg msg; + msg.filter_type = GCS_BASIC_FILTER_TYPE; + msg.start_height = start_height; + memcpy(msg.stop_hash, batch_stop_hash, sizeof(uint256_t)); + + cstring *payload = cstr_new_sz(64); + dogecoin_p2p_msg_getcfheaders_ser(&msg, payload); + + cstring *p2p_msg = dogecoin_p2p_message_new( + node->nodegroup->chainparams->netmagic, + DOGECOIN_MSG_GETCFHEADERS, + payload->str, payload->len); + cstr_free(payload, true); + dogecoin_node_send(node, p2p_msg); + cstr_free(p2p_msg, true); + + client->cfilter_state->awaiting_response = true; + client->cfilter_state->last_request_time = (uint64_t)time(NULL); + client->cfilter_state->pending_start_height = start_height; + memcpy(client->cfilter_state->pending_stop_hash, batch_stop_hash, sizeof(uint256_t)); + + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb("[bip157] sent getcfheaders (start=%u stop_height=%u) to node %d [%us elapsed]\n", + start_height, batch_stop_height, node->nodeid, spv_elapsed(client)); + return true; +} + +LIBDOGECOIN_API dogecoin_bool dogecoin_spv_request_cfilters(dogecoin_spv_client *client, dogecoin_node *node, uint32_t start_height, const uint256_t stop_hash) +{ + if (!client || !node || !client->cfilter_state) return false; + + dogecoin_compact_filter_state *cfstate = client->cfilter_state; + uint32_t cfheaders_tip = cfstate->cfheaders_tip_height; + + /* BIP157: servers reject requests with stop_height - start_height >= MAX_GETCFILTERS_SIZE. + * Clamp the batch to at most MAX_GETCFILTERS_SIZE cfilters. */ + uint32_t batch_end = start_height + MAX_GETCFILTERS_SIZE - 1; + if (cfheaders_tip > 0 && batch_end > cfheaders_tip) + batch_end = cfheaders_tip; + + /* Find the block hash at batch_end. */ + uint256_t batch_stop_hash; + dogecoin_blockindex *tip = client->headers_db->getchaintip(client->headers_db_ctx); + if (tip && batch_end == (uint32_t)tip->height) { + memcpy(batch_stop_hash, tip->hash, sizeof(uint256_t)); + } else { + dogecoin_headers_db *hdb = (dogecoin_headers_db *)client->headers_db_ctx; + if (!dogecoin_headers_db_get_block_hash_at_height(hdb, batch_end, batch_stop_hash)) { + /* Primary DB miss — try aux hash-lookup DB (genesis headers for filter IBD). */ + dogecoin_bool aux_found = false; + if (client->aux_hash_db && client->aux_hash_db_ctx) { + dogecoin_headers_db *aux = (dogecoin_headers_db *)client->aux_hash_db_ctx; + aux_found = dogecoin_headers_db_get_block_hash_at_height(aux, batch_end, batch_stop_hash); + } + if (!aux_found) { + uint32_t cp_h = cf_find_checkpoint_stop(client->chainparams, + batch_end, batch_stop_hash); + if (cp_h > 0) { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157] getcfilters: no hash at %u, using checkpoint %u\n", + batch_end, cp_h); + batch_end = cp_h; + } else { + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb( + "[bip157] getcfilters: cannot find hash at height %u, using tip\n", + batch_end); + memcpy(batch_stop_hash, stop_hash, sizeof(uint256_t)); + if (tip) batch_end = (uint32_t)tip->height; + } + } + } + } + + dogecoin_getcfilters_msg msg; + msg.filter_type = GCS_BASIC_FILTER_TYPE; + msg.start_height = start_height; + memcpy(msg.stop_hash, batch_stop_hash, sizeof(uint256_t)); + + cstring *payload = cstr_new_sz(64); + dogecoin_p2p_msg_getcfilters_ser(&msg, payload); + + cstring *p2p_msg = dogecoin_p2p_message_new( + node->nodegroup->chainparams->netmagic, + DOGECOIN_MSG_GETCFILTERS, + payload->str, payload->len); + cstr_free(payload, true); + dogecoin_node_send(node, p2p_msg); + cstr_free(p2p_msg, true); + + cfstate->cfilter_batch_end = batch_end; + cfstate->awaiting_response = true; + cfstate->last_request_time = (uint64_t)time(NULL); + cfstate->pending_start_height = start_height; + memcpy(cfstate->pending_stop_hash, batch_stop_hash, sizeof(uint256_t)); + + if (client->nodegroup && client->nodegroup->log_write_cb) + client->nodegroup->log_write_cb("[bip157] sent getcfilters (start=%u..%u) to node %d [%us elapsed]\n", + start_height, batch_end, node->nodeid, spv_elapsed(client)); + return true; +} diff --git a/src/wallet.c b/src/wallet.c index 6c567d3f2..72560c6a8 100644 --- a/src/wallet.c +++ b/src/wallet.c @@ -1503,6 +1503,41 @@ dogecoin_wallet_addr* dogecoin_p2pkh_address_to_wallet(const char* address_in, d return NULL; } +dogecoin_bool dogecoin_wallet_add_watchonly_addr(dogecoin_wallet* wallet, const char* address_in) { + if (!wallet || !address_in) return false; + + /* skip if already present */ + vector_t* addrs = vector_new(1, free); + dogecoin_wallet_get_addresses(wallet, addrs); + dogecoin_bool match = false; + unsigned int i; + for (i = 0; i < addrs->len; i++) { + if (strncmp((char*)vector_idx(addrs, i), address_in, P2PKHLEN - 1) == 0) { + match = true; + break; + } + } + vector_free(addrs, true); + if (match) return true; + + char* pubkey_hash = dogecoin_address_to_pubkey_hash((char*)address_in); + if (!pubkey_hash) return false; + + dogecoin_wallet_addr* addr = dogecoin_wallet_addr_new(); + memcpy_safe(addr->pubkeyhash, utils_hex_to_uint8(pubkey_hash), 20); + addr->childindex = wallet->next_childindex; + dogecoin_btree_tsearch(addr, &wallet->waddr_rbtree, dogecoin_wallet_addr_compare); + vector_add(wallet->waddr_vector, addr); + cstring* record = cstr_new_sz(256); + dogecoin_wallet_addr_serialize(record, wallet->chain, addr); + if (!wallet_write_record(wallet, record, WALLET_DB_REC_TYPE_ADDR)) + fprintf(stderr, "wallet: failed to write watch-only address %s\n", address_in); + cstr_free(record, true); + dogecoin_file_commit(wallet->dbfile); + wallet->next_childindex++; + return true; +} + void dogecoin_wallet_get_addresses(dogecoin_wallet* wallet, vector_t* addr_out) { unsigned int i; @@ -1863,6 +1898,7 @@ void dogecoin_wallet_check_transaction(void *ctx, dogecoin_tx *tx, unsigned int uint256_t blockhash; dogecoin_block_header_hash(&pindex->header, blockhash); printf("Found new relevant transaction: %s (height: %u)\n", txid_hex, pindex->height); + fflush(stdout); dogecoin_hash_set(wtx->blockhash, blockhash); wtx->height = pindex->height; dogecoin_tx_copy(wtx->tx, tx); diff --git a/test/cfheadersdb_tests.c b/test/cfheadersdb_tests.c new file mode 100644 index 000000000..fc2ee554f --- /dev/null +++ b/test/cfheadersdb_tests.c @@ -0,0 +1,320 @@ +/* + + The MIT License (MIT) + + Copyright (c) 2024 bluezr + Copyright (c) 2024 The Dogecoin Foundation + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES + OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + */ + +#ifndef _WIN32 +#include +#include +#include +#endif +#include +#include +#include + +#include + +/* + * Create scratch files private to this user. plain cfdb_tmp_open(path, "wb") leaves + * the mode to the process umask, which can yield a world-writable file another + * local user could rewrite between creation and read. + */ +static FILE* cfdb_tmp_open(const char* path, const char* mode) +{ +#ifdef _WIN32 + return fopen(path, mode); +#else + int fd = open(path, O_CREAT | O_WRONLY | O_TRUNC, S_IRUSR | S_IWUSR); + if (fd < 0) { + return NULL; + } + return fdopen(fd, mode); +#endif +} + + +#include +#include +#include +#include +#include +#include +#include +#include + +/* Relative to the working directory: Windows and Android have no /tmp. */ +#define CFDB_TEST_HEADERS "test_cfheaders.dat" +#define CFDB_TEST_FILTERS "test_cfilters.dat" + +/* Fill a uint256_t with a deterministic, height-dependent pattern so that a + record read back at the wrong offset is detectable rather than plausible. */ +static void fill_header(uint256_t out, uint32_t height) +{ + unsigned int i; + for (i = 0; i < 32; i++) + out[i] = (uint8_t)((height * 7u + i * 13u) & 0xff); +} + +struct iter_ctx { + unsigned int count; + uint32_t last_height; + uint32_t last_len; + dogecoin_bool payload_ok; +}; + +/* Largest single allocation seen while a recording mapper is installed. + iterate() sizes one allocation directly from a length field read off disk, so + watching the allocator is the only way to tell "rejected the length" apart + from "asked for 4 GiB and then failed the read" -- both return false. */ +static size_t cfdb_max_alloc = 0; + +static void *rec_malloc(size_t size) +{ + if (size > cfdb_max_alloc) cfdb_max_alloc = size; + return malloc(size); +} +static void *rec_calloc(size_t count, size_t size) +{ + if (count * size > cfdb_max_alloc) cfdb_max_alloc = count * size; + return calloc(count, size); +} +static void *rec_realloc(void *ptr, size_t size) +{ + if (size > cfdb_max_alloc) cfdb_max_alloc = size; + return realloc(ptr, size); +} +static void rec_free(void *ptr) { free(ptr); } + +static dogecoin_bool count_cb(uint32_t height, const uint256_t block_hash, + const uint8_t *filter_data, uint32_t data_len, + void *ctx) +{ + struct iter_ctx *c = (struct iter_ctx *)ctx; + uint256_t expect; + (void)block_hash; + c->count++; + c->last_height = height; + c->last_len = data_len; + fill_header(expect, height); + if (filter_data && data_len >= 4 && memcmp(filter_data, expect, 4) != 0) + c->payload_ok = false; + return true; +} + +void test_cfheadersdb() +{ + unsigned int i; + + /* ---------------------------------------------------------------- */ + /* cfheaders: write, flush, reopen, and read the records back */ + /* ---------------------------------------------------------------- */ + remove(CFDB_TEST_HEADERS); + + dogecoin_cfheaders_db *db = dogecoin_cfheaders_db_new(&dogecoin_chainparams_main, false); + u_assert_int_eq(db != NULL, 1); + + dogecoin_compact_filter_state *state = dogecoin_compact_filter_state_new(); + u_assert_int_eq(state != NULL, 1); + u_assert_int_eq(dogecoin_cfheaders_db_load(db, CFDB_TEST_HEADERS, state), true); + + uint256_t genesis_fh; + fill_header(genesis_fh, 0); + u_assert_int_eq(dogecoin_cfheaders_db_write_genesis(db, genesis_fh), true); + + for (i = 1; i <= 16; i++) { + uint256_t fh; + fill_header(fh, i); + u_assert_int_eq(dogecoin_cfheaders_db_write(db, i, fh), true); + } + u_assert_int_eq(dogecoin_cfheaders_db_flush(db), true); + u_assert_uint32_eq(db->tip_height, 16); + dogecoin_cfheaders_db_free(db); + dogecoin_compact_filter_state_free(state); + + /* Reopen: the records must come back, in order, with the genesis header. */ + db = dogecoin_cfheaders_db_new(&dogecoin_chainparams_main, false); + state = dogecoin_compact_filter_state_new(); + u_assert_int_eq(dogecoin_cfheaders_db_load(db, CFDB_TEST_HEADERS, state), true); + u_assert_uint32_eq(db->tip_height, 16); + u_assert_int_eq(memcmp(state->genesis_filter_header, genesis_fh, 32), 0); + u_assert_int_eq(state->filter_headers != NULL, 1); + u_assert_uint32_eq((uint32_t)state->filter_headers->len, 16); + for (i = 0; i < 16; i++) { + uint256_t expect; + uint256_t *got = (uint256_t *)vector_idx(state->filter_headers, i); + fill_header(expect, i + 1); + u_assert_int_eq(memcmp(*got, expect, 32), 0); + } + + /* reset() truncates back to the file header, leaving no records. */ + u_assert_int_eq(dogecoin_cfheaders_db_reset(db), true); + dogecoin_cfheaders_db_free(db); + dogecoin_compact_filter_state_free(state); + + db = dogecoin_cfheaders_db_new(&dogecoin_chainparams_main, false); + state = dogecoin_compact_filter_state_new(); + u_assert_int_eq(dogecoin_cfheaders_db_load(db, CFDB_TEST_HEADERS, state), true); + u_assert_uint32_eq((uint32_t)state->filter_headers->len, 0); + dogecoin_cfheaders_db_free(db); + dogecoin_compact_filter_state_free(state); + + /* ---------------------------------------------------------------- */ + /* A trailing partial record must be ignored, not misparsed */ + /* ---------------------------------------------------------------- */ + remove(CFDB_TEST_HEADERS); + db = dogecoin_cfheaders_db_new(&dogecoin_chainparams_main, false); + state = dogecoin_compact_filter_state_new(); + u_assert_int_eq(dogecoin_cfheaders_db_load(db, CFDB_TEST_HEADERS, state), true); + for (i = 1; i <= 4; i++) { + uint256_t fh; + fill_header(fh, i); + u_assert_int_eq(dogecoin_cfheaders_db_write(db, i, fh), true); + } + u_assert_int_eq(dogecoin_cfheaders_db_flush(db), true); + dogecoin_cfheaders_db_free(db); + dogecoin_compact_filter_state_free(state); + + /* Lop 10 bytes off the last record, as an interrupted write would. Done by + rewriting a shortened copy rather than truncate()/_chsize(), so the test + stays portable across the platforms this file already builds on. */ + { + FILE *f = fopen(CFDB_TEST_HEADERS, "rb"); + uint8_t *buf; + long size; + size_t got; + u_assert_int_eq(f != NULL, 1); + fseek(f, 0, SEEK_END); + size = ftell(f); + u_assert_int_eq(size > 10, 1); + rewind(f); + buf = dogecoin_malloc((size_t)size); + u_assert_int_eq(buf != NULL, 1); + got = fread(buf, 1, (size_t)size, f); + fclose(f); + u_assert_int_eq(got == (size_t)size, 1); + + f = cfdb_tmp_open(CFDB_TEST_HEADERS, "wb"); + u_assert_int_eq(f != NULL, 1); + u_assert_int_eq(fwrite(buf, 1, (size_t)size - 10, f) == (size_t)size - 10, 1); + fclose(f); + dogecoin_free(buf); + } + + db = dogecoin_cfheaders_db_new(&dogecoin_chainparams_main, false); + state = dogecoin_compact_filter_state_new(); + u_assert_int_eq(dogecoin_cfheaders_db_load(db, CFDB_TEST_HEADERS, state), true); + /* Three whole records survive; the truncated fourth is dropped. */ + u_assert_uint32_eq((uint32_t)state->filter_headers->len, 3); + u_assert_uint32_eq(db->tip_height, 3); + dogecoin_cfheaders_db_free(db); + dogecoin_compact_filter_state_free(state); + + /* ---------------------------------------------------------------- */ + /* cfilters: write, iterate, and reject an oversized length field */ + /* ---------------------------------------------------------------- */ + remove(CFDB_TEST_FILTERS); + dogecoin_cfilters_db *fdb = dogecoin_cfilters_db_new(&dogecoin_chainparams_main, false); + u_assert_int_eq(fdb != NULL, 1); + u_assert_int_eq(dogecoin_cfilters_db_load(fdb, CFDB_TEST_FILTERS), true); + + for (i = 1; i <= 5; i++) { + uint256_t bh, payload; + cstring *data; + fill_header(bh, i + 100); + fill_header(payload, i); + data = cstr_new_buf(payload, 32); + u_assert_int_eq(dogecoin_cfilters_db_write(fdb, i, bh, data), true); + cstr_free(data, true); + } + dogecoin_cfilters_db_free(fdb); + + fdb = dogecoin_cfilters_db_new(&dogecoin_chainparams_main, false); + u_assert_int_eq(dogecoin_cfilters_db_load(fdb, CFDB_TEST_FILTERS), true); + { + struct iter_ctx c; + c.count = 0; c.last_height = 0; c.last_len = 0; c.payload_ok = true; + u_assert_int_eq(dogecoin_cfilters_db_iterate(fdb, count_cb, &c), true); + u_assert_uint32_eq(c.count, 5); + u_assert_uint32_eq(c.last_height, 5); + u_assert_uint32_eq(c.last_len, 32); + u_assert_int_eq(c.payload_ok, true); + } + dogecoin_cfilters_db_free(fdb); + + /* Corrupt the first record's data_len to 0xFFFFFFFF. Without a bound this + asks the allocator for 4 GiB before the short read is ever attempted, so + iterate() must reject the record on the length alone. The file header is + CF_HEADERS_FILE_HDR_LEN bytes and data_len sits at offset 36 of the + record header. */ + { + FILE *f = fopen(CFDB_TEST_FILTERS, "r+b"); + uint32_t bogus = 0xFFFFFFFFu; + u_assert_int_eq(f != NULL, 1); + u_assert_int_eq(fseek(f, CF_HEADERS_FILE_HDR_LEN + 36, SEEK_SET) == 0, 1); + u_assert_int_eq(fwrite(&bogus, 4, 1, f) == 1, 1); + fclose(f); + } + + fdb = dogecoin_cfilters_db_new(&dogecoin_chainparams_main, false); + u_assert_int_eq(dogecoin_cfilters_db_load(fdb, CFDB_TEST_FILTERS), true); + { + struct iter_ctx c; + dogecoin_mem_mapper rec = {rec_malloc, rec_calloc, rec_realloc, rec_free}; + c.count = 0; c.last_height = 0; c.last_len = 0; c.payload_ok = true; + + cfdb_max_alloc = 0; + dogecoin_mem_set_mapper(rec); + u_assert_int_eq(dogecoin_cfilters_db_iterate(fdb, count_cb, &c), false); + dogecoin_mem_set_mapper_default(); + + /* The record is rejected and no callback fires. */ + u_assert_uint32_eq(c.count, 0); + /* And, the point of the bound: the 0xFFFFFFFF length was never handed + to the allocator. Asserting only on the false return would pass with + the bound removed, because the oversized read fails immediately + after the oversized allocation succeeds under memory overcommit. */ + u_assert_int_eq(cfdb_max_alloc <= (size_t)DOGECOIN_MAX_P2P_MSG_SIZE, 1); + } + dogecoin_cfilters_db_free(fdb); + + /* ---------------------------------------------------------------- */ + /* inmem_only performs no file I/O */ + /* ---------------------------------------------------------------- */ + { + dogecoin_cfheaders_db *mem = dogecoin_cfheaders_db_new(&dogecoin_chainparams_main, true); + uint256_t fh; + u_assert_int_eq(mem != NULL, 1); + u_assert_int_eq(mem->read_write, false); + u_assert_int_eq(mem->file == NULL, 1); + fill_header(fh, 1); + /* Writes are accepted and tracked in RAM without touching the disk. */ + u_assert_int_eq(dogecoin_cfheaders_db_write(mem, 1, fh), true); + u_assert_int_eq(mem->file == NULL, 1); + dogecoin_cfheaders_db_free(mem); + } + + remove(CFDB_TEST_HEADERS); + remove(CFDB_TEST_FILTERS); +} diff --git a/test/compact_filter_tests.c b/test/compact_filter_tests.c new file mode 100644 index 000000000..328ed525c --- /dev/null +++ b/test/compact_filter_tests.c @@ -0,0 +1,559 @@ +/* + + The MIT License (MIT) + + Copyright (c) 2026 bluezr + Copyright (c) 2026 The Dogecoin Foundation + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES + OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + +*/ + +#include + +#include + +#include +#include +#include +#include +#include + +/* ================================================================ */ +/* State lifecycle */ +/* ================================================================ */ + +static void test_compact_filter_state_lifecycle(void) +{ + dogecoin_compact_filter_state *state = dogecoin_compact_filter_state_new(); + u_assert_not_null(state); + u_assert_true(state->enabled == false); + u_assert_uint32_eq(state->filter_type, GCS_BASIC_FILTER_TYPE); + u_assert_uint32_eq(state->cfheaders_tip_height, 0); + u_assert_uint32_eq(state->filters_tip_height, 0); + u_assert_true(state->awaiting_response == false); + u_assert_not_null(state->filter_headers); + u_assert_not_null(state->checkpoints); + u_assert_not_null(state->watched_scripts); + u_assert_not_null(state->matched_block_hashes); + + /* cfheaders_base_height must start at 1 (default) */ + u_assert_uint32_eq(state->cfheaders_base_height, 1); + + /* reset clears tip height and awaiting flag, preserves watched_scripts */ + state->cfheaders_tip_height = 42; + state->cfheaders_base_height = 6238060; + state->awaiting_response = true; + dogecoin_compact_filter_state_reset(state); + u_assert_uint32_eq(state->cfheaders_tip_height, 0); + u_assert_uint32_eq(state->cfheaders_base_height, 1); + u_assert_true(state->awaiting_response == false); + u_assert_not_null(state->watched_scripts); + + dogecoin_compact_filter_state_free(state); +} + +/* ================================================================ */ +/* Request message serialization */ +/* ================================================================ */ + +static void test_getcfilters_ser(void) +{ + dogecoin_getcfilters_msg msg; + msg.filter_type = GCS_BASIC_FILTER_TYPE; + msg.start_height = 0x01020304; + uint8_t stop_hash[32]; + uint32_t i; + for (i = 0; i < 32; i++) stop_hash[i] = (uint8_t)(i * 2 + 1); + memcpy(msg.stop_hash, stop_hash, 32); + + cstring *buf = cstr_new_sz(64); + dogecoin_p2p_msg_getcfilters_ser(&msg, buf); + + /* 1 (filter_type) + 4 (start_height LE) + 32 (stop_hash) = 37 */ + u_assert_uint32_eq(buf->len, 37); + u_assert_uint32_eq((uint8_t)buf->str[0], GCS_BASIC_FILTER_TYPE); + /* start_height 0x01020304 in LE: 04 03 02 01 */ + u_assert_uint32_eq((uint8_t)buf->str[1], 0x04); + u_assert_uint32_eq((uint8_t)buf->str[2], 0x03); + u_assert_uint32_eq((uint8_t)buf->str[3], 0x02); + u_assert_uint32_eq((uint8_t)buf->str[4], 0x01); + u_assert_mem_eq(buf->str + 5, stop_hash, 32); + cstr_free(buf, true); +} + +static void test_getcfheaders_ser(void) +{ + dogecoin_getcfheaders_msg msg; + msg.filter_type = GCS_BASIC_FILTER_TYPE; + msg.start_height = 1000; + memset(msg.stop_hash, 0xAB, 32); + + cstring *buf = cstr_new_sz(64); + dogecoin_p2p_msg_getcfheaders_ser(&msg, buf); + + u_assert_uint32_eq(buf->len, 37); + u_assert_uint32_eq((uint8_t)buf->str[0], GCS_BASIC_FILTER_TYPE); + /* start_height 1000 = 0x3E8 in LE: E8 03 00 00 */ + u_assert_uint32_eq((uint8_t)buf->str[1], 0xE8); + u_assert_uint32_eq((uint8_t)buf->str[2], 0x03); + u_assert_uint32_eq((uint8_t)buf->str[3], 0x00); + u_assert_uint32_eq((uint8_t)buf->str[4], 0x00); + cstr_free(buf, true); +} + +static void test_getcfcheckpt_ser(void) +{ + dogecoin_getcfcheckpt_msg msg; + msg.filter_type = GCS_BASIC_FILTER_TYPE; + memset(msg.stop_hash, 0x55, 32); + + cstring *buf = cstr_new_sz(64); + dogecoin_p2p_msg_getcfcheckpt_ser(&msg, buf); + + /* 1 (filter_type) + 32 (stop_hash) = 33 */ + u_assert_uint32_eq(buf->len, 33); + u_assert_uint32_eq((uint8_t)buf->str[0], GCS_BASIC_FILTER_TYPE); + uint8_t expected[32]; + memset(expected, 0x55, 32); + u_assert_mem_eq(buf->str + 1, expected, 32); + cstr_free(buf, true); +} + +/* ================================================================ */ +/* Response message deserialization */ +/* ================================================================ */ + +static void test_cfilter_deser(void) +{ + /* BIP157 wire format: filter_type(1) | block_hash(32) | varint(len) | data */ + uint8_t block_hash[32]; + uint32_t i; + for (i = 0; i < 32; i++) block_hash[i] = (uint8_t)i; + const uint8_t filter_bytes[] = {0xDE, 0xAD, 0xBE, 0xEF}; + + cstring *wire = cstr_new_sz(64); + uint8_t ft = GCS_BASIC_FILTER_TYPE; + ser_bytes(wire, &ft, 1); + ser_bytes(wire, block_hash, 32); + ser_varlen(wire, sizeof(filter_bytes)); + ser_bytes(wire, filter_bytes, sizeof(filter_bytes)); + + struct const_buffer buf = {(const uint8_t *)wire->str, wire->len}; + dogecoin_cfilter_msg msg; + dogecoin_cfilter_msg_init(&msg); + + u_assert_true(dogecoin_p2p_msg_cfilter_deser(&msg, &buf)); + u_assert_mem_eq(msg.block_hash, block_hash, 32); + u_assert_uint32_eq(msg.filter_type, GCS_BASIC_FILTER_TYPE); + u_assert_not_null(msg.filter_data); + u_assert_uint32_eq(msg.filter_data->len, sizeof(filter_bytes)); + u_assert_mem_eq(msg.filter_data->str, filter_bytes, sizeof(filter_bytes)); + u_assert_uint32_eq(buf.len, 0); /* fully consumed */ + + dogecoin_cfilter_msg_free(&msg); + cstr_free(wire, true); +} + +static void test_cfilter_deser_truncated(void) +{ + /* Truncated message should fail cleanly */ + uint8_t short_buf[10]; + memset(short_buf, 0, sizeof(short_buf)); + struct const_buffer buf = {short_buf, sizeof(short_buf)}; + dogecoin_cfilter_msg msg; + dogecoin_cfilter_msg_init(&msg); + /* Only 10 bytes — not enough for filter_type(1) + block_hash(32) */ + u_assert_true(!dogecoin_p2p_msg_cfilter_deser(&msg, &buf)); + dogecoin_cfilter_msg_free(&msg); +} + +static void test_cfheaders_deser(void) +{ + /* Wire: filter_type(1) | stop_hash(32) | prev_filter_header(32) | varint(N) | N×32 hashes */ + uint8_t stop_hash[32], prev_header[32], hash1[32], hash2[32]; + memset(stop_hash, 0x11, 32); + memset(prev_header, 0x22, 32); + memset(hash1, 0xAA, 32); + memset(hash2, 0xBB, 32); + + cstring *wire = cstr_new_sz(128); + uint8_t ft = GCS_BASIC_FILTER_TYPE; + ser_bytes(wire, &ft, 1); + ser_bytes(wire, stop_hash, 32); + ser_bytes(wire, prev_header, 32); + ser_varlen(wire, 2); + ser_bytes(wire, hash1, 32); + ser_bytes(wire, hash2, 32); + + struct const_buffer buf = {(const uint8_t *)wire->str, wire->len}; + dogecoin_cfheaders_msg msg; + dogecoin_cfheaders_msg_init(&msg); + + u_assert_true(dogecoin_p2p_msg_cfheaders_deser(&msg, &buf)); + u_assert_uint32_eq(msg.filter_type, GCS_BASIC_FILTER_TYPE); + u_assert_mem_eq(msg.stop_hash, stop_hash, 32); + u_assert_mem_eq(msg.prev_filter_header, prev_header, 32); + u_assert_not_null(msg.filter_hashes); + u_assert_uint32_eq((uint32_t)msg.filter_hashes->len, 2); + u_assert_mem_eq(vector_idx(msg.filter_hashes, 0), hash1, 32); + u_assert_mem_eq(vector_idx(msg.filter_hashes, 1), hash2, 32); + u_assert_uint32_eq(buf.len, 0); + + dogecoin_cfheaders_msg_free(&msg); + cstr_free(wire, true); +} + +static void test_cfcheckpt_deser(void) +{ + /* Wire: filter_type(1) | stop_hash(32) | varint(N) | N×32 filter headers */ + uint8_t stop_hash[32], cp1[32], cp2[32], cp3[32]; + memset(stop_hash, 0x55, 32); + memset(cp1, 0x01, 32); + memset(cp2, 0x02, 32); + memset(cp3, 0x03, 32); + + cstring *wire = cstr_new_sz(160); + uint8_t ft = GCS_BASIC_FILTER_TYPE; + ser_bytes(wire, &ft, 1); + ser_bytes(wire, stop_hash, 32); + ser_varlen(wire, 3); + ser_bytes(wire, cp1, 32); + ser_bytes(wire, cp2, 32); + ser_bytes(wire, cp3, 32); + + struct const_buffer buf = {(const uint8_t *)wire->str, wire->len}; + dogecoin_cfcheckpt_msg msg; + dogecoin_cfcheckpt_msg_init(&msg); + + u_assert_true(dogecoin_p2p_msg_cfcheckpt_deser(&msg, &buf)); + u_assert_uint32_eq(msg.filter_type, GCS_BASIC_FILTER_TYPE); + u_assert_mem_eq(msg.stop_hash, stop_hash, 32); + u_assert_not_null(msg.filter_headers); + u_assert_uint32_eq((uint32_t)msg.filter_headers->len, 3); + u_assert_mem_eq(vector_idx(msg.filter_headers, 0), cp1, 32); + u_assert_mem_eq(vector_idx(msg.filter_headers, 1), cp2, 32); + u_assert_mem_eq(vector_idx(msg.filter_headers, 2), cp3, 32); + u_assert_uint32_eq(buf.len, 0); + + dogecoin_cfcheckpt_msg_free(&msg); + cstr_free(wire, true); +} + +/* ================================================================ */ +/* Filter header computation and validation */ +/* ================================================================ */ + +static void test_filter_header_compute(void) +{ + const char *data_str = "hello world"; + cstring *filter_data = cstr_new(data_str); + + uint8_t prev[32], header[32]; + memset(prev, 0, 32); + + dogecoin_compact_filter_compute_header(filter_data, prev, header); + + /* The header must not be all zeros */ + uint8_t zeros[32]; + memset(zeros, 0, 32); + u_assert_mem_not_eq(header, zeros, 32); + + /* Validation with the correct expected header must pass */ + u_assert_true(dogecoin_compact_filter_validate(filter_data, prev, header)); + + /* Different prev_filter_header yields a different header */ + uint8_t other_prev[32], other_header[32]; + memset(other_prev, 0xFF, 32); + dogecoin_compact_filter_compute_header(filter_data, other_prev, other_header); + u_assert_mem_not_eq(header, other_header, 32); + + /* Cross-validation must fail */ + u_assert_true(!dogecoin_compact_filter_validate(filter_data, prev, other_header)); + u_assert_true(!dogecoin_compact_filter_validate(filter_data, other_prev, header)); + + /* NULL filter_data returns false */ + u_assert_true(!dogecoin_compact_filter_validate(NULL, prev, header)); + + /* The attack this function exists to stop: a peer that serves altered + * filter bytes for a block whose filter header is already committed to by + * the cfheaders chain. Flipping any single bit of the payload must fail + * validation against the header computed from the original -- otherwise a + * peer could strip a transaction out of a filter and the client would + * silently skip the block that pays it. */ + { + size_t probe; + for (probe = 0; probe < filter_data->len; probe++) { + cstring *tampered = cstr_new_buf(filter_data->str, filter_data->len); + tampered->str[probe] ^= 0x01; + u_assert_true(!dogecoin_compact_filter_validate(tampered, prev, header)); + cstr_free(tampered, true); + } + /* Truncation and extension must be rejected on the same grounds. */ + cstring *shorter = cstr_new_buf(filter_data->str, filter_data->len - 1); + u_assert_true(!dogecoin_compact_filter_validate(shorter, prev, header)); + cstr_free(shorter, true); + + cstring *longer = cstr_new_buf(filter_data->str, filter_data->len); + cstr_append_c(longer, 0x00); + u_assert_true(!dogecoin_compact_filter_validate(longer, prev, header)); + cstr_free(longer, true); + } + + /* Chaining: header2 = SHA256d(filter_hash2 || header1) */ + cstring *filter_data2 = cstr_new("next block filter"); + uint8_t header2[32]; + dogecoin_compact_filter_compute_header(filter_data2, header, header2); + u_assert_mem_not_eq(header2, header, 32); + u_assert_true(dogecoin_compact_filter_validate(filter_data2, header, header2)); + + cstr_free(filter_data, true); + cstr_free(filter_data2, true); +} + +/* ================================================================ */ +/* Hardcoded checkpoint helpers */ +/* ================================================================ */ + +static void test_cf_checkpoints_get(void) +{ + size_t count = 0; + const dogecoin_cf_checkpoint *arr = dogecoin_cf_get_checkpoints(&dogecoin_chainparams_main, &count); + u_assert_not_null(arr); + u_assert_true(count > 0); + /* First checkpoint is at height 1000 (Dogecoin Core convention) */ + u_assert_uint32_eq(arr[0].height, 1000); + u_assert_not_null(arr[0].filter_header); + + /* Testnet and regtest currently have no checkpoints — function returns true (nothing to verify) */ + const dogecoin_cf_checkpoint *tarr = dogecoin_cf_get_checkpoints(&dogecoin_chainparams_test, &count); + (void)tarr; + /* count may be 0; that's expected */ +} + +static void test_cf_checkpoints_load(void) +{ + dogecoin_compact_filter_state *state = dogecoin_compact_filter_state_new(); + size_t loaded = dogecoin_cf_load_hardcoded_checkpoints(state, &dogecoin_chainparams_main); + u_assert_true(loaded > 0); + + /* The checkpoints vector must have at least as many slots as loaded entries */ + u_assert_true((uint32_t)state->checkpoints->len >= (uint32_t)loaded); + + /* cp_idx 0 corresponds to height 1000; it must not be all-zero */ + uint8_t zeros[32]; + memset(zeros, 0, 32); + u_assert_mem_not_eq(vector_idx(state->checkpoints, 0), zeros, 32); + + dogecoin_compact_filter_state_free(state); +} + +static void test_cf_checkpoints_validate(void) +{ + size_t count = 0; + const dogecoin_cf_checkpoint *arr = dogecoin_cf_get_checkpoints(&dogecoin_chainparams_main, &count); + + /* Empty peer list — every hardcoded checkpoint is skipped (peer chain is "shorter") */ + vector_t *peer = vector_new(4, dogecoin_free); + u_assert_true(dogecoin_cf_validate_checkpoints(&dogecoin_chainparams_main, peer)); + + /* Correct checkpoint at cp_idx 0 (height 1000) */ + uint256_t *cp0 = dogecoin_calloc(1, sizeof(uint256_t)); + utils_uint256_sethex((char *)arr[0].filter_header, *cp0); + vector_add(peer, cp0); + u_assert_true(dogecoin_cf_validate_checkpoints(&dogecoin_chainparams_main, peer)); + + /* Corrupt cp_idx 0 — validation must fail */ + (*cp0)[0] ^= 0xFF; + u_assert_true(!dogecoin_cf_validate_checkpoints(&dogecoin_chainparams_main, peer)); + + vector_free(peer, true); +} + +/* ================================================================ */ +/* cfheaders_base_height cfilter indexing */ +/* ================================================================ */ + +/* Verify cfilter validation indexing when cfheaders start at a height > 1. + * With checkpoint-based header sync, cfheaders_base_height is set to chainbottom + * (e.g. 6,238,060), not 1. filter_headers[i] = filter header for block at + * (cfheaders_base_height + i), so the vector index is (filter_height - base). */ +static void test_cfilter_indexing_with_base_height(void) +{ + dogecoin_compact_filter_state *state = dogecoin_compact_filter_state_new(); + u_assert_not_null(state); + + const uint32_t base = 6238060; /* simulated chainbottom */ + state->cfheaders_base_height = base; + state->cfheaders_tip_height = base - 1; + state->filters_tip_height = base - 1; + + /* Synthetic genesis_filter_header: the filter header at height (base-1). */ + uint256_t genesis_fh; + memset(genesis_fh, 0xAB, 32); + memcpy(state->genesis_filter_header, genesis_fh, 32); + + /* Build 3 consecutive filter data strings (empty GCS filters). */ + cstring *fd[3]; + fd[0] = cstr_new_sz(0); /* height base */ + fd[1] = cstr_new_sz(0); /* height base+1 */ + fd[2] = cstr_new_sz(0); /* height base+2 */ + + /* Compute chained filter headers. */ + uint256_t fh[3]; + dogecoin_compact_filter_compute_header(fd[0], genesis_fh, fh[0]); + dogecoin_compact_filter_compute_header(fd[1], fh[0], fh[1]); + dogecoin_compact_filter_compute_header(fd[2], fh[1], fh[2]); + + /* Populate filter_headers as if cfheaders download completed. */ + uint32_t k; + for (k = 0; k < 3; k++) { + uint256_t *h = dogecoin_calloc(1, sizeof(uint256_t)); + memcpy(*h, fh[k], 32); + vector_add(state->filter_headers, h); + } + state->cfheaders_tip_height = base + 2; + + /* ------ cfilter at height (base) ------ + * vec_idx = filter_height - base = 0 + * prev_fh = genesis_filter_header (filter_height <= base) */ + { + uint32_t filter_height = base; + uint32_t vec_idx = filter_height - base; + u_assert_uint32_eq(vec_idx, 0); + u_assert_true(vec_idx < state->filter_headers->len); + + uint256_t prev_fh; + memcpy(prev_fh, state->genesis_filter_header, 32); + u_assert_mem_eq(prev_fh, genesis_fh, 32); + + uint256_t *expected = (uint256_t *)vector_idx(state->filter_headers, vec_idx); + u_assert_mem_eq(*expected, fh[0], 32); + u_assert_true(dogecoin_compact_filter_validate(fd[0], prev_fh, *expected)); + } + + /* ------ cfilter at height (base+1) ------ + * vec_idx = 1, prev_fh = filter_headers[0] */ + { + uint32_t filter_height = base + 1; + uint32_t vec_idx = filter_height - base; + u_assert_uint32_eq(vec_idx, 1); + u_assert_true(vec_idx < state->filter_headers->len); + + uint32_t prev_idx = filter_height - base - 1; /* = 0 */ + uint256_t prev_fh; + memcpy(prev_fh, vector_idx(state->filter_headers, prev_idx), 32); + u_assert_mem_eq(prev_fh, fh[0], 32); + + uint256_t *expected = (uint256_t *)vector_idx(state->filter_headers, vec_idx); + u_assert_mem_eq(*expected, fh[1], 32); + u_assert_true(dogecoin_compact_filter_validate(fd[1], prev_fh, *expected)); + } + + /* ------ wrong prev_fh must fail ------ + * Using genesis_fh as prev for height base+1 is incorrect. */ + { + uint256_t *expected = (uint256_t *)vector_idx(state->filter_headers, 1); + u_assert_true(!dogecoin_compact_filter_validate(fd[1], genesis_fh, *expected)); + } + + uint32_t j; + for (j = 0; j < 3; j++) cstr_free(fd[j], true); + dogecoin_compact_filter_state_free(state); +} + +/* ================================================================ */ +/* Unbounded-allocation regressions (CWE-400) */ +/* ================================================================ */ + +/* A cfheaders/cfcheckpt message declares a hash count as a compact_size read + * straight off the wire. The count fed vector_new() directly, which reserves a + * power-of-two number of pointers -- 0xFFFFFFFF became a ~34 GB calloc before a + * single hash was read, so a ~10-byte message from any peer was a memory + * exhaustion DoS. Same class as the getheaders locator-count fix. Each entry is + * a 32-byte hash, so a count the remaining buffer cannot hold must be rejected. */ +static void test_cfheaders_deser_unbounded_count(void) +{ + /* filter_type(1) + stop_hash(32) + prev_filter_header(32), then + * varint 0xFFFFFFFF claiming 429496729 hashes, then nothing. */ + uint8_t bad[1 + 32 + 32 + 5]; + memset(bad, 0, sizeof(bad)); + bad[65] = 0xfe; /* compact_size: uint32 follows */ + bad[66] = 0xff; bad[67] = 0xff; + bad[68] = 0xff; bad[69] = 0xff; /* 0xFFFFFFFF */ + + struct const_buffer buf = { bad, sizeof(bad) }; + dogecoin_cfheaders_msg msg; + dogecoin_cfheaders_msg_init(&msg); + u_assert_true(!dogecoin_p2p_msg_cfheaders_deser(&msg, &buf)); + dogecoin_cfheaders_msg_free(&msg); + + /* A count above BIP157's 2000-hash cap must also be refused even when the + * buffer is large enough to make it look plausible. */ + size_t big_len = 1 + 32 + 32 + 3 + (size_t)2001 * 32; + uint8_t *big = dogecoin_calloc(1, big_len); + big[65] = 0xfd; /* compact_size: uint16 follows */ + big[66] = (uint8_t)(2001 & 0xff); + big[67] = (uint8_t)((2001 >> 8) & 0xff); + struct const_buffer bigbuf = { big, big_len }; + dogecoin_cfheaders_msg msg2; + dogecoin_cfheaders_msg_init(&msg2); + u_assert_true(!dogecoin_p2p_msg_cfheaders_deser(&msg2, &bigbuf)); + dogecoin_cfheaders_msg_free(&msg2); + dogecoin_free(big); +} + +static void test_cfcheckpt_deser_unbounded_count(void) +{ + /* filter_type(1) + stop_hash(32), then varint 0xFFFFFFFF, then nothing. */ + uint8_t bad[1 + 32 + 5]; + memset(bad, 0, sizeof(bad)); + bad[33] = 0xfe; + bad[34] = 0xff; bad[35] = 0xff; + bad[36] = 0xff; bad[37] = 0xff; + + struct const_buffer buf = { bad, sizeof(bad) }; + dogecoin_cfcheckpt_msg msg; + dogecoin_cfcheckpt_msg_init(&msg); + u_assert_true(!dogecoin_p2p_msg_cfcheckpt_deser(&msg, &buf)); + dogecoin_cfcheckpt_msg_free(&msg); +} + +/* ================================================================ */ +/* Public test entry point */ +/* ================================================================ */ + +void test_compact_filter(void) +{ + test_cfheaders_deser_unbounded_count(); + test_cfcheckpt_deser_unbounded_count(); + test_compact_filter_state_lifecycle(); + test_getcfilters_ser(); + test_getcfheaders_ser(); + test_getcfcheckpt_ser(); + test_cfilter_deser(); + test_cfilter_deser_truncated(); + test_cfheaders_deser(); + test_cfcheckpt_deser(); + test_filter_header_compute(); + test_cf_checkpoints_get(); + test_cf_checkpoints_load(); + test_cf_checkpoints_validate(); + test_cfilter_indexing_with_base_height(); +} diff --git a/test/golomb_tests.c b/test/golomb_tests.c new file mode 100644 index 000000000..69f3af8b6 --- /dev/null +++ b/test/golomb_tests.c @@ -0,0 +1,425 @@ +/* + + The MIT License (MIT) + + Copyright (c) 2026 bluezr + Copyright (c) 2026 The Dogecoin Foundation + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES + OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + +*/ + +#include + +#include + +#include +#include +#include + +static void cstr_free_cb(void *p) { cstr_free((cstring *)p, true); } + +/* ================================================================ */ +/* Bitwriter / Bitreader */ +/* ================================================================ */ + +static void test_bitwriter_basic(void) +{ + gcs_bitwriter w; + gcs_bitwriter_init(&w, 4); + + /* Write 10 bits: 1 0 1 1 0 0 1 0 1 1 + * First byte = 10110010 = 0xB2 + * Second byte = 11xxxxxx → after flush = 0xC0 */ + gcs_bitwriter_write_bit(&w, 1); + gcs_bitwriter_write_bit(&w, 0); + gcs_bitwriter_write_bit(&w, 1); + gcs_bitwriter_write_bit(&w, 1); + gcs_bitwriter_write_bit(&w, 0); + gcs_bitwriter_write_bit(&w, 0); + gcs_bitwriter_write_bit(&w, 1); + gcs_bitwriter_write_bit(&w, 0); /* byte boundary → 0xB2 written */ + gcs_bitwriter_write_bit(&w, 1); + gcs_bitwriter_write_bit(&w, 1); + gcs_bitwriter_flush(&w); + + u_assert_uint32_eq(w.data->len, 2); + u_assert_uint32_eq((uint8_t)w.data->str[0], 0xB2); + u_assert_uint32_eq((uint8_t)w.data->str[1], 0xC0); + + cstr_free(w.data, true); +} + +static void test_bitwriter_write_bits_be(void) +{ + /* write_bits_be(22, 5): value=22=0b10110, 5 bits MSB-first + * bit order: 1,0,1,1,0 → packed byte: 10110000 = 0xB0 */ + gcs_bitwriter w; + gcs_bitwriter_init(&w, 4); + gcs_bitwriter_write_bits_be(&w, 22, 5); + gcs_bitwriter_flush(&w); + + u_assert_uint32_eq(w.data->len, 1); + u_assert_uint32_eq((uint8_t)w.data->str[0], 0xB0); + cstr_free(w.data, true); +} + +static void test_bitreader_roundtrip(void) +{ + /* Write a known 5-bit value and read it back */ + gcs_bitwriter w; + gcs_bitwriter_init(&w, 4); + gcs_bitwriter_write_bits_be(&w, 22, 5); + gcs_bitwriter_flush(&w); + + gcs_bitreader r; + gcs_bitreader_init(&r, w.data->str, w.data->len); + + uint64_t out = 0; + u_assert_true(gcs_bitreader_read_bits_be(&r, 5, &out)); + u_assert_uint64_eq(out, 22); + + cstr_free(w.data, true); +} + +static void test_bitreader_individual_bits(void) +{ + /* Write 0xB2 and read each bit */ + uint8_t byte = 0xB2; /* 10110010 */ + gcs_bitreader r; + gcs_bitreader_init(&r, &byte, 1); + + u_assert_int_eq(gcs_bitreader_read_bit(&r), 1); + u_assert_int_eq(gcs_bitreader_read_bit(&r), 0); + u_assert_int_eq(gcs_bitreader_read_bit(&r), 1); + u_assert_int_eq(gcs_bitreader_read_bit(&r), 1); + u_assert_int_eq(gcs_bitreader_read_bit(&r), 0); + u_assert_int_eq(gcs_bitreader_read_bit(&r), 0); + u_assert_int_eq(gcs_bitreader_read_bit(&r), 1); + u_assert_int_eq(gcs_bitreader_read_bit(&r), 0); + + /* Buffer exhausted — next read returns -1 */ + u_assert_int_eq(gcs_bitreader_read_bit(&r), -1); +} + +/* ================================================================ */ +/* Golomb-Rice codec */ +/* ================================================================ */ + +static void test_golomb_rice_roundtrip_p3(void) +{ + int P = 3; + uint64_t values[] = {0, 1, 7, 8, 9, 15, 100, 255, 1023, 65535}; + size_t n = sizeof(values) / sizeof(values[0]); + size_t i; + + for (i = 0; i < n; i++) { + gcs_bitwriter w; + gcs_bitwriter_init(&w, 16); + golomb_rice_encode(&w, values[i], P); + gcs_bitwriter_flush(&w); + + gcs_bitreader r; + gcs_bitreader_init(&r, w.data->str, w.data->len); + uint64_t decoded = 0; + u_assert_true(golomb_rice_decode(&r, P, &decoded)); + u_assert_uint64_eq(decoded, values[i]); + + cstr_free(w.data, true); + } +} + +static void test_golomb_rice_roundtrip_p19(void) +{ + /* P=19 is the actual BIP158 parameter */ + int P = GCS_BASIC_FILTER_P; + uint64_t values[] = { + 0, + 1, + (1ULL << 19) - 1, /* max remainder with P=19 */ + (1ULL << 19), /* first value needing quotient=1 */ + (1ULL << 19) + 42, + (uint64_t)GCS_BASIC_FILTER_M, /* ~784931 */ + (uint64_t)GCS_BASIC_FILTER_M * 5 + }; + size_t n = sizeof(values) / sizeof(values[0]); + size_t i; + + for (i = 0; i < n; i++) { + gcs_bitwriter w; + gcs_bitwriter_init(&w, 32); + golomb_rice_encode(&w, values[i], P); + gcs_bitwriter_flush(&w); + + gcs_bitreader r; + gcs_bitreader_init(&r, w.data->str, w.data->len); + uint64_t decoded = 0; + u_assert_true(golomb_rice_decode(&r, P, &decoded)); + u_assert_uint64_eq(decoded, values[i]); + + cstr_free(w.data, true); + } +} + +static void test_golomb_rice_known_encoding(void) +{ + /* value=5, P=3: quotient=0, remainder=5 + * bits: 0(term) 1 0 1 → 4 bits → 0101xxxx → 0x50 after flush */ + gcs_bitwriter w; + gcs_bitwriter_init(&w, 4); + golomb_rice_encode(&w, 5, 3); + gcs_bitwriter_flush(&w); + + u_assert_uint32_eq(w.data->len, 1); + u_assert_uint32_eq((uint8_t)w.data->str[0], 0x50); + cstr_free(w.data, true); + + /* value=0, P=3: quotient=0, remainder=0 + * bits: 0(term) 0 0 0 → 4 bits → 0000xxxx → 0x00 after flush */ + gcs_bitwriter_init(&w, 4); + golomb_rice_encode(&w, 0, 3); + gcs_bitwriter_flush(&w); + + u_assert_uint32_eq(w.data->len, 1); + u_assert_uint32_eq((uint8_t)w.data->str[0], 0x00); + cstr_free(w.data, true); +} + +/* ================================================================ */ +/* GCS filter: build and match */ +/* ================================================================ */ + +static void test_gcs_filter_empty(void) +{ + gcs_filter *f = gcs_filter_new(); + u_assert_not_null(f); + u_assert_uint32_eq(f->filter_type, GCS_BASIC_FILTER_TYPE); + u_assert_uint32_eq(f->N, 0); + + uint8_t blockhash[32]; + memset(blockhash, 0, 32); + vector_t *elements = vector_new(0, cstr_free_cb); + + u_assert_true(gcs_filter_build(f, GCS_BASIC_FILTER_TYPE, blockhash, elements)); + u_assert_uint32_eq(f->N, 0); + u_assert_not_null(f->encoded); + u_assert_uint32_eq(f->encoded->len, 0); + + u_assert_true(!gcs_filter_match(f, (const uint8_t *)"test", 4)); + + gcs_filter_free(f); + vector_free(elements, true); +} + +static void test_gcs_filter_build_and_match(void) +{ + gcs_filter *f = gcs_filter_new(); + u_assert_not_null(f); + + uint8_t blockhash[32]; + memset(blockhash, 0xAB, 32); + + /* Three known script pubkeys */ + const uint8_t s0[] = {0x76, 0xa9, 0x14, 0x01, 0x02, 0x03}; + const uint8_t s1[] = {0x76, 0xa9, 0x14, 0x04, 0x05, 0x06}; + const uint8_t s2[] = {0x00, 0x14, 0x07, 0x08, 0x09, 0x0a}; + + vector_t *elements = vector_new(3, cstr_free_cb); + vector_add(elements, cstr_new_buf((const char *)s0, sizeof(s0))); + vector_add(elements, cstr_new_buf((const char *)s1, sizeof(s1))); + vector_add(elements, cstr_new_buf((const char *)s2, sizeof(s2))); + + u_assert_true(gcs_filter_build(f, GCS_BASIC_FILTER_TYPE, blockhash, elements)); + u_assert_uint32_eq(f->N, 3); + u_assert_not_null(f->encoded); + + /* All inserted elements must match */ + u_assert_true(gcs_filter_match(f, s0, sizeof(s0))); + u_assert_true(gcs_filter_match(f, s1, sizeof(s1))); + u_assert_true(gcs_filter_match(f, s2, sizeof(s2))); + + /* An element that was not inserted should not match (FP rate ~1/784931) */ + const uint8_t nonmember[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + u_assert_true(!gcs_filter_match(f, nonmember, sizeof(nonmember))); + + gcs_filter_free(f); + vector_free(elements, true); +} + +static void test_gcs_filter_match_any(void) +{ + gcs_filter *f = gcs_filter_new(); + uint8_t blockhash[32]; + memset(blockhash, 0xCC, 32); + + const uint8_t s0[] = {0x76, 0xa9, 0x14, 0xDE, 0xAD, 0xBE}; + const uint8_t s1[] = {0x76, 0xa9, 0x14, 0xCA, 0xFE, 0x00}; + + vector_t *elements = vector_new(2, cstr_free_cb); + vector_add(elements, cstr_new_buf((const char *)s0, sizeof(s0))); + vector_add(elements, cstr_new_buf((const char *)s1, sizeof(s1))); + + u_assert_true(gcs_filter_build(f, GCS_BASIC_FILTER_TYPE, blockhash, elements)); + + /* Query set containing one matching element */ + vector_t *mixed = vector_new(3, cstr_free_cb); + vector_add(mixed, cstr_new_buf("\x00\x00\x00\x00", 4)); /* non-member */ + vector_add(mixed, cstr_new_buf((const char *)s1, sizeof(s1))); /* member */ + u_assert_true(gcs_filter_match_any(f, mixed)); + + /* Query set with no matching elements */ + vector_t *none = vector_new(2, cstr_free_cb); + vector_add(none, cstr_new_buf("\x00\x00\x00\x00", 4)); + vector_add(none, cstr_new_buf("\xFF\xFF\xFF\xFF", 4)); + u_assert_true(!gcs_filter_match_any(f, none)); + + /* Empty query set */ + vector_t *empty = vector_new(0, cstr_free_cb); + u_assert_true(!gcs_filter_match_any(f, empty)); + + gcs_filter_free(f); + vector_free(elements, true); + vector_free(mixed, true); + vector_free(none, true); + vector_free(empty, true); +} + +/* ================================================================ */ +/* GCS filter: serialization round-trip */ +/* ================================================================ */ + +static void test_gcs_filter_serialize_deser(void) +{ + gcs_filter *f = gcs_filter_new(); + uint8_t blockhash[32]; + memset(blockhash, 0x11, 32); + + const uint8_t s0[] = {0x76, 0xa9, 0x14, 0xDE, 0xAD, 0xBE, 0xEF}; + const uint8_t s1[] = {0x00, 0x14, 0x01, 0x23, 0x45, 0x67}; + + vector_t *elements = vector_new(2, cstr_free_cb); + vector_add(elements, cstr_new_buf((const char *)s0, sizeof(s0))); + vector_add(elements, cstr_new_buf((const char *)s1, sizeof(s1))); + + u_assert_true(gcs_filter_build(f, GCS_BASIC_FILTER_TYPE, blockhash, elements)); + + /* Serialize */ + cstring *serialized = cstr_new_sz(64); + gcs_filter_serialize(f, serialized); + u_assert_true(serialized->len > 0); + + /* Deserialize */ + gcs_filter *f2 = gcs_filter_new(); + struct const_buffer buf = {(const uint8_t *)serialized->str, serialized->len}; + u_assert_true(gcs_filter_deserialize(f2, GCS_BASIC_FILTER_TYPE, blockhash, &buf)); + u_assert_uint32_eq(f2->N, f->N); + u_assert_uint32_eq(f2->encoded->len, f->encoded->len); + u_assert_mem_eq(f2->encoded->str, f->encoded->str, f->encoded->len); + + /* Deserialized filter must still match inserted elements */ + u_assert_true(gcs_filter_match(f2, s0, sizeof(s0))); + u_assert_true(gcs_filter_match(f2, s1, sizeof(s1))); + + gcs_filter_free(f); + gcs_filter_free(f2); + cstr_free(serialized, true); + vector_free(elements, true); +} + +/* ================================================================ */ +/* GCS filter header chaining */ +/* ================================================================ */ + +static void test_gcs_filter_header(void) +{ + uint8_t blockhash[32]; + memset(blockhash, 0, 32); + + gcs_filter *f1 = gcs_filter_new(); + vector_t *e1 = vector_new(1, cstr_free_cb); + vector_add(e1, cstr_new("script_one")); + u_assert_true(gcs_filter_build(f1, GCS_BASIC_FILTER_TYPE, blockhash, e1)); + + uint8_t prev[32], h1[32], h2[32]; + memset(prev, 0, 32); + u_assert_true(gcs_filter_compute_header(f1, prev, h1)); + + /* Second filter chains from h1 */ + gcs_filter *f2 = gcs_filter_new(); + vector_t *e2 = vector_new(1, cstr_free_cb); + vector_add(e2, cstr_new("script_two")); + u_assert_true(gcs_filter_build(f2, GCS_BASIC_FILTER_TYPE, blockhash, e2)); + u_assert_true(gcs_filter_compute_header(f2, h1, h2)); + + /* Headers must differ from each other and from the zero-hash */ + uint8_t zeros[32]; + memset(zeros, 0, 32); + u_assert_mem_not_eq(h1, zeros, 32); + u_assert_mem_not_eq(h2, zeros, 32); + u_assert_mem_not_eq(h1, h2, 32); + + /* Same inputs reproduce the same header */ + uint8_t h1_again[32]; + u_assert_true(gcs_filter_compute_header(f1, prev, h1_again)); + u_assert_mem_eq(h1, h1_again, 32); + + gcs_filter_free(f1); + gcs_filter_free(f2); + vector_free(e1, true); + vector_free(e2, true); +} + +/* ================================================================ */ +/* GCS key derivation */ +/* ================================================================ */ + +static void test_gcs_derive_key(void) +{ + uint8_t blockhash[32]; + uint8_t key[GCS_SIPHASH_KEY_SIZE]; + uint32_t i; + + for (i = 0; i < 32; i++) blockhash[i] = (uint8_t)i; + + gcs_derive_key(blockhash, key); + + /* Key must be the first 16 bytes of the block hash */ + u_assert_mem_eq(key, blockhash, GCS_SIPHASH_KEY_SIZE); +} + +/* ================================================================ */ +/* Public test entry point */ +/* ================================================================ */ + +void test_golomb(void) +{ + test_bitwriter_basic(); + test_bitwriter_write_bits_be(); + test_bitreader_roundtrip(); + test_bitreader_individual_bits(); + test_golomb_rice_roundtrip_p3(); + test_golomb_rice_roundtrip_p19(); + test_golomb_rice_known_encoding(); + test_gcs_filter_empty(); + test_gcs_filter_build_and_match(); + test_gcs_filter_match_any(); + test_gcs_filter_serialize_deser(); + test_gcs_filter_header(); + test_gcs_derive_key(); +} diff --git a/test/spv_tests.c b/test/spv_tests.c index 797e27af2..a5eed15da 100644 --- a/test/spv_tests.c +++ b/test/spv_tests.c @@ -598,6 +598,14 @@ void test_bip37_filter_state() dogecoin_spv_client* client = dogecoin_spv_client_new(&dogecoin_chainparams_main, false, true, false, false, 1, NULL); u_assert_true(client != NULL); + /* BIP37 and BIP157 are mutually exclusive for privacy reasons: a bloom + * filter leaks the watched scripts to peers, which is what compact filters + * avoid. Compact filters are on by default, and filterload fails closed + * while they are, so a BIP37 consumer must opt out explicitly first. */ + u_assert_true(!dogecoin_spv_client_filterload(client, (const uint8_t[]){0xaa}, 1, 1, 0, 0)); + dogecoin_spv_enable_compact_filters(client, false); + u_assert_true(!client->compact_filters_enabled); + uint8_t filter[3] = {0xaa, 0xbb, 0xcc}; u_assert_true(dogecoin_spv_client_filterload(client, filter, sizeof(filter), 2, 123, 1)); u_assert_true(client->bloom_filter != NULL); diff --git a/test/unittester.c b/test/unittester.c index 96dd35fae..2fa72499b 100644 --- a/test/unittester.c +++ b/test/unittester.c @@ -46,6 +46,8 @@ extern void test_bip32(); extern void test_bip39(); extern void test_bip44(); extern void test_block_header(); +extern void test_golomb(); +extern void test_compact_filter(); extern void test_buffer(); extern void test_chacha20(); extern void test_cstr(); @@ -153,6 +155,7 @@ extern void test_reorg(); extern void test_spv(); extern void test_bip37_filter_state(); extern void test_bip37_merkleblock_vector(); +extern void test_cfheadersdb(); #else extern void test_net_flag_not_defined(); #endif @@ -177,6 +180,8 @@ int main() u_run_test(test_bip39); u_run_test(test_bip44); u_run_test(test_block_header); + u_run_test(test_golomb); + u_run_test(test_compact_filter); u_run_test(test_buffer); u_run_test(test_chacha20); u_run_test(test_cstr); @@ -290,6 +295,7 @@ int main() u_run_test(test_spv); u_run_test(test_bip37_filter_state); u_run_test(test_bip37_merkleblock_vector); + u_run_test(test_cfheadersdb); #else u_run_test(test_net_flag_not_defined); #endif