From 10d9014e35dcd99a3fab7354d6220db2996669c7 Mon Sep 17 00:00:00 2001 From: deadmanoz <62584182+deadmanoz@users.noreply.github.com> Date: Mon, 21 Sep 2026 16:07:51 +0800 Subject: [PATCH] feat(dataset): admit P2SH failures from proof files, starting with 173886, 174772 and 189498 A record without a body may carry proofs/{height}-{hash}.json: the failing transaction and the block's complete ordered txids. The list must reproduce the header's merkle root and contain the transaction, which binds it to the header; the input is then checked exactly as for a body. The txid-list authentication is shared with the parent-reuse rule. --- .github/workflows/sanitycheck.yml | 2 +- README.md | 3 +- ci/block_evidence.py | 30 +- ci/prevouts.py | 22 +- ci/sanity-check.py | 48 +- ci/test_sanity_check.py | 71 ++- data/invalid-blocks.jsonl | 3 + docs/notes.md | 4 +- docs/schema.md | 11 +- ...dafa40f94d2462c1381dcf6e84f6a53920bc1.json | 82 +++ ...a301faa24aabd48a5d274a5cee54d21dee7b8.json | 12 + ...03e8cd41f42654c39db44e254187f7aa750b5.json | 563 ++++++++++++++++++ 12 files changed, 790 insertions(+), 61 deletions(-) create mode 100644 proofs/173886-000000000000053ff5459413d05dafa40f94d2462c1381dcf6e84f6a53920bc1.json create mode 100644 proofs/174772-00000000000004f3cf5af3ded18a301faa24aabd48a5d274a5cee54d21dee7b8.json create mode 100644 proofs/189498-00000000000001d38cbefa7b86e03e8cd41f42654c39db44e254187f7aa750b5.json diff --git a/.github/workflows/sanitycheck.yml b/.github/workflows/sanitycheck.yml index 4992346..417cbf0 100644 --- a/.github/workflows/sanitycheck.yml +++ b/.github/workflows/sanitycheck.yml @@ -27,7 +27,7 @@ jobs: uses: actions/cache/restore@v6 with: path: .cache/prevouts - key: prevouts-v2-${{ hashFiles('blocks/*.bin') }} + key: prevouts-v2-${{ hashFiles('blocks/*.bin', 'proofs/*.json') }} restore-keys: prevouts-v2- - name: validate data and test validator run: | diff --git a/README.md b/README.md index 98de8bb..ea53289 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ This dataset covers blocks that fail those rules, including failures that can be - [`docs/schema.md`](docs/schema.md): fields and admission rules. - [`docs/notes.md`](docs/notes.md): replay behaviour and incident notes. - `blocks/{height}-{hash}.bin`: full block, when available. +- `proofs/{height}-{hash}.json`: for a P2SH record without a body, the failing transaction and the block's ordered transaction IDs. Merge-mined recoveries generally provide a header and coinbase rather than a full Bitcoin block. @@ -32,7 +33,7 @@ Use `merge_mining` for child-chain commitments, `p2p` for direct Bitcoin network Prefer immutable evidence URLs. For header rules, observations and full block files are optional. -Body failures require a complete `.bin` that demonstrates the named failure. +Body failures require a complete `.bin` that demonstrates the named failure; a P2SH failure may instead supply a proof file whose transaction IDs reproduce the header's merkle root. For sigops, CI fetches the referenced previous transactions from public APIs, verifies their transaction IDs, and calculates the cost using their output scripts. For `already_confirmed_in_parent`, CI checks that a named non-coinbase transaction also appears in the canonical parent, using a txid list authenticated against the parent's header merkle root. The [schema](docs/schema.md#evidence-enforced-by-ci) specifies each rule's evidence contract; observation labels cannot substitute for these checks. diff --git a/ci/block_evidence.py b/ci/block_evidence.py index 556404e..5a2ca4b 100644 --- a/ci/block_evidence.py +++ b/ci/block_evidence.py @@ -15,9 +15,11 @@ """ from collections.abc import Mapping, Sequence +import json +import re from typing import TypeVar -from bitcoin.core import COIN, CBlock, CoreMainParams, CTransaction, Hash as sha256d, MoneyRange, ValidationError, b2lx, lx +from bitcoin.core import COIN, CBlock, CBlockHeader, CoreMainParams, CTransaction, Hash as sha256d, MoneyRange, ValidationError, b2lx, lx from bitcoin.core.scripteval import SCRIPT_VERIFY_P2SH, VerifyScript, VerifySignature from bitcoin.core.script import ( CScript, CScriptInvalidError, CScriptOp, OP_1, OP_16, @@ -27,6 +29,7 @@ T = TypeVar("T", CBlock, CTransaction) +HEX64 = re.compile(r"[0-9a-fA-F]{64}") MAX_MONEY = CoreMainParams.MAX_MONEY MAX_BLOCK_SIGOPS_COST = 80_000 @@ -117,6 +120,31 @@ def reuses_parent_transaction(block: CBlock, parent_txids: Sequence[str], txid: and any(not tx.is_coinbase() and tx.GetTxid() == target for tx in block.vtx[1:])) +def checked_txids(txids: object, header: CBlockHeader) -> list[str]: + """Require a nonempty list of distinct 64-hex txids whose merkle root is the header's.""" + if not isinstance(txids, list) or not txids or any( + not isinstance(txid, str) or not HEX64.fullmatch(txid) for txid in txids): + raise ValueError("txid list must be a nonempty array of 64-hex strings") + txids = [txid.lower() for txid in txids] + # Repeated leaves can preserve a merkle root under Bitcoin's odd-leaf padding. + if len(set(txids)) != len(txids): + raise ValueError("duplicate transaction IDs in txid list") + if CBlock.build_merkle_tree_from_txids([lx(txid) for txid in txids])[-1] != header.hashMerkleRoot: + raise ValueError("txid list merkle root mismatch") + return txids + + +def read_proof(data: bytes, header: CBlockHeader) -> CTransaction: + """Read a transaction and the ordered txid list that places it in the header's block.""" + proof = json.loads(data) + if not isinstance(proof, dict) or set(proof) != {"transaction", "txids"}: + raise ValueError("proof must be an object with transaction and txids") + tx = read_transaction(bytes.fromhex(proof["transaction"])) + if b2lx(tx.GetTxid()) not in checked_txids(proof["txids"], header): + raise ValueError("proof transaction is not in the block's txid list") + return tx + + def spending_input(transactions: Sequence[CTransaction], txid: bytes, vout: int) -> tuple[CTransaction, int]: """Return the one non-coinbase input among these transactions that spends the outpoint.""" spends = [(tx, index) for tx in transactions if not tx.is_coinbase() diff --git a/ci/prevouts.py b/ci/prevouts.py index 3e9dc63..b2214bc 100644 --- a/ci/prevouts.py +++ b/ci/prevouts.py @@ -15,19 +15,17 @@ from http.client import HTTPException, IncompleteRead import json from pathlib import Path -import re import time import tempfile from typing import TypeVar from urllib.request import Request, urlopen -from bitcoin.core import CBlock, CBlockHeader, CTransaction, b2lx, lx +from bitcoin.core import CBlockHeader, CTransaction, b2lx, lx -from block_evidence import omitted_prevouts, read_transaction +from block_evidence import HEX64, checked_txids, omitted_prevouts, read_transaction DEFAULT_APIS = ("https://mempool.space/api", "https://blockstream.info/api") PREVOUTS_DIR = Path(".cache/prevouts") -BLOCK_HASH = re.compile(r"[0-9a-fA-F]{64}") PARENT_TXIDS_LIMIT = 2 * 1024 * 1024 T = TypeVar("T") @@ -145,7 +143,7 @@ def decode_confirmation(data: bytes, txid: str) -> tuple[int, str]: if not isinstance(payload, dict) or payload.get("confirmed") is not True: raise ValueError(f"parent transaction {txid} is not confirmed") height, block_hash = payload.get("block_height"), payload.get("block_hash") - if type(height) is not int or height < 0 or not isinstance(block_hash, str) or not BLOCK_HASH.fullmatch(block_hash): + if type(height) is not int or height < 0 or not isinstance(block_hash, str) or not HEX64.fullmatch(block_hash): raise ValueError(f"malformed confirmation: {txid}") return height, block_hash.lower() @@ -165,7 +163,7 @@ def _ascii_text(data: bytes) -> str: def decode_block_hash(data: bytes, height: int) -> str: """Read a block-height reply as a lowercase block hash.""" text = _ascii_text(data) - if not BLOCK_HASH.fullmatch(text): + if not HEX64.fullmatch(text): raise ValueError(f"malformed block hash for height {height}") return text.lower() @@ -195,17 +193,7 @@ def decode_parent_txids(data: bytes, header: CBlockHeader) -> list[str]: """Authenticate a complete, ordered txid list against the parent merkle root.""" if len(data) > PARENT_TXIDS_LIMIT: raise ValueError("oversized parent txid list") - txids = json.loads(data) - if not isinstance(txids, list) or not txids or any( - not isinstance(txid, str) or not BLOCK_HASH.fullmatch(txid) for txid in txids): - raise ValueError("parent txid list must be a nonempty array of 64-hex strings") - txids = [txid.lower() for txid in txids] - # Repeated leaves can preserve a merkle root under Bitcoin's odd-leaf padding. - if len(set(txids)) != len(txids): - raise ValueError("duplicate transaction IDs in parent evidence") - if CBlock.build_merkle_tree_from_txids([lx(txid) for txid in txids])[-1] != header.hashMerkleRoot: - raise ValueError("parent transaction merkle root mismatch") - return txids + return checked_txids(json.loads(data), header) def load_parent_txids(block_hash: str, cache_dir: Path | str = PREVOUTS_DIR, fetch: bool = False, diff --git a/ci/sanity-check.py b/ci/sanity-check.py index ea53b7e..71aa1f0 100644 --- a/ci/sanity-check.py +++ b/ci/sanity-check.py @@ -16,7 +16,7 @@ from typing import Any from urllib.parse import urlparse -from bitcoin.core import CBlock, CBlockHeader, b2lx, lx +from bitcoin.core import CBlock, CBlockHeader, CTransaction, b2lx, lx from bitcoin.core._bignum import vch2bn from bitcoin.core.script import CScript, CScriptInvalidError, OP_1NEGATE from bitcoin.core.serialize import uint256_from_compact @@ -24,7 +24,7 @@ from block_evidence import ( MAX_BLOCK_SIGOPS_COST, coinbase_amounts, confirmed_at_or_after, establishes_rule, omitted_prevouts, p2sh_spend_fails, spending_input, - read_block, reuses_parent_transaction, sigop_cost, verify_witness_commitment, + read_block, read_proof, reuses_parent_transaction, sigop_cost, verify_witness_commitment, ) from prevouts import ( DEFAULT_APIS, PREVOUTS_DIR, load_canonical_hash, load_confirmation, load_parent_txids, load_previous, load_transaction, @@ -32,6 +32,7 @@ DATA_PATH = Path("data/invalid-blocks.jsonl") BLOCKS_DIR = Path("blocks") +PROOFS_DIR = Path("proofs") REQUIRED = {"height", "hash", "header", "prev_hash", "nTime", "core_reject_reason", "rule"} CONTEXT_FIELDS = { "expected_nbits", "parent_mtp", "coinbase_height", "coinbase_scriptsig_hex", @@ -51,8 +52,8 @@ # sigops = body plus previous transactions; missing_parent = body plus API # evidence for the recorded outpoint; parent_txid_reuse = body plus an # authenticated canonical parent txid list; cb_amount = body plus canonical -# parent and fee prevouts; p2sh = body plus the spent output of the named -# input. Rule names and reject strings must +# parent and fee prevouts; p2sh = body or proof file plus the spent output of +# the named input. Rule names and reject strings must # match docs/schema.md. RULES = { "bad-txns-vout-toolarge": ("bad-txns-vout-toolarge", (), "body"), @@ -311,12 +312,15 @@ def require_canonical_parent(record: dict[str, Any], prevouts_dir: Path | str, f def check_failure_evidence(record: dict[str, Any], block: CBlock | None, prevouts_dir: Path | str = PREVOUTS_DIR, - fetch_prevouts: bool = False, apis: Sequence[str] = DEFAULT_APIS) -> None: + fetch_prevouts: bool = False, apis: Sequence[str] = DEFAULT_APIS, + proof: CTransaction | None = None) -> None: """Require a checked failure; observations cannot substitute for bytes.""" mode = RULES[record["rule"]][2] + if proof is not None and mode != "p2sh": + raise ValueError("proof files apply only to the P2SH rule") if mode == "local": return - if block is None: + if block is None and proof is None: raise ValueError(f"{record['rule']} requires a complete block body") if mode == "body" and not establishes_rule(block, record["rule"]): raise ValueError(f"committed body does not demonstrate {record['rule']}") @@ -336,7 +340,8 @@ def check_failure_evidence(record: dict[str, Any], block: CBlock | None, prevout f"fees {amounts['fees']}, excess {amounts['excess']} sat", flush=True) if mode == "p2sh": txid, vout = record["context"]["failing_prevout"].split(":") - tx, index = spending_input(block.vtx, lx(txid), int(vout)) + transactions = block.vtx if block is not None else [proof] + tx, index = spending_input(transactions, lx(txid), int(vout)) if not p2sh_spend_fails(tx, index, load_transaction(txid, prevouts_dir, fetch_prevouts, apis)): raise ValueError("named input does not fail P2SH evaluation") if mode == "missing_parent": @@ -368,11 +373,13 @@ def check_failure_evidence(record: dict[str, Any], block: CBlock | None, prevout def check_dataset(path: Path | str = DATA_PATH, blocks_dir: Path | str = BLOCKS_DIR, prevouts_dir: Path | str = PREVOUTS_DIR, fetch_prevouts: bool = False, - apis: Sequence[str] = DEFAULT_APIS) -> tuple[list[str], tuple[int, int, int, int]]: + apis: Sequence[str] = DEFAULT_APIS, + proofs_dir: Path | str = PROOFS_DIR) -> tuple[list[str], tuple[int, int, int, int, int]]: problems = [] seen = set() - remaining_blocks = {block.name: block for block in Path(blocks_dir).glob("*.bin")} - block_count = 0 + remaining = {"block": {path.name: path for path in Path(blocks_dir).glob("*.bin")}, + "proof": {path.name: path for path in Path(proofs_dir).glob("*.json")}} + found = {kind: len(paths) for kind, paths in remaining.items()} last_key = None observation_count = 0 context_count = 0 @@ -393,8 +400,8 @@ def check_dataset(path: Path | str = DATA_PATH, blocks_dir: Path | str = BLOCKS_ if record["core_reject_reason"] != RULES[rule][0]: raise ValueError(f"rule {rule} requires core_reject_reason={RULES[rule][0]}") block_hash = record["hash"] - block = remaining_blocks.pop(f"{height}-{block_hash}.bin", None) - block_count += block is not None + block = remaining["block"].pop(f"{height}-{block_hash}.bin", None) + proof = remaining["proof"].pop(f"{height}-{block_hash}.json", None) key = (height, block_hash) if last_key is not None and key < last_key: raise ValueError("records must be ordered by height then hash") @@ -429,12 +436,19 @@ def check_dataset(path: Path | str = DATA_PATH, blocks_dir: Path | str = BLOCKS_ if "coinbase_scriptsig_hex" in details: if evidence_block.vtx[0].vin[0].scriptSig.hex() != details["coinbase_scriptsig_hex"]: raise ValueError("coinbase scriptSig does not match context") - check_failure_evidence(record, evidence_block, prevouts_dir, fetch_prevouts, apis) + proof_transaction = None + if proof is not None: + if block is not None: + raise ValueError("a record has either a block body or a proof file, not both") + proof_transaction = read_proof(proof.read_bytes(), parsed_header) + check_failure_evidence(record, evidence_block, prevouts_dir, fetch_prevouts, apis, proof_transaction) except (OSError, ValueError) as exc: problems.append(f"{where}: {exc}") - for block in sorted(remaining_blocks.values()): - problems.append(f"{block}: orphan block file; name must match a dataset record") - return problems, (len(seen), context_count, observation_count, block_count) + for kind, paths in remaining.items(): + for path in sorted(paths.values()): + problems.append(f"{path}: orphan {kind} file; name must match a dataset record") + return problems, (len(seen), context_count, observation_count, + found["block"] - len(remaining["block"]), found["proof"] - len(remaining["proof"])) def main() -> int: @@ -451,7 +465,7 @@ def main() -> int: print("\n".join(problems)) return 1 print("sanity-check successful") - print(f" {counts[0]} blocks, {counts[1]} contexts, {counts[2]} observations, {counts[3]} block files") + print(f" {counts[0]} blocks, {counts[1]} contexts, {counts[2]} observations, {counts[3]} block files, {counts[4]} proof files") return 0 diff --git a/ci/test_sanity_check.py b/ci/test_sanity_check.py index f809421..79b6ca5 100644 --- a/ci/test_sanity_check.py +++ b/ci/test_sanity_check.py @@ -10,6 +10,8 @@ from bitcoin.core import CBlock, CBlockHeader +from test_block_evidence import P2SH_FUNDING + SPEC = importlib.util.spec_from_file_location("sanity_check", Path(__file__).with_name("sanity-check.py")) CHECK = importlib.util.module_from_spec(SPEC) SPEC.loader.exec_module(CHECK) @@ -28,18 +30,22 @@ def setUp(self): def for_rule(self, rule): return copy.deepcopy(next(r for r in self.records if r["rule"] == rule)) - def copy_body(self, record): - blocks = self.root / "blocks" - blocks.mkdir(exist_ok=True) - name = f"{record['height']}-{record['hash']}.bin" - path = blocks / name - path.write_bytes((CHECK.BLOCKS_DIR / name).read_bytes()) - return path + def for_height(self, height): + return copy.deepcopy(next(r for r in self.records if r["height"] == height)) + + def copy_evidence(self, record, kind="block"): + """Copy the record's body (.bin under blocks) or proof (.json under proofs) into the temp tree.""" + source, folder, suffix = {"block": (CHECK.BLOCKS_DIR, "blocks", ".bin"), "proof": (CHECK.PROOFS_DIR, "proofs", ".json")}[kind] + target = self.root / folder + target.mkdir(exist_ok=True) + name = f"{record['height']}-{record['hash']}{suffix}" + (target / name).write_bytes((source / name).read_bytes()) + return target / name def validate(self, records=None, prevouts_dir=CHECK.PREVOUTS_DIR): path = self.root / "data.jsonl" path.write_text("".join(json.dumps(record) + "\n" for record in (records or [self.record]))) - return CHECK.check_dataset(path, self.root / "blocks", prevouts_dir)[0] + return CHECK.check_dataset(path, self.root / "blocks", prevouts_dir, proofs_dir=self.root / "proofs")[0] def test_documented_sigops_breakdowns(self): """Reproduce both F2Pool blocks' documented legacy, P2SH and witness costs.""" @@ -50,7 +56,7 @@ def test_documented_sigops_breakdowns(self): 784121: {"legacy": 72204, "p2sh": 908, "witness": 6891, "total": 80003}, } for height, costs in expected.items(): - record = next(r for r in self.records if r["height"] == height) + record = self.for_height(height) path = CHECK.BLOCKS_DIR / f"{height}-{record['hash']}.bin" block = CHECK.read_block(path.read_bytes()) previous = CHECK.load_previous(block.vtx) @@ -118,18 +124,18 @@ def test_coinbase_overpayment_evidence(self): """Prove 584802 with no previous transactions, then both overpayments from the cached fee evidence.""" records = {r["height"]: copy.deepcopy(r) for r in self.records if r["rule"] == "bad-cb-amount"} self.record = records[584802] - self.copy_body(self.record) + self.copy_evidence(self.record) cache = self.root / "empty-cache" with patch.object(CHECK, "load_canonical_hash", return_value=self.record["prev_hash"]), \ patch("prevouts.urlopen", side_effect=AssertionError("unnecessary download")): self.assertEqual(self.validate(prevouts_dir=cache), []) - self.copy_body(records[197438]) + self.copy_evidence(records[197438]) self.assertEqual(self.validate([records[197438], self.record]), []) def test_sigops_requires_previous_transactions(self): """A complete sigops block still fails admission when previous transactions are missing.""" self.record = self.for_rule("bad-blk-sigops") - self.copy_body(self.record) + self.copy_evidence(self.record) path = self.root / "sigops.jsonl" path.write_text(json.dumps(self.record) + "\n") problems, _ = CHECK.check_dataset(path, self.root / "blocks", self.root / "empty-cache") @@ -138,7 +144,7 @@ def test_sigops_requires_previous_transactions(self): def test_missing_parent_requires_recorded_outpoint_and_cached_evidence(self): """The body must spend the recorded outpoint, the previous block must be canonical, and evidence must be cached.""" self.record = self.for_rule("missing_unconfirmed_parent") - self.copy_body(self.record) + self.copy_evidence(self.record) cache = self.root / "cache" cache.mkdir() canonical = cache / f"height-{self.record['height'] - 1}.hash" @@ -174,7 +180,7 @@ def test_sigops_limit_and_supported_activation(self): def test_body_witness_mutation_is_detected_before_sigop_counting(self): """Changed witness bytes must fail commitment checks before prevout acquisition.""" self.record = self.for_rule("bad-blk-sigops") - path = self.copy_body(self.record) + path = self.copy_evidence(self.record) original = path.read_bytes() block = CHECK.read_block(original) item = next(item for tx in block.vtx[1:] for txinwit in tx.wit.vtxinwit for item in txinwit.scriptWitness.stack if len(item) > 40) @@ -198,7 +204,7 @@ def test_body_evidence_is_required(self): def test_parent_reuse_requires_canonical_parent_and_matching_witness(self): """Reject disjoint evidence, noncanonical parents, malformed witnesses and missing cache.""" self.record = self.for_rule("already_confirmed_in_parent") - self.copy_body(self.record) + self.copy_evidence(self.record) parent = self.record["prev_hash"] witness = self.record["context"]["parent_txid"] cases = ( @@ -221,8 +227,8 @@ def test_parent_reuse_requires_canonical_parent_and_matching_witness(self): def test_p2sh_failure_requires_named_spend_after_activation(self): """Admit a P2SH body from cached evidence; reject an unspent outpoint, a pre-BIP16 time and a missing cache.""" - self.record = self.for_rule("p2sh_redeem_script_failure") - self.copy_body(self.record) + self.record = self.for_height(173928) + self.copy_evidence(self.record) self.assertEqual(self.validate(), []) with self.subTest(case="outpoint not spent"), patch.dict(self.record["context"], {"failing_prevout": "00" * 32 + ":0"}): self.assertTrue(any("exactly one input" in p for p in self.validate())) @@ -231,10 +237,31 @@ def test_p2sh_failure_requires_named_spend_after_activation(self): with self.subTest(case="missing cache"): self.assertTrue(any("missing cached" in p for p in self.validate(prevouts_dir=self.root / "empty"))) + def test_p2sh_proof_stands_in_for_a_missing_body(self): + """Admit a proof-only P2SH record, and reject a proof beside a body, a foreign transaction and a wrong list.""" + self.record = self.for_height(173886) + path = self.copy_evidence(self.record, "proof") + proof = json.loads(path.read_text()) + self.assertEqual(self.validate(), []) + cases = ( + ("foreign transaction", dict(proof, transaction=P2SH_FUNDING.hex()), "not in the block's txid list"), + ("wrong list", dict(proof, txids=proof["txids"][::-1]), "merkle root mismatch"), + ) + for case, content, error in cases: + with self.subTest(case=case): + path.write_text(json.dumps(content)) + self.assertTrue(any(error in p for p in self.validate())) + path.write_text(json.dumps(proof)) + with self.subTest(case="proof beside body"): + body = self.for_height(173928) + self.copy_evidence(body) + (self.root / "proofs" / f"{body['height']}-{body['hash']}.json").write_text(json.dumps(proof)) + self.assertTrue(any("not both" in p for p in self.validate([self.record, body]))) + def test_body_matches_claimed_evidence(self): """Bind the named failure and supplied coinbase scriptSig to the available body.""" self.record = self.for_rule("bad-txns-vout-toolarge") - self.copy_body(self.record) + self.copy_evidence(self.record) cases = ( ("wrong failure", {"rule": "bad-txns-inputs-missingorspent", "core_reject_reason": "bad-txns-inputs-missingorspent"}, "does not demonstrate"), @@ -247,7 +274,7 @@ def test_body_matches_claimed_evidence(self): def test_body_parse_error_is_reported(self): """Propagate a parser error without also claiming that the available body is absent.""" self.record = self.for_rule("bad-txns-vout-toolarge") - path = self.copy_body(self.record) + path = self.copy_evidence(self.record) path.write_bytes(path.read_bytes()[:-1]) problems = self.validate() self.assertTrue(any("truncated" in p for p in problems)) @@ -322,12 +349,16 @@ def test_invalid_targets(self): self.assertEqual(CHECK.target_from_bits(0x03012345), 0x012345) def test_orphan_and_mismatched_block_files(self): - """Reject binaries without a dataset record or without its matching 80-byte header.""" + """Reject evidence files without a dataset record, and a body without its matching 80-byte header.""" blocks = self.root / "blocks" blocks.mkdir() (blocks / "unknown.bin").write_bytes(b"bad") self.assertTrue(any("orphan block file" in p for p in self.validate())) (blocks / "unknown.bin").unlink() + (self.root / "proofs").mkdir() + (self.root / "proofs" / "unknown.json").write_text("{}") + self.assertTrue(any("orphan proof file" in p for p in self.validate())) + (self.root / "proofs" / "unknown.json").unlink() (blocks / f"{self.record['height']}-{self.record['hash']}.bin").write_bytes(b"bad") self.assertTrue(any("first 80 bytes" in p for p in self.validate())) diff --git a/data/invalid-blocks.jsonl b/data/invalid-blocks.jsonl index cf48879..d0f54e2 100644 --- a/data/invalid-blocks.jsonl +++ b/data/invalid-blocks.jsonl @@ -1,8 +1,11 @@ {"height":74638,"hash":"0000000000790ab3f22ec756ad43b6ab569abf0bddeb97c67a6f7b1470a7ec1c","header":"01000000846e2b968653ef0a25a92c12e8884d76919907df8e3079e665686000000000005eecb6808d6de56a05211483d86fc6c7d17cda46c3388dd0c8139e4114ba8e61751e684c0e80001ccf2fae01","prev_hash":"0000000000606865e679308edf079991764d88e8122ca9250aef5386962b6e84","nTime":1281891957,"core_reject_reason":"bad-txns-vout-toolarge","rule":"bad-txns-vout-toolarge","context":{"coinbase_scriptsig_hex":"040e80001c028f00","parent_kind":"canonical"},"observations":[{"channel":"p2p","source":"stale-blocks","provenance":"https://github.com/bitcoin-data/stale-blocks/pull/65"}]} +{"height":173886,"hash":"000000000000053ff5459413d05dafa40f94d2462c1381dcf6e84f6a53920bc1","header":"01000000e95dc9c6fea8585a15c52b25b4b4c49e19641271d218d9f773010000000000009512b1572afe8c93df0a0ef6cf328033bbd3ea58fc10fd7381013c26a7f1e5b5246d784f7e500a1a012ae4ae","prev_hash":"0000000000000173f7d918d2711264199ec4b4b4252bc5155a58a8fec6c95de9","nTime":1333292324,"core_reject_reason":"block-script-verify-flag-failed","rule":"p2sh_redeem_script_failure","context":{"parent_kind":"canonical","failing_prevout":"b0539a45de13b3e0403909b8bd1a555b8cbe45fd4e3f3fda76f3a5f52835c29d:1"},"observations":[{"channel":"scrape","source":"blockchain.com","provenance":"https://web.archive.org/web/20120409062143id_/http://blockchain.info:80/block-index/202021"},{"channel":"scrape","source":"bitcoin-dev IRC","provenance":"https://buildingbitcoin.org/bitcoin-dev/log-2012-04-07.html"}]} {"height":173928,"hash":"000000000000023df73ac98923e2de321db3e3396102ad5dcfe3b25f01a81f64","header":"010000007c9c506afb390a2d2388588c790447f6d1065fa3e720bd56a106000000000000ed2ee7a93da92de85c3c433dce5be44ef368a7eaa2075adba237e7437226a44f35bd784f7e500a1a8a365d00","prev_hash":"00000000000006a156bd20e7a35f06d1f64704798c5888232d0a39fb6a509c7c","nTime":1333312821,"core_reject_reason":"block-script-verify-flag-failed","rule":"p2sh_redeem_script_failure","context":{"coinbase_scriptsig_hex":"1265636f406f7a636f2e696e202f503253482f0435bd784f0288142cfabe6d6d79789d63ff5b8fa4544dc0fb62998383ec1d79146b9ec89bb79c2aef3a3af2ba0100000000000000","pool":"OzCoin","pool_basis":"tag","parent_kind":"canonical","failing_prevout":"b0539a45de13b3e0403909b8bd1a555b8cbe45fd4e3f3fda76f3a5f52835c29d:1"},"observations":[{"channel":"merge_mining","source":"merge-mining-research","provenance":"https://github.com/deadmanoz/merge-mining-research/blob/629039bc8023bdaaafd9470e29051f9acc43973c/data/child-identity/namecoin_child_identity.csv#L163","child_chain":"namecoin","child_height":49691,"child_block_hash":"79789d63ff5b8fa4544dc0fb62998383ec1d79146b9ec89bb79c2aef3a3af2ba","child_block_time":1333312853},{"channel":"scrape","source":"blockchain.com","provenance":"https://web.archive.org/web/20120409062117id_/http://blockchain.info:80/block-index/202136"}]} {"height":173957,"hash":"00000000000001bd778cffee5b5bae4c7b8d56a9aca955a04c60856b31b11155","header":"01000000da8dd3abd3104cf7b86cc7c85dfe0449e728a2a6ab6812a9a9060000000000002fc67cab928ab7767a7f19d10d33a96057031f562049d94c98c510a46db36ab0900d794f7e500a1a01f61748","prev_hash":"00000000000006a9a91268aba6a228e74904fe5dc8c76cb8f74c10d3abd38dda","nTime":1333333392,"core_reject_reason":"block-script-verify-flag-failed","rule":"p2sh_redeem_script_failure","context":{"coinbase_scriptsig_hex":"1265636f406f7a636f2e696e202f503253482f04900d794f02e2012cfabe6d6d4010fa4be6e64892c469796f0b9a26c7cb2602d58fdc6cd22e545b93189e27da0100000000000000","pool":"OzCoin","pool_basis":"tag","parent_kind":"canonical","failing_prevout":"b0539a45de13b3e0403909b8bd1a555b8cbe45fd4e3f3fda76f3a5f52835c29d:1"},"observations":[{"channel":"merge_mining","source":"merge-mining-research","provenance":"https://github.com/deadmanoz/merge-mining-research/blob/629039bc8023bdaaafd9470e29051f9acc43973c/data/child-identity/namecoin_child_identity.csv#L164","child_chain":"namecoin","child_height":49718,"child_block_hash":"4010fa4be6e64892c469796f0b9a26c7cb2602d58fdc6cd22e545b93189e27da","child_block_time":1333332848},{"channel":"scrape","source":"blockchain.com","provenance":"https://web.archive.org/web/20120409062147id_/http://blockchain.info:80/block-index/202222"}]} {"height":173998,"hash":"00000000000003bf4a1e491c802eeec3f1fbf3c2c7299e7935c2b0f33b189651","header":"010000005e2ffb38eb012a6a3db86b26a9860aa796c49f269a290b09ce06000000000000437b7ec39f4bc8d2de5046215007a7cd8643d76f7f5c5cda8ba4ca7886ededf5c785794f7e500a1a3ee1de47","prev_hash":"00000000000006ce090b299a269fc496a70a86a9266bb83d6a2a01eb38fb2f5e","nTime":1333364167,"core_reject_reason":"block-script-verify-flag-failed","rule":"p2sh_redeem_script_failure","context":{"coinbase_scriptsig_hex":"70736a047e500a1a048e073a00522cfabe6d6dfaf5f62042f9e4bc45be832f5de3c8ba251b1fb5731f997bb0826857b1b4066701000000000000006e6d636269742e636f6dac1eeeed88","pool":"NMCbit","pool_basis":"tag","parent_kind":"canonical","failing_prevout":"b0539a45de13b3e0403909b8bd1a555b8cbe45fd4e3f3fda76f3a5f52835c29d:1"},"observations":[{"channel":"merge_mining","source":"merge-mining-research","provenance":"https://github.com/deadmanoz/merge-mining-research/blob/629039bc8023bdaaafd9470e29051f9acc43973c/data/child-identity/namecoin_child_identity.csv#L166","child_chain":"namecoin","child_height":49773,"child_block_hash":"faf5f62042f9e4bc45be832f5de3c8ba251b1fb5731f997bb0826857b1b40667","child_block_time":1333364075},{"channel":"scrape","source":"blockchain.com","provenance":"https://web.archive.org/web/20120409062156id_/http://blockchain.info:80/block-index/202359"}]} {"height":174605,"hash":"000000000000068294db0526cb4a5520d21b9d4f271a34012e96784b3b3168c5","header":"010000008a5b519c7220e14a365bf1aa213d76ffd86026d72bf9e2a016000000000000006523afe67fa541a46218b5dc53cd1630c61ddcb197e4202b15a342e7ec79c9fe28bb7f4f7e500a1a9e93b2f5","prev_hash":"0000000000000016a0e2f92bd72660d8ff763d21aaf15b364ae120729c515b8a","nTime":1333771048,"core_reject_reason":"block-script-verify-flag-failed","rule":"p2sh_redeem_script_failure","context":{"coinbase_scriptsig_hex":"047e500a1a0177522cfabe6d6d591bc1f842bb323ad07c7d38c984b5a2da9422dcf907fbc6fca2a51e3e3c196e0100000000000000","parent_kind":"canonical","failing_prevout":"b0539a45de13b3e0403909b8bd1a555b8cbe45fd4e3f3fda76f3a5f52835c29d:1"},"observations":[{"channel":"merge_mining","source":"merge-mining-research","provenance":"https://github.com/deadmanoz/merge-mining-research/blob/629039bc8023bdaaafd9470e29051f9acc43973c/data/child-identity/namecoin_child_identity.csv#L172","child_chain":"namecoin","child_height":50516,"child_block_hash":"591bc1f842bb323ad07c7d38c984b5a2da9422dcf907fbc6fca2a51e3e3c196e","child_block_time":1333770799},{"channel":"scrape","source":"blockchain.com","provenance":"https://web.archive.org/web/20120409062031id_/http://blockchain.info:80/block-index/204692"}]} +{"height":174772,"hash":"00000000000004f3cf5af3ded18a301faa24aabd48a5d274a5cee54d21dee7b8","header":"0100000054415896f0b34d0e0e120955fbc7320c3389fcf3414360ed3e0400000000000033b6ecbca487b637f720b9e7e1db8218491a92f20aec5a8ba99a9b87a0f8e78fae62814f7e500a1a03a8455b","prev_hash":"000000000000043eed604341f3fc89330c32c7fb5509120e0e4db3f096584154","nTime":1333879470,"core_reject_reason":"block-script-verify-flag-failed","rule":"p2sh_redeem_script_failure","context":{"parent_kind":"canonical","failing_prevout":"b0539a45de13b3e0403909b8bd1a555b8cbe45fd4e3f3fda76f3a5f52835c29d:1"},"observations":[{"channel":"scrape","source":"decker-wattenhofer","provenance":"https://github.com/NStifter/mergedmonitor/blob/54344d4e355f73eb94bef8d391e8fb6e4a9323a6/fork-analysis/decker-wattenhofer/orphans.tar.bz2"},{"channel":"scrape","source":"bitcoin-dev IRC","provenance":"https://buildingbitcoin.org/bitcoin-dev/log-2012-11-28.html"}]} +{"height":189498,"hash":"00000000000001d38cbefa7b86e03e8cd41f42654c39db44e254187f7aa750b5","header":"0100000005f00556cd1a3cb6f912d2e787c1674be7e0f6925ffd92241f080000000000001fc461174faabd7ceb0bf64ccaef1db01b587438f57dc5090212c1485c775615bf7505503194091a0b92266b","prev_hash":"000000000000081f2492fd5f92f6e0e74b67c187e7d212f9b63c1acd5605f005","nTime":1342535103,"core_reject_reason":"block-script-verify-flag-failed","rule":"p2sh_redeem_script_failure","context":{"parent_kind":"canonical","failing_prevout":"b0539a45de13b3e0403909b8bd1a555b8cbe45fd4e3f3fda76f3a5f52835c29d:1"},"observations":[{"channel":"scrape","source":"decker-wattenhofer","provenance":"https://github.com/NStifter/mergedmonitor/blob/54344d4e355f73eb94bef8d391e8fb6e4a9323a6/fork-analysis/decker-wattenhofer/orphans.tar.bz2"},{"channel":"scrape","source":"bitcoin-dev IRC","provenance":"https://buildingbitcoin.org/bitcoin-dev/log-2012-07-17.html"}]} {"height":197438,"hash":"0000000000000307872ec2eb0eae2dca3ed9ce6af9e024412cb3ddfe8afd12a7","header":"02000000c4565285b10dce8c4b548fcf984b97c3a6aaaa686ade85b38c000000000000008cd835ddcd03bbd91c9c7d15b9d288b8cefb46c468b5d5594497d1715a737f77ebed4750bedf061ab3da1706","prev_hash":"000000000000008cb385de6a68aaaaa6c3974b98cf8f544b8cce0db1855256c4","nTime":1346891243,"core_reject_reason":"bad-cb-amount","rule":"bad-cb-amount","context":{"coinbase_scriptsig_hex":"033e03030f00456c6967697573005047ec540fc0fabe6d6d8b42ab39f683f027da81c497c9c38f29dd341a00df5e553f995fd846c3cd0a9a0800000000000000002f503253482f00","pool":"Eligius","pool_basis":"tag","parent_kind":"canonical"},"observations":[{"channel":"merge_mining","source":"merge-mining-research","provenance":"https://github.com/deadmanoz/merge-mining-research/blob/629039bc8023bdaaafd9470e29051f9acc43973c/data/validated-stales/ixcoin_validated_stales.csv#L50","child_chain":"ixcoin","child_height":91289,"child_block_hash":"77e32d1f06bb050248ecf3997f4a5d5246a66ef19176813f9c00a22afe5c17d3","child_block_time":1346890246,"child_header":"01010300f1d378600b2cb98d501284c612959bf27ad43c76e5a7bc7529b90a0b14ef67655e1be54a9991765be2334127f6436686a74487e5442236cdf8b59a3e05a6354806ea4750946f011b00000000"},{"channel":"scrape","source":"bitcoin-dev IRC","provenance":"https://buildingbitcoin.org/bitcoin-dev/log-2012-09-09.html"}]} {"height":225013,"hash":"000000000000037f2cc0769d4244cf50f1cace4ab76b0b4adb31010e10150708","header":"02000000386dc07a7e4776eb8e87e6a97cf8332b7b873ba8764d0bc206000000000000005ab4785c9cb7a514fe6bbe66800391cbc56400977161d43f9c9bb9bd1b7ac8087d543b514bd7031a63a27512","prev_hash":"0000000000000006c20b4d76a83b877b2b33f87ca9e6878eeb76477e7ac06d38","nTime":1362842749,"core_reject_reason":"bad-cb-height","rule":"bip34_v2_coinbase_height_mismatch","context":{"expected_nbits":"1a03d74b","coinbase_height":436459339,"coinbase_scriptsig_hex":"044bd7031a0173522cfabe6d6d5f96eead5ea22511ec2950557d0834f76cd860bbee47f1d5bb386270d4f183b80800000000000000","parent_kind":"canonical"},"observations":[{"channel":"merge_mining","source":"merge-mining-research","child_chain":"devcoin","child_height":80590,"provenance":"https://github.com/deadmanoz/merge-mining-research/blob/f543b1f23c57be6840c7a2a44a59306b5d0180f7/data/error-blocks/error_block_observations.csv#L2","child_block_hash":"25c0c320839d5fdfa2bea57d6335f212798dad156d243946cb6365e3b496488e","child_block_time":1362842673,"child_header":"01010400d172e1559fefaf57ec032d6aa0541215fb1749fbf27da89210cdf15e6c4de3280c99b52bbebad9660834f0a73cc954cd38e04e4492bb6dc6f3d84ea824145bcf31543b5191c3071b00000000"},{"channel":"merge_mining","source":"merge-mining-research","child_chain":"ixcoin","child_height":120330,"provenance":"https://github.com/deadmanoz/merge-mining-research/blob/f543b1f23c57be6840c7a2a44a59306b5d0180f7/data/error-blocks/error_block_observations.csv#L27","child_block_hash":"6214faa077468141f92a0588f78a3140743b3dc8af6ac7effc9fbc73661bae81","child_block_time":1362842672,"child_header":"01010300ef6f83bfd4c3e1a1d2e47b932bb9c61bfb5795edb602c95c08f19416757179d9e52d09588372602162839a72ae83a9a3d470c0cd676135a95533fa5138702b1830543b51728e021b00000000"},{"channel":"merge_mining","source":"merge-mining-research","child_chain":"namecoin","child_height":99370,"provenance":"https://github.com/deadmanoz/merge-mining-research/blob/f543b1f23c57be6840c7a2a44a59306b5d0180f7/data/error-blocks/error_block_observations.csv#L42","child_block_hash":"43aeacac4539943a530413ecd48eeea120544dca1c1a9f2718d6cca482f0a729","child_block_time":1362842196},{"channel":"merge_mining","source":"mergedmonitor","child_chain":"devcoin","provenance":"https://github.com/NStifter/mergedmonitor/blob/54344d4e355f73eb94bef8d391e8fb6e4a9323a6/fork-analysis/mergedmonitor/mergedmonitor.json"},{"channel":"merge_mining","source":"mergedmonitor","child_chain":"ixcoin","provenance":"https://github.com/NStifter/mergedmonitor/blob/54344d4e355f73eb94bef8d391e8fb6e4a9323a6/fork-analysis/mergedmonitor/mergedmonitor.json"},{"channel":"merge_mining","source":"mergedmonitor","child_chain":"namecoin","provenance":"https://github.com/NStifter/mergedmonitor/blob/54344d4e355f73eb94bef8d391e8fb6e4a9323a6/fork-analysis/mergedmonitor/mergedmonitor.json"}]} {"height":225015,"hash":"000000000000015437122b60d0a1d2ed7e1f98b5b292e886d6ca62042bba2035","header":"020000007b857cd06c12f2a8e032bc38215b8ebbbe387f3b1bd487a92600000000000000900b7044d905f7e58bfc9d98b5e298a86fdfb1e2ea86c892c010fceefc6568e43f573b514bd7031aea797c30","prev_hash":"0000000000000026a987d41b3b7f38bebb8e5b2138bc32e0a8f2126cd07c857b","nTime":1362843455,"core_reject_reason":"bad-cb-height","rule":"bip34_v2_coinbase_height_mismatch","context":{"expected_nbits":"1a03d74b","coinbase_height":436459339,"coinbase_scriptsig_hex":"044bd7031a025001522cfabe6d6d43629863b5b1d5de8916a8bd7cbd1918bc6543e246e7ba6e55bf745dcb513e2f0800000000000000","parent_kind":"canonical"},"observations":[{"channel":"merge_mining","source":"merge-mining-research","child_chain":"devcoin","child_height":80595,"provenance":"https://github.com/deadmanoz/merge-mining-research/blob/f543b1f23c57be6840c7a2a44a59306b5d0180f7/data/error-blocks/error_block_observations.csv#L3","child_block_hash":"4cb852207cf335969f2ec2cf65ffabb657818e4b65f87e97f52932ac46a28f8d","child_block_time":1362843422,"child_header":"01010400cf2a6264a20af2fb0b4d43af8d79115d54ef83980e149f255afad643d0d433202558e4f3bfea7775606c42f65c1e19ccfb4c3489ff7c9b96f9eeb1df43d946891e573b51cba5071b00000000"},{"channel":"merge_mining","source":"merge-mining-research","child_chain":"ixcoin","child_height":120333,"provenance":"https://github.com/deadmanoz/merge-mining-research/blob/f543b1f23c57be6840c7a2a44a59306b5d0180f7/data/error-blocks/error_block_observations.csv#L28","child_block_hash":"5b9a346a5060370d6aa8a0a3467c5563b38d62d2a2bae2017956c5e0222d5806","child_block_time":1362843421,"child_header":"01010300f1e2ef20771d69fe2d265356eca3dc7c178b270a940ddb5930992bdb609168c5695d33c7a85439a88244feac2772f8e13c82b6ab85f87294e9bb2bca93657bb81d573b51728e021b00000000"},{"channel":"merge_mining","source":"merge-mining-research","child_chain":"namecoin","child_height":99371,"provenance":"https://github.com/deadmanoz/merge-mining-research/blob/f543b1f23c57be6840c7a2a44a59306b5d0180f7/data/error-blocks/error_block_observations.csv#L43","child_block_hash":"0530563a96697ca4e83d6db1b5ef3071215cefc643467be5c4f5500f39adc3d4","child_block_time":1362842753},{"channel":"merge_mining","source":"mergedmonitor","child_chain":"devcoin","provenance":"https://github.com/NStifter/mergedmonitor/blob/54344d4e355f73eb94bef8d391e8fb6e4a9323a6/fork-analysis/mergedmonitor/mergedmonitor.json"},{"channel":"merge_mining","source":"mergedmonitor","child_chain":"ixcoin","provenance":"https://github.com/NStifter/mergedmonitor/blob/54344d4e355f73eb94bef8d391e8fb6e4a9323a6/fork-analysis/mergedmonitor/mergedmonitor.json"},{"channel":"merge_mining","source":"mergedmonitor","child_chain":"namecoin","provenance":"https://github.com/NStifter/mergedmonitor/blob/54344d4e355f73eb94bef8d391e8fb6e4a9323a6/fork-analysis/mergedmonitor/mergedmonitor.json"}]} diff --git a/docs/notes.md b/docs/notes.md index 1ddb180..f2c3575 100644 --- a/docs/notes.md +++ b/docs/notes.md @@ -54,7 +54,9 @@ They hold 67, 64, 23 and 14 transactions in 31258, 41258, 7662 and 4855 bytes. CI fetches the funding transaction, checks its txid, and evaluates the named input with and without P2SH. The blockchain.info block pages archived by the Wayback Machine in April 2012 list each block's transactions. The [2 April 2012 bitcoin-dev log](https://buildingbitcoin.org/bitcoin-dev/log-2012-04-02.html) records the first `P2SH VerifySignature failed` rejections and the [4 April log](https://buildingbitcoin.org/bitcoin-dev/log-2012-04-04.html) preserves the transaction. -Eighty-five further blocks carry the same spend with authenticated inclusion proofs but no complete body; they need a proof-based admission path. +Eighty-five further blocks carry the same spend without a complete body; a proof file holds the transaction and the block's ordered txids instead. +The first three admitted that way are 173886, whose rejection a node log in the [7 April 2012 log](https://buildingbitcoin.org/bitcoin-dev/log-2012-04-07.html) records at 14:58:54 UTC on 1 April; 174772, which the [28 November 2012 log](https://buildingbitcoin.org/bitcoin-dev/log-2012-11-28.html) shows an unpatched node connecting as its best chain; and 189498, the last, reported in the [17 July 2012 log](https://buildingbitcoin.org/bitcoin-dev/log-2012-07-17.html). +Their txid lists come from the Wayback Machine's April 2012 capture of the blockchain.info block page or from the Decker and Wattenhofer orphan archive preserved in mergedmonitor. ### 74638 - value overflow (2010) diff --git a/docs/schema.md b/docs/schema.md index ae20e6a..f29e5e3 100644 --- a/docs/schema.md +++ b/docs/schema.md @@ -18,6 +18,7 @@ Omit unknown or inapplicable optional fields instead of writing `null` or empty Hex strings are lowercase without `0x`. Bitcoin hashes use RPC/display byte order with leading zeros; `header` is the 160-character wire serialization. Full blocks, when available, are `blocks/{height}-{hash}.bin`. +A P2SH record without a body carries `proofs/{height}-{hash}.json` instead. ## Required fields @@ -130,7 +131,7 @@ A provenance URL cannot bypass these requirements. | `bad-txns-inputs-missingorspent` | A complete block containing a spend of an existing output of a later transaction in that block. A spend of a parent transaction absent from the block uses `missing_unconfirmed_parent`. | | `missing_unconfirmed_parent` | A complete block extending the block a public API reports at the previous height. The `missing_prevout` outpoint must be spent by an input in the block and created by a transaction not in the block, and the API must currently report that transaction confirmed in another block at this height or later. Unconfirmed or absent status is not evidence. | | `already_confirmed_in_parent` | A complete block whose named `parent_txid` is a non-coinbase transaction in both that body and its canonical parent. The parent's ordered txid list must reproduce the merkle root of a hash-verified parent header, and the canonical hash at height minus one must equal `prev_hash`. Require `parent_kind=canonical` and body-derived coinbase fields with `coinbase_height` equal to the record height. | -| `p2sh_redeem_script_failure` | A complete block with header time at or after 1 April 2012 whose named `failing_prevout` is spent by exactly one input in the body. That input must pass script evaluation without P2SH and fail with it, checked against the authenticated previous transaction. | +| `p2sh_redeem_script_failure` | A complete block, or a proof file holding the transaction and the block's ordered txids, with header time at or after 1 April 2012, in which exactly one input spends the named `failing_prevout`. That input must pass script evaluation without P2SH and fail with it, checked against the authenticated previous transaction. | | `bad-blk-sigops` | A complete block at mainnet height 481824 or later, authenticated previous transactions for every external input, and calculated BIP16/BIP141 sigop cost above 80000. | | `bip34_v2_coinbase_height_mismatch` | Both coinbase context fields, decoded height matching the scriptSig, and a scriptSig that lacks the exact expected BIP34 prefix. Header version must be at least 2 and height below 227931. Applicability of the historical rolling-version threshold still requires review. | | `bip34_coinbase_height_mismatch` | Both coinbase context fields, decoded height matching the scriptSig, and a scriptSig that lacks the exact expected BIP34 prefix, at height 227931 or later. A non-minimal encoding of the right number also fails the prefix check. | @@ -169,7 +170,7 @@ Before accepting a response, CI parses the whole transaction and verifies its tx It caches stripped transaction bytes under `.cache/prevouts/{txid}.bin`; witness data from previous transactions is unnecessary for authenticating their outputs. Every cache hit undergoes the same identity check. A corrupt cache entry fails instead of being trusted or silently replaced. -GitHub Actions caches previous transactions by the contents of the block files, reusing older caches to reduce downloads when blocks are added. +GitHub Actions caches previous transactions by the contents of the block and proof files, reusing older caches to reduce downloads when evidence is added. Only successful non-PR runs on the default branch save an archive, and only when no exact cache exists for that block set. Without `--fetch-prevouts`, all required entries must already be cached; missing evidence is an error. Cache contents are not committed to the dataset. @@ -251,6 +252,10 @@ Nodes of 2012 executed redeem scripts for blocks timestamped from 1 April 2012 ( Bitcoin Core today applies P2SH from genesis, with one historical exception at block 170060 (`script_flag_exceptions` in `src/kernel/chainparams.cpp`), and reports the failure as `block-script-verify-flag-failed` with the script error in parentheses. `failing_prevout` names the spent output. -CI finds the one input in the body that spends it, fetches and authenticates the previous transaction through the sigops cache, and evaluates that input twice with python-bitcoinlib: `VerifySignature` binds it to the previous output and runs it with no flags, then `VerifyScript` runs it with `SCRIPT_VERIFY_P2SH`; it must pass the first and fail the second. +CI finds the one input that spends it, in the body or in the proof file's transaction, fetches and authenticates the previous transaction through the sigops cache, and evaluates that input twice with python-bitcoinlib: `VerifySignature` binds it to the previous output and runs it with no flags, then `VerifyScript` runs it with `SCRIPT_VERIFY_P2SH`; it must pass the first and fail the second. An input that fails without P2SH is an error rather than evidence. This evaluates one input with a library interpreter; it is not Bitcoin Core's interpreter and does not validate the other inputs in the block. + +A record without a body may carry `proofs/{height}-{hash}.json`: an object with `transaction`, the hex of the failing transaction, and `txids`, the block's complete ordered transaction IDs. +The list must reproduce the header's merkle root and contain the transaction's txid, which binds the transaction to the header without its other bodies; the input is then checked exactly as for a body. +A record has a body or a proof file, not both, and a proof file for any other rule is an error. diff --git a/proofs/173886-000000000000053ff5459413d05dafa40f94d2462c1381dcf6e84f6a53920bc1.json b/proofs/173886-000000000000053ff5459413d05dafa40f94d2462c1381dcf6e84f6a53920bc1.json new file mode 100644 index 0000000..b2ccb7e --- /dev/null +++ b/proofs/173886-000000000000053ff5459413d05dafa40f94d2462c1381dcf6e84f6a53920bc1.json @@ -0,0 +1,82 @@ +{ + "transaction": "01000000019dc23528f5a5f376da3f3f4efd45be8c5b551abdb8093940e0b313de459a53b00100000026255121029c7187ecea7f09146820075c3a8de5d33ffbc293b63228ea1667c8d3796aff3f51aeffffffff0130570500000000001976a9147288ca9e213c54cbb2094f00bcf33bfbce691dbb88ac00000000", + "txids": [ + "c9198c699e699b1fcbe980126714bbc43b5976fb444f37a84afc3004becb1186", + "d94ac4b98b8ef211fb31976393c94a24f1db754acc5a8648bacc73fdef283ddc", + "64a66cf194f57b99fb7849a95946265cda5f2c7b88e318800ddf7c3fded90d9e", + "1751306e948a701aac2e91c327cd16313d0631a62d1baa013f062e03811467d6", + "b6b0c21d40765df1c5b3678aa0f58758ae46c134e6a6cf5970cd31fe1ab5ff44", + "e63af37033749a153636ff56084984466bf5ba1420bd0b4674704eabb466b049", + "163be730ad78936a6ab969ba4abfd4ec0e436ae64780a20d844dd29964bd7ac1", + "8802a07d6db67708096a9be91aa85df2c359db61c63bef271d679f389d726504", + "bed58d8cb3e9efd089347b8eb09f405251a1b56cb42f7addb1b3215d00c05b86", + "70c9a0468fa03667eb13e8eb72530d216b5c42f6a5f7d4fc9285ab03e913c15a", + "d33ddd99671bd863b3cf541dca4b709b8a4273f8f15b754384d6e416a472eff4", + "f600ac5beb0e8e1b108ca09eca808f31068adab5225d66670b2b452b2a4a36bd", + "cc5984b52fbf2b806e879a84b7cc858bdd08359dabf3ed122cffe66c527ed3a0", + "8ca7ea77543e2e912ce1e87944eed47894f32353a8113280d12245d90af65e0e", + "aa0b438be2d8163e3f89c6adac97b1eb215f1e529730438aee4f70c1decdf04d", + "693eba1af147ca4df1985084733414ec080ea172fc96c078be06212188ce208f", + "4cd32a98b07866b33155f00c4d20cb52fb9c2a5e6702fb7e0d107d4925c04b67", + "70f0c51f75fcd9758e59191b73bb22f9ca2a0049011756d217151fcef91b9848", + "98fe7ae38e4fb66d95b59f86a96c17bb7093be23b1742f20677fc2e769649bad", + "9f6763eaff4e63d68226d9c67f5c2c0f1558f2ac182f9e3940e32f150a93f719", + "ca7c644bbe71f11de1cfe4bbd02b5fcdead45998defb2c068cf58bc972a8ed8e", + "c91a836b7eecd50c15dfbf0cbaff7db1e5c4dee5a4e2df306554462f3b1c5313", + "185e0ec95a20bff762fc4525e1308792c945f1f741257415f210e58f98469c50", + "b65f2f5507b3e771821429e9be80f229f0867f50bf25ab4f94d60d21b57cf27b", + "f712b17dae671989b5f542a673850ca4932200a4000c26f809bb57644f6dbc91", + "4e9450771f1ab776148d3b5a7a68d6f78049e1eb8be11ae647f4b60491f52de9", + "5825c8e5f29d9e6ac1705011ba36f4a186bf9d71929d191de4d60117d7a09fb7", + "6b8875ad95899416e8f0f87949c9be038eb5737823296c8809d297e1dd9d4d81", + "bd17cdd1d8a61191dd56f5e8ed02e44a40cac0ac114e3e80d0402bbd5d4103e4", + "dfe9a93fd5976dfaae4473f0cf0c6e8f51427f6797e1692815b7e3d6349378fb", + "76f990c4f2ba5ec299e0b25da9fdf687ff0586b6e5ea22c0c08bd1dad4846abf", + "94f1a65d69de92a688d3775ef9f74224301b1b6dc7080cc1d2fdb0ea44ec0e81", + "d6a4c8e85426dc8062d63cd483c982e95dea0ec4b75a4624292dd2aecdb49591", + "34810d0cb98f597d504195777ec7fcbe2beaf259b6a97e8d87c11d02c27c3a2e", + "7ecf4eb9a79e05e908e7ea25241fe89795725cfff54536231d48fe74cc0368a0", + "f9c3f771f2725eaca6fbaa9e8e1a896b9165109919e278f714d87fd95fb7b3b7", + "9198ab09aa107614934d3ee29f9d3fbf551ed6b8aa1371e7b061d51f6410f49f", + "b9ca0d219add31b62ada1f96874cca71a0083a6e9d061457b4896427dc62df21", + "0076c5aec98a2746a97a57d7ac77cb1ff0b7ef2407272efeba806adfc6eedc67", + "2d5a7b5f3432b702528a50e84ed13b4e48e92555cdf1717566ec11276341b2a4", + "bba772346eca40692b753917e0c94bffd521ed28156e9f6ecf43ee19289047bf", + "0c11aae863ff80b9f3d302a8a7171c7de0730dd1dcdbf9785db1e049401f656d", + "98a0e7957885c12a672ec41631469c0b754b0a57a7c6726fccc9fcd922321f19", + "550f405722b0c92db5532abdba8bd9ca998438abdfff0265c878fc44d68dfb22", + "51ced5336f2820a529efdad9759b11d9454341e64f78bdc2f3daa219f87dc6c1", + "6d98ad319a91cb4adf452fb0b46d848ba6196168f82ed23a3c5fbd02bec61e07", + "90f38080955d9aa81ba4a09fd0c12f35443a73e5265ab1da563e5994b0f9ef5a", + "f92ca3f237cd6ec1e83d649b81431027a56a9cf265188a933b3d2fa1c2af6c3a", + "929e0f60798bab4c31e50c839357d71b793d5e8684cace5381507615b8bc90f2", + "68ec1fc34b1a266dd1ab3229868f946a5cb338be97f683851bbf60fabaf01c61", + "fd6a59499379ac4b01297414043f74bcadb8fdeb8880f59b5b3362200536b4cb", + "edbd7b0fdfb60ede5f0bc8b0534ae300b541de5f69d36f8168d8293e4fd151dd", + "5abaeaad83cbeec530915543c8c48e6fbad0e306665c7299df2d7289db4a318c", + "9e9da044327573afd1a0551a585450f4d34f67122d4f725b1a4e30193db4683f", + "92fd9b6fb5ebef8c35afd342403057434fee8d9e463ce54f5f797ad3e03c2e87", + "c770ab3eba5f41397d7fea8ae97419935afe4f8eb8c6c016898b03927b305419", + "d529e6886dc34456e954ec25e51f07eeea2e2d45d413315189399e67e4013c75", + "fe3116a293dc415642825b253877e872ba2b66b4d7088b84b843a36694df7338", + "e26b70ca298081f667053957591b11401282d15984557846716e46ac5d22796a", + "f8838398ec9c656bbb5f92332da73c2c9c19dea4a34414e959ef7d8240703e9d", + "1f47f654759dbc64957acbae72a90899fba8b8ae6e57f2cb693b56c8de9b9a8d", + "361752452a2bf1847788487c1350e5694012f4391016bc24bf7d606dfa47d91e", + "4005d6bea3a93fb72f006d23e2685b85069d270cb57d15f0c057ef2d5e3f78d2", + "3e55798ac21c5e3dc8a14109a0528926d5eae0e10bd1374da904f5b234b3a3b0", + "e28962ea63500b47739130ac07a0323f000c5feb22853d1d37a5c2192eab10d4", + "532492979ffd94bc85ecf596dfadbd78745d0f3ff424a5cdb952a3515f8b9508", + "9a60ab59fa2ddf6458571dac29b86fa7144ede13915c95a87bed3276065191ea", + "c43dcd32256741667bff3c49b81c9ec30f0b16b62712f231407032ff41777e15", + "8007909f437ba7fbd428a2a979852e04ef3b523ea8bcd70cfc99357162ba1a33", + "f85d5dec1b650a3a56b8909e1cc55d025d742b401a528ebe9f2f64791e535d72", + "4cd5cfeb447632c2a6d54d0c3d4bcbcf78c39da7e33d67bb23b332652030e832", + "0aec72ddc07f5f5c79b355446dd83f2415f7692f85bbf312e0d79231dc667e0b", + "6b7d2135b5e94cf1919f3be8668b8b47daa3d255af3f9c7d52274cd23a034265", + "bdf9f8de1481a2d2cc66db2d05c84a4bd9ca90303fc0a0b6c62fc8291a128472", + "c7a65e21e157c64738de5c05e7f23eb0fcb08b91f0a2421684141ace13fa587a", + "3be1ca8e8286ebbbe72b32a3c820a231922b1e814c3f8aa1fd5812b2427c791d", + "4913d3b0e3a7bb927eecaa1e31705a18b1cd7f5a5a20de36b8108bf66b6f4e24" + ] +} diff --git a/proofs/174772-00000000000004f3cf5af3ded18a301faa24aabd48a5d274a5cee54d21dee7b8.json b/proofs/174772-00000000000004f3cf5af3ded18a301faa24aabd48a5d274a5cee54d21dee7b8.json new file mode 100644 index 0000000..e588761 --- /dev/null +++ b/proofs/174772-00000000000004f3cf5af3ded18a301faa24aabd48a5d274a5cee54d21dee7b8.json @@ -0,0 +1,12 @@ +{ + "transaction": "01000000019dc23528f5a5f376da3f3f4efd45be8c5b551abdb8093940e0b313de459a53b00100000026255121029c7187ecea7f09146820075c3a8de5d33ffbc293b63228ea1667c8d3796aff3f51aeffffffff0130570500000000001976a9147288ca9e213c54cbb2094f00bcf33bfbce691dbb88ac00000000", + "txids": [ + "e5a5306bfe5d37facc7dafe5f5500ebce8faaefd9bba46ac02c872e2a19f1779", + "2c1847f9c5033b24b28d852cbd60afe831d96f8e21610509ee66d3cab9a64531", + "7c721157ed89e7e76a4241445ff98367e9d24b52e6d21fbc908991d1775a609f", + "4005d6bea3a93fb72f006d23e2685b85069d270cb57d15f0c057ef2d5e3f78d2", + "e342258d90cb3553b461436faf1b827cd14c696d8f2e635d078c7234f6121680", + "fec940d71a439aa8114718523f11914a4c9c7970f4780c3dc100bae4072af9d5", + "54347030d62de094b10eb01fff3e60c58f1c9ebeb8c84284cd2a9103639d6fb3" + ] +} diff --git a/proofs/189498-00000000000001d38cbefa7b86e03e8cd41f42654c39db44e254187f7aa750b5.json b/proofs/189498-00000000000001d38cbefa7b86e03e8cd41f42654c39db44e254187f7aa750b5.json new file mode 100644 index 0000000..08497b3 --- /dev/null +++ b/proofs/189498-00000000000001d38cbefa7b86e03e8cd41f42654c39db44e254187f7aa750b5.json @@ -0,0 +1,563 @@ +{ + "transaction": "01000000019dc23528f5a5f376da3f3f4efd45be8c5b551abdb8093940e0b313de459a53b00100000026255121029c7187ecea7f09146820075c3a8de5d33ffbc293b63228ea1667c8d3796aff3f51aeffffffff0130570500000000001976a9147288ca9e213c54cbb2094f00bcf33bfbce691dbb88ac00000000", + "txids": [ + "4b2a5508509e5e86c021d15750348196deeee58cd5eaf37137e63d83f5de5f5e", + "3d45fff86396836e6bf2f2d4216a908e4c59c0659ff109daeb10248ce6fc27f3", + "d84ececa69a8852ebe0118a1aefbeca7b3df8d7e739b68e4c1db6063d470c8b3", + "43fdd6fb9fc47b91419a7291fd897bbdd051bbbdd64e27a9a2ef82997d7cdd2b", + "9bfa7731a863a23eeef241efacb7628e72621f9a73e4e408bd13a181175f6047", + "484f34a93bda65c89c8f546a8f0128618286ff061f6a67580a9cf311d374ecd8", + "9f90055b3da978c0695014146ab0b8a797e4fd32cf22c4110dbb1a45a0857d44", + "f49b140c8628783f89875b973655590d6c70cd887ce70ef2d4dbe44d32ebaab5", + "992d4a30c69ffc8b0c445740b08318c157b71b23f261a8638274bc5d7b906d37", + "afa0c9b610710654f638431883d68ffdc59e734224047f7c45636c0ae5400cf9", + "1dc67296055bb907219f44c4da65e8fcb7e85742335ba9dc5c797b90691e49da", + "c8f9cb17a614be7986e5481caf5d5b9137cb0489857767b48e44e2c62b6e929b", + "f7a41cec77c495601989928b5a5423d5e08c910b3ce770c64d696f15dd9bb421", + "9c27b0678437af5e267247ad46ff3b4974d1b5194d55fb19f33adf61a5f5ddeb", + "edc4ff66b4d635be5f39ce7838da64e523344ce6f35229525c893916c5ff1c86", + "16b322f3be1b768a0e19ee858f5b045ccda7b4977575731a52687551f3ba708f", + "81b777bef1e7a144a16b496dfb7496537d13026fc042b748e9b5e5627021d0ff", + "3716b625277d46666b96c9138b76a3be8ae5fda07cac3d53e9c56e350ecfe74f", + "6c8cc86d491111b0610d5667e906beb30d64c6cb9532cbed8444f7df8e390c1b", + "8200bd8b0666442ff32256a03c698303217b5096f8d5522c30d2ad424a5a1edf", + "477960618bccc6c12e440ffe053a5ea7c1562feedb280586fd0215290a5e04ac", + "f3b0ef234d5d5b157919dc70b4519a0e2b22b92984c2cf86f95742e6d9ef9972", + "70d0bc4611a412aded9a17450a3c8bac8d6b47ce48736ac99ec19de276d1b6ed", + "8bb145aa9c89aeeea117a433b00231590f4069e0d1510f9b43058d9c1d0b1d21", + "fd7c91f5d5d004e53d8c85db802ef79965729631a835d918eeb3faeaee8be030", + "65af05d89ce6870103994ada582d9a9c35554068727344a2954ffd55a3afd9ab", + "1a9657f9ff5df3cd271a0b5309d6a574708295fd986fd636721eca5782e6bab7", + "4bc475184efbfde2960dad110333e5937c2a8ae7d76f2a4b883d4ee54a77dc4a", + "e70df786fa7b7295bce20be6b01b5f9356b569896158dc025ea37bc807add5c3", + "334710add820b9d0381880a47af8c07878812bf5311917c25ea5775288b0a0f3", + "a710db0c9a44f1cdd57703f50c7e11c1b81bc46888cc020cc2dc544b528f9c85", + "b0c208cef4e10d72890ff174a54d8a58e10fbae6bfb8a7eeebc6a6ed2392878c", + "69c4a029e9bd0ac91020f1e0c9aa76dc35ebf638b6f80594d8126342d31dd5c0", + "0ffe26cb86dfe2901618f84c55c24d9a9ab525d62f14409145001d00f6d35049", + "9a92fe0ef5f06a7d9f7602b55a4f3589f493f70dd8dc04c700c38e38a2e4abb6", + "2a47cbf5d73b14667ed7a03c2eaa00b9830de4cc7d481c61a0e3012c01e95d51", + "54a20d5217120c8ba219df3d3e3cba36d064e9270814f8fba4d0ea04ece07fd5", + "10b09af8f8bf8f7216feae0ab581a1eaa0f35d616168be0fb2009ac18fc02394", + "a30d7e757a0a5bbef05f38ceb81c5dbc7e7dee9218756b6e6c9ea545b8bf7349", + "f935aaf9de5c1d5f83d4ad48890401ec7412e8efe2aeb4445d8c398bbacb4e35", + "be0317c620c5fe17d2445b712a1e86b2af1e05e826aee7eac43d2664a46b5ac1", + "940a1ef57691b7f623a88cc429fc20ea9a8981531920128b6f9b4fc05313fd33", + "cf6fc34c89a007e69d82c9695cd956101081376bb198c03eae1f2fbd9f474ff0", + "12d234e3e03537e93ea51a503c2dfbefdc340c870f8d19035ce059d8d7989cd6", + "9b145aa77ba45e8c254043bddf760ffa22fdae9c4d848f9910c1e3b28ffc2d74", + "60b17db8b8ea40ef8cd8afc18611d31ad50c77d8074188e6b4d184c2904899d9", + "1d695969075a85000b57921d4ae99b8a1d5bfa492fad8c65f9c109ddee343cdc", + "c85a7d8380ec1eb38ae4a4704b1994d88d35260c1f047e1a36983ed91274e74f", + "25dcd46dda021efa737039da5eb8b83999926e6c54dca8f07ba09b1d7fea4fdc", + "f0c7d0670b1ba45e78895db0c283ee5241102328f05c45b4565af3e407e711aa", + "e1312d19adf2d52dc3351ef1290d5aef699be992d2d9916d36d78ea152907f8b", + "857a38685e4889fe5a14d04ac40498d4a8e4ebe59ad4e021fc02d9e9855366bc", + "3ccbeaae8af4e649905b5fff9735996005fc9f52cf09dcdb4006afd17f5b28c4", + "6b877e031aebc38543f2f7037b66ce94478fe626e7a30635155df834abf7806d", + "c3b00f8da7f6ccecb8d64c155791cef22b9d6d628b4168543117597b3708c1de", + "4005d6bea3a93fb72f006d23e2685b85069d270cb57d15f0c057ef2d5e3f78d2", + "6b410284a1e44c59b5e0fcfe00b4f49050651f61d2542020b700deb39e94cbbe", + "79206f0a9c36f47951a39b92aa60d3285d8faf624f35309796990c7a301519ea", + "ad211f44d787676d34428b8b3960f267ef95bd6731bf44bbdad772a970ae3afb", + "1f5a242ee983280778f8906f058c330b428a3acb358b9216061bd95c9d2dbbed", + "4551d8540992afb18ebac860e3dc8505f9d838e969f8d241629c39a553299401", + "07d67224a810168df319006fedeab9aaee08e79965515dec496cea8ae6800468", + "fcc5910b055483e45c67f403e9ca1e95d578d0cca7630205f2a56a7f5d61e133", + "93627419d9a013b0092b093f9afe82f7a2c846540fc547f42e96ecc1c5ec96e8", + "a61a1fdaef12b6dd6c921a83ff4096217b391e32422f874497a5ab8f074dd7fe", + "f35638fcaeed7f36cc38763bd7ed6e8b86aa635a98f5858832834abbd14c280e", + "e3d6b5b474e7d51a41c7db01c60ffc613a0d33540e4fa1af5ab1ab9db394875e", + "a32b9235f8a2141c5780a3a2e57530649814c04dec0d83f69ebca737ea197d4c", + "43ad700e80693b83cc3000243adaefff526dcf999ae9c21b53743192b96e0f85", + "c62b5170163000c59cdaf7dc9db9b11ae3a59d4e3eac973a00f64ec734d41a35", + "b71f5e70d944597db0a93ff3a5f76bb2194f15a5074b5eab4e6b8419b1a61176", + "1395a4ec338a440bbe59f057acf5a9ea111cb34287dfc2cbc3ac59a5e8a0f6de", + "980a5a8b52a3cac50b0f4c23c4999132b3d33e3f5f3c8e32dc7249f446c9c104", + "534006d88c6a7b6839f34e17cd40cc8c5cfc2ca2709a6b42c00eb0a1baaa1ba7", + "772f16310ff4774b515af416608fd79373e9bf35f17ab320cf8373d89cd66a3c", + "39437c2bbf3d1b1d265673e4a3d59f2bc90a0aadff7516cffe8cfcb31d0bdb24", + "6f3bd451f3076232d568b52cbbcba8249fddc9401f28a6d2db8d973f14d29c7a", + "c18740be95543e23fe71a351e2dc9f526a655252b4efae60625d683ccd899041", + "85d809945cfd24dec00191d9e2c946889573ff5b15b4b12ae917dbd2505b38ca", + "5e75d0bf106ddcd40cfdc53e5a91a7ab46c222ed1184b4eba92ba86a5861fad2", + "1ecf8e1a95f0f828ebb784d14e8a09f2ad4ca3ef2fd2f45c955db2c21ee6adf0", + "b17df438c9ee083c8a99ab57d802c62e7573c571fbfc406d997b77ecde4fc302", + "42ea6dc115429706e4d8476c16445bd3f1d0b2b88e2c7cf4151494d45c165fad", + "7c97a4a877cfa2540a8746abd6270fbf4e1bc375bf4aaf15940211abef6e4d49", + "459a6cf5f1c9094ebfb9fa6f92701267e6f501a1646a66928fb9d15646a36fce", + "3e952cadf4ee299abdf3460443bfb34e8c203858cc9f7101b82666c3dc4a969c", + "38afdf391092e91df0c708ce13a16f80fedfacfbee2a77c4f1bf0f2fd9ac8f4f", + "97f86edd9dc3c196fe39e158e2e9ab25c9dda5efa70c6d08e18795975630713a", + "c56fbe28d93f41d646bd4eb839524fb718006eb913ed2db11407106dc67bb1b8", + "cd9076ae9103f4214def4b26c24845beb883cc03c28baaaf8a46c92830e66a06", + "1aee52af9b1fb44e4f8b62a8b58f7ed0ee1af6fa290ae0183947ca15e1387ee5", + "f46c71e45888ba11af5857cb3567efeb0f1bc6464db32c1b865e9aa91c619a28", + "b43c58f197bed42ae16c13dbaf3dbd38d6d1bc163f770863fe74a3e7eb9e1020", + "2d67936b89a84fbaaf95238b7cecf6de97c62f555d5762550758b689c6932b4e", + "be168f20e45e79550dae7ef2f0e8ce7e5aa392d858a8e6332eb50b599144970b", + "d1a551642819efca121f04ef49bdd0cad295bc8c9b9d95b985352b033833e223", + "2e00081dd2b368c000c780724867fe26e9ab5539b6ac3a1280850cbfe2ad29fa", + "fe6e403ad75e49195a0e7386adebfc36d764f7cbf5ed903fe1a9e5d09d3b4170", + "dfeb78f812c84ac07e641588c42d54d2caa5e0076f612ad03ff1cef9191a9b38", + "9bac589453867c78f4debf6518cf78c32c6f521b3d5374cf38edc547603a992b", + "9a54ab22cea38a19d3044b58502e84a11ef48cc491bdb8c784cad41233e07451", + "7cf80ff0eef097299173f6091af92a6857c579d5d6aaaa0dea31ed0668cc9a3a", + "c0d7ee5c232505d151e1a718d127c7e3ce91c3361b1061f1d5da82e1092d8f36", + "7bac425589c2d886185daa42c45f4e3497308641376a43fc44bd02f56305edc0", + "ea1cf8f300762a34928b6bbdf60b6ba92af007e2ccf71fdc394399210a5487f6", + "7cb24f26ab2f69cf5af89164e2ac78d0074c4b51a10b034ddeef090d4d1c8c95", + "984b3a160fd1338fc2e387641df4c6274d9f1908257fc9fb14027b07b3492cc7", + "318f0d3c5f166d1218d21801b370da7abd80ee852f9674c7a7e1248c2a7ec288", + "fc22dc94010ba3c3b21f6c6a54658027d85236068c0fbc6271e3810ea1980abd", + "0b52770daa0ee5930c1ab082a11eb3caa53b44c6fb86c31a706c644d48d8c6d6", + "623aa294bf9528d2054f3cdf7a521a56a14c8042512e351229ae08b3a46e463e", + "6658a0fd2dde0b20c0f73db58c118442084d838b1807b326ccbfc8efc13fe737", + "1880da0ea2138506ee3fed48dc61bb00d1294335d59248b60d21c8f8599d9672", + "ad2675058f6e1826bd72d4b596d3b47800ad3fd5c757c9c5ddf21125a52b58d4", + "d473910bc7ab156dccd25536cb7bf751d74a52697fa366422c78f7e0c41f02f2", + "b269ede5690904c3db7b571912e2fe77554f0096e5a2dd978904004f21400168", + "bfa13cf6125a6688187fa7f82cb7c6aad52261cc2ee93bbd5f0014315b9eac0a", + "86bb9cacdd2f71ae0e2545ae9ce16d79a32c968a8cc732d09405cc8aeb95bb18", + "c442b820e7fe33cfd85f4088097bdeff0fd63161395301a2824d4930e742cdfb", + "ee69d70c10d9250a292ed54e175590ed19e237f11915b3e4b20311e1d98540a5", + "3e68966b4b209dede4037367af8021570f62508b77992c4cada05013b2325dbf", + "e8d223d8e0db11e48169538346c2765d625a893b64bb40753020e3e010f30e35", + "261ca14f053a23e83a5f47205bb7a4c10d59c2dd68cb4943f7e85fad341d2f0c", + "f8f63d70dbb6d130cd50e2b9f694af8e056fc1b3bd47098209ae9ddab84e5b93", + "3ce1f3bfdf5747a924febf2d3133dcf5af189abdef21ee8300c2bb99cc7ba059", + "b5c16e5f09c79a8063407600290e4848b1ca8d5c1245730fc4dd5625fb62edfc", + "2abb14573bb7102ef55af2331c7de8ea6e82ca65ad4fffeb397eba9621cc351d", + "ef69b612d33cca6365c896cd3a816ea4806b847c264dc3f89dfb2072d8584cf9", + "36559c4798ad3c8fba5852e30f5e542e9a36addf63d457ab98aad7aed7999698", + "221761a08c67d6ea2aa029fa04c2bc44015d3d428379cceafd92e3069782477d", + "aac1a5e95432eda4ca25aa6a58c2ca15cb92c6af38ab0a47e0694f2f7aa6839a", + "4bda2aba4a2c33df19ef89a14039d326544705df683393aabdce439dc320ea8c", + "8e2f3f1789f9abdc2069b2c4183fb306c0566070d6cf3071c4f04d0bf8133fa8", + "cd2685c2943048226403e44a1a5f89100a6bb614193f46a5d5a1d75ba6dcab6b", + "ae0eeae6549d2b8db8f8ce77e5dab71f2c58264252a079619e2ae97106d7f4cd", + "59f6ef92f60eeddf4e4250dd71de55cca2f04ceb7187975018b5f454457adc84", + "36985ea4b71df39dc41379a14c2564951f47d0755efa9431aad948683715f6be", + "79a31730784878b0956f573d481123e4a35c1396cdc614a66b1921b3e92d5bd9", + "f52797daaf8300929f077c3b826bd357da7ddf0c3b0f4a66bbbea9808330b18b", + "58f7dd6ee2cee9a7a3b5dde8f169fcb6f9ee4131f087c094339a0a32823e6ec8", + "b6920e406be94a5edac7b1667734f2222d528230777b8f9153b240d0618865b3", + "f488b0a0053ba49bde32cc8c7e613a113584572286fa8bb0e20095d7f187822f", + "9ea41630b2dcf9f9e63f620d3307d892ac83823195c8dfc32761417f35f37c63", + "0ac767adb9ea02825cdc7699ae19eff340244cdd3cdb885de3c5ef6f89a44ee4", + "bf6ea579a2a2e8db0af245a14dc74bc480b67157a634d124693264d8a09d2cb8", + "313e376bab5a185e0a207b09adc3c0e138d8e78a3375fc7484e1fab86b7e5a69", + "e849588ae8fa5ec5e1604ecd20c194f090e73215dd1638c1892c0abd65b2c347", + "f8b600b160f052b18cf122dd6f37e372533c26d7f054f627dde4164f57194546", + "7fb78dcdc7be3195d0939c2b293d8163b49d5e542c34c5a185364c4f645e2c97", + "770d07e303d8e3099c26700b94cb8c7ad3431c42b39229d759220349a8144f7c", + "43e2438a30224c4c6c1529ad4cfa528b5bbaeb6f8e5da17f68d01cb053f278d6", + "39e93d0d2be0b3a3e76fe9a96252b9f1e5adff7dff6a1e9985f312f635cf46e5", + "51236c6053f93d7bf12fcd7e675e8816544346a1e0d6547c03ad87cdf0317105", + "0d8cc533f224a412b6da1a3fe4aa868449778f46c558847fc38ea4514eccc305", + "3050fcbff599ebbb348de56b6f4e82cc96d204c151dc228591499205f9b16d4d", + "3ddc5b5f3b830f5442d3e257e88ce837139b355935310da2fb8eb6f0ac532d05", + "5b0f7ab9ec20851b6a47868d676d30031ea4e4d2ece5e862baa336664fa6a33e", + "683f75f858777515cd239b31fc5b2cbf0ea8db01b7ff79dd292fb8d6ce47d86b", + "78a9ab3fb3e35b08aa431a7f3fbec85ac462867821cdcb01956f7bd35f62fe56", + "79cbcdef5d1e07dac5631bbd262c9765bbbe985316e91513218f9c2d21039670", + "9a36da4c07de4c57d2e5bb32a047ed414e29cbe4b0b60895e1393a225fd1bc90", + "cb98ab3a0980fac1d886c29653956082339f7a311d6ab870fe416780059f9606", + "db796c6547637dc5467b74f08d912235df5df396ab000b2947548469c01cea7a", + "1d6afecf510dc233f0e68cf362ea9ec54e0348c862ae8f85349470b8fd14e1d7", + "80d6bad060447f7cea3e2da5dc473838aebe7065c230b866b787fb064d175e90", + "b31054f691a578018751b581b8b4f7bca99e4c2cce9731d9903adc05e2521e57", + "555991620690f741d6d6ddd6e7d889b9769af7f88d2fbe959df181d8905d5c58", + "bdaa46316dc1ba9b1cebdbef8e399d4f212d2505aea82afe8ff9f842831e42f9", + "2553df1b803c3c664c7a933c9817453f13455445b4be1db445fc7237ae2caa3e", + "f01eea6d99394c2cc98465d05bc35490e5748b1d937a32d389a565cac2bc0b5c", + "df3b0eb68afec9496cb362a742ff3374a3cff1f20e1baede0ba9d365c75295aa", + "2374769a3560da9ac1cae0db1dd1f8918f42f477503d9c3ef7d5fdf0e8ddf09d", + "269938f1a3c0213851412a564758e21a4d3eaf6d1f5f2014e96dd4bfc2792adc", + "597152001dceeb945163473803dcf2a90e98095d49c04ad22e4458cfb57bffc9", + "7bf87eff36125b176b1cd0865fa46a79d26e141b424c9c43e8f46e4e89618bb6", + "da4da5f8152b1fbdf9b473685c3aa7861b998d0b662db9b060730d7cdcfcb939", + "e7525cee0ebbf236cb64d67434484197271d6056dea4ff2590374f77418f1784", + "1abe0ec004b92576ade8f56a4ad53a9bb93a089394909ed0ee8625168f2bf76e", + "2189632387be649863f508eb507a6ed2c876b40c827ebc250644d570720830da", + "21bc6282e36dfec1aad97f938eca0f835936133890f79b1ff116e14f3d3a7969", + "a0d80f70420a26a49c4d8ca49d44c59e663465e9728915d7c4d22e7a77b41be7", + "f2b3f50d933aa03982c6395998ec3b0e916dad1a1e9a1a49a57ec25355d86253", + "ff7c65d6cef22fcdde30eaed00ba2e312999181e0ff22fdca594fd528077eb9f", + "42d0eb34ea2aefe6208091f9a084f719b0d8e6e1ff8bb409be2d595454966a04", + "4c0ac0028981f2081f006ae38ae7290037edabcc93a443f3f82cba0d3dea12b6", + "b9c1b8461324d71b5f626b05b5594cf0758a0530ab54993693d04d6c1b9c6bae", + "f6617ef42e73a76e8c7fbf5ca6ea9846022c5480f267cac5e9092217649f00b0", + "8582bda4a45fe4afe9246fdc2110c187da8571ffc2209876119bc2cbe7b46c3d", + "e578c8a119974f0b9b764bfb1455787c31a556d9f7f04a65ececd2acfd565f1e", + "6fdfff890bf2c9504abeb4ca23488135f9845b4743d99f555e1888820b6f221a", + "a696dbc198c96e506e27701f4e8f6c917672670ba4504cd7893838d5d7a34330", + "75c4e69de51b6d6121c1c3853abfbc4b8caedcdadbf330b50803b507e3d1f989", + "74984de77fc059be1aff96abc8da6a779ea9fd48040217175cb8a82abc9283f0", + "abec3b4673158133737519c0f19c4f6340ef103131d788b27a924dc0ece5a788", + "d0c821d29c75f191cbe519bbe000920486cc67274cf75f319730f9cf9cd29c09", + "bca35c1f13acd6254d1cf0e7051ffc387d905c6eaf71e37deff32a596cb97445", + "cdda625be9cfec6bebaf0a9c59a4e6abf312271cb0ce215cb403526e94e67dab", + "1243856969409765c1749c555a58bfaa8e63ca2b2565817e88cc0172038482c2", + "9710b9c26c2cf3cbdf56b14bad7bf1076e39568e4bcb39a56aa2032855a67e1c", + "ae03606b5eac290b116d5ea7d0f5b34dc33ac966c9e9eb814fb2016c82363b04", + "1faaff51e07ec6f94512f112b99422ef96e158aebb260c63649a097d522f43cc", + "25fea4bf0c3ae12a7909f6347e708faedf0e15bd7dc04c7c180861c40d84d5e1", + "8698ed8f40b816e544dd1ed9a87a4f7a0149d7e1872237039a5027eeed9b380b", + "18c92619a0270a5b121b303a8156cb1190dab339afdaae897e3001fc3661294b", + "f0122754cea75ab97bf5dad4da8229d0f419a24ac9ce907416b1969b458a3ced", + "72322364189eb3ce1b735f6ab7f10a06e5a6ae693f59bf83d02f777763d997de", + "37fec6b2a501ad948678fc9a228d9e54cb9bf3d968afa48c192d3f405f1a8cc4", + "d60a1edf17701d339db6ec90f63471cfa054a60d042ff20bd87d384540ace3c4", + "7b45f14845cee41974120bed3904f0859d92422262fd18df17a28dc8f5d64f94", + "6c2f0c4115f6d565645833fcfbbb4fa58b26c9aba0c024741a9d596eebde8220", + "68fcf29318def2747e7b5c06b90e7f3a4becacaade36f1c57002f2546af71f8f", + "4ddf6b6d3a54853682682811ee770c3962fdb549a9e604b8155a27d8090912e7", + "4d04e0c9588610ee43f2e26bc048c1776362412ffda815db1c212baa89e20fc2", + "12c9a912f075f7745ef6f0ab4623aaff04de2a5aeefbd7d6f289de57f8300574", + "5c3e79b9902cb2729d5bcdbbc5090b09d2448d1db65610e3fe564321749a9000", + "b68dee8fa8ce0fe527192606bb0c7db5f3a019680f958d8d1e4047e541f9f373", + "7a9ae6275e1c6bb6833476c8f108891465856b65f52877c0772b251a3076ad3c", + "999fdcff8b2cfd65407b48866a466e940af0f6244f8928b1261da84dd7f6ac59", + "a8c5adba7b8b6775c81386193054b05f78a1480f16773fe2375f8deb676cf8ef", + "c3a9c125ae2b58c6c08df8c1be9945bfce3335a6a1a5e409693bb850ef36c8d6", + "d8786169190271216780f3835afeca6995273a8a1abafb05e261e4a66de2fdc5", + "6386f49bf1ef7df5756acbf61058ac1a86c5081b5a877bb72eeb6630bd094268", + "75f7aa4a611b0b263336303eed1e337e50d9f3c4f215e1603988ae6d084b37f3", + "c1a6acced1b638416df0288f6e9a858222f12fb56f012039a4217ac994188cc3", + "2b7f5ca7cb237568a54698a933e58e8c377748d9043d9c6d1d77d159b4ac0a8f", + "5c4f37c4f0e13f03915b715a72c8b8f391801a44238ccc4e7c2b600e1b800f8c", + "8c0bbd3ed8e665ccbdfa96d2560acbea3676c25dcded661ef0a986e27b8198e3", + "0bb5bbaeb80edd9cc5f8c5307c831d29c2720210a83bc3bae0648fbcfd7af9da", + "d704d15d04f4d56489a49ae158891a542fac9794b030ab4306a486e4bcc452a6", + "14d3ac5bd3bed6c8fe1b15fae64fc10bce539bc0f155a8ee1d52975298fc6248", + "9f8b74d513b0d5ee8490d534969709c6f551f20b8297e1ebe740c23ed11fb19d", + "753d1b1c0c003a79a5c993359b9cfc1e25006376696af91e34b5482ef4173fcf", + "843e0a822f8f631efe86262bd92afe720eed68f80db7e3741bf56bb04407def9", + "de59bbedde7082711f264e9fc4c5a2244a89609a7afc0cc86d9bbc83255285fd", + "8a33a68825da425eea12e49bdb638c2cdff32491faae462ab8e51c08dd4ded99", + "d65e8e2e87828f2718c01ebfd1f3cec3562570c7396e5595d9286ce81d161e7d", + "69453eace3a040ae19d0c83f949f6eeb76a89ae66e25a39930c0dbe1cc1deb02", + "3c06c2ecce4d994dec0c76f4f0c597a341824a8b6744aec7362e626ed99289f4", + "0d0a5d16ae3b2e18ca8c9e2367cb90a2534581b8a69ab91bab4a3a2c10ba6196", + "91c2168adcc9e238f83c87115b0288723e02f592cc919378ab74ce441224b31c", + "fd4040f51a2f91bf91deb1202b9311b948b742df0c94f40bac10c0de7210075e", + "ae334cb1225f5a9b000d89cab033fb980b866f91b0e99c428524508476b669e1", + "e5a0b204bd5c9ee242377ae9607a3bf33da6d1d498a267ef74d9e6c8111d6446", + "e659d943a81d31ae7a745545ed22f6ed28a955324be402dadef5ce942343b6ac", + "7a39917e2176b4473e8eda8aa3581d590e67685fd32c259494c4d80a3031ae9f", + "8d299c9316010789185f55ebc3439a1a62372169bf61e7234ce31578ef2a1969", + "139900c5e626f53ff74adcf0da8290e114ec01d6c8883b32ced72dc6b3f8aa97", + "70ebb3e3644787d5f1c9da35e11cdceaee019e355a78975e6efe23d15aefaa3f", + "fcdae3b96ea7996418e1dfee19e3f91877b6e0ef749aa068186fdbc07254028d", + "2c9b01e45fbc8d48ee3c7270fa4d88a4fae5199e14706fa2ff890ddea5831d2b", + "89542c0bab8d663c014971a4ceb06d64394085db651b4a244938cf9172dabc40", + "bee8f952e33740cdcf148f7eb7589a78448e7c4c4d5b9fa956124625c3c74f90", + "7e46d6ea30a7d401763cfccf3d87693438094130e0a7155cce50aa8775242630", + "d138c58156a77132bb4c671b27cf6e391a7d1dfe2bf4f5af85d2218118997c58", + "b978837cd5c36cb4e1cb55543565433760568c26d4d005bdfa859dce808ddb7d", + "110aff6cb18e9110e2a4976fe48b2f048a1cc784a10c1a03e9cea3d64afcc7f3", + "78744d4894724c2698b824e9115c7b1d3e86cc35407fcaeed771782081062d62", + "3383ec760d448f96f395314390ef22da2c882131ea9a9645d0d2970390cba2aa", + "6460a52e4c402bd2c95b04dae0c6ecd80eba93434ebc254f3639ab8b4e9c18bc", + "e874be8a9f0ec19bda39ee8c0f0e31bcc8c29ea2c18fc332ed90054443c879df", + "06b7e3d141e3ad1edd533bc22323a9a68216688361c9f137ee7f55a85f26305a", + "2c887007c3c670d8f6630ff71c126e644c9925c9cbaab97b49f01035160ba493", + "b46dd2be517c3bc7b33daef3058647ae265cf18ef1bd02a1ac4e4ec3914913f4", + "fab3a1162fec263be7df92aafddc4721fa6f27b655ae687e80d062dcc598c6c0", + "19f13c7629bb40764bacf3e05478600d2faf13999ee79b18a38570ad57077f2b", + "aff7d68aa9b7453d32e373f61447e17ab2eed6f7c065ed09d5d1a502c9943d64", + "f837a2079d83dd6a5e00fd4efd0046745ba4970e19bbdde09d5b4e0bd17c0f07", + "5a638bcae72faca0ab5613468456df7eba9731a82a6f9e446ae2ccb48a6c5070", + "82292db81666a11f78c25a35007b4238e538a2b37a750d42d71317819750da20", + "ebb0a22a251d5e502f47f67bb34ad01f4b3ae1979355f0ae00b9c1e83a97f54d", + "54aaa739493bf7c4d4aa736d79b9c700a30b3a8dca3d7f347fcfc843434fb971", + "d4ead1ee2cfa1c1498f965da82991410911ea2d75bc362245e2595b367d06d27", + "c21e03afdc3ea9495703068aaf467e73fa37711dd694ca30e06407caaa67e556", + "e1b8b88fe09d23e4da47ba5d8215536b8ac8efaec7ed47ca48b24d8cd764d4e3", + "8666692b352ae2b9b663218b66861cef4f7ad96c73d3fbd3871a59192e552cc8", + "f1661ff3f255cc38a18ca1e8dd2fa7f85ae7b0a55830cec17ce91e9c0c7b4546", + "0f1fd453a6635e699de68f21c3ee7f607af2bee61d97de00eb8b9e8aef53f70d", + "050cb92b1881a1cecbef0ee03fb43c2bf07325e24588116aa5084f0b99423a91", + "5da38c006c3adc309a1378ebd4ed7abea53b51b34aeffb6a486056501772bc14", + "a65fb8bc78e1d585c4530c30e9a254e56afea50f693c3e97c097f4d012d562f1", + "4f392c796802dac6ab8f767cd1ff1b14a3a9af1b4c1178e641c8cf5cb21e5ecf", + "0bad080643c3a1d7abb5506bcc859ada03bca5477f17179016d73fc81bd459fa", + "e36c1003e7efe700df284607c6590453cc134f3ef637a87b00aef3ff2cf50db7", + "e5379ed24957853202ea64dc890956e290dc8be6a2525a34ec5d0e8597bd96cb", + "cdb987d89a0e0c53b2c2399e93e9b0586c7c0c6ff7240ff42061b371061a2939", + "ec3f1e0dbc9d3873b7f4eb4e971d22bd8c7b4c1d62415171a48fc50d8fd5c7a4", + "07d3c81185dcf705064ced36f079b1750a07c3b77db7dedc498d2389e3f58302", + "0ff42cec50691df3863ee453e6427a433a96ad2d0361ef0dbf9b821ce22ced48", + "884f9707baa14664cca0f35682df8b2ceea4e3940232fea6a18aea8825614df4", + "688bac1b64a8ee1e7b4ad6e6c7187bdaec1209295e3f8977cccd9ddc686d93e3", + "46241c66bc2b35bc8302247e4c37126751cebac67382dfb205aed0275adf3102", + "8b402a37fda168e8283823942f7fd38c2d2a8eb52418a9f42409414fc20fd7b2", + "7f513921296f0b6f11875939c5bfa8a92a7cea47f3813b62799e1648ddf73124", + "7ee0546ff6624ae4d33be9bfb50befaf21baa89b7a6d6bb8875eb0e0b0452e36", + "96367297dd6c9eaf440640b72a71075e47400f0a9bc238bc5818aa3ebbc44260", + "4cd77fe584044b823a33f66458817e1c31d6851f21b8ad1e6b7bfef74792170f", + "72d2d7cb9e136dc91fc70a6affd24f8b1952fab2f8773979bc43ecdab86ce94c", + "cd90096a0c5c31c7c890729c2866d6c0966b9d35a761efe015780d1444f12436", + "0d496a29cace9b3f73fc97293c2703436ff83df0960b76a86d5c9b0b6b13a990", + "5ee54fb2eac61773c641fcbdb038a6e996e43a8d4907961f561d849cdf3eff25", + "6b8db9dd8ebb476e7d21f417a4d48c4e4483801396b0de177a7f477908f09c72", + "7249038c87dc979253a4f4924058a84e4038a247d9a378ad66fdc4153234a54f", + "926563522de5be8b93f6463ae208ba5e7d40e88ec98688b1646bc15603d54a2e", + "f827fecebd88f8e57a96da1cef9aac9d35e9022b4b64c300e5db67a6d4009ddc", + "7ecd96acbf0beb0f9dddb2874dbb5f03abbec4a399e3c0d90ad5f7d569f617d7", + "8865752aae6c44a7b73e4b5e560080f215fbe33a9272e7cbdbb1a1b350001413", + "94dd52f550bb7556ccfb2fa61dd80e016fd09c6c26d437eaee4402894fa2ba91", + "23fdbbe336b6071b7b24bd5c4429227c5e58134893514c02649e1d478df75db6", + "5d6b0649efbfca1da1324fe00f0b4cfd7ede401fac1bdaedb39b6e7c8ab5143e", + "4566a28b634af9b98af5d3f90caf1e17d598fc2233192a65f3f22beb9837a914", + "18979eb47ce9d1851d1f019d28993f4a32c3bcc7ee9ac79f76c7a2b2f60e0c85", + "0348c90d956d24890d4de99a31fa7d1c4f49b6e6f9a7a7456cc38800e9af7c7e", + "c00d3371b6406aad790bb09b47997e21a2be16f176c680f12ab91df1ff5cd480", + "7c15648b072cb9ef8f7bdbd6b1f840408db6b1c004b84972ebe7d31fee5f3f77", + "8f3febf8350894083685d095944d34a9f92eee1f6a298115cc540fa3a6cb377d", + "cd20a0916e5e36fb06c001fbc0a549d28344eb8dd8808767ca334b1470eaf4ad", + "b412f8d5810a44f3618f135d09c5fc26f173e03ded190aca38c3bf680502ef37", + "8346cf5a65422912d510615818d7d53917008c988bc3378a72c92f9b8d285a9c", + "b915f47368051c634287b9832ab94a9d13a67a47dd8467309ce01bb7e7a4021e", + "c9b065876d31a4edb3929ebbe5604c727437b82e02aba57ab374159ff8de2637", + "0b55712c9353e304d71b82c81187e0139b48627e26870b2b740cf77830a43806", + "79c34697e8e1e6df83d1ccf14e1119f3c1023dae668ed144d41c311178b020a7", + "87c24274031a90831d66f2709fded69d8f4ecfbf4eb080de80e27c25032d193f", + "c0f34735e7a333926c03ce80ed1b1d40576204c093400b3b35ca9bf8b8ab3fa2", + "4aac7b0271ec7f85ffa7e3a7fe51980b52aa89b776e0ce87b23d6c45ed39165a", + "198142fab8c69bd925c4cb3f53d4eb678dbd34f86b7a4a14d69638b2a4b05abf", + "977ba0cc06e97843ee8f210f83ebabe6f95c8c5ab5fcc7b3e8b37c816d84c14e", + "9a032d4f86dad0f8dcff00d3c050b0127a431ad3b50364dee89624c4473c3b24", + "aef4fd169582363b0ac8d303833c546beab6d2dd44ed076a30ed8f3e4d1696a0", + "81358dd7a973fc19eef6068c8cfb80d4e9c189002ffd0470e6d19da9b6ce5d44", + "ccd76804b1f695d920077be1d9c06dc7baacd4e8796f0f955fae0818e6ed4d1d", + "2b9ff20e7aad15ec41fd31362969ee8e9b9e50c560b2120515a7d72b10fc1c23", + "19c2969b3668ffaa7b54e441930099474226b4efeb63143fd7ac23556fb406bd", + "d04788c154b1852c1599d95c54967a5cfbe9bf1d55a74dd80db7b416f9b8be9b", + "19cbf33a67b86a072466e0bbb5804b9fc98cb64fe663868ae07dafc975b2ed99", + "051c03710694b2ce51e0338e3f4c94e9ebe1db80df856104550dccfe268a1a9c", + "437461dbcb51cd95e3c2d114f75d2ad263326893b8fd4d2b95095899ae5b1b97", + "749909013a73d24ba70d1c39e00fde3966da9cd87d48b1acc24571230f5882d7", + "be692bb61e22c7d7a73b987ac673ff68f1abc2fe866f0844c0195ac0009af3c0", + "e804200ab4fb526eb48d6550958425e97def519086eaf854a53a532bfd6edb84", + "9dc9766396ac26225adb4b1d5f4274186b7e56a640566d37fb065055ab2d911b", + "2afc01e6d6f1b54b875ced27b187f76c1a489f2c071fd2c501b0075c29e04edc", + "2d3c56d949dcc3219289d8f27a0ef16fe9fcb035878daf09cbd3b1452a8eb070", + "19aea1a1e5e7ee0e5f0ac0a243b53d5f5e7b443f289ddc1727fed1fcff989242", + "9e5c579747285a319d7508e40fc6699b85bcbe21fb948a0605de44c6bc7e765c", + "c2261790d40b0e342679c61e021adfe44b7dd8ddaeadb114a9a35be741c1d6bf", + "fb6706f07c5e6ef70ae31b1a32d8fa78c8508d552ec3bd42964e9578f1722462", + "2b6bd8243529d2c1ab49c43981eb8621b3bc2e9dc07c8b9b8707ee76a2913a77", + "5a72f8d57dd638d173ae1973b138a2c56802c807901afc51397c4c2c554c8bd3", + "cc61c6b56ccec3f84acdbac4f34933e9e8be51b9f432f30637dbd0ed62e12925", + "0ebe936ed65cdf42687ea57958ffa3bda320295ba6732736e3bf5c470d0a23a5", + "ab8dfde0c79af5a6079bada89614f8ebf9213aee09c89d59f7a8f47e7893de29", + "17ff137073c853bd1dbc7342e90706c3f6aa8a366606a514dd50e213dd4e498d", + "3b6c41724d438e55d3ce4cb8942ac58b821c94723851911b8db2b80b2f44c9c1", + "7ced5f1e88009574c5dbb53eb745cba1dbec07d87e37df6c81a05352d2f580b2", + "f6c7051a65f517b47439320f7578a506366135ca10e487683a875131d29227e1", + "a96039d35cc5f002ca3b5e70e8a5fa46f4b3f0f4444e39f84e9967372b3095e2", + "075d08cccf9f18ad6f50796896df3bebc899c2b171a9ef13671e14a520ab0695", + "343e5d265e6230cba01e4859936bfa27a7adec1bd7545dd0270d340098ddf668", + "44878f2b04ae23e9607ddace452ddaa54f4b186971eacf0045102486b63af53b", + "29e49a789e74d29668cd9874fe0caf73f461bdad05643263cbf37432a5ff2918", + "815aa9c5b73746fa69781ee4ad28cb7d46811497e454882dd9ec5c3d8c0c1e10", + "1f70390d31be5a6b9873c8eb491bbb79cce0b9509cddea89897dc17f904b74fd", + "9194ef6348011a883ba070f1674f0aee8d2b51957615d5e16bf77f1c1e51d1d6", + "34e50e074dfdd9ac0b273b8892bd14f42c71e460a160cbdfe0aa4d9da868e9bc", + "4b90f8cb5f1fa0ed1215fa2b944d2d7d515cc1ab83fd0a33393d94933ad61a2b", + "7bb0ce67ced5bdf471e1adafa75e6fe9232004613d9ae09e83413385d88a07e9", + "015518a9041a806fd103820dc07bd3b6fc4c3d6c2cd274b0036b1971780edd00", + "cf68d95fc1ae2966bc73e60642fadac51e377f6d459d34d6e09257672d6314a9", + "da455781258a9ad29297bf482f62f2466dc9bc9decd157c5605a0f95a7c9d06b", + "9c9b8e710befaea250e368723ac83eab3d6ecd260ff6b0b6658e9a8ac56addb3", + "d5506907f5cf8fcd4337219bb39812faec8d60bdc121978d196b1f0098819dbd", + "942ba6012e93df51c8ca78ca5cac68b70967c041670685da92416a41327ae6e0", + "3b9b80cba47916e17327404aae6480268881b58255073f1fff24053e5fc64398", + "6f486618bc45d317385038d5751a0159bf8c1646d280c3336446b1258edf5645", + "4a485911481a5285c6cb29991a903d9dc2af03aada3c7aa3ae825dc7ee0db214", + "55038f074ad71fb171a88acbcc0bc23333e65ca9e0d3ee6dc841f761b03ea01e", + "522b31fa936f8d5040af1220722521f4ab1a03a45ca5553a4b89a273abd29515", + "6d468203a76db26e80c1c8b6882bc74229424f6c21ddb0501eb67af3bbfbe03c", + "b7e436aaf9887a62f4ab4d5026958cc45381ee51d520827e5c4e478833acfb4b", + "2f9233aeaedd918c8c751a962333f16e84830a7a118288fc267a3ee9c20e87e4", + "948e04976fbdb76536b50c854bf764f7caf83bffbd14ef246e0cca79a5406dbd", + "778ccd3bd224a56823989ee8167d35f4e8e1753194cb9b0cdca5cb06a35e73f7", + "4c9a5e1c6cdd5daf597664ce48be13bf29248d2db7400efdf79dd6fcc34cdea4", + "95c677759bc56ce0b806b9cf717482b86535e42462a975e0b33e52724ad52f67", + "9a4029fc1d9c798fcfa27c172c3ac6d1becf9ae71ea1398935d79dad89e454d0", + "decf9234dbf449c085442c38ebe53bb2bd78396e76ab1bb7dce926b5bace7fdb", + "5ca73d57f15f37747755a91fac8f9b4f4f3c8d6af1dfaf24d84e8fe191f03c6f", + "b0e2a7e841ab858734527201f1d201d69dae8f111f6a4505b830e14cf7b29979", + "19119f8d3708c4c24601ebd19f86a76fc4c05c7fc5f80be300efd0b0d7a4bf4d", + "245a90a25faeea1c01237ce7e6583f70784cbe8c467b1aadc1e554e9f971ab1c", + "94ef3ab0fc5a5d83b01b34487c5e1abb80312b7b545a571f3c928d21ee1de82c", + "c5ecd36ff1d94317a3d270e1c4a7969fc47f58135c5fd0d73c89f0920cf9b9fc", + "4d283c55898c56ef073b754c21f3986f068525dc12e4fcee394ac81f744f9fd2", + "4a6abb5b65c6b0bb058f982d666f30c36d3e907ae07b0b299cd059d1ad82fa01", + "4db7b2b37940cbe4075d4f18486309edb99fdd6e72e1427dc86d39c56837b307", + "07a415a16a4b383e3c5c2674e97c69ef8cacc347b3d1bfaa9b994d974b14d2a8", + "a780e975d94f94bccc0aaf0d0d22d4e0efeb6e54c56889a64cc09303b4e3d773", + "f7700ea1cfe5cf88bf4851f91e7b354cdb43de0920ac2b9034a3e3546f2748d5", + "ea6ecef8988996e05e090bde7678ae02d74a58903ea93877a1a5b4325e3bba0d", + "5cd812822481416100022f883b4f477d50f5913c4b680c952e0c52240a07b344", + "578ed82d0c9c371a2bf1892956a9c2836e93bc49204cb39e55dd08a3200d6cd4", + "97d62815effd099897b3a8a3200a6ac8363cfc2653bfcd40198326ba0b7cbbf9", + "9723ff8481ab87e535e375b5b7b6909ad0a7b4d7f5e9833dbc3cfe210602569e", + "9eb3a820d88abacd0f2dc7a892a389e3337d32c466a85f859385af07383918c3", + "c3b5bddc32be9e0bcb57ccd32341e9ae02a6d12d9b283b7ae3bd9256c68044a5", + "a7cd3aa1bd69d23e9e7892c254922009dafdfd082a01fe3ed7c29d5fea032b72", + "dc8cb51cc96fafcb37a9022a02b2392f3c33f73c4ce06fd1c8060067c1499c5b", + "ce14f8d35b0aaf0e275b86e9dd1ce6837cf85faf9cb0ad115c57ddbdc87cc304", + "3ea7e3ec73eecc9857d4e5eee9e7540a0ae9f9dc82b72fc4bd353a6a0f153794", + "335a24888bfdedcc28a9536bf54be487fe04d0ef9a32c442cbda14ffecc4a582", + "bf4b0dce57072e85f964f593b3d98e58d2234379f11a15c03355903cf996837e", + "47a1364d550e3f7ba42dea5ed683f3355e6b7ea2f035d0a7f8322794ffcd8b99", + "05c77f4922a0001497c1ad76a08e0aa380d001a2dcf3962b147bce67ca0dad82", + "35577efe7f40a333d26c96fad68ffb930421cb768e94351c8f98d201ee2fe5dc", + "a04e6b1e77decc9d6781038dded8e86b5c630076c00707b77affc6838c3ff77e", + "f61d6725fd84911b33a5f9f92848568df39439743b087d4d752cf57ac55381a2", + "afe801ef65a1cf91e829126ea52a5e29f7321c6276b840ed49d92abaeca66b8e", + "6836c980145f514afd5536be048808016fa4c70ea8b09500204690bd075642ef", + "a4546c541b994f93f3c1e30a6d9b91b10d301d484df8fc8f9720b26bd5580fd8", + "d3e30406542ef259197ecfb58d833c4818922119a5fc374bd93e0d4d5e261cc0", + "9bd48164bd77d1c655fade460aeff710464829c32e9b13249003133fd81f596d", + "c08a7ff629c2ff144cadf3ec8217444d11ae47ef6fbddf70a3736aba90acc0ba", + "0840e54eaa87c36b733d051854a8557d18f9ffce85d9fd3bbedcc27548ab31b9", + "8103fa981ea13c04bf25b7257c59de294248c3b7692c70df0bf42ed3bd719bdd", + "1b2957e258b2b87711ecda9bfeffc7d1ee2c6781ed8f1511a94c3b275ad0ed9e", + "f26273477d39c28ae7cc46ee99188b4bb03f7a27c16c53a32269d2a26c00d6d6", + "ed135b5c94a3c251f407ce841d106a4b8bc2d254c01c1e5d1fe5a3eb3b37795d", + "2c793f609670115be70ac500094c752e049899902e1b8a5edf9cc22c2bbe57fc", + "74b38010bad72be43457b7e60f4eabe22811529a9f4629305ca76308bb12c66f", + "70d7c73ccd53c63d4b8bd3358a0a37a62b7fae6b7eeac0d5c28e6816a10173aa", + "48317e58da4e8f2060ac2eeb6c85986c11f73f3da74070855616382fbeb36cb7", + "84844d315917c078effd7830ad3ee80549c061153e33414425cb3f8b44853adf", + "b8d49690692ffd0a39e794c67c6d55e72a5dd08148f0d0529fe77142ebbc0fa9", + "d3bb308d38df74f7140898d61f95cc3ed1a6d18d8d5fea7641d4599acca09afb", + "36fbaebc460f77450f0504c0490159958097699ed0b1ff7f2d8a974add80a9d9", + "0d8c6c992af5d78d63e428a0139566e7d72a00e12f0f85f56e43922c01c8a3ee", + "658486f87b85a7432e3104333d3b8993b0a2b8fa85d369fb8221818ffca6bf57", + "e7dbcd65f75fe8e297f4ea38ce1f6475b53c8d1650c09c71a36cb42b2e97a04b", + "36671264e5726dd9a33e3ee5b5e35d19e036acab13001530d590ff62e7380f9e", + "5bfebef5d4b30428e8bb84bce5779accf20d9655ea0b01576001a23e5ba88091", + "91fc4dc442fe9850b878bb19c2f76848f41dbe76300aa3bd9065141badcf2648", + "b33fb9f45b2238aa19fae7d79d8dd4a67d81eb83b4646c0a1e803b197a27306f", + "de34653eaf016479dfeb62f1be7dbd56b1d492d145d3239558082f0f7e4c61e1", + "133793b06deea1ec6cc9ee96867a28121a17f607619d175f41827482755b7973", + "8065c21bc65f8b5b5a73d2fa421ccdfc5c9fc45c13b903c397f867cdd4122dbf", + "5deed48cbeaafb2ed772aa533185696da70186fd4b2e5c61105ad24a8839b0c5", + "6c2beabf715815e828257ffe0bf055e58772f977291cbe44073ae784174377a3", + "996330b2bd6959fd143760a253a4ed90a54b393c5bf2ddfd548c13ed6bfd20d7", + "46947c90dca3929bad89182f009d9b01eb606079f2a8987a73a9da7111c9562e", + "7dedeff49c65572104faa00e6b0673d21d801f28a374381f463a4e0ae95bc9d0", + "abe03f05a1535982009929db7637b98aa4695de384bdaa5bce639df7bdb2b888", + "2d88668f062d17cc1421fba5b51ee5e97e458c1be00e83333d9bcda5db4fef42", + "fe1df94648276979dec0d01911274fdefda19c729794fd0627b19f351fa86537", + "cf4b8610ecb168c9755eb35ddb1099d7844856d0c9a9549fbd8ea19836a1817a", + "1d31c26909e417fe1e821bd927e66ca47dfce1fa16c3e5d1dc1ae7e425b59821", + "740cc084a1ca166c851fe6f410fff6a63e74fd4adad6494c4fdc0a5732f0c7d4", + "51278c9ed77dfbb68b4c3078dda018170e3144b24ab8bbe2433373ad0ff888ca", + "5369925cf01be7531fe4be6839bbec7654ab370e0b8e2beca9a41baa205e988b", + "d12ff4141f2dd3d6bcc7f0dbc526564c5eea1d1b55fed251fc777dfc438ff007", + "a50a6060fd1deda5114e9fa2155dcce9697ec12300033874d46664dfb64388b0", + "89b716fe1c0b79824b46d38257532d174dfbbf70c5e589d7b60b3f0b2deb778d", + "49ce1ce860e1dbdcb6dae1a139cf241d38f9b60543267e2140570ba3575bc585", + "98aef625e82517fb8053125c74020fda64fc7fee40110affdcb29d3541d6c970", + "a8b802548713cffb5e5cc85b28faed8d76dbffe20c3613fa35016cc7b14129f4", + "2a83f9bb96e4a27895e75116aad87fb1e406c29c5c1fb3e6e995e0b305ec6f14", + "b102531f55a1d978e1460d3cc75f6a7645b7114c6d5eb3ad2429bde5877c7372", + "9f80ab8c05eacea58a80e05a4ec9f9090ee7f433a8e709a2dfa85da8039c06fc", + "de1eb2c07fa49e96394a858d648e4cc5503df546d39336a188c24b02c2c1e2c2", + "edb432dfbe482849475a55b33df4d0ad8aac824fe3eff05e406195e95515041a", + "40a9a4e02511b5bbb6477d1c2a24c77b55a02e7ca5775881bd7e692983863a50", + "cf5e8a96c20c42cdb6224d1e616d6e2b7e731fddf8ed7baac7bc13621002c664", + "3828ef3f5891655e83a9f8a2f755491dfe56aa3d3376fab9c3d2232c3ab87a9f", + "6c1be04ae7466f4df153599f1dc3b5684bf21c72ce7d04d20a95068c47ba98b6", + "bb16807c99ae3e32bc7b357633551aa8b50738e3b3fae51f9bca79e33cbe9d2a", + "b2b4ccb23dfd75d8226447e0ff70d8361f147abeb4f7073e9e4add52bb9005a4", + "503eaae3945c258a19da7e032dae222f98049e3084a33f82691067c8601f686e", + "0b7071ce9730545c06b46b4b9ba51b64b2f220e2896eaf870c5d05179918c8ee", + "e85afa2542259bafbd29d6f133b5fedcf53c38804746e56c9a1dbe6d2dedec1f", + "ce1e20d5122b7e230b08069f6ba6cb1b0642bf56fab716a9b4404fac3e4c1598", + "05d66d08632efe70e62aecc04fa6aef1c663b32e24495c63f86efe44f0d19221", + "daaa229800ba2dc5b8c05be81af97c82aa867c75264ca59e73da86d40ee24714", + "23f4da5e1e33fdb6b2cc1b705873e67c71a566a1833fd64e030eb2388eb99b2d", + "d18b764f58c9cda74ca3ef104dd39f58c0689fe011d1ceb7eeb7302aba3af99b", + "79dd095ac223e0722415a089582551c38b169986b6cc529493c3ab0b10d3408d", + "b7d584fe2cb85ddd31453f876043a68756430005b58a7bdb5b251c889ee597ee", + "7950315cd67dacf326859f12aeee6871649cd2422e530a091a05a2b6fc39aaed", + "079953da0f9c55ec918a51c99b1f1fe482216520f5610efbc0e937dd2f77dfc9", + "1bf82ba51133173499675039b94746fddc3315b0d7c1b28b8f105b1d7bef38ab", + "45895d75d21c8f8b3cb635602890f44b22e9da9a98b8b501df249fc5ed53df26", + "9844d5fdf4dc75642e77743248fbee7350e47b6c00e76ebef0a97d4c692703f9", + "a173aa6052ff8e5fe4ffc1b4d797a5c2f6218e990ebd89a1e6515bd7fdf2461a", + "cd581455125ae3d3a2cd39be6c3e13e9cc46e347986dfe26c075a801266e67b3", + "1232ee8bfacac2beeb7a50414c57c3d9f172cd6d91915aed7fce6915fe254d2d", + "db464eb753463b1658f438b1fa271049c61695b8a76a1baa4e021d35cbe9d828", + "45e6b17db28fdcdd0908d46e97a705bc37d726d899006acf0425015ced81d58c", + "bdfc14e733c3ca67717178a1b923858a85e45beaea64e0ca8aa083610be4048c", + "2514f3ca66512494b096ca34411dab374ebe71a213997c9d0432282007ea26d7", + "76a24bf0d85b513a60076f6624eb8c8a99b5e748a9059043211cdfaf0445730e", + "ca5af23d611b50080387fe04758fd633a4766dd4d1bc9d8fd6f7e6566d96d379", + "e8a53eb0350a51b3a234678afd06b5b30681b4116218470cc97e4bbcf5f08eca", + "fe003642cec44ef52cac81a28adc80fc796b4e4314236dc1878ef194167e21d8", + "9e6b6f36cb37305dc7403b2a9c741024c1fcdfc6a737c4e6282db89e79f6a84c", + "bf640dbb1506bafd41cbedfc822a7d99ecf9810965127a4b7fa64d71f6aaa283", + "27ff9f44a5e59c45861bed70944a0c1715a9e48a2095e5635ab5390a0ca3927a", + "aca6ef4a8f4e280d38baaef5d03f9c4374e02795013760a3f6c86de5ba40651b", + "8b63d4185e399a1a4a3aa52284646effa1a99f6124123190cbb58604892b6d02", + "d73305cc751c2b8010860844f20d471ea2b4df683b764832a91e6c42929cfbde", + "0a51087840947a9dbcd570015ceb967ef85bc322e92f30ac48ecc40671921df1", + "de2ceccabdcff4675ba9897ff9f1467fe3f39d2241c1c197c5e3581f2d12d392", + "8cdfd2646789943991bee8b94974892129aed376525a2e0a954a537f33bf849a", + "c95b14f172544af5a1e2310fa182fef0b4997a6fa53b8855f067162f68b60903", + "443900be9d185e3e34c0461031f187d0f34f14baecac64d41a1f68d3be4c72c1", + "0ad0456243e7fb72cc412c09d43a873d37da012370ef544417e4db09e1747809", + "014e71b1b7a4e04c9f52b8afa9ae9c2a9bef708f462fd5a265a71bad6dc4a20b", + "82de30f5dbca9ace9d0120b7c196df71ff59bff944e7a68acf8c95d4577d7490", + "6b317261ec074c6a2319c85a8d2bb47733ddb9f3e99dcca3ffd205cfb5c15d18", + "9d4b801b4ef2a1328a2425710ea8e4ab25c9bfa36a9f58db414c0646806befc5", + "6b253e0b2e669962bd58eaff691b8d3cc731677d748bca8b8be97ae547ffa95e", + "0c56a7c71317def1cd713478dc789363ec6194bac234da2d473d8b2275ffd529", + "808e3d3aedc00126363cae56c305b1434d43bd7f75ce0b3e7ba07b024a12355a", + "ba1cf17388f6296d73cb2fe97369acce9149af34230284426bf072cf6699c5f5", + "1518d87b564c1f163334e95888738bac177503cd7ac1727d6d5070af2cac67e4", + "481dfad7077482cdbb8c5ad6122839a487cc19e614a3563cc9200f7a5f4d55ab", + "75a3a1aa454d74f053844c76995cde598839c62690e5040ce61713f1f29a92e8", + "1497b7d1d9739a4934a7db8f2b1c05a4e9daa7d0adb8d4e86022cb8d83ee5b7b", + "80ec19e1e38c81e7d1e1a06ab3fd52931df0bc7dce31d7130c79054427e68301", + "941a1d31e361692aa5be2b50365d376a59458ce659d83e8454f318e2b0cda3e8", + "13a260a9517c0b3585e10e3784de521341186a2024fc9535fbb8de44783cdd6b", + "d568a9234f7939248203fa48d2fa6e4bcc46df7e8e907e2515721d984dead26b", + "eb15aa52a62753fad8d2eb88723e6d463f7563d79728832a7db3d3f821ebb832", + "df75869a8e46b44978f958cb22d853a0c5ff2c9651b7aeaafa8125f3c14e8a2d", + "e3bcfb84032e8c6c1621c8417505ebddad05f2c9ff53570c6c914fc7e41b7730", + "f39088ea1f02902f75d42648610e00ae17c9ff44d6b18340dbfd1f82755fb961", + "12c34893f97da1507f8e7af1c810e16b059d72f1a32f46a02be31896aaf9f878", + "197085c73b1579d548abbcf7a126ffcc449fa9bb146d7338b40aeaec317ca521", + "62643d9079466fa762c526bd058b635758f14b0a2f7f984148a0acafff912208", + "2c0f747370111c82b0a14d905422bec1768eccb2de2fb5b28ad82dc8360fd7c5", + "69384468ea13b6e9f2326a96885789888fa8362d2c6f1665d4fc4db7933329ff", + "15f70927bfc8c430b364ca2f2579a797b60387e5664c74ee6b5e987cb95e65ae", + "3c3875d94f661ed0003f138025a937f61fc8e8ae88015b95aa910d423c34b639", + "e9d5594b2724ee14beeb1e995eb2afffed8b9744d8cb1b38abd4e7e3cbd4b3f7", + "caeaa6f195a991a70cb263650df57b6dcbd025099d5f8ef544e5c55347dd1e7a", + "ca0c8d66b84e2a240534df6c0581f23de18fbe29111f3a7160a2803050194b87", + "f9be39a9c9f68400b5374b4c50c7be20b34035fae60806346139a7a8b6344fda", + "a86f87ded290adef580b3d233e1135c3ff7deb637080b5eb52928d8557830a2c", + "88873fc6e56280d52784209bfd078667c41779941741ef9d486b489521099723", + "90babbf9a0e577fc69e1ed18294084d527a07df6e59addbf35ce9ae3a21b9786", + "e1417a7ed31f2904418871fbe047d83648851a8f9266618c3e0b1d030a639c5e", + "e53cb9d1d2491fa03ad52e3dbe59d1fe9e0ec9b102e157ccaae5a2a5593c0cde", + "f6c3f034a6e0920e594d9e463d88ef7c1a7ec14e43e850f811e34fd25b61778f", + "332a679796668481ed0e1737684ce13084663d0f444301dbcc8bc6c79c221ce5", + "bf7e258086bb4c3165300e96d37b2fa250ac8e0df29fe77f69945ba0edac20d8", + "f166d179ce19766c4a07c2b7571bbc28987a7c550a2c900bffb3e2188f8d6e0f", + "8cccc72a50ca585a6752cd74577e16cd685084e130b3cba0663221da67a65c00", + "953730fb4c5066a84cde079aa8340f22db397bc02083d045b91b562b5629a79e", + "ab1c79143fa95a349d0e7b6b8c49af842b53508f7c295fb13ef3530d2bb7ad5a", + "9ac273ad3c304c616a04906f2429342c0d14e8927bc69cd5da8e78b8e8dcdd96" + ] +}