{"assessments":[],"deployments":[],"fuzz":[],"identity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"interpretation":"Records acceptance and evidence. Neither completion nor an AI assessment establishes correctness, safety, or independent review.","jobId":"266f3b46-8ba8-4025-9ec3-da167a14c3aa","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"2e36ea073961bad96dd6febb647617766dbc7dd283fa14f32855a15d309c8a9e","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_economics","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"ac626ba0d50dea1cc907cd52760081c6db22f1665b12c78d1fdb65942b17e357","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_flow","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"58d7991ee1e03c5a09a59fa5b71311acaa9dde9208ccb411a64413dbd4fecf1d","dependsOn":["build_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"b89279670f5a00f5d26286edee00c97dd158b997031350a01cafe6e0329ad227","skillId":"audit-judge","subagents":4,"tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"b89279670f5a00f5d26286edee00c97dd158b997031350a01cafe6e0329ad227","skillId":"audit-judge","state":"accepted"},{"acceptedSubmissionHash":"d92d36c327f94ae0d46ed655fae59c36d213d952352d5dedf306894645abad5e","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_math","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"5ac15a0fca05fb277e15dc2fb78770fdc148333efe3d8d593a6e6b3aa86e62a1","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_permissions","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"cc50b8f1fc216b8fc07dde81e2caf069e04befc5ad81b6a6f8dd5cc461e4fc88","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"15b04fc8f60521936b9e2b37c09a804685ec689fc98cd5b04510d986d3106a15","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"15b04fc8f60521936b9e2b37c09a804685ec689fc98cd5b04510d986d3106a15","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"3f9ad126627bf3a36a3fa3cb60165c1e9741085ac1c230065fae2604f2dbe45c","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"c329099e8a55aea55f31418f197028bf59e1e1a90666517f78484046f93e47d9","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"606842ccca0e7c5d3017a54684625438eab9b351eb51dcf0cf88c43d1ea41464","skillId":"write-foundry-tests","subagents":4,"tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"606842ccca0e7c5d3017a54684625438eab9b351eb51dcf0cf88c43d1ea41464","skillId":"write-foundry-tests","state":"accepted"}],"objective":"_Squeek Companion — dynamic ERC-721 on Sepolia (Squeekchain)\nMD Job Brief (Job 1/2 — Contract) — \"Squeek Companion\": dynamic ERC-721 on Sepolia\nGoal\nBuild, test and deploy on Sepolia (chain ID 11155111) a dynamic ERC-721 collection\n\"Squeek Companion\" whose artwork and traits change automatically with Squeektoshi's real\nactivity, derived fully on-chain from SqueekCore. No oracle, no keeper, no upkeep transactions.\n(This is job 1 of 2. Job 2 will build the mint/gallery website on top of the deployed\ncontract address from this job.)\nBackground\nSqueekchain is a hamster-powered proof-of-work \"toychain\" on Ethereum Sepolia. SqueekCore\nsettles the hamster's wheel work in 10-minute rounds.\nDocs: https://docs.squeekchain.com (SqueekCore page documents every function; published ABI\nJSON under Developers > Deployments).\nSqueekCore proxy on Sepolia: 0x74665dAecA35A2303e767E76a2FF1FB6F93e119f\n(Transparent proxy, implementation v3 — always call through the proxy address.)\nKey reads (permissionless view functions):\nstate() -> CoreState { settledThroughRound, cumulativeBlockUnits, ... }\n  Squeek block height = cumulativeBlockUnits / 1_000_000_000\nroundPage(afterRound, throughRound, maxRecords) -> active rounds only, 0-16 records.\n  Reverts with InvalidRoundPageBounds on reversed ranges or ends past the frontier —\n  clamp inputs (if frontier < 12, start at round 0).\nContract requirements\nERC-721, name \"Squeek Companion\" (placeholder), symbol e.g. SQUEEKCOMP, fixed supply 999.\nFree public mint on Sepolia, max 1 per wallet (900 tokens for the public).\n99 tokens reserved for the owner address\n  0x3C7838665Ff8215c95500E1a6306e19E146674a0\n  (mint to the owner at deploy, or via an owner-only reserve function; the public mint\n  must never be able to touch the reserve).\nOn-chain hamster-state derivation in the contract:\nRead state() for settledThroughRound and block height.\nRead roundPage(frontier-12, frontier, 16) (12 rounds ~= 2 hours).\nRules: active round with work > 0 in last 3 rounds -> RUNNING;\n    else active round with work > 0 in last 12 rounds -> NAPPING; else SLEEPING.\nFully on-chain SVG inside tokenURI (data-URI JSON), re-rendered live on every read:\nPixel-art hamster: eyes open + motion lines + warm background when RUNNING;\n    eyes closed + \"Zzz\" + night background when NAPPING;\n    deeper night + moon when SLEEPING.\nOverlay text: current Squeek block height (dynamic).\nMetadata attributes: state (RUNNING/NAPPING/SLEEPING, dynamic),\n  squeek_block (dynamic), mint_block (static).\nImmutable contract (no proxy, no upgradeability). No other owner backdoors.\nFoundry test suite: state-derivation logic against a mocked SqueekCore covering\n  RUNNING / NAPPING / SLEEPING / frontier-edge cases; mint limits; reserve protection.\nNon-goals\nNo mainnet deployment. No token sale, no real money.\nNothing that encourages or forces the hamster's behavior — the NFT only reflects\n  observed on-chain state.\nNo website in this job (job 2).\nAcceptance criteria\nDeployed on Sepolia; source verified (or ABI published); deployment tx linked.\nmint() works from a fresh wallet; 1-per-wallet limit enforced; 999 cap enforced.\n99 reserve tokens held by the owner address; public mint cannot mint them.\ntokenURI returns valid data-URI JSON; SVG visibly differs across the three states\n      (demonstrate by simulating each state).\nREADME with contract address, how state derivation works, and how to verify it.\n\nToken symbol: SQCOM\nToken name: _Squeek Companion","parentJobId":null,"planHash":"e4dca7013a83018b74cc27f7566cc07e226135f0c5c5e851723e9ac08ac7627f","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"266f3b46-8ba8-4025-9ec3-da167a14c3aa","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2694-squeek-companion"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52619","feedbackHash":"5e6e9b8a72a7a78f7c14e4b359e9b0a39c6a89999e59547f9343dd33bb6bb972","nodeKey":"audit_economics","submissionHash":"2e36ea073961bad96dd6febb647617766dbc7dd283fa14f32855a15d309c8a9e","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52626","feedbackHash":"6462603a55b33d71e181be67c9c360a326a56451268217950fe88687604354b8","nodeKey":"audit_flow","submissionHash":"ac626ba0d50dea1cc907cd52760081c6db22f1665b12c78d1fdb65942b17e357","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52272","feedbackHash":"9046a06446ca8c5e5ecadb13e4f8ea4376e84a6c7f3eecb6002954241ee8e786","nodeKey":"audit_judge","submissionHash":"58d7991ee1e03c5a09a59fa5b71311acaa9dde9208ccb411a64413dbd4fecf1d","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51368","feedbackHash":"34542dc725118c90be52cbcbd6ad4699f528cb47561368c2d97a6d2c638b6e02","nodeKey":"audit_math","submissionHash":"d92d36c327f94ae0d46ed655fae59c36d213d952352d5dedf306894645abad5e","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52671","feedbackHash":"907d50e3be7a1de7e8a171705fc752e712fa70e803fef67d1d6c82851bbb6b3a","nodeKey":"audit_permissions","submissionHash":"5ac15a0fca05fb277e15dc2fb78770fdc148333efe3d8d593a6e6b3aa86e62a1","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50987","feedbackHash":"53a2b43f6370c94650afa00e5085c6ebe35e27a816c2bcdb6c1b9e5e10cfd951","nodeKey":"build_contract_project","submissionHash":"cc50b8f1fc216b8fc07dde81e2caf069e04befc5ad81b6a6f8dd5cc461e4fc88","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52344","feedbackHash":"133cbae95a51cb953fa7bc8ab080ec2aa85dd76614f18418674cef1394659903","nodeKey":"manifest","submissionHash":"3f9ad126627bf3a36a3fa3cb60165c1e9741085ac1c230065fae2604f2dbe45c","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51013","feedbackHash":"b7fa7ed07a8179fd0f888b7630bc16ec58a772e2612d74b21eb57586eb0a6401","nodeKey":"write_foundry_tests","submissionHash":"c329099e8a55aea55f31418f197028bf59e1e1a90666517f78484046f93e47d9","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"fdfa0598349e50aee566722392ee41a46d1cfe43f308f18b6709f82b14047f20","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"523b06a3dd921f5d","findings":[{"citation":"resolved","description":"mint() limits claims per msg.sender only. A contract that calls mint() from its constructor has no code yet, so _safeMint (line 49) skips the onERC721Received hook. That contract can then pass the token on with transferFrom in the same constructor. A single helper contract can deploy N of these one-shot minters in one transaction, each a fresh address that passes the hasMinted check, so the per-wallet rule does not stop one actor from taking the entire public allocation. The brief asks for 'max 1 per wallet' and the code enforces it per address as written, so this is a limit of the economic design rather than a broken check. It matters because the 900 public tokens are meant for the public, and on Sepolia gas costs nothing. Every fix changes the agreed design, so it is the requester's decision: an EOA-only rule (msg.sender == tx.origin, which also blocks smart-contract wallets), an allowlist or signature, or accepting and documenting the limit. The README currently says only 'one lifetime public claim per caller'.","line":44,"path":"src/SqueekCompanion.sol","reproduction":"On a fresh SqueekCompanion: deploy BulkMinter, whose run(c, n) does `for i<n: new OneShotMinter(c, msg.sender)`. OneShotMinter's constructor does `uint256 id = c.mint(); c.transferFrom(address(this), to, id);`. The attacker calls BulkMinter.run(c, 150) six times. Measured with forge: 150 mints in one transaction cost 20,554,919 gas, under the 30M block limit. Final state: balanceOf(attacker) == 900, publicMinted() == 900, and a fresh wallet's mint() reverts with PublicSupplyExhausted. Expected under a per-person reading of '900 tokens for the public': one actor cannot take more than one public token. Actual: one actor takes all 900 in 6 transactions.","severity":"low","snippet":"        if (hasMinted[msg.sender]) revert AlreadyMinted();","title":"The one-per-wallet limit is the only distribution control, and one actor can claim all 900 public tokens in six transactions by minting from contract constructors"}],"hash":"2e36ea073961bad96dd6febb647617766dbc7dd283fa14f32855a15d309c8a9e","nodeId":"28448fbb-78a9-4672-b627-dfedafdb6fd4","outcome":"completed","summary":"I found one low-severity issue and nothing medium or higher. The results are in `.imd-findings.json`: one finding and coverage rows for all 6 entry points, plus 3 invariants. No repository files were changed. I wrote scratch tests under `test/scratch/` to check things and deleted them afterwards.\n\n**Finding 1 (low): one person can claim all 900 public tokens.** See `src/SqueekCompanion.sol:44`. The limit is one mint per address. A contract that calls `mint()` from its constructor has no code yet, so the safe-mint step doesn't check whether it can receive NFTs. It can then hand the token on straight away. A small helper contract can create 150 of these throwaway minters in one transaction, which I measured at 20,554,919 gas, under the 30M block limit. Six transactions leave the attacker holding 900 tokens, and a fresh wallet's `mint()` then fails with `PublicSupplyExhausted`. The code does what the brief literally says (\"max 1 per wallet\"), so this is a limit of the design rather than a broken check. Every fix changes the agreed design, so it's the requester's decision: allow only regular wallets (which also shuts out smart-contract wallets), use an allowlist or signature, or accept and document the limit.\n\n**What holds:**\n- **Mint:** the 999 cap and the \"one claim per wallet, ever\" record both hold. Public IDs run from 100 to 999, and all bookkeeping is written before the receiver callback, so the callback can't mint a second time.\n- **Reserve:** IDs 1–99 go to `0x3C78…74a0` at deploy, and nothing public can reach them. There is no owner role or backdoor, and no burn.\n- **Transfers and approvals:** these are standard OpenZeppelin 5.4 code. A transfer never resets the claim record or changes `mint_block`.\n- **State derivation:** I checked it against the live Sepolia Core in a fork test at block 12025000. `currentState()` returns SLEEPING (frontier 1973, Squeek block 13095), and `tokenURI` and `mint` work. The contract's strict checks on Core's round data are correct against live Core: the returned page ends exactly at the frontier, and its work total matches `state()`. The 3-round and 12-round windows match the brief.\n\n**Not a finding, but worth knowing:** Core emitted no events in the roughly 12 hours of history my free Sepolia RPC could reach, and its frontier stayed at round 1973. The NFT dates everything from that frontier, so during a pause in settlement it keeps showing the last settled state. If settlement ever stalls just after a stretch of activity, it would keep showing RUNNING. The brief asks for this frontier-based rule and the README documents the behaviour, so I didn't report it. I couldn't find out how often Core normally settles: the docs site blocked my requests, and the RPC had no older history.\n\nI didn't attach a proof test, since that's only required for critical or high findings. The steps to reproduce are in the finding. The existing suite passes: 76 tests.","treeHash":null,"usage":{"cachedInputTokens":1088331,"inputTokens":46,"model":"claude-opus-5-5","outputTokens":16069,"runtime":"claude","turns":24,"wallClockMs":263818}},{"artifacts":[],"attempt":1,"bundleHash":"326be1e5ba3d622c1adb3aa033f9c728f2a769521729425d565f554b9bb1ade0","device":"ab846a7d68ed31f8","findings":[],"hash":"3f9ad126627bf3a36a3fa3cb60165c1e9741085ac1c230065fae2604f2dbe45c","nodeId":"5b5d658c-1000-4bc6-b190-d1191d923b79","outcome":"completed","summary":"Created [launch.json](/home/imd/.identitymd/work/266f3b46-8ba8-4025-9ec3-da167a14c3aa/5b5d658c-1000-4bc6-b190-d1191d923b79/launch.json) listing `SqueekCompanion` with no constructor arguments, matching the accepted ABI.\n\nOnly `launch.json` changed. Local manifest checks and `forge build` passed; `forge test` passed all 76 tests with the required fuzz seed.","treeHash":"ae713cacfa192f8ed8f28390da0433783068c085","usage":{"cachedInputTokens":171904,"inputTokens":50832,"model":"gpt-6-astra","outputTokens":2581,"runtime":"codex","turns":3,"wallClockMs":99701}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"ef31844bb462de78","findings":[{"citation":"resolved","description":"mint() enforces the brief's 'max 1 per wallet' per address. A contract that calls mint() from its constructor is a fresh msg.sender with hasMinted == false, has no code yet so _safeMint (line 49) skips the onERC721Received hook, and can transferFrom the token to its deployer in the same constructor. A helper that loops `new OneShotMinter(c, msg.sender)` collects 150 tokens in about 20.5M gas, so one actor drains the whole 900-token public allocation in six Sepolia transactions and a genuinely fresh wallet then reverts with PublicSupplyExhausted. The reserve (ids 1-99) is not affected: public ids are always 100..999. Both specialists (audit_permissions, audit_economics) reported this same root cause; it is one finding. The check is correct as written and the acceptance criterion '1-per-wallet limit enforced' is met literally, so this is a limit of the agreed design, not a bypass: severity low. Any fix is a requester decision (msg.sender == tx.origin blocks Safe/ERC-4337 wallets; an allowlist or signature gate changes scope). At minimum the README (line 16, 'one lifetime public claim per caller', and line 74) should state the limit is per address and Sybil-able.","line":44,"path":"src/SqueekCompanion.sol","reproduction":"Foundry, fresh `new SqueekCompanion()` (any chain; no Core needed for mint). Contract OneShotMinter's constructor does `uint256 id = c.mint(); c.transferFrom(address(this), to, id);`. BulkMinter.run(c, n) does `for i<n: new OneShotMinter(c, msg.sender)`. From one EOA `attacker`, call BulkMinter.run(c, 150) six times (measured 20,554,564 gas for the first call, 20,520,364 for each later one, all under the 30M block limit). Expected under a per-person reading of '900 tokens for the public': attacker holds at most 1. Actual: balanceOf(attacker) == 900, publicMinted() == 900, hasMinted(attacker) == false, and `vm.prank(fresh); c.mint()` reverts with PublicSupplyExhausted. Verified with test/scratch/Sybil.t.sol on this tree (passes, i.e. the drain succeeds).","severity":"low","snippet":"        if (hasMinted[msg.sender]) revert AlreadyMinted();","title":"One-per-wallet limit is keyed on msg.sender only: one actor can take all 900 public tokens via throwaway contracts (merged: audit_permissions + audit_economics)"},{"citation":"resolved","description":"The README (line 119) says dependency checksums are recorded in docs/dependencies.json and docs/VALIDATION.md line 17 states 'All 46 vendored dependency files matched their recorded checksums'. Five vendored files under lib/openzeppelin-contracts do not hash to the recorded values: contracts/token/ERC721/ERC721.sol, contracts/token/ERC721/IERC721Receiver.sol, contracts/utils/Base64.sol, contracts/utils/Strings.sol and contracts/utils/math/Math.sol. The recorded values are the genuine upstream v5.4.0 hashes (confirmed by fetching the files from the v5.4.0 tag), but the vendored copies were reformatted (forge-fmt style line wrapping, braces added around single-statement if/else in Strings.sol). I diffed each against upstream: the differences are whitespace/formatting only, so the ERC-721 behaviour, Base64 and Strings are semantically upstream v5.4.0 and this is not a code-safety defect. It is a provenance defect: the launch handoff (README step 1-4) and any reviewer who follows the documented procedure to verify the vendored dependencies gets a mismatch, and the validation document asserts a check that does not pass on the delivered tree. Fix: either re-vendor the byte-exact upstream files (and keep fmt's ignore = [\"lib/**\"] effective) or regenerate dependencies.json from the tree and correct VALIDATION.md.","line":10,"path":"docs/dependencies.json","reproduction":"In the repository root run `shasum -a 256 lib/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol`. Expected (docs/dependencies.json line 10): 330a87f2bf94083df8ddd341735d712866455042aaca58d33ee1799773e1cae1. Actual: 94455991c575f84ffce31711b161b5043d967c99c35124277eb94b1b21ae4909. Likewise IERC721Receiver.sol actual c9d1f120dd53a7eab2b2f14011c9b2028be9e9292a4850941fe0e18c905c8438 vs recorded eafee3ff...; Base64.sol actual 8da6395aef4f73794a2c7e72746da9262502d90217507bdc1db2a2a9cd3c5463 vs recorded b24abf66...; Strings.sol actual 9997eca10909cad68109c56ee223e16bcf943cbf5fd9ced24aa127911d5a40e6 vs recorded 2db7d211...; Math.sol actual da166443095b4f43249716186d2940dc17dc3367e05b6ae8a16247f918d3f8cb vs recorded 92fee281.... `curl https://raw.githubusercontent.com/OpenZeppelin/openzeppelin-contracts/v5.4.0/contracts/token/ERC721/ERC721.sol | shasum -a 256` gives the recorded 330a87..., and `diff -w` of that download against the vendored file shows formatting-only changes.","severity":"low","snippet":"      \"contracts/token/ERC721/ERC721.sol\": \"330a87f2bf94083df8ddd341735d712866455042aaca58d33ee1799773e1cae1\",","title":"docs/dependencies.json records upstream checksums that five vendored OpenZeppelin files do not match; VALIDATION.md's 'all 46 files matched' claim is false for this tree"}],"hash":"58d7991ee1e03c5a09a59fa5b71311acaa9dde9208ccb411a64413dbd4fecf1d","nodeId":"d045dcd6-cfbf-4776-9bbb-dec8abc9a11c","outcome":"completed","summary":"Review complete. The findings file is written at `.imd-findings.json` with two low findings and ten coverage rows, and the scratch tests are removed.\n\n**Outcome:** no critical, high or medium defect. The contract does what the brief asks, and I verified it against the live Sepolia SqueekCore, not only the mock.\n\n**What I checked**\n- Build and the full suite pass (108 tests, including the invariant runs).\n- The pinned read interface matches the published SqueekCore v3 ABI field for field.\n- On a Sepolia fork the derivation ran against the real proxy: frontier 1973, the page checks hold, result SLEEPING at height 13095, and tokenURI renders. A historical window with active rounds confirmed strictly increasing cumulative work, end equal to the last checkpoint, and start equal to the point position, so the InvalidCorePage guards cannot spuriously revert.\n- The five ERC-721 entry points are stock OpenZeppelin v5.4.0 with no override. mint commits all effects before the receiver callback, ids 100 to 999 can never reach the reserve, and the 900 cap is enforced.\n- The manifest has only the schema keys and an empty argument list matching the parameterless constructor. The constructor makes no external calls, so it deploys on an empty chain.\n- All six aderyn lines are intentional or harmless.\n\n**Findings kept**\n1. **Low, merged from permissions and economics.** The one-per-wallet rule is per address. A contract that mints in its constructor and transfers the token out lets one actor take all 900 public tokens in six transactions. I reproduced it with a scratch test. The check is correct as written, so this is a design limit for the requester to decide on, at minimum by disclosing it in the README.\n2. **Low, new.** Five vendored OpenZeppelin files do not match the checksums recorded in docs/dependencies.json, and VALIDATION.md claims they all matched. I fetched the upstream v5.4.0 files: the recorded hashes are genuine and the vendored copies differ by formatting only, so behaviour is unaffected. The provenance record is still wrong for the delivered tree.\n\n**One note, not a finding:** the constructor costs about 7.2M gas for the 99 reserve mints. The launch gas ceiling must cover it, which I could not check from here.","treeHash":null,"usage":{"cachedInputTokens":613236,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":22391,"runtime":"claude","turns":29,"wallClockMs":342441}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"e293ff3324f7ddb5","findings":[{"citation":"resolved","description":"mint() limits each msg.sender to one token, and the brief asks for 'max 1 per wallet'. A contract deployed in the same transaction is a new msg.sender with hasMinted == false. It can mint from its constructor (or from onERC721Received for a deployed receiver) and pass the token on at once. One externally owned account can therefore deploy N child contracts and collect N tokens, so the 900 public tokens are not spread across distinct people. This is the usual Sybil limit of a free mint, not a bypass of the reserve: the reserve stays safe because public ids are always 100..999. I report it because it changes the fairness the requester likely expects. The obvious fix, msg.sender == tx.origin, would lock out smart-contract wallets (Safe, ERC-4337) that the brief's 'fresh wallet' acceptance may need. That is a design decision for the requester, so this finding asks only that the README state the limit is per address and Sybil-able, unless they choose an allowlist or signature gate instead.","line":44,"path":"src/SqueekCompanion.sol","reproduction":"Foundry, local deployment of `new SqueekCompanion()`. Contract Minion's constructor calls `c.mint()` and then `c.transferFrom(address(this), attacker, id)`, and it implements onERC721Received. Harvester.run(c, n) runs `new Minion(c, msg.sender)` n times. Called 3 times by one EOA as run(c, 300), each call used about 57.4M gas (about 191k per token). Afterwards balanceOf(attacker) == 900, and a fresh wallet's mint() reverts with PublicSupplyExhausted. Expected (as the brief says '1 per wallet'): a single actor gets at most 1 public token. Actual: a single actor gets all 900 in about 6 transactions of 30M gas each on Sepolia, at no cost beyond testnet gas.","severity":"low","snippet":"        if (hasMinted[msg.sender]) revert AlreadyMinted();","title":"1-per-wallet limit is keyed on msg.sender only: one actor can claim the whole 900-token public supply through throwaway contracts"}],"hash":"5ac15a0fca05fb277e15dc2fb78770fdc148333efe3d8d593a6e6b3aa86e62a1","nodeId":"70537496-8284-4f30-85ce-1b7ddb2f4d09","outcome":"completed","summary":"I finished the permissions review of `src/SqueekCompanion.sol` (Access Control, Trust Gap and Asymmetry guides) and found one low-severity issue; nothing critical, high or medium. The results are in `.imd-findings.json`. The full suite passes (76 tests), and the working tree is unchanged: my scratch test is deleted and git status is clean.\n\n**Finding (low):** the one-per-wallet limit is keyed only on the caller's address (`src/SqueekCompanion.sol:44`), so one person can take the whole public supply.\n- **Reproduction:** I wrote a throwaway contract whose constructor calls `mint()` and then sends the token to one account. Deploying 300 of these per transaction, three times, left that account holding all 900 public tokens. A fresh wallet's `mint()` then reverted with `PublicSupplyExhausted`.\n- **Cost:** about 191k gas per token, so roughly six 30M-gas transactions on Sepolia.\n- **Fix:** checking `msg.sender == tx.origin` would close it but also lock out smart-contract wallets (Safe, ERC-4337), so this is the requester's call. At minimum the README should say the limit is per address. An allowlist or signature gate are the other options.\n\n**What holds:**\n- **Reserve:** tokens 1–99 are minted to the fixed owner address in the constructor, which never uses `msg.sender`, so the deploying factory gets no role. Public mints always get ids 100–999, so they can never reach the reserve, and the 999 cap holds.\n- **Re-entry on mint:** the mint counters are written before the receiver callback, so calling `mint()` again from that callback with the same address reverts.\n- **No backdoors:** there is no owner role, no privileged function, no proxy, and no delegatecall or selfdestruct.\n- **Approve, setApprovalForAll and the transfer functions:** these are stock OpenZeppelin v5 with no overrides. `mint_block` stays fixed through transfers, as the brief requires.\n\n**Trust assumption, not a defect:** SqueekCore is an upgradeable proxy. Its admin could change or break `state()` and `roundPage()`, which would change or block `tokenURI` and `currentState`. Minting, ownership and transfers don't depend on it.\n\n**Coverage:** every listed entry point has a coverage row. I also checked the constructor, the no-backdoor rule and the SqueekCore dependency. I did not go deep into the state-derivation logic or the SVG rendering, since those belong to the other reviewers.","treeHash":null,"usage":{"cachedInputTokens":176215,"inputTokens":12,"model":"claude-opus-5-5","outputTokens":5621,"runtime":"claude","turns":6,"wallClockMs":106412}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"790f4e545968ee92","findings":[],"hash":"ac626ba0d50dea1cc907cd52760081c6db22f1665b12c78d1fdb65942b17e357","nodeId":"ad68ab18-1745-4e2a-a8a5-780bb7d6b676","outcome":"completed","summary":"I found no defects I could back with a concrete failing input, so `.imd-findings.json` has an empty findings list and 10 coverage rows. That covers all 6 listed entry points (all `holds`) plus the constructor, the state derivation against live Core, and two invariants. No repository files were changed; the scratch fork test I wrote was deleted and the working tree is clean.\n\n**What I checked, using the Execution Trace, Periphery and First Principles guides:**\n- **The project's own suite:** all 77 tests pass.\n- **`mint()`:** the claim flag, the counter, the token ID (100–999) and the mint block are all written before the `_safeMint` receiver callback. A re-entrant mint reverts with `AlreadyMinted`, and a receiver that rejects the token undoes the whole mint. The counter goes up by exactly one per mint and stops at 900, so public mints can never reach the reserved IDs 1–99.\n- **Constructor:** the 99 reserve tokens go to `0x3C78…74a0` via `_mint`, which makes no external call, so deployment works on an empty chain. That address has no code on Sepolia, so it is an ordinary wallet and can hold the tokens. There is no owner role and no reserve function.\n- **Transfers and approvals:** these use unmodified OpenZeppelin 5.4 ERC-721 code. They never touch the mint flags or mint blocks, so `mint_block` stays fixed through transfers.\n- **State derivation against the real SqueekCore:** I ran the contract on a Sepolia fork. It returned SLEEPING at frontier 1973 and Squeek block 13095; the last round with work was 1910. `tokenURI` cost about 475k gas.\n  - Live calls confirmed what the contract assumes about `roundPage`: `start` and `end` are the ledger positions at the window edges, the checkpoints hold running totals of work, and `certifiedThroughRound` equals `throughRound`.\n  - Live Core reverts only when the range ends past the frontier or more than 16 records are requested. The contract does neither.\n  - The windows match the brief: work in the last 3 rounds means RUNNING, otherwise work in the last 12 means NAPPING, including when the frontier is below 12 or 3.\n\n**Not a finding, but worth knowing:** SqueekCore's frontier moves only when its reporter settles rounds. It sat at 1973 for over 20 minutes, more than two 10-minute rounds, and the contract follows the brief in reading it. So if settlement stops, the NFT keeps showing the last settled state instead of drifting to sleep. The README already says this.\n\n**What I couldn't reach:**\n- The public RPC keeps only about 128 blocks of history, so I couldn't replay the contract against past RUNNING or NAPPING moments on chain. Those states rest on the mocked tests plus the live data structure matching the mock.\n- The SqueekCore docs and published ABI are behind a Cloudflare challenge, so I checked the interface against live calls rather than the docs.\n- I made no proofs, since there were no high or critical findings.","treeHash":null,"usage":{"cachedInputTokens":1260437,"inputTokens":48,"model":"claude-opus-5-5","outputTokens":15274,"runtime":"claude","turns":24,"wallClockMs":305471}},{"artifacts":[],"attempt":1,"bundleHash":"4be3d41e95953e29b6248b26fc0029a1c1662f6dff7811a1dabcfbd2556b6ca7","device":"84a29c6575331b77","findings":[],"hash":"c329099e8a55aea55f31418f197028bf59e1e1a90666517f78484046f93e47d9","nodeId":"0d834ad1-e1e2-4936-926d-31dac25d7efa","outcome":"completed","summary":"Added adversarial state, callback, mint-limit, reserve, and authorization tests, plus two invariant campaigns.\n\n`forge build` and `forge test` pass: **108 passed, 0 failed**, using the required seed.\n\nOnly `test/` files were added. No confirmed production defects found.","treeHash":"d5f14c48e5b7112ad3f1865865a618e95ec4ac6b","usage":{"cachedInputTokens":1848064,"inputTokens":160019,"model":"gpt-6-astra","outputTokens":25877,"runtime":"codex","turns":8,"wallClockMs":1077477}},{"artifacts":[],"attempt":1,"bundleHash":"cf82ef478739aead66532acd72fa455fd0c7bfce907dfe9e2a1d5084e3442127","device":"18527ba42d5b89d7","findings":[],"hash":"cc50b8f1fc216b8fc07dde81e2caf069e04befc5ad81b6a6f8dd5cc461e4fc88","nodeId":"566636ef-93b9-46e2-b6f5-7ddfc567e0e3","outcome":"completed","summary":"Implemented the immutable collection, protected reserve, lifetime mint limit, live SVG metadata, vendored dependencies, ABI and three state previews. Details are in [README.md](/home/imd/.identitymd/work/266f3b46-8ba8-4025-9ec3-da167a14c3aa/566636ef-93b9-46e2-b6f5-7ddfc567e0e3/README.md).\n\nValidation passed: `forge build`, `forge test` (**76 passed**, requested fuzz seed), `forge fmt --check`, and metadata export checks.\n\nSepolia deployment, confirmed address, transaction link and explorer verification remain pending the separate IMD launch.","treeHash":"fb92c42d95430f897c6d5b763a0fbc3bc6af7125","usage":{"cachedInputTokens":1871744,"inputTokens":81917,"model":"gpt-6-astra","outputTokens":38386,"runtime":"codex","turns":7,"wallClockMs":1345998}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"bf4c5b8707945096","findings":[],"hash":"d92d36c327f94ae0d46ed655fae59c36d213d952352d5dedf306894645abad5e","nodeId":"f90b4311-4ffd-4fd6-a95e-ee70f30a01e7","outcome":"completed","summary":"I found no defects in the math area (precision, boundaries and numerical gaps). `.imd-findings.json` has an empty findings list and 11 coverage rows. All six listed entry points are marked `holds`, and five more rows cover the invariants I checked. No repository files were changed; my scratch tests in `test/scratch/` have been deleted.\n\n**What I checked, against the live SqueekCore proxy on Sepolia** (public endpoint `ethereum-sepolia-rpc.publicnode.com`):\n- **Round windows:** the 12-round window starts after `max(F-12, 0)` and the 3-round running window after `max(F-3, 0)`, where F is the last settled round. Both subtractions are guarded so they can't underflow. The docs say the start round is excluded and rounds are numbered from 1, and the live Core agrees: `roundPage(0,12,16)` returns round 1. A start equal to the end, as at round 0, is accepted. Only an end past F or more than 16 records reverts, and the contract can't send either.\n- **The contract's page checks:** I ran it on a Sepolia fork and fetched live pages at 28 values of F. These covered F = 1–4 and 11–14 and the edges of the real activity in rounds 1906–1922. Every page met every condition the contract checks, so its revert guards never fire on real data. The classification was right at both window edges.\n- **The total-work check:** the Core's current total work (148,986) equals the page's end value at F = 1973, so that cross-check holds.\n- **Squeek block height:** `cumulativeBlockUnits / 1e9` gives 13,095, which matches the Core's own `blockHeight`. The Core's configured units per block is also 1e9. Rounding down gives completed blocks, as intended.\n- **Decoding:** a deployed copy decodes the live `state()` and `roundPage()` results and returns SLEEPING, height 13,095 and frontier 1973. `tokenURI` costs about 475k gas.\n- **Supply:** reserve IDs are 1–99, public IDs 100–999, and the mint stops at 900 public tokens. There is no burn, so `totalSupply()` stays exact. The reserve address has no code on Sepolia, so minting the reserve without the receiver check is safe there.\n- **ERC-721 base:** the vendored OpenZeppelin v5.4.0 files match upstream once formatting is ignored. The transfer and approval entry points are not modified.\n- **Tests and static analysis:** the existing suite passes (76/76). The six aderyn notes are style points or intended behaviour, not defects.\n\n**Two observations I left out of the findings** (the code follows the brief on both and the README documents them):\n- **The Core's reporter has stopped.** Settled rounds end at 1973, but the clock is at round about 2496, roughly 87 hours behind. Every token is frozen on the last settled state. That happens to be SLEEPING, but if the outage had started during activity, all tokens would show RUNNING until the reporter resumes. This also matters for Job 2 and the \"show all three states\" check: live data currently gives only SLEEPING.\n- **`mint_block` uses Ethereum block numbers.** It shows the Sepolia block (about 12,025,141) right next to `squeek_block` (about 13,095). The brief doesn't say which unit to use, and the README states the choice.\n\n**What I couldn't check:**\n- Replays at past blocks, because the public node has pruned that state. Instead I fed past values of F into the live pages, but the total-work check could only be tested at the current F.\n- How the Core behaves while paused.\n- The Core proxy itself, since it is upgradeable and outside this contract's control.","treeHash":null,"usage":{"cachedInputTokens":1678878,"inputTokens":51,"model":"claude-opus-5-5","outputTokens":27363,"runtime":"claude","turns":31,"wallClockMs":362491}}],"verification":[{"checks":[{"durationMs":2197,"exitCode":0,"name":"build","output":"Compiling 47 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.11s\nCompiler run successful!\n","passed":true},{"durationMs":9124,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 7 tests for test/ERC721.t.sol:ERC721Test\n[PASS] testNonexistentTokenAndZeroBalanceQueriesRevert() (gas: 32629)\n[PASS] testOperatorApprovalAndRevocation() (gas: 382578)\n[PASS] testSafeTransferAcceptingReceiverWithData() (gas: 482719)\n[PASS] testSafeTransferRejectsMissingReceiverAndPreservesOwner() (gas: 355799)\n[PASS] testTokenApprovalAndTransferClearApproval() (gas: 330384)\n[PASS] testUnauthorizedApprovalRejected() (gas: 176551)\n[PASS] testWrongFromAndZeroRecipientRejected() (gas: 242232)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 45.48ms (1.41ms CPU time)\n\nRan 21 tests for test/Minting.t.sol:MintingTest\n[PASS] testAll900PublicMintsReach999AndCannotTouchReserve() (gas: 118826395)\n[PASS] testCallbackTransferAndReentryCannotClaimTwice() (gas: 883516)\n[PASS] testConstructorNeedsNoExternalCodeAndFactoryHasNoPrivilege() (gas: 7888917)\n[PASS] testContractWalletCanMintWithReceiverHook() (gas: 432358)\n[PASS] testDirectEtherRejected() (gas: 39388)\n[PASS] testExactCollectionIdentityAndInterfaces() (gas: 108301)\n[PASS] testFreeMintRecordsOwnerSupplyAndStaticBlockAndEmitsTransfer() (gas: 219355)\n[PASS] testFuzzDistinctWalletsReceiveDistinctPublicTokens(uint8) (runs: 512, μ: 1739570, ~: 1351165)\nLogs:\n  Bound result 15\n\n[PASS] testInvalidReceiverRollsBackThenCanRetry() (gas: 616554)\n[PASS] testMintDoesNotDependOnCoreAvailability() (gas: 230578)\n[PASS] testMintRejectsEtherWithoutConsumingEligibility() (gas: 204100)\n[PASS] testMissingReceiverHookRollsBack() (gas: 300857)\n[PASS] testNoOwnerMintPauseOrUpgradeBackdoors() (gas: 107762)\n[PASS] testOneLifetimePublicMintPerWallet() (gas: 177681)\n[PASS] testRecipientCanClaimOnceEvenWhenAlreadyHoldingAnotherToken() (gas: 325785)\n[PASS] testReserveHeldByNamedOwnerAtDeployment() (gas: 2359803)\n[PASS] testReserveOwnerCanClaimOneOfThePublicAllocation() (gas: 172856)\n[PASS] testReserveOwnerMayTransferTheirTokens() (gas: 112079)\n[PASS] testRevertingReceiverCannotBlockOtherMinters() (gas: 486253)\n[PASS] testTransferringAwayDoesNotRestoreMintEligibility() (gas: 241933)\n[PASS] testUnauthorizedReserveTransferRejected() (gas: 40834)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 550.31ms (159.88ms CPU time)\n\nRan 35 tests for test/StateDerivation.t.sol:StateDerivationTest\n[PASS] testAllTwelveActiveRoundsFitOnePageAndRecentWins() (gas: 775486)\n[PASS] testFirstRoundIsRunning() (gas: 157863)\n[PASS] testFrontierFourRoundOneIsNapping() (gas: 154506)\n[PASS] testFrontierThirteenExcludesRoundOne() (gas: 155766)\n[PASS] testFrontierThreeIncludesRoundOne() (gas: 154450)\n[PASS] testFrontierTwelveIncludesRoundOne() (gas: 157984)\n[PASS] testFuzzHeightDivision(uint96) (runs: 512, μ: 80185, ~: 80248)\n[PASS] testFuzzSingleActivityWindow(uint64,uint64,uint64) (runs: 512, μ: 160260, ~: 160177)\nLogs:\n  Bound result 148\n  Bound result 42\n\n[PASS] testFuzzSmallFrontierBounds(uint8) (runs: 512, μ: 86660, ~: 87637)\nLogs:\n  Bound result 8\n\n[PASS] testFuzzSparseHistoryMatchesIndependentWindowModel(uint16,uint64) (runs: 512, μ: 991069, ~: 990929)\nLogs:\n  Bound result 24358821\n\n[PASS] testGenesisFrontierZeroUsesValidEmptyPage() (gas: 78671)\n[PASS] testHeightComesFromBlockUnitsNotWorkOrReportedHeight() (gas: 201533)\n[PASS] testIncompletePageRejected() (gas: 41209)\n[PASS] testMaximumFrontierDoesNotOverflow() (gas: 155883)\n[PASS] testMockHonorsTruncatedPageFrontier() (gas: 133048)\n[PASS] testMockRejectsActualInvalidBounds() (gas: 41822)\n[PASS] testNappingAtOldestOfTwelveRounds() (gas: 174541)\n[PASS] testNappingJustOutsideThreeRounds() (gas: 174585)\n[PASS] testNoCoreCodeRevertsInsteadOfInventingSleep() (gas: 11798)\n[PASS] testOutOfRangeRoundRejected() (gas: 160931)\n[PASS] testOversizedPageRejected() (gas: 60509)\n[PASS] testPageEndpointMismatchRejected() (gas: 41380)\n[PASS] testPageFailurePropagates() (gas: 23984)\n[PASS] testPausedCoreKeepsLastSettledActivity() (gas: 201581)\n[PASS] testReversedWorkRejected() (gas: 180871)\n[PASS] testRoundAtExclusiveStartRejected() (gas: 160845)\n[PASS] testRunningAtFrontier() (gas: 174566)\n[PASS] testRunningAtOldestOfThreeRounds() (gas: 174573)\n[PASS] testSleepingAtExclusiveTwelveRoundBoundary() (gas: 172187)\n[PASS] testSleepingWithoutAnyActiveRoundsDespiteHistoricalWork() (gas: 100172)\n[PASS] testStateAndPageMismatchRejected() (gas: 41563)\n[PASS] testStateFailurePropagates() (gas: 12579)\n[PASS] testUnsortedRoundsRejected() (gas: 162866)\n[PASS] testZeroWorkCheckpointIsNotActivity() (gas: 174457)\n[PASS] testZeroWorkRecentCheckpointDoesNotOverrideNapping() (gas: 228374)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 568.90ms (149.35ms CPU time)\n\nRan 2 tests for test/DeploymentAndABI.t.sol:DeploymentAndABITest\n[PASS] testPublishedV3AbiDecodesExactFieldWidthsAndNestedPageOffsets() (gas: 23586)\n[PASS] testRuntimeFitsEip170AndContainsNoReachableEscapeOpcodes() (gas: 6416956)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 569.19ms (19.50ms CPU time)\n\nRan 10 tests for test/Metadata.t.sol:MetadataTest\n[PASS] testBlockOverlayChangesEvenWithinSameActivityState() (gas: 9458884)\n[PASS] testFuzzMetadataPreservesNumericHeightsAndMintBlocks(uint96,uint64) (runs: 512, μ: 4671900, ~: 4654759)\n[PASS] testJsonAndSvgAreValidDataUrisWithRequiredFields() (gas: 4879501)\n[PASS] testMetadataChangesLiveWhileMintBlockStaysFixedAcrossTransfer() (gas: 10860609)\n[PASS] testNappingArtHasClosedEyesZzzAndNightBackground() (gas: 4835518)\n[PASS] testPreviewMetadata() (gas: 1788886)\nLogs:\n  PREVIEW_RUNNING=data:application/json;base64,eyJuYW1lIjoiX1NxdWVlayBDb21wYW5pb24gIzEwMCIsImRlc2NyaXB0aW9uIjoiQSBjb21wYW5pb24gcmVmbGVjdGluZyBTcXVlZWt0b3NoaSdzIHNldHRsZWQgb24tY2hhaW4gd2hlZWwgYWN0aXZpdHkuIG1pbnRfYmxvY2sgaXMgdGhlIFNlcG9saWEgYmxvY2sgYXQgbWludC4gTm8gcmV3YXJkcyBvciB1cGtlZXAuIiwiaW1hZ2UiOiJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSFpwWlhkQ2IzZzlJakFnTUNBek1qQWdNell3SWlCeWIyeGxQU0pwYldjaUlHRnlhV0V0YkdGaVpXeHNaV1JpZVQwaWRHbDBiR1VnWkdWell5SStQSFJwZEd4bElHbGtQU0owYVhSc1pTSStYMU54ZFdWbGF5QkRiMjF3WVc1cGIyNDZJRkpWVGs1SlRrYzhMM1JwZEd4bFBqeGtaWE5qSUdsa1BTSmtaWE5qSWo1QklIQnBlR1ZzSUdoaGJYTjBaWElnY21WbWJHVmpkR2x1WnlCelpYUjBiR1ZrSUhkb1pXVnNJR0ZqZEdsMmFYUjVMaUJUY1hWbFpXc2dZbXh2WTJzZ05ESXVQQzlrWlhOalBqeHlaV04wSUhkcFpIUm9QU0l6TWpBaUlHaGxhV2RvZEQwaU16WXdJaUJtYVd4c1BTSWpaamhrT1RsaklpOCtQSEpsWTNRZ2VEMGlNVElpSUhrOUlqRXlJaUIzYVdSMGFEMGlNamsySWlCb1pXbG5hSFE5SWpNek5pSWdabWxzYkQwaWJtOXVaU0lnYzNSeWIydGxQU0lqTlRFek9ESmxJaUJ2Y0dGamFYUjVQU0l1TXpVaUx6NDhaeUJtYVd4c1BTSWpOVEV6T0RKbElpQm1iMjUwTFdaaGJXbHNlVDBpYlc5dWIzTndZV05sSWlCMFpYaDBMV0Z1WTJodmNqMGliV2xrWkd4bElqNDhkR1Y0ZENCNFBTSXhOakFpSUhrOUlqTTVJaUJtYjI1MExYTnBlbVU5SWpFMUlpQnNaWFIwWlhJdGMzQmhZMmx1WnowaU1pSStYMU5SVlVWRlN5QkRUMDFRUVU1SlQwNDhMM1JsZUhRK1BIUmxlSFFnZUQwaU1UWXdJaUI1UFNJMk5pSWdabTl1ZEMxemFYcGxQU0l4TVNJZ2JHVjBkR1Z5TFhOd1lXTnBibWM5SWpNaVBsSlZUazVKVGtjOEwzUmxlSFErUEM5blBqeG5JR2xrUFNKM2FHVmxiQ0lnWm1sc2JEMGlibTl1WlNJZ2MzUnliMnRsUFNJalltSTROalUySWlCemRISnZhMlV0ZDJsa2RHZzlJallpUGp4amFYSmpiR1VnWTNnOUlqRTJNQ0lnWTNrOUlqRTJPU0lnY2owaU9EZ2lMejQ4Y0dGMGFDQmtQU0pOT1RZZ01UQTFiREV5T0NBeE1qaE5OeklnTVRZNWFERTNOazB4TmpBZ09ERjJNVGMyVFRrMklESXpNMnd4TWpndE1USTRJaUJ2Y0dGamFYUjVQU0l1TXpVaUx6NDhMMmMrUEdjZ2FXUTlJbTF2ZEdsdmJpMXNhVzVsY3lJZ1ptbHNiRDBpSTJKaU5tRXpOaUkrUEhCaGRHZ2daRDBpVFRNd0lERTBOMmd6T1hZMlNETXdlazB5TWlBeE5qUm9NemgyTmtneU1ucE5NekFnTVRneGFETTBkalpJTXpCNlRUSTFNeUF4TkRkb01qVjJObWd0TWpWNlRUSTJNQ0F4TmpSb016aDJObWd0TXpoNlRUSTFNeUF4T0RGb01qVjJObWd0TWpWNklpOCtQQzluUGp4d1lYUm9JR1E5SWsweE1qWWdNalUwYURZNGRqWm9MVFk0ZWlJZ1ptbHNiRDBpSTJKaU9EWTFOaUl2UGp4bklITm9ZWEJsTFhKbGJtUmxjbWx1WnowaVkzSnBjM0JGWkdkbGN5SStQR2NnYzNSeWIydGxQU0lqTlRFek9ESmxJaUJ6ZEhKdmEyVXRkMmxrZEdnOUlqWWlJSE4wY205clpTMXNhVzVsYW05cGJqMGliV2wwWlhJaVBqeHdZWFJvSUdROUlrMHhNRFFnTVRReGRpMHpNR2c0ZGkwNGFESTBkamhvT0hZek1FMHhOellnTVRReGRpMHpNR2c0ZGkwNGFESTBkamhvT0hZek1DSWdabWxzYkQwaUkyUTJPV0UyTkNJdlBqeHdZWFJvSUdROUlrMHhNRFFnTVRRemFERTJkaTB4TW1nNE1IWXhNbWd4Tm5ZeE5tZ3hNblkyTkdndE1USjJNVFpvTFRFMmRqaG9MVGd3ZGkwNGFDMHhObll0TVRaSU9USjJMVFkwYURFeWVpSWdabWxzYkQwaUkyUTJPV0UyTkNJdlBqd3ZaejQ4Y0dGMGFDQmtQU0pOTVRFMUlERXhObWd4Tm5ZeE9XZ3RNVFo2VFRFNE9TQXhNVFpvTVRaMk1UbG9MVEUyZWlJZ1ptbHNiRDBpSTJWbVlqQmhNQ0l2UGp4d1lYUm9JR1E5SWsweE1Ua2dNVGMxYURneWRqRXlhREV5ZGpNMmFDMHhNbll4TW1ndE9ESjJMVEV5YUMweE1uWXRNelpvTVRKNklpQm1hV3hzUFNJalptWm1NR05sSWk4K1BIQmhkR2dnWkQwaVRURXhNQ0F4T1Rkb01UUjJPR2d0TVRSNlRURTVOaUF4T1Rkb01UUjJPR2d0TVRSNklpQm1hV3hzUFNJalpXWmhNVGhqSWk4K1BIQmhkR2dnWkQwaVRURTFOQ0F4T1Rob01USjJOMmd0TVRKNklpQm1hV3hzUFNJak9XSTJNelZoSWk4K1BIQmhkR2dnWkQwaVRURTFOeUF5TURWb05uWTVhQzAyZWsweE5EWWdNakUwYURFeGRqVm9MVEV4ZWsweE5qTWdNakUwYURFeGRqVm9MVEV4ZWlJZ1ptbHNiRDBpSXpVeE16Z3laU0l2UGp4d1lYUm9JR1E5SWsweE1ESWdNakl5YURFNGRqRXphQzB4T0hwTk1qQXdJREl5TW1neE9IWXhNMmd0TVRoNklpQm1hV3hzUFNJall6UTROalU0SWk4K1BIQmhkR2dnWkQwaVRURXhOaUF5TkRKb01qUjJNVEJvTFRJMGVrMHhPREFnTWpReWFESTBkakV3YUMweU5Ib2lJR1pwYkd3OUlpTmxabUl3WVRBaUx6NDhaeUJwWkQwaWIzQmxiaTFsZVdWeklpQm1hV3hzUFNJak16TXlPREpqSWo0OGNHRjBhQ0JrUFNKTk1USTFJREUzTTJneE1uWXhOMmd0TVRKNlRURTRNeUF4TnpOb01USjJNVGRvTFRFeWVpSXZQand2Wno0OGNHRjBhQ0JrUFNKTk1USTNJREUzTldnMGRqVm9MVFI2VFRFNE5TQXhOelZvTkhZMWFDMDBlaUlnWm1sc2JEMGlJMlptWmpsbE9TSXZQand2Wno0OFp5Qm1hV3hzUFNJak5URXpPREpsSWlCbWIyNTBMV1poYldsc2VUMGliVzl1YjNOd1lXTmxJaUIwWlhoMExXRnVZMmh2Y2owaWJXbGtaR3hsSWo0OGRHVjRkQ0I0UFNJeE5qQWlJSGs5SWpJNU1pSWdabTl1ZEMxemFYcGxQU0l4TUNJZ2JHVjBkR1Z5TFhOd1lXTnBibWM5SWpJaVBsTlJWVVZGU3lCQ1RFOURTend2ZEdWNGRENDhkR1Y0ZENCNFBTSXhOakFpSUhrOUlqTXhOeUlnWm05dWRDMXphWHBsUFNJeE5pSStOREk4TDNSbGVIUStQSFJsZUhRZ2VEMGlNVFl3SWlCNVBTSXpNemNpSUdadmJuUXRjMmw2WlQwaU9DSWdiM0JoWTJsMGVUMGlMamNpUGtFZ1RFbFVWRXhGSUVOUFRWQkJUa2xQVGlCVVR5QlVTRVVnVjBoRlJVdzhMM1JsZUhRK1BDOW5Qand2YzNablBnPT0iLCJhdHRyaWJ1dGVzIjpbeyJ0cmFpdF90eXBlIjoic3RhdGUiLCJ2YWx1ZSI6IlJVTk5JTkcifSx7ImRpc3BsYXlfdHlwZSI6Im51bWJlciIsInRyYWl0X3R5cGUiOiJzcXVlZWtfYmxvY2siLCJ2YWx1ZSI6NDJ9LHsiZGlzcGxheV90eXBlIjoibnVtYmVyIiwidHJhaXRfdHlwZSI6Im1pbnRfYmxvY2siLCJ2YWx1ZSI6MjAwMDAwMDB9XX0=\n  PREVIEW_NAPPING=data:application/json;base64,eyJuYW1lIjoiX1NxdWVlayBDb21wYW5pb24gIzEwMCIsImRlc2NyaXB0aW9uIjoiQSBjb21wYW5pb24gcmVmbGVjdGluZyBTcXVlZWt0b3NoaSdzIHNldHRsZWQgb24tY2hhaW4gd2hlZWwgYWN0aXZpdHkuIG1pbnRfYmxvY2sgaXMgdGhlIFNlcG9saWEgYmxvY2sgYXQgbWludC4gTm8gcmV3YXJkcyBvciB1cGtlZXAuIiwiaW1hZ2UiOiJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSFpwWlhkQ2IzZzlJakFnTUNBek1qQWdNell3SWlCeWIyeGxQU0pwYldjaUlHRnlhV0V0YkdGaVpXeHNaV1JpZVQwaWRHbDBiR1VnWkdWell5SStQSFJwZEd4bElHbGtQU0owYVhSc1pTSStYMU54ZFdWbGF5QkRiMjF3WVc1cGIyNDZJRTVCVUZCSlRrYzhMM1JwZEd4bFBqeGtaWE5qSUdsa1BTSmtaWE5qSWo1QklIQnBlR1ZzSUdoaGJYTjBaWElnY21WbWJHVmpkR2x1WnlCelpYUjBiR1ZrSUhkb1pXVnNJR0ZqZEdsMmFYUjVMaUJUY1hWbFpXc2dZbXh2WTJzZ05ESXVQQzlrWlhOalBqeHlaV04wSUhkcFpIUm9QU0l6TWpBaUlHaGxhV2RvZEQwaU16WXdJaUJtYVd4c1BTSWpNalF6TmpWaUlpOCtQSEpsWTNRZ2VEMGlNVElpSUhrOUlqRXlJaUIzYVdSMGFEMGlNamsySWlCb1pXbG5hSFE5SWpNek5pSWdabWxzYkQwaWJtOXVaU0lnYzNSeWIydGxQU0lqWmpkbE5HSmlJaUJ2Y0dGamFYUjVQU0l1TXpVaUx6NDhaeUJtYVd4c1BTSWpaamRsTkdKaUlpQm1iMjUwTFdaaGJXbHNlVDBpYlc5dWIzTndZV05sSWlCMFpYaDBMV0Z1WTJodmNqMGliV2xrWkd4bElqNDhkR1Y0ZENCNFBTSXhOakFpSUhrOUlqTTVJaUJtYjI1MExYTnBlbVU5SWpFMUlpQnNaWFIwWlhJdGMzQmhZMmx1WnowaU1pSStYMU5SVlVWRlN5QkRUMDFRUVU1SlQwNDhMM1JsZUhRK1BIUmxlSFFnZUQwaU1UWXdJaUI1UFNJMk5pSWdabTl1ZEMxemFYcGxQU0l4TVNJZ2JHVjBkR1Z5TFhOd1lXTnBibWM5SWpNaVBrNUJVRkJKVGtjOEwzUmxlSFErUEM5blBqeG5JR2xrUFNKemRHRnljeUlnWm1sc2JEMGlJMkk1WXpsbFpTSStQSEJoZEdnZ1pEMGlUVFEwSURFd00yZzBkalJvTFRSNlRUYzNJREV6TldnMGRqUm9MVFI2VFRJMU9DQXhOREZvTkhZMGFDMDBlazB5TnpJZ01UQXphRFIyTkdndE5IcE5ORGtnTWpFMWFEUjJOR2d0TkhwTk1qTTVJREl3T1dnMGRqUm9MVFI2SWk4K1BDOW5Qanh3WVhSb0lHUTlJazA0TkNBeU5EVm9NVFV5ZGpoSU9EUjZUVGsySURJMU0yZ3hNamgyTmtnNU5ub2lJR1pwYkd3OUlpTTFPVFppT0RnaUx6NDhaeUJwWkQwaWVucDZJaUJtYVd4c1BTSWpaREJrWTJZeklpQm1iMjUwTFdaaGJXbHNlVDBpYlc5dWIzTndZV05sSWo0OGRHVjRkQ0I0UFNJeU1Ua2lJSGs5SWpFek5pSWdabTl1ZEMxemFYcGxQU0l5TWlJK1dqd3ZkR1Y0ZEQ0OGRHVjRkQ0I0UFNJeU16a2lJSGs5SWpFeE9TSWdabTl1ZEMxemFYcGxQU0l4TnlJK2Vqd3ZkR1Y0ZEQ0OGRHVjRkQ0I0UFNJeU5UWWlJSGs5SWpFd05DSWdabTl1ZEMxemFYcGxQU0l4TWlJK2Vqd3ZkR1Y0ZEQ0OEwyYytQR2NnYzJoaGNHVXRjbVZ1WkdWeWFXNW5QU0pqY21semNFVmtaMlZ6SWo0OFp5QnpkSEp2YTJVOUlpTTFNVE00TW1VaUlITjBjbTlyWlMxM2FXUjBhRDBpTmlJZ2MzUnliMnRsTFd4cGJtVnFiMmx1UFNKdGFYUmxjaUkrUEhCaGRHZ2daRDBpVFRFd05DQXhOREYyTFRNd2FEaDJMVGhvTWpSMk9HZzRkak13VFRFM05pQXhOREYyTFRNd2FEaDJMVGhvTWpSMk9HZzRkak13SWlCbWFXeHNQU0lqWkRZNVlUWTBJaTgrUEhCaGRHZ2daRDBpVFRFd05DQXhORE5vTVRaMkxURXlhRGd3ZGpFeWFERTJkakUyYURFeWRqWTBhQzB4TW5ZeE5tZ3RNVFoyT0dndE9EQjJMVGhvTFRFMmRpMHhOa2c1TW5ZdE5qUm9NVEo2SWlCbWFXeHNQU0lqWkRZNVlUWTBJaTgrUEM5blBqeHdZWFJvSUdROUlrMHhNVFVnTVRFMmFERTJkakU1YUMweE5ucE5NVGc1SURFeE5tZ3hObll4T1dndE1UWjZJaUJtYVd4c1BTSWpaV1ppTUdFd0lpOCtQSEJoZEdnZ1pEMGlUVEV4T1NBeE56Vm9PREoyTVRKb01USjJNelpvTFRFeWRqRXlhQzA0TW5ZdE1USm9MVEV5ZGkwek5tZ3hNbm9pSUdacGJHdzlJaU5tWm1Zd1kyVWlMejQ4Y0dGMGFDQmtQU0pOTVRFd0lERTVOMmd4TkhZNGFDMHhOSHBOTVRrMklERTVOMmd4TkhZNGFDMHhOSG9pSUdacGJHdzlJaU5sWm1FeE9HTWlMejQ4Y0dGMGFDQmtQU0pOTVRVMElERTVPR2d4TW5ZM2FDMHhNbm9pSUdacGJHdzlJaU01WWpZek5XRWlMejQ4Y0dGMGFDQmtQU0pOTVRVM0lESXdOV2cyZGpsb0xUWjZUVEUwTmlBeU1UUm9NVEYyTldndE1URjZUVEUyTXlBeU1UUm9NVEYyTldndE1URjZJaUJtYVd4c1BTSWpOVEV6T0RKbElpOCtQSEJoZEdnZ1pEMGlUVEV3TWlBeU1qSm9NVGgyTVROb0xURTRlazB5TURBZ01qSXlhREU0ZGpFemFDMHhPSG9pSUdacGJHdzlJaU5qTkRnMk5UZ2lMejQ4Y0dGMGFDQmtQU0pOTVRFMklESTBNbWd5TkhZeE1HZ3RNalI2VFRFNE1DQXlOREpvTWpSMk1UQm9MVEkwZWlJZ1ptbHNiRDBpSTJWbVlqQmhNQ0l2UGp4d1lYUm9JR2xrUFNKamJHOXpaV1F0WlhsbGN5SWdaRDBpVFRFeU1pQXhPREZvT0hZMWFERXlkaTAxYURWTk1UY3pJREU0TVdnNGRqVm9NVEoyTFRWb05TSWdabWxzYkQwaWJtOXVaU0lnYzNSeWIydGxQU0lqTXpNeU9ESmpJaUJ6ZEhKdmEyVXRkMmxrZEdnOUlqVWlMejQ4TDJjK1BHY2dabWxzYkQwaUkyWTNaVFJpWWlJZ1ptOXVkQzFtWVcxcGJIazlJbTF2Ym05emNHRmpaU0lnZEdWNGRDMWhibU5vYjNJOUltMXBaR1JzWlNJK1BIUmxlSFFnZUQwaU1UWXdJaUI1UFNJeU9USWlJR1p2Ym5RdGMybDZaVDBpTVRBaUlHeGxkSFJsY2kxemNHRmphVzVuUFNJeUlqNVRVVlZGUlVzZ1FreFBRMHM4TDNSbGVIUStQSFJsZUhRZ2VEMGlNVFl3SWlCNVBTSXpNVGNpSUdadmJuUXRjMmw2WlQwaU1UWWlQalF5UEM5MFpYaDBQangwWlhoMElIZzlJakUyTUNJZ2VUMGlNek0zSWlCbWIyNTBMWE5wZW1VOUlqZ2lJRzl3WVdOcGRIazlJaTQzSWo1QklFeEpWRlJNUlNCRFQwMVFRVTVKVDA0Z1ZFOGdWRWhGSUZkSVJVVk1QQzkwWlhoMFBqd3ZaejQ4TDNOMlp6ND0iLCJhdHRyaWJ1dGVzIjpbeyJ0cmFpdF90eXBlIjoic3RhdGUiLCJ2YWx1ZSI6Ik5BUFBJTkcifSx7ImRpc3BsYXlfdHlwZSI6Im51bWJlciIsInRyYWl0X3R5cGUiOiJzcXVlZWtfYmxvY2siLCJ2YWx1ZSI6NDJ9LHsiZGlzcGxheV90eXBlIjoibnVtYmVyIiwidHJhaXRfdHlwZSI6Im1pbnRfYmxvY2siLCJ2YWx1ZSI6MjAwMDAwMDB9XX0=\n  PREVIEW_SLEEPING=data:application/json;base64,eyJuYW1lIjoiX1NxdWVlayBDb21wYW5pb24gIzEwMCIsImRlc2NyaXB0aW9uIjoiQSBjb21wYW5pb24gcmVmbGVjdGluZyBTcXVlZWt0b3NoaSdzIHNldHRsZWQgb24tY2hhaW4gd2hlZWwgYWN0aXZpdHkuIG1pbnRfYmxvY2sgaXMgdGhlIFNlcG9saWEgYmxvY2sgYXQgbWludC4gTm8gcmV3YXJkcyBvciB1cGtlZXAuIiwiaW1hZ2UiOiJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSFpwWlhkQ2IzZzlJakFnTUNBek1qQWdNell3SWlCeWIyeGxQU0pwYldjaUlHRnlhV0V0YkdGaVpXeHNaV1JpZVQwaWRHbDBiR1VnWkdWell5SStQSFJwZEd4bElHbGtQU0owYVhSc1pTSStYMU54ZFdWbGF5QkRiMjF3WVc1cGIyNDZJRk5NUlVWUVNVNUhQQzkwYVhSc1pUNDhaR1Z6WXlCcFpEMGlaR1Z6WXlJK1FTQndhWGhsYkNCb1lXMXpkR1Z5SUhKbFpteGxZM1JwYm1jZ2MyVjBkR3hsWkNCM2FHVmxiQ0JoWTNScGRtbDBlUzRnVTNGMVpXVnJJR0pzYjJOcklEUXlMand2WkdWell6NDhjbVZqZENCM2FXUjBhRDBpTXpJd0lpQm9aV2xuYUhROUlqTTJNQ0lnWm1sc2JEMGlJekV3TVRjeVpTSXZQanh5WldOMElIZzlJakV5SWlCNVBTSXhNaUlnZDJsa2RHZzlJakk1TmlJZ2FHVnBaMmgwUFNJek16WWlJR1pwYkd3OUltNXZibVVpSUhOMGNtOXJaVDBpSTJZM1pUUmlZaUlnYjNCaFkybDBlVDBpTGpNMUlpOCtQR2NnWm1sc2JEMGlJMlkzWlRSaVlpSWdabTl1ZEMxbVlXMXBiSGs5SW0xdmJtOXpjR0ZqWlNJZ2RHVjRkQzFoYm1Ob2IzSTlJbTFwWkdSc1pTSStQSFJsZUhRZ2VEMGlNVFl3SWlCNVBTSXpPU0lnWm05dWRDMXphWHBsUFNJeE5TSWdiR1YwZEdWeUxYTndZV05wYm1jOUlqSWlQbDlUVVZWRlJVc2dRMDlOVUVGT1NVOU9QQzkwWlhoMFBqeDBaWGgwSUhnOUlqRTJNQ0lnZVQwaU5qWWlJR1p2Ym5RdGMybDZaVDBpTVRFaUlHeGxkSFJsY2kxemNHRmphVzVuUFNJeklqNVRURVZGVUVsT1J6d3ZkR1Y0ZEQ0OEwyYytQR2NnYVdROUluTjBZWEp6SWlCbWFXeHNQU0lqWWpsak9XVmxJajQ4Y0dGMGFDQmtQU0pOTkRRZ01UQXphRFIyTkdndE5IcE5OemNnTVRNMWFEUjJOR2d0TkhwTk1qVTRJREUwTVdnMGRqUm9MVFI2VFRJM01pQXhNRE5vTkhZMGFDMDBlazAwT1NBeU1UVm9OSFkwYUMwMGVrMHlNemtnTWpBNWFEUjJOR2d0TkhvaUx6NDhMMmMrUEhCaGRHZ2daRDBpVFRnMElESTBOV2d4TlRKMk9FZzROSHBOT1RZZ01qVXphREV5T0hZMlNEazJlaUlnWm1sc2JEMGlJelU1Tm1JNE9DSXZQanh3WVhSb0lHbGtQU0p0YjI5dUlpQmtQU0pOTWpRMElEZzBhREl3ZGpab0xURTBkamhvTFRaMk1UaG9Oblk0YURFMGRqWm9MVEl3ZGkwMmFDMDRkaTA0YUMwMlZqazRhRFoyTFRob09Ib2lJR1pwYkd3OUlpTm1ObVUyWWpBaUx6NDhjR0YwYUNCa1BTSk5OemNnTWpRd2FERTJOblkzU0RjM2VpSWdabWxzYkQwaUl6TTFOREUxWlNJdlBqeG5JSE5vWVhCbExYSmxibVJsY21sdVp6MGlZM0pwYzNCRlpHZGxjeUkrUEdjZ2MzUnliMnRsUFNJak5URXpPREpsSWlCemRISnZhMlV0ZDJsa2RHZzlJallpSUhOMGNtOXJaUzFzYVc1bGFtOXBiajBpYldsMFpYSWlQanh3WVhSb0lHUTlJazB4TURRZ01UUXhkaTB6TUdnNGRpMDRhREkwZGpob09IWXpNRTB4TnpZZ01UUXhkaTB6TUdnNGRpMDRhREkwZGpob09IWXpNQ0lnWm1sc2JEMGlJMlEyT1dFMk5DSXZQanh3WVhSb0lHUTlJazB4TURRZ01UUXphREUyZGkweE1tZzRNSFl4TW1neE5uWXhObWd4TW5ZMk5HZ3RNVEoyTVRab0xURTJkamhvTFRnd2RpMDRhQzB4Tm5ZdE1UWklPVEoyTFRZMGFERXllaUlnWm1sc2JEMGlJMlEyT1dFMk5DSXZQand2Wno0OGNHRjBhQ0JrUFNKTk1URTFJREV4Tm1neE5uWXhPV2d0TVRaNlRURTRPU0F4TVRab01UWjJNVGxvTFRFMmVpSWdabWxzYkQwaUkyVm1ZakJoTUNJdlBqeHdZWFJvSUdROUlrMHhNVGtnTVRjMWFEZ3lkakV5YURFeWRqTTJhQzB4TW5ZeE1tZ3RPREoyTFRFeWFDMHhNbll0TXpab01USjZJaUJtYVd4c1BTSWpabVptTUdObElpOCtQSEJoZEdnZ1pEMGlUVEV4TUNBeE9UZG9NVFIyT0dndE1UUjZUVEU1TmlBeE9UZG9NVFIyT0dndE1UUjZJaUJtYVd4c1BTSWpaV1poTVRoaklpOCtQSEJoZEdnZ1pEMGlUVEUxTkNBeE9UaG9NVEoyTjJndE1USjZJaUJtYVd4c1BTSWpPV0kyTXpWaElpOCtQSEJoZEdnZ1pEMGlUVEUxTnlBeU1EVm9Oblk1YUMwMmVrMHhORFlnTWpFMGFERXhkalZvTFRFeGVrMHhOak1nTWpFMGFERXhkalZvTFRFeGVpSWdabWxzYkQwaUl6VXhNemd5WlNJdlBqeHdZWFJvSUdROUlrMHhNRElnTWpJeWFERTRkakV6YUMweE9IcE5NakF3SURJeU1tZ3hPSFl4TTJndE1UaDZJaUJtYVd4c1BTSWpZelE0TmpVNElpOCtQSEJoZEdnZ1pEMGlUVEV4TmlBeU5ESm9NalIyTVRCb0xUSTBlazB4T0RBZ01qUXlhREkwZGpFd2FDMHlOSG9pSUdacGJHdzlJaU5sWm1Jd1lUQWlMejQ4Y0dGMGFDQnBaRDBpWTJ4dmMyVmtMV1Y1WlhNaUlHUTlJazB4TWpJZ01UZ3hhRGgyTldneE1uWXROV2cxVFRFM015QXhPREZvT0hZMWFERXlkaTAxYURVaUlHWnBiR3c5SW01dmJtVWlJSE4wY205clpUMGlJek16TWpneVl5SWdjM1J5YjJ0bExYZHBaSFJvUFNJMUlpOCtQQzluUGp4bklHWnBiR3c5SWlObU4yVTBZbUlpSUdadmJuUXRabUZ0YVd4NVBTSnRiMjV2YzNCaFkyVWlJSFJsZUhRdFlXNWphRzl5UFNKdGFXUmtiR1VpUGp4MFpYaDBJSGc5SWpFMk1DSWdlVDBpTWpreUlpQm1iMjUwTFhOcGVtVTlJakV3SWlCc1pYUjBaWEl0YzNCaFkybHVaejBpTWlJK1UxRlZSVVZMSUVKTVQwTkxQQzkwWlhoMFBqeDBaWGgwSUhnOUlqRTJNQ0lnZVQwaU16RTNJaUJtYjI1MExYTnBlbVU5SWpFMklqNDBNand2ZEdWNGRENDhkR1Y0ZENCNFBTSXhOakFpSUhrOUlqTXpOeUlnWm05dWRDMXphWHBsUFNJNElpQnZjR0ZqYVhSNVBTSXVOeUkrUVNCTVNWUlVURVVnUTA5TlVFRk9TVTlPSUZSUElGUklSU0JYU0VWRlREd3ZkR1Y0ZEQ0OEwyYytQQzl6ZG1jKyIsImF0dHJpYnV0ZXMiOlt7InRyYWl0X3R5cGUiOiJzdGF0ZSIsInZhbHVlIjoiU0xFRVBJTkcifSx7ImRpc3BsYXlfdHlwZSI6Im51bWJlciIsInRyYWl0X3R5cGUiOiJzcXVlZWtfYmxvY2siLCJ2YWx1ZSI6NDJ9LHsiZGlzcGxheV90eXBlIjoibnVtYmVyIiwidHJhaXRfdHlwZSI6Im1pbnRfYmxvY2siLCJ2YWx1ZSI6MjAwMDAwMDB9XX0=\n\n[PASS] testReserveTokenMetadataAvailableWithoutPublicMint() (gas: 4456723)\n[PASS] testSleepingArtHasMoonAndDeeperNightBackground() (gas: 4599478)\n[PASS] testUnchangedCoreProducesIdenticalMetadataRegardlessOfTime() (gas: 1053477)\n[PASS] testUnknownTokenRevertsBeforeDependencyRead() (gas: 37287)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 576.88ms (670.97ms CPU time)\n\nRan 1 test for test/Invariants.t.sol:CompanionInvariantTest\n[PASS]\nCompanionInvariantTest invariants:\n[PASS] invariantLifetimeClaimsPersistAfterArbitraryTransfers\n[PASS] invariantMintedPublicIdsExistAndMintBlocksNeverChange\n[PASS] invariantReserveNeverEntersPublicMintPool\n[PASS] invariantSupplyAndBalancesAreConserved\n CompanionInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭---------------------+----------------------+-------+---------+----------╮\n| Contract            | Selector             | Calls | Reverts | Discards |\n+=========================================================================+\n| MintTransferHandler | mint                 | 2719  | 0       | 0        |\n|---------------------+----------------------+-------+---------+----------|\n| MintTransferHandler | transfer             | 2748  | 0       | 0        |\n|---------------------+----------------------+-------+---------+----------|\n| MintTransferHandler | unauthorizedTransfer | 2725  | 0       | 0        |\n╰---------------------+----------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 9.02s (9.02s CPU time)\n\nRan 6 test suites in 9.02s (11.33s CPU time): 76 tests passed, 0 failed, 0 skipped (76 total tests)\n","passed":true},{"durationMs":41,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"SqueekCompanion.approve(address,uint256)\",\"SqueekCompanion.mint()\",\"SqueekCompanion.safeTransferFrom(address,address,uint256)\",\"SqueekCompanion.safeTransferFrom(address,address,uint256,bytes)\",\"SqueekCompanion.setApprovalForAll(address,bool)\",\"SqueekCompanion.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":5,\"LICENSE\":21,\"README.md\":119,\"docs/VALIDATION.md\":36,\"docs/abi/SqueekCompanion.json\":672,\"docs/abi/SqueekCore.reads.json\":169,\"docs/dependencies.json\":64,\"docs/previews/napping.json\":21,\"docs/previews/napping.svg\":1,\"docs/previews/running.json\":21,\"docs/previews/running.svg\":1,\"docs/previews/sleeping.json\":21,\"docs/previews/sleeping.svg\":1,\"foundry.toml\":22,\"launch.json\":10,\"remappings.txt\":2,\"scripts/export_artifacts.py\":95,\"src/SqueekCompanion.sol\":126,\"src/interfaces/ISqueekCore.sol\":47,\"src/libraries/CompanionArt.sol\":115,\"test/DeploymentAndABI.t.sol\":74,\"test/ERC721.t.sol\":85,\"test/Invariants.t.sol\":105,\"test/Metadata.t.sol\":143,\"test/Minting.t.sol\":265,\"test/StateDerivation.t.sol\":271,\"test/helpers/CompanionTestBase.sol\":52,\"test/helpers/DataUri.sol\":41,\"test/mocks/MintReceivers.sol\":79,\"test/mocks/MockSqueekCore.sol\":86},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"3f9ad126627bf3a36a3fa3cb60165c1e9741085ac1c230065fae2604f2dbe45c","verifiedTreeHash":"ae713cacfa192f8ed8f28390da0433783068c085","verifierVersion":"0.1.0+d372f99e"},{"checks":[{"durationMs":3865,"exitCode":0,"name":"build","output":"Compiling 52 files with Solc 0.8.26\nSolc 0.8.26 finished in 3.77s\nCompiler run successful!\n","passed":true},{"durationMs":21112,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/DeploymentAndABI.t.sol:DeploymentAndABITest\n[PASS] testPublishedV3AbiDecodesExactFieldWidthsAndNestedPageOffsets() (gas: 23586)\n[PASS] testRuntimeFitsEip170AndContainsNoReachableEscapeOpcodes() (gas: 6416956)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 15.96ms (14.54ms CPU time)\n\nRan 4 tests for test/LedgerInvariants.t.sol:LedgerHandlerSequencesTest\n[PASS] testOperatorCanApproveButTokenDelegateCannotRedelegate() (gas: 1448416)\nLogs:\n  Bound result 1\n\n[PASS] testReserveMovesOnlyWithItsHoldersAuthorization() (gas: 1314528)\nLogs:\n  Bound result 99\n  Bound result 99\n  Bound result 1\n\n[PASS] testRevokedOperatorAndRejectingSafeTransferLeaveLedgerIntact() (gas: 2294702)\nLogs:\n  Bound result 1\n\n[PASS] testRevokedTokenApprovalCannotBeUsedAfterSelfTransfer() (gas: 1288419)\nLogs:\n  Bound result 1\n\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 18.77ms (7.27ms CPU time)\n\nRan 11 tests for test/CallbackAtomicity.t.sol:CallbackAtomicityTest\n[PASS] testAllReceiverRejectionModesPreserveEligibilityAndId() (gas: 1662029)\n[PASS] testDistinctWalletNestedMintsReturnTheirOwnIds() (gas: 914288)\n[PASS] testFuzzSafeTransferForwardsExactCallbackArguments(bytes) (runs: 256, μ: 719434, ~: 709099)\n[PASS] testLastSlotIsVisibleToNestedWalletBeforeOuterCallbackReturns() (gas: 107928476)\n[PASS] testMintCallbackSeesCommittedAccountingAndUsableMetadata() (gas: 1347606)\n[PASS] testNestedMintsCanConsumeExactlyLastTwoPublicSlots() (gas: 108076692)\n[PASS] testOuterRejectionRollsBackNestedMintAndForwardedToken() (gas: 1562903)\n[PASS] testRejectedInnerMintCanBeCaughtAndRetriedIndependently() (gas: 1204340)\n[PASS] testRejectedReserveSafeTransferRestoresApprovalAndNestedMint() (gas: 1229243)\n[PASS] testRejectedSafeTransferRestoresApprovalAndNestedMint() (gas: 1315094)\n[PASS] testUncaughtNestedExhaustionRestoresLastSlot() (gas: 108224398)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 189.76ms (658.97ms CPU time)\n\nRan 7 tests for test/ERC721.t.sol:ERC721Test\n[PASS] testNonexistentTokenAndZeroBalanceQueriesRevert() (gas: 32629)\n[PASS] testOperatorApprovalAndRevocation() (gas: 382578)\n[PASS] testSafeTransferAcceptingReceiverWithData() (gas: 482719)\n[PASS] testSafeTransferRejectsMissingReceiverAndPreservesOwner() (gas: 355799)\n[PASS] testTokenApprovalAndTransferClearApproval() (gas: 330384)\n[PASS] testUnauthorizedApprovalRejected() (gas: 176551)\n[PASS] testWrongFromAndZeroRecipientRejected() (gas: 242232)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 567.16ms (1.66ms CPU time)\n\nRan 35 tests for test/StateDerivation.t.sol:StateDerivationTest\n[PASS] testAllTwelveActiveRoundsFitOnePageAndRecentWins() (gas: 775486)\n[PASS] testFirstRoundIsRunning() (gas: 157863)\n[PASS] testFrontierFourRoundOneIsNapping() (gas: 154506)\n[PASS] testFrontierThirteenExcludesRoundOne() (gas: 155766)\n[PASS] testFrontierThreeIncludesRoundOne() (gas: 154450)\n[PASS] testFrontierTwelveIncludesRoundOne() (gas: 157984)\n[PASS] testFuzzHeightDivision(uint96) (runs: 512, μ: 80190, ~: 80260)\n[PASS] testFuzzSingleActivityWindow(uint64,uint64,uint64) (runs: 512, μ: 160212, ~: 160177)\nLogs:\n  Bound result 942143766\n  Bound result 583536856\n\n[PASS] testFuzzSmallFrontierBounds(uint8) (runs: 512, μ: 86631, ~: 87637)\nLogs:\n  Bound result 6\n\n[PASS] testFuzzSparseHistoryMatchesIndependentWindowModel(uint16,uint64) (runs: 512, μ: 991075, ~: 990963)\nLogs:\n  Bound result 18\n\n[PASS] testGenesisFrontierZeroUsesValidEmptyPage() (gas: 78671)\n[PASS] testHeightComesFromBlockUnitsNotWorkOrReportedHeight() (gas: 201533)\n[PASS] testIncompletePageRejected() (gas: 41209)\n[PASS] testMaximumFrontierDoesNotOverflow() (gas: 155883)\n[PASS] testMockHonorsTruncatedPageFrontier() (gas: 133048)\n[PASS] testMockRejectsActualInvalidBounds() (gas: 41822)\n[PASS] testNappingAtOldestOfTwelveRounds() (gas: 174541)\n[PASS] testNappingJustOutsideThreeRounds() (gas: 174585)\n[PASS] testNoCoreCodeRevertsInsteadOfInventingSleep() (gas: 11798)\n[PASS] testOutOfRangeRoundRejected() (gas: 160931)\n[PASS] testOversizedPageRejected() (gas: 60509)\n[PASS] testPageEndpointMismatchRejected() (gas: 41380)\n[PASS] testPageFailurePropagates() (gas: 23984)\n[PASS] testPausedCoreKeepsLastSettledActivity() (gas: 201581)\n[PASS] testReversedWorkRejected() (gas: 180871)\n[PASS] testRoundAtExclusiveStartRejected() (gas: 160845)\n[PASS] testRunningAtFrontier() (gas: 174566)\n[PASS] testRunningAtOldestOfThreeRounds() (gas: 174573)\n[PASS] testSleepingAtExclusiveTwelveRoundBoundary() (gas: 172187)\n[PASS] testSleepingWithoutAnyActiveRoundsDespiteHistoricalWork() (gas: 100172)\n[PASS] testStateAndPageMismatchRejected() (gas: 41563)\n[PASS] testStateFailurePropagates() (gas: 12579)\n[PASS] testUnsortedRoundsRejected() (gas: 162866)\n[PASS] testZeroWorkCheckpointIsNotActivity() (gas: 174457)\n[PASS] testZeroWorkRecentCheckpointDoesNotOverrideNapping() (gas: 228374)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 606.95ms (813.44ms CPU time)\n\nRan 14 tests for test/ActivityProperties.t.sol:ActivityPropertiesTest\n[PASS] testAddingZeroWorkCheckpointsDoesNotEraseRecentActivity() (gas: 282512)\n[PASS] testDuplicateCheckpointAfterRunningCheckpointReverts() (gas: 278198)\n[PASS] testEndpointMismatchAfterRunningCheckpointReverts() (gas: 278920)\n[PASS] testFutureCheckpointAfterRunningCheckpointReverts() (gas: 278150)\n[PASS] testFuzzHeightIsFloorAndAddingOneBlockAddsExactlyOne(uint96) (runs: 1000, μ: 162577, ~: 162220)\nLogs:\n  Bound result 2024\n\n[PASS] testFuzzOneObservationAgesAndNewWorkWakesIt(uint64,uint64) (runs: 1000, μ: 671181, ~: 671153)\nLogs:\n  Bound result 16865404453008294928\n  Bound result 11\n\n[PASS] testFuzzTranslatingHistoryAndScalingPositiveWorkPreservesActivity(uint16,uint64,uint32,uint32) (runs: 1000, μ: 1337441, ~: 1338054)\nLogs:\n  Bound result 90\n  Bound result 11\n\n[PASS] testFuzzTruncatedStateResponseCannotProduceMetadata(uint8) (runs: 1000, μ: 56909, ~: 48896)\n[PASS] testInvalidCheckpointAfterRunningCheckpointStillReverts() (gas: 278439)\n[PASS] testLastUnitOfCumulativeWorkCountsAsActivity() (gas: 265088)\n[PASS] testMaximumHistoricalWorkWithZeroRecentDeltaIsSleeping() (gas: 174921)\n[PASS] testMetadataRecoversAfterDependencyFailureWithoutCollectionWrite() (gas: 4007780)\n[PASS] testOverCertifiedPageReverts() (gas: 276493)\n[PASS] testTruncatedDynamicPageResponseCannotProduceMetadata() (gas: 382224)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 704.51ms (1.49s CPU time)\n\nRan 10 tests for test/Metadata.t.sol:MetadataTest\n[PASS] testBlockOverlayChangesEvenWithinSameActivityState() (gas: 9458884)\n[PASS] testFuzzMetadataPreservesNumericHeightsAndMintBlocks(uint96,uint64) (runs: 512, μ: 4674560, ~: 4655532)\n[PASS] testJsonAndSvgAreValidDataUrisWithRequiredFields() (gas: 4879501)\n[PASS] testMetadataChangesLiveWhileMintBlockStaysFixedAcrossTransfer() (gas: 10860609)\n[PASS] testNappingArtHasClosedEyesZzzAndNightBackground() (gas: 4835518)\n[PASS] testPreviewMetadata() (gas: 1788886)\nLogs:\n  PREVIEW_RUNNING=data:application/json;base64,eyJuYW1lIjoiX1NxdWVlayBDb21wYW5pb24gIzEwMCIsImRlc2NyaXB0aW9uIjoiQSBjb21wYW5pb24gcmVmbGVjdGluZyBTcXVlZWt0b3NoaSdzIHNldHRsZWQgb24tY2hhaW4gd2hlZWwgYWN0aXZpdHkuIG1pbnRfYmxvY2sgaXMgdGhlIFNlcG9saWEgYmxvY2sgYXQgbWludC4gTm8gcmV3YXJkcyBvciB1cGtlZXAuIiwiaW1hZ2UiOiJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSFpwWlhkQ2IzZzlJakFnTUNBek1qQWdNell3SWlCeWIyeGxQU0pwYldjaUlHRnlhV0V0YkdGaVpXeHNaV1JpZVQwaWRHbDBiR1VnWkdWell5SStQSFJwZEd4bElHbGtQU0owYVhSc1pTSStYMU54ZFdWbGF5QkRiMjF3WVc1cGIyNDZJRkpWVGs1SlRrYzhMM1JwZEd4bFBqeGtaWE5qSUdsa1BTSmtaWE5qSWo1QklIQnBlR1ZzSUdoaGJYTjBaWElnY21WbWJHVmpkR2x1WnlCelpYUjBiR1ZrSUhkb1pXVnNJR0ZqZEdsMmFYUjVMaUJUY1hWbFpXc2dZbXh2WTJzZ05ESXVQQzlrWlhOalBqeHlaV04wSUhkcFpIUm9QU0l6TWpBaUlHaGxhV2RvZEQwaU16WXdJaUJtYVd4c1BTSWpaamhrT1RsaklpOCtQSEpsWTNRZ2VEMGlNVElpSUhrOUlqRXlJaUIzYVdSMGFEMGlNamsySWlCb1pXbG5hSFE5SWpNek5pSWdabWxzYkQwaWJtOXVaU0lnYzNSeWIydGxQU0lqTlRFek9ESmxJaUJ2Y0dGamFYUjVQU0l1TXpVaUx6NDhaeUJtYVd4c1BTSWpOVEV6T0RKbElpQm1iMjUwTFdaaGJXbHNlVDBpYlc5dWIzTndZV05sSWlCMFpYaDBMV0Z1WTJodmNqMGliV2xrWkd4bElqNDhkR1Y0ZENCNFBTSXhOakFpSUhrOUlqTTVJaUJtYjI1MExYTnBlbVU5SWpFMUlpQnNaWFIwWlhJdGMzQmhZMmx1WnowaU1pSStYMU5SVlVWRlN5QkRUMDFRUVU1SlQwNDhMM1JsZUhRK1BIUmxlSFFnZUQwaU1UWXdJaUI1UFNJMk5pSWdabTl1ZEMxemFYcGxQU0l4TVNJZ2JHVjBkR1Z5TFhOd1lXTnBibWM5SWpNaVBsSlZUazVKVGtjOEwzUmxlSFErUEM5blBqeG5JR2xrUFNKM2FHVmxiQ0lnWm1sc2JEMGlibTl1WlNJZ2MzUnliMnRsUFNJalltSTROalUySWlCemRISnZhMlV0ZDJsa2RHZzlJallpUGp4amFYSmpiR1VnWTNnOUlqRTJNQ0lnWTNrOUlqRTJPU0lnY2owaU9EZ2lMejQ4Y0dGMGFDQmtQU0pOT1RZZ01UQTFiREV5T0NBeE1qaE5OeklnTVRZNWFERTNOazB4TmpBZ09ERjJNVGMyVFRrMklESXpNMnd4TWpndE1USTRJaUJ2Y0dGamFYUjVQU0l1TXpVaUx6NDhMMmMrUEdjZ2FXUTlJbTF2ZEdsdmJpMXNhVzVsY3lJZ1ptbHNiRDBpSTJKaU5tRXpOaUkrUEhCaGRHZ2daRDBpVFRNd0lERTBOMmd6T1hZMlNETXdlazB5TWlBeE5qUm9NemgyTmtneU1ucE5NekFnTVRneGFETTBkalpJTXpCNlRUSTFNeUF4TkRkb01qVjJObWd0TWpWNlRUSTJNQ0F4TmpSb016aDJObWd0TXpoNlRUSTFNeUF4T0RGb01qVjJObWd0TWpWNklpOCtQQzluUGp4d1lYUm9JR1E5SWsweE1qWWdNalUwYURZNGRqWm9MVFk0ZWlJZ1ptbHNiRDBpSTJKaU9EWTFOaUl2UGp4bklITm9ZWEJsTFhKbGJtUmxjbWx1WnowaVkzSnBjM0JGWkdkbGN5SStQR2NnYzNSeWIydGxQU0lqTlRFek9ESmxJaUJ6ZEhKdmEyVXRkMmxrZEdnOUlqWWlJSE4wY205clpTMXNhVzVsYW05cGJqMGliV2wwWlhJaVBqeHdZWFJvSUdROUlrMHhNRFFnTVRReGRpMHpNR2c0ZGkwNGFESTBkamhvT0hZek1FMHhOellnTVRReGRpMHpNR2c0ZGkwNGFESTBkamhvT0hZek1DSWdabWxzYkQwaUkyUTJPV0UyTkNJdlBqeHdZWFJvSUdROUlrMHhNRFFnTVRRemFERTJkaTB4TW1nNE1IWXhNbWd4Tm5ZeE5tZ3hNblkyTkdndE1USjJNVFpvTFRFMmRqaG9MVGd3ZGkwNGFDMHhObll0TVRaSU9USjJMVFkwYURFeWVpSWdabWxzYkQwaUkyUTJPV0UyTkNJdlBqd3ZaejQ4Y0dGMGFDQmtQU0pOTVRFMUlERXhObWd4Tm5ZeE9XZ3RNVFo2VFRFNE9TQXhNVFpvTVRaMk1UbG9MVEUyZWlJZ1ptbHNiRDBpSTJWbVlqQmhNQ0l2UGp4d1lYUm9JR1E5SWsweE1Ua2dNVGMxYURneWRqRXlhREV5ZGpNMmFDMHhNbll4TW1ndE9ESjJMVEV5YUMweE1uWXRNelpvTVRKNklpQm1hV3hzUFNJalptWm1NR05sSWk4K1BIQmhkR2dnWkQwaVRURXhNQ0F4T1Rkb01UUjJPR2d0TVRSNlRURTVOaUF4T1Rkb01UUjJPR2d0TVRSNklpQm1hV3hzUFNJalpXWmhNVGhqSWk4K1BIQmhkR2dnWkQwaVRURTFOQ0F4T1Rob01USjJOMmd0TVRKNklpQm1hV3hzUFNJak9XSTJNelZoSWk4K1BIQmhkR2dnWkQwaVRURTFOeUF5TURWb05uWTVhQzAyZWsweE5EWWdNakUwYURFeGRqVm9MVEV4ZWsweE5qTWdNakUwYURFeGRqVm9MVEV4ZWlJZ1ptbHNiRDBpSXpVeE16Z3laU0l2UGp4d1lYUm9JR1E5SWsweE1ESWdNakl5YURFNGRqRXphQzB4T0hwTk1qQXdJREl5TW1neE9IWXhNMmd0TVRoNklpQm1hV3hzUFNJall6UTROalU0SWk4K1BIQmhkR2dnWkQwaVRURXhOaUF5TkRKb01qUjJNVEJvTFRJMGVrMHhPREFnTWpReWFESTBkakV3YUMweU5Ib2lJR1pwYkd3OUlpTmxabUl3WVRBaUx6NDhaeUJwWkQwaWIzQmxiaTFsZVdWeklpQm1hV3hzUFNJak16TXlPREpqSWo0OGNHRjBhQ0JrUFNKTk1USTFJREUzTTJneE1uWXhOMmd0TVRKNlRURTRNeUF4TnpOb01USjJNVGRvTFRFeWVpSXZQand2Wno0OGNHRjBhQ0JrUFNKTk1USTNJREUzTldnMGRqVm9MVFI2VFRFNE5TQXhOelZvTkhZMWFDMDBlaUlnWm1sc2JEMGlJMlptWmpsbE9TSXZQand2Wno0OFp5Qm1hV3hzUFNJak5URXpPREpsSWlCbWIyNTBMV1poYldsc2VUMGliVzl1YjNOd1lXTmxJaUIwWlhoMExXRnVZMmh2Y2owaWJXbGtaR3hsSWo0OGRHVjRkQ0I0UFNJeE5qQWlJSGs5SWpJNU1pSWdabTl1ZEMxemFYcGxQU0l4TUNJZ2JHVjBkR1Z5TFhOd1lXTnBibWM5SWpJaVBsTlJWVVZGU3lCQ1RFOURTend2ZEdWNGRENDhkR1Y0ZENCNFBTSXhOakFpSUhrOUlqTXhOeUlnWm05dWRDMXphWHBsUFNJeE5pSStOREk4TDNSbGVIUStQSFJsZUhRZ2VEMGlNVFl3SWlCNVBTSXpNemNpSUdadmJuUXRjMmw2WlQwaU9DSWdiM0JoWTJsMGVUMGlMamNpUGtFZ1RFbFVWRXhGSUVOUFRWQkJUa2xQVGlCVVR5QlVTRVVnVjBoRlJVdzhMM1JsZUhRK1BDOW5Qand2YzNablBnPT0iLCJhdHRyaWJ1dGVzIjpbeyJ0cmFpdF90eXBlIjoic3RhdGUiLCJ2YWx1ZSI6IlJVTk5JTkcifSx7ImRpc3BsYXlfdHlwZSI6Im51bWJlciIsInRyYWl0X3R5cGUiOiJzcXVlZWtfYmxvY2siLCJ2YWx1ZSI6NDJ9LHsiZGlzcGxheV90eXBlIjoibnVtYmVyIiwidHJhaXRfdHlwZSI6Im1pbnRfYmxvY2siLCJ2YWx1ZSI6MjAwMDAwMDB9XX0=\n  PREVIEW_NAPPING=data:application/json;base64,eyJuYW1lIjoiX1NxdWVlayBDb21wYW5pb24gIzEwMCIsImRlc2NyaXB0aW9uIjoiQSBjb21wYW5pb24gcmVmbGVjdGluZyBTcXVlZWt0b3NoaSdzIHNldHRsZWQgb24tY2hhaW4gd2hlZWwgYWN0aXZpdHkuIG1pbnRfYmxvY2sgaXMgdGhlIFNlcG9saWEgYmxvY2sgYXQgbWludC4gTm8gcmV3YXJkcyBvciB1cGtlZXAuIiwiaW1hZ2UiOiJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSFpwWlhkQ2IzZzlJakFnTUNBek1qQWdNell3SWlCeWIyeGxQU0pwYldjaUlHRnlhV0V0YkdGaVpXeHNaV1JpZVQwaWRHbDBiR1VnWkdWell5SStQSFJwZEd4bElHbGtQU0owYVhSc1pTSStYMU54ZFdWbGF5QkRiMjF3WVc1cGIyNDZJRTVCVUZCSlRrYzhMM1JwZEd4bFBqeGtaWE5qSUdsa1BTSmtaWE5qSWo1QklIQnBlR1ZzSUdoaGJYTjBaWElnY21WbWJHVmpkR2x1WnlCelpYUjBiR1ZrSUhkb1pXVnNJR0ZqZEdsMmFYUjVMaUJUY1hWbFpXc2dZbXh2WTJzZ05ESXVQQzlrWlhOalBqeHlaV04wSUhkcFpIUm9QU0l6TWpBaUlHaGxhV2RvZEQwaU16WXdJaUJtYVd4c1BTSWpNalF6TmpWaUlpOCtQSEpsWTNRZ2VEMGlNVElpSUhrOUlqRXlJaUIzYVdSMGFEMGlNamsySWlCb1pXbG5hSFE5SWpNek5pSWdabWxzYkQwaWJtOXVaU0lnYzNSeWIydGxQU0lqWmpkbE5HSmlJaUJ2Y0dGamFYUjVQU0l1TXpVaUx6NDhaeUJtYVd4c1BTSWpaamRsTkdKaUlpQm1iMjUwTFdaaGJXbHNlVDBpYlc5dWIzTndZV05sSWlCMFpYaDBMV0Z1WTJodmNqMGliV2xrWkd4bElqNDhkR1Y0ZENCNFBTSXhOakFpSUhrOUlqTTVJaUJtYjI1MExYTnBlbVU5SWpFMUlpQnNaWFIwWlhJdGMzQmhZMmx1WnowaU1pSStYMU5SVlVWRlN5QkRUMDFRUVU1SlQwNDhMM1JsZUhRK1BIUmxlSFFnZUQwaU1UWXdJaUI1UFNJMk5pSWdabTl1ZEMxemFYcGxQU0l4TVNJZ2JHVjBkR1Z5TFhOd1lXTnBibWM5SWpNaVBrNUJVRkJKVGtjOEwzUmxlSFErUEM5blBqeG5JR2xrUFNKemRHRnljeUlnWm1sc2JEMGlJMkk1WXpsbFpTSStQSEJoZEdnZ1pEMGlUVFEwSURFd00yZzBkalJvTFRSNlRUYzNJREV6TldnMGRqUm9MVFI2VFRJMU9DQXhOREZvTkhZMGFDMDBlazB5TnpJZ01UQXphRFIyTkdndE5IcE5ORGtnTWpFMWFEUjJOR2d0TkhwTk1qTTVJREl3T1dnMGRqUm9MVFI2SWk4K1BDOW5Qanh3WVhSb0lHUTlJazA0TkNBeU5EVm9NVFV5ZGpoSU9EUjZUVGsySURJMU0yZ3hNamgyTmtnNU5ub2lJR1pwYkd3OUlpTTFPVFppT0RnaUx6NDhaeUJwWkQwaWVucDZJaUJtYVd4c1BTSWpaREJrWTJZeklpQm1iMjUwTFdaaGJXbHNlVDBpYlc5dWIzTndZV05sSWo0OGRHVjRkQ0I0UFNJeU1Ua2lJSGs5SWpFek5pSWdabTl1ZEMxemFYcGxQU0l5TWlJK1dqd3ZkR1Y0ZEQ0OGRHVjRkQ0I0UFNJeU16a2lJSGs5SWpFeE9TSWdabTl1ZEMxemFYcGxQU0l4TnlJK2Vqd3ZkR1Y0ZEQ0OGRHVjRkQ0I0UFNJeU5UWWlJSGs5SWpFd05DSWdabTl1ZEMxemFYcGxQU0l4TWlJK2Vqd3ZkR1Y0ZEQ0OEwyYytQR2NnYzJoaGNHVXRjbVZ1WkdWeWFXNW5QU0pqY21semNFVmtaMlZ6SWo0OFp5QnpkSEp2YTJVOUlpTTFNVE00TW1VaUlITjBjbTlyWlMxM2FXUjBhRDBpTmlJZ2MzUnliMnRsTFd4cGJtVnFiMmx1UFNKdGFYUmxjaUkrUEhCaGRHZ2daRDBpVFRFd05DQXhOREYyTFRNd2FEaDJMVGhvTWpSMk9HZzRkak13VFRFM05pQXhOREYyTFRNd2FEaDJMVGhvTWpSMk9HZzRkak13SWlCbWFXeHNQU0lqWkRZNVlUWTBJaTgrUEhCaGRHZ2daRDBpVFRFd05DQXhORE5vTVRaMkxURXlhRGd3ZGpFeWFERTJkakUyYURFeWRqWTBhQzB4TW5ZeE5tZ3RNVFoyT0dndE9EQjJMVGhvTFRFMmRpMHhOa2c1TW5ZdE5qUm9NVEo2SWlCbWFXeHNQU0lqWkRZNVlUWTBJaTgrUEM5blBqeHdZWFJvSUdROUlrMHhNVFVnTVRFMmFERTJkakU1YUMweE5ucE5NVGc1SURFeE5tZ3hObll4T1dndE1UWjZJaUJtYVd4c1BTSWpaV1ppTUdFd0lpOCtQSEJoZEdnZ1pEMGlUVEV4T1NBeE56Vm9PREoyTVRKb01USjJNelpvTFRFeWRqRXlhQzA0TW5ZdE1USm9MVEV5ZGkwek5tZ3hNbm9pSUdacGJHdzlJaU5tWm1Zd1kyVWlMejQ4Y0dGMGFDQmtQU0pOTVRFd0lERTVOMmd4TkhZNGFDMHhOSHBOTVRrMklERTVOMmd4TkhZNGFDMHhOSG9pSUdacGJHdzlJaU5sWm1FeE9HTWlMejQ4Y0dGMGFDQmtQU0pOTVRVMElERTVPR2d4TW5ZM2FDMHhNbm9pSUdacGJHdzlJaU01WWpZek5XRWlMejQ4Y0dGMGFDQmtQU0pOTVRVM0lESXdOV2cyZGpsb0xUWjZUVEUwTmlBeU1UUm9NVEYyTldndE1URjZUVEUyTXlBeU1UUm9NVEYyTldndE1URjZJaUJtYVd4c1BTSWpOVEV6T0RKbElpOCtQSEJoZEdnZ1pEMGlUVEV3TWlBeU1qSm9NVGgyTVROb0xURTRlazB5TURBZ01qSXlhREU0ZGpFemFDMHhPSG9pSUdacGJHdzlJaU5qTkRnMk5UZ2lMejQ4Y0dGMGFDQmtQU0pOTVRFMklESTBNbWd5TkhZeE1HZ3RNalI2VFRFNE1DQXlOREpvTWpSMk1UQm9MVEkwZWlJZ1ptbHNiRDBpSTJWbVlqQmhNQ0l2UGp4d1lYUm9JR2xrUFNKamJHOXpaV1F0WlhsbGN5SWdaRDBpVFRFeU1pQXhPREZvT0hZMWFERXlkaTAxYURWTk1UY3pJREU0TVdnNGRqVm9NVEoyTFRWb05TSWdabWxzYkQwaWJtOXVaU0lnYzNSeWIydGxQU0lqTXpNeU9ESmpJaUJ6ZEhKdmEyVXRkMmxrZEdnOUlqVWlMejQ4TDJjK1BHY2dabWxzYkQwaUkyWTNaVFJpWWlJZ1ptOXVkQzFtWVcxcGJIazlJbTF2Ym05emNHRmpaU0lnZEdWNGRDMWhibU5vYjNJOUltMXBaR1JzWlNJK1BIUmxlSFFnZUQwaU1UWXdJaUI1UFNJeU9USWlJR1p2Ym5RdGMybDZaVDBpTVRBaUlHeGxkSFJsY2kxemNHRmphVzVuUFNJeUlqNVRVVlZGUlVzZ1FreFBRMHM4TDNSbGVIUStQSFJsZUhRZ2VEMGlNVFl3SWlCNVBTSXpNVGNpSUdadmJuUXRjMmw2WlQwaU1UWWlQalF5UEM5MFpYaDBQangwWlhoMElIZzlJakUyTUNJZ2VUMGlNek0zSWlCbWIyNTBMWE5wZW1VOUlqZ2lJRzl3WVdOcGRIazlJaTQzSWo1QklFeEpWRlJNUlNCRFQwMVFRVTVKVDA0Z1ZFOGdWRWhGSUZkSVJVVk1QQzkwWlhoMFBqd3ZaejQ4TDNOMlp6ND0iLCJhdHRyaWJ1dGVzIjpbeyJ0cmFpdF90eXBlIjoic3RhdGUiLCJ2YWx1ZSI6Ik5BUFBJTkcifSx7ImRpc3BsYXlfdHlwZSI6Im51bWJlciIsInRyYWl0X3R5cGUiOiJzcXVlZWtfYmxvY2siLCJ2YWx1ZSI6NDJ9LHsiZGlzcGxheV90eXBlIjoibnVtYmVyIiwidHJhaXRfdHlwZSI6Im1pbnRfYmxvY2siLCJ2YWx1ZSI6MjAwMDAwMDB9XX0=\n  PREVIEW_SLEEPING=data:application/json;base64,eyJuYW1lIjoiX1NxdWVlayBDb21wYW5pb24gIzEwMCIsImRlc2NyaXB0aW9uIjoiQSBjb21wYW5pb24gcmVmbGVjdGluZyBTcXVlZWt0b3NoaSdzIHNldHRsZWQgb24tY2hhaW4gd2hlZWwgYWN0aXZpdHkuIG1pbnRfYmxvY2sgaXMgdGhlIFNlcG9saWEgYmxvY2sgYXQgbWludC4gTm8gcmV3YXJkcyBvciB1cGtlZXAuIiwiaW1hZ2UiOiJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSFpwWlhkQ2IzZzlJakFnTUNBek1qQWdNell3SWlCeWIyeGxQU0pwYldjaUlHRnlhV0V0YkdGaVpXeHNaV1JpZVQwaWRHbDBiR1VnWkdWell5SStQSFJwZEd4bElHbGtQU0owYVhSc1pTSStYMU54ZFdWbGF5QkRiMjF3WVc1cGIyNDZJRk5NUlVWUVNVNUhQQzkwYVhSc1pUNDhaR1Z6WXlCcFpEMGlaR1Z6WXlJK1FTQndhWGhsYkNCb1lXMXpkR1Z5SUhKbFpteGxZM1JwYm1jZ2MyVjBkR3hsWkNCM2FHVmxiQ0JoWTNScGRtbDBlUzRnVTNGMVpXVnJJR0pzYjJOcklEUXlMand2WkdWell6NDhjbVZqZENCM2FXUjBhRDBpTXpJd0lpQm9aV2xuYUhROUlqTTJNQ0lnWm1sc2JEMGlJekV3TVRjeVpTSXZQanh5WldOMElIZzlJakV5SWlCNVBTSXhNaUlnZDJsa2RHZzlJakk1TmlJZ2FHVnBaMmgwUFNJek16WWlJR1pwYkd3OUltNXZibVVpSUhOMGNtOXJaVDBpSTJZM1pUUmlZaUlnYjNCaFkybDBlVDBpTGpNMUlpOCtQR2NnWm1sc2JEMGlJMlkzWlRSaVlpSWdabTl1ZEMxbVlXMXBiSGs5SW0xdmJtOXpjR0ZqWlNJZ2RHVjRkQzFoYm1Ob2IzSTlJbTFwWkdSc1pTSStQSFJsZUhRZ2VEMGlNVFl3SWlCNVBTSXpPU0lnWm05dWRDMXphWHBsUFNJeE5TSWdiR1YwZEdWeUxYTndZV05wYm1jOUlqSWlQbDlUVVZWRlJVc2dRMDlOVUVGT1NVOU9QQzkwWlhoMFBqeDBaWGgwSUhnOUlqRTJNQ0lnZVQwaU5qWWlJR1p2Ym5RdGMybDZaVDBpTVRFaUlHeGxkSFJsY2kxemNHRmphVzVuUFNJeklqNVRURVZGVUVsT1J6d3ZkR1Y0ZEQ0OEwyYytQR2NnYVdROUluTjBZWEp6SWlCbWFXeHNQU0lqWWpsak9XVmxJajQ4Y0dGMGFDQmtQU0pOTkRRZ01UQXphRFIyTkdndE5IcE5OemNnTVRNMWFEUjJOR2d0TkhwTk1qVTRJREUwTVdnMGRqUm9MVFI2VFRJM01pQXhNRE5vTkhZMGFDMDBlazAwT1NBeU1UVm9OSFkwYUMwMGVrMHlNemtnTWpBNWFEUjJOR2d0TkhvaUx6NDhMMmMrUEhCaGRHZ2daRDBpVFRnMElESTBOV2d4TlRKMk9FZzROSHBOT1RZZ01qVXphREV5T0hZMlNEazJlaUlnWm1sc2JEMGlJelU1Tm1JNE9DSXZQanh3WVhSb0lHbGtQU0p0YjI5dUlpQmtQU0pOTWpRMElEZzBhREl3ZGpab0xURTBkamhvTFRaMk1UaG9Oblk0YURFMGRqWm9MVEl3ZGkwMmFDMDRkaTA0YUMwMlZqazRhRFoyTFRob09Ib2lJR1pwYkd3OUlpTm1ObVUyWWpBaUx6NDhjR0YwYUNCa1BTSk5OemNnTWpRd2FERTJOblkzU0RjM2VpSWdabWxzYkQwaUl6TTFOREUxWlNJdlBqeG5JSE5vWVhCbExYSmxibVJsY21sdVp6MGlZM0pwYzNCRlpHZGxjeUkrUEdjZ2MzUnliMnRsUFNJak5URXpPREpsSWlCemRISnZhMlV0ZDJsa2RHZzlJallpSUhOMGNtOXJaUzFzYVc1bGFtOXBiajBpYldsMFpYSWlQanh3WVhSb0lHUTlJazB4TURRZ01UUXhkaTB6TUdnNGRpMDRhREkwZGpob09IWXpNRTB4TnpZZ01UUXhkaTB6TUdnNGRpMDRhREkwZGpob09IWXpNQ0lnWm1sc2JEMGlJMlEyT1dFMk5DSXZQanh3WVhSb0lHUTlJazB4TURRZ01UUXphREUyZGkweE1tZzRNSFl4TW1neE5uWXhObWd4TW5ZMk5HZ3RNVEoyTVRab0xURTJkamhvTFRnd2RpMDRhQzB4Tm5ZdE1UWklPVEoyTFRZMGFERXllaUlnWm1sc2JEMGlJMlEyT1dFMk5DSXZQand2Wno0OGNHRjBhQ0JrUFNKTk1URTFJREV4Tm1neE5uWXhPV2d0TVRaNlRURTRPU0F4TVRab01UWjJNVGxvTFRFMmVpSWdabWxzYkQwaUkyVm1ZakJoTUNJdlBqeHdZWFJvSUdROUlrMHhNVGtnTVRjMWFEZ3lkakV5YURFeWRqTTJhQzB4TW5ZeE1tZ3RPREoyTFRFeWFDMHhNbll0TXpab01USjZJaUJtYVd4c1BTSWpabVptTUdObElpOCtQSEJoZEdnZ1pEMGlUVEV4TUNBeE9UZG9NVFIyT0dndE1UUjZUVEU1TmlBeE9UZG9NVFIyT0dndE1UUjZJaUJtYVd4c1BTSWpaV1poTVRoaklpOCtQSEJoZEdnZ1pEMGlUVEUxTkNBeE9UaG9NVEoyTjJndE1USjZJaUJtYVd4c1BTSWpPV0kyTXpWaElpOCtQSEJoZEdnZ1pEMGlUVEUxTnlBeU1EVm9Oblk1YUMwMmVrMHhORFlnTWpFMGFERXhkalZvTFRFeGVrMHhOak1nTWpFMGFERXhkalZvTFRFeGVpSWdabWxzYkQwaUl6VXhNemd5WlNJdlBqeHdZWFJvSUdROUlrMHhNRElnTWpJeWFERTRkakV6YUMweE9IcE5NakF3SURJeU1tZ3hPSFl4TTJndE1UaDZJaUJtYVd4c1BTSWpZelE0TmpVNElpOCtQSEJoZEdnZ1pEMGlUVEV4TmlBeU5ESm9NalIyTVRCb0xUSTBlazB4T0RBZ01qUXlhREkwZGpFd2FDMHlOSG9pSUdacGJHdzlJaU5sWm1Jd1lUQWlMejQ4Y0dGMGFDQnBaRDBpWTJ4dmMyVmtMV1Y1WlhNaUlHUTlJazB4TWpJZ01UZ3hhRGgyTldneE1uWXROV2cxVFRFM015QXhPREZvT0hZMWFERXlkaTAxYURVaUlHWnBiR3c5SW01dmJtVWlJSE4wY205clpUMGlJek16TWpneVl5SWdjM1J5YjJ0bExYZHBaSFJvUFNJMUlpOCtQQzluUGp4bklHWnBiR3c5SWlObU4yVTBZbUlpSUdadmJuUXRabUZ0YVd4NVBTSnRiMjV2YzNCaFkyVWlJSFJsZUhRdFlXNWphRzl5UFNKdGFXUmtiR1VpUGp4MFpYaDBJSGc5SWpFMk1DSWdlVDBpTWpreUlpQm1iMjUwTFhOcGVtVTlJakV3SWlCc1pYUjBaWEl0YzNCaFkybHVaejBpTWlJK1UxRlZSVVZMSUVKTVQwTkxQQzkwWlhoMFBqeDBaWGgwSUhnOUlqRTJNQ0lnZVQwaU16RTNJaUJtYjI1MExYTnBlbVU5SWpFMklqNDBNand2ZEdWNGRENDhkR1Y0ZENCNFBTSXhOakFpSUhrOUlqTXpOeUlnWm05dWRDMXphWHBsUFNJNElpQnZjR0ZqYVhSNVBTSXVOeUkrUVNCTVNWUlVURVVnUTA5TlVFRk9TVTlPSUZSUElGUklSU0JYU0VWRlREd3ZkR1Y0ZEQ0OEwyYytQQzl6ZG1jKyIsImF0dHJpYnV0ZXMiOlt7InRyYWl0X3R5cGUiOiJzdGF0ZSIsInZhbHVlIjoiU0xFRVBJTkcifSx7ImRpc3BsYXlfdHlwZSI6Im51bWJlciIsInRyYWl0X3R5cGUiOiJzcXVlZWtfYmxvY2siLCJ2YWx1ZSI6NDJ9LHsiZGlzcGxheV90eXBlIjoibnVtYmVyIiwidHJhaXRfdHlwZSI6Im1pbnRfYmxvY2siLCJ2YWx1ZSI6MjAwMDAwMDB9XX0=\n\n[PASS] testReserveTokenMetadataAvailableWithoutPublicMint() (gas: 4456723)\n[PASS] testSleepingArtHasMoonAndDeeperNightBackground() (gas: 4599478)\n[PASS] testUnchangedCoreProducesIdenticalMetadataRegardlessOfTime() (gas: 1053477)\n[PASS] testUnknownTokenRevertsBeforeDependencyRead() (gas: 37287)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 704.43ms (826.71ms CPU time)\n\nRan 21 tests for test/Minting.t.sol:MintingTest\n[PASS] testAll900PublicMintsReach999AndCannotTouchReserve() (gas: 118826395)\n[PASS] testCallbackTransferAndReentryCannotClaimTwice() (gas: 883516)\n[PASS] testConstructorNeedsNoExternalCodeAndFactoryHasNoPrivilege() (gas: 7888917)\n[PASS] testContractWalletCanMintWithReceiverHook() (gas: 432358)\n[PASS] testDirectEtherRejected() (gas: 39388)\n[PASS] testExactCollectionIdentityAndInterfaces() (gas: 108301)\n[PASS] testFreeMintRecordsOwnerSupplyAndStaticBlockAndEmitsTransfer() (gas: 219355)\n[PASS] testFuzzDistinctWalletsReceiveDistinctPublicTokens(uint8) (runs: 512, μ: 1750291, ~: 1481084)\nLogs:\n  Bound result 19\n\n[PASS] testInvalidReceiverRollsBackThenCanRetry() (gas: 616554)\n[PASS] testMintDoesNotDependOnCoreAvailability() (gas: 230578)\n[PASS] testMintRejectsEtherWithoutConsumingEligibility() (gas: 204100)\n[PASS] testMissingReceiverHookRollsBack() (gas: 300857)\n[PASS] testNoOwnerMintPauseOrUpgradeBackdoors() (gas: 107762)\n[PASS] testOneLifetimePublicMintPerWallet() (gas: 177681)\n[PASS] testRecipientCanClaimOnceEvenWhenAlreadyHoldingAnotherToken() (gas: 325785)\n[PASS] testReserveHeldByNamedOwnerAtDeployment() (gas: 2359803)\n[PASS] testReserveOwnerCanClaimOneOfThePublicAllocation() (gas: 172856)\n[PASS] testReserveOwnerMayTransferTheirTokens() (gas: 112079)\n[PASS] testRevertingReceiverCannotBlockOtherMinters() (gas: 486253)\n[PASS] testTransferringAwayDoesNotRestoreMintEligibility() (gas: 241933)\n[PASS] testUnauthorizedReserveTransferRejected() (gas: 40834)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 704.40ms (915.82ms CPU time)\n\nRan 1 test for test/Invariants.t.sol:CompanionInvariantTest\n[PASS]\nCompanionInvariantTest invariants:\n[PASS] invariantLifetimeClaimsPersistAfterArbitraryTransfers\n[PASS] invariantMintedPublicIdsExistAndMintBlocksNeverChange\n[PASS] invariantReserveNeverEntersPublicMintPool\n[PASS] invariantSupplyAndBalancesAreConserved\n CompanionInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭---------------------+----------------------+-------+---------+----------╮\n| Contract            | Selector             | Calls | Reverts | Discards |\n+=========================================================================+\n| MintTransferHandler | mint                 | 2719  | 0       | 0        |\n|---------------------+----------------------+-------+---------+----------|\n| MintTransferHandler | transfer             | 2748  | 0       | 0        |\n|---------------------+----------------------+-------+---------+----------|\n| MintTransferHandler | unauthorizedTransfer | 2725  | 0       | 0        |\n╰---------------------+----------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 10.03s (10.02s CPU time)\n\nRan 1 test for test/LedgerInvariants.t.sol:LedgerInvariantTest\n[PASS]\nLedgerInvariantTest invariants:\n[PASS] invariant_independentLedgerMatchesEveryObservableBalanceAndAuthorization\n[PASS] invariant_noUncountedTokenExists\n LedgerInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭------------------------+---------------+-------+---------+----------╮\n| Contract               | Selector      | Calls | Reverts | Discards |\n+=====================================================================+\n| CompanionLedgerHandler | approve       | 2274  | 0       | 0        |\n|------------------------+---------------+-------+---------+----------|\n| CompanionLedgerHandler | attackReserve | 2382  | 0       | 0        |\n|------------------------+---------------+-------+---------+----------|\n| CompanionLedgerHandler | mint          | 2280  | 0       | 0        |\n|------------------------+---------------+-------+---------+----------|\n| CompanionLedgerHandler | mintWithValue | 2392  | 0       | 0        |\n|------------------------+---------------+-------+---------+----------|\n| CompanionLedgerHandler | roundTrip     | 2344  | 0       | 0        |\n|------------------------+---------------+-------+---------+----------|\n| CompanionLedgerHandler | setOperator   | 2376  | 0       | 0        |\n|------------------------+---------------+-------+---------+----------|\n| CompanionLedgerHandler | transfer      | 2336  | 0       | 0        |\n╰------------------------+---------------+-------+---------+----------╯\n\nLogs:\n  Bound result 98\n  Bound result 1\n  Bound result 84\n  Bound result 5\n  Bound result 158131851557598309\n  Bound result 45\n  Bound result 13\n  Bound result 62\n  Bound result 42500000000\n  Bound result 1\n  Bound result 6179\n  Bound result 42\n  Bound result 82\n  Bound result 407163386462069369\n  Bound result 723953619018\n  Bound result 27\n  Bound result 23\n  Bound result 22\n  Bound result 92\n  Bound result 9000000000\n  Bound result 1783\n  Bound result 7\n  Bound result 71\n  Bound result 21\n  Bound result 3\n  Bound result 40\n  Bound result 29\n  Bound result 8\n  Bound result 2\n  Bound result 35\n  Bound result 1\n  Bound result 54\n  Bound result 17\n  Bound result 56\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 15.72s (15.71s CPU time)\n\nRan 2 tests for test/LedgerInvariants.t.sol:NearCapLedgerInvariantTest\n[PASS]\nNearCapLedgerInvariantTest invariants:\n[PASS] invariant_independentLedgerMatchesEveryObservableBalanceAndAuthorization\n[PASS] invariant_noUncountedTokenExists\n NearCapLedgerInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭------------------------+---------------+-------+---------+----------╮\n| Contract               | Selector      | Calls | Reverts | Discards |\n+=====================================================================+\n| CompanionLedgerHandler | approve       | 2274  | 0       | 0        |\n|------------------------+---------------+-------+---------+----------|\n| CompanionLedgerHandler | attackReserve | 2382  | 0       | 0        |\n|------------------------+---------------+-------+---------+----------|\n| CompanionLedgerHandler | mint          | 2280  | 0       | 0        |\n|------------------------+---------------+-------+---------+----------|\n| CompanionLedgerHandler | mintWithValue | 2392  | 0       | 0        |\n|------------------------+---------------+-------+---------+----------|\n| CompanionLedgerHandler | roundTrip     | 2344  | 0       | 0        |\n|------------------------+---------------+-------+---------+----------|\n| CompanionLedgerHandler | setOperator   | 2376  | 0       | 0        |\n|------------------------+---------------+-------+---------+----------|\n| CompanionLedgerHandler | transfer      | 2336  | 0       | 0        |\n╰------------------------+---------------+-------+---------+----------╯\n\nLogs:\n  Bound result 98\n  Bound result 1\n  Bound result 38\n  Bound result 5\n  Bound result 766638007233936525\n  Bound result 45\n  Bound result 45\n  Bound result 62\n  Bound result 42500000000\n  Bound result 1\n  Bound result 8113\n  Bound result 42\n  Bound result 82\n  Bound result 266214917287040024\n  Bound result 723953619018\n  Bound result 27\n  Bound result 1\n  Bound result 22\n  Bound result 92\n  Bound result 9000000000\n  Bound result 887612478\n  Bound result 93\n  Bound result 71\n  Bound result 50\n  Bound result 3\n  Bound result 90\n  Bound result 25\n  Bound result 8\n  Bound result 2\n  Bound result 4\n  Bound result 1\n  Bound result 10\n  Bound result 17\n  Bound result 56\n\n[PASS] testNearCapHandlerReachesExhaustionAndCannotRestoreEligibilityByTransfer() (gas: 21552473)\nLogs:\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 20.98s (20.95s CPU time)\n\nRan 11 test suites in 20.99s (50.24s CPU time): 108 tests passed, 0 failed, 0 skipped (108 total tests)\n","passed":true},{"durationMs":73,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"SqueekCompanion.approve(address,uint256)\",\"SqueekCompanion.mint()\",\"SqueekCompanion.safeTransferFrom(address,address,uint256)\",\"SqueekCompanion.safeTransferFrom(address,address,uint256,bytes)\",\"SqueekCompanion.setApprovalForAll(address,bool)\",\"SqueekCompanion.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":5,\"LICENSE\":21,\"README.md\":119,\"docs/VALIDATION.md\":36,\"docs/abi/SqueekCompanion.json\":672,\"docs/abi/SqueekCore.reads.json\":169,\"docs/dependencies.json\":64,\"docs/previews/napping.json\":21,\"docs/previews/napping.svg\":1,\"docs/previews/running.json\":21,\"docs/previews/running.svg\":1,\"docs/previews/sleeping.json\":21,\"docs/previews/sleeping.svg\":1,\"foundry.toml\":22,\"remappings.txt\":2,\"scripts/export_artifacts.py\":95,\"src/SqueekCompanion.sol\":126,\"src/interfaces/ISqueekCore.sol\":47,\"src/libraries/CompanionArt.sol\":115,\"test/ActivityProperties.t.sol\":191,\"test/CallbackAtomicity.t.sol\":226,\"test/DeploymentAndABI.t.sol\":74,\"test/ERC721.t.sol\":85,\"test/Invariants.t.sol\":105,\"test/LedgerInvariants.t.sol\":137,\"test/Metadata.t.sol\":143,\"test/Minting.t.sol\":265,\"test/StateDerivation.t.sol\":271,\"test/TESTING.md\":59,\"test/handlers/CompanionLedgerHandler.sol\":280,\"test/helpers/CompanionTestBase.sol\":52,\"test/helpers/DataUri.sol\":41,\"test/mocks/AtomicReceiver.sol\":89,\"test/mocks/MintReceivers.sol\":79,\"test/mocks/MockSqueekCore.sol\":86},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"c329099e8a55aea55f31418f197028bf59e1e1a90666517f78484046f93e47d9","verifiedTreeHash":"d5f14c48e5b7112ad3f1865865a618e95ec4ac6b","verifierVersion":"0.1.0+d372f99e"},{"checks":[{"durationMs":2250,"exitCode":0,"name":"build","output":"Compiling 47 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.17s\nCompiler run successful!\n","passed":true},{"durationMs":9024,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 7 tests for test/ERC721.t.sol:ERC721Test\n[PASS] testNonexistentTokenAndZeroBalanceQueriesRevert() (gas: 32629)\n[PASS] testOperatorApprovalAndRevocation() (gas: 382578)\n[PASS] testSafeTransferAcceptingReceiverWithData() (gas: 482719)\n[PASS] testSafeTransferRejectsMissingReceiverAndPreservesOwner() (gas: 355799)\n[PASS] testTokenApprovalAndTransferClearApproval() (gas: 330384)\n[PASS] testUnauthorizedApprovalRejected() (gas: 176551)\n[PASS] testWrongFromAndZeroRecipientRejected() (gas: 242232)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 10.14ms (1.45ms CPU time)\n\nRan 2 tests for test/DeploymentAndABI.t.sol:DeploymentAndABITest\n[PASS] testPublishedV3AbiDecodesExactFieldWidthsAndNestedPageOffsets() (gas: 23586)\n[PASS] testRuntimeFitsEip170AndContainsNoReachableEscapeOpcodes() (gas: 6416956)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 32.38ms (31.35ms CPU time)\n\nRan 35 tests for test/StateDerivation.t.sol:StateDerivationTest\n[PASS] testAllTwelveActiveRoundsFitOnePageAndRecentWins() (gas: 775486)\n[PASS] testFirstRoundIsRunning() (gas: 157863)\n[PASS] testFrontierFourRoundOneIsNapping() (gas: 154506)\n[PASS] testFrontierThirteenExcludesRoundOne() (gas: 155766)\n[PASS] testFrontierThreeIncludesRoundOne() (gas: 154450)\n[PASS] testFrontierTwelveIncludesRoundOne() (gas: 157984)\n[PASS] testFuzzHeightDivision(uint96) (runs: 512, μ: 80185, ~: 80248)\n[PASS] testFuzzSingleActivityWindow(uint64,uint64,uint64) (runs: 512, μ: 160260, ~: 160177)\nLogs:\n  Bound result 37926\n  Bound result 16236\n\n[PASS] testFuzzSmallFrontierBounds(uint8) (runs: 512, μ: 86660, ~: 87637)\nLogs:\n  Bound result 8\n\n[PASS] testFuzzSparseHistoryMatchesIndependentWindowModel(uint16,uint64) (runs: 512, μ: 991069, ~: 990929)\nLogs:\n  Bound result 86\n\n[PASS] testGenesisFrontierZeroUsesValidEmptyPage() (gas: 78671)\n[PASS] testHeightComesFromBlockUnitsNotWorkOrReportedHeight() (gas: 201533)\n[PASS] testIncompletePageRejected() (gas: 41209)\n[PASS] testMaximumFrontierDoesNotOverflow() (gas: 155883)\n[PASS] testMockHonorsTruncatedPageFrontier() (gas: 133048)\n[PASS] testMockRejectsActualInvalidBounds() (gas: 41822)\n[PASS] testNappingAtOldestOfTwelveRounds() (gas: 174541)\n[PASS] testNappingJustOutsideThreeRounds() (gas: 174585)\n[PASS] testNoCoreCodeRevertsInsteadOfInventingSleep() (gas: 11798)\n[PASS] testOutOfRangeRoundRejected() (gas: 160931)\n[PASS] testOversizedPageRejected() (gas: 60509)\n[PASS] testPageEndpointMismatchRejected() (gas: 41380)\n[PASS] testPageFailurePropagates() (gas: 23984)\n[PASS] testPausedCoreKeepsLastSettledActivity() (gas: 201581)\n[PASS] testReversedWorkRejected() (gas: 180871)\n[PASS] testRoundAtExclusiveStartRejected() (gas: 160845)\n[PASS] testRunningAtFrontier() (gas: 174566)\n[PASS] testRunningAtOldestOfThreeRounds() (gas: 174573)\n[PASS] testSleepingAtExclusiveTwelveRoundBoundary() (gas: 172187)\n[PASS] testSleepingWithoutAnyActiveRoundsDespiteHistoricalWork() (gas: 100172)\n[PASS] testStateAndPageMismatchRejected() (gas: 41563)\n[PASS] testStateFailurePropagates() (gas: 12579)\n[PASS] testUnsortedRoundsRejected() (gas: 162866)\n[PASS] testZeroWorkCheckpointIsNotActivity() (gas: 174457)\n[PASS] testZeroWorkRecentCheckpointDoesNotOverrideNapping() (gas: 228374)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 549.85ms (664.32ms CPU time)\n\nRan 10 tests for test/Metadata.t.sol:MetadataTest\n[PASS] testBlockOverlayChangesEvenWithinSameActivityState() (gas: 9458884)\n[PASS] testFuzzMetadataPreservesNumericHeightsAndMintBlocks(uint96,uint64) (runs: 512, μ: 4671900, ~: 4654759)\n[PASS] testJsonAndSvgAreValidDataUrisWithRequiredFields() (gas: 4879501)\n[PASS] testMetadataChangesLiveWhileMintBlockStaysFixedAcrossTransfer() (gas: 10860609)\n[PASS] testNappingArtHasClosedEyesZzzAndNightBackground() (gas: 4835518)\n[PASS] testPreviewMetadata() (gas: 1788886)\nLogs:\n  PREVIEW_RUNNING=data:application/json;base64,eyJuYW1lIjoiX1NxdWVlayBDb21wYW5pb24gIzEwMCIsImRlc2NyaXB0aW9uIjoiQSBjb21wYW5pb24gcmVmbGVjdGluZyBTcXVlZWt0b3NoaSdzIHNldHRsZWQgb24tY2hhaW4gd2hlZWwgYWN0aXZpdHkuIG1pbnRfYmxvY2sgaXMgdGhlIFNlcG9saWEgYmxvY2sgYXQgbWludC4gTm8gcmV3YXJkcyBvciB1cGtlZXAuIiwiaW1hZ2UiOiJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSFpwWlhkQ2IzZzlJakFnTUNBek1qQWdNell3SWlCeWIyeGxQU0pwYldjaUlHRnlhV0V0YkdGaVpXeHNaV1JpZVQwaWRHbDBiR1VnWkdWell5SStQSFJwZEd4bElHbGtQU0owYVhSc1pTSStYMU54ZFdWbGF5QkRiMjF3WVc1cGIyNDZJRkpWVGs1SlRrYzhMM1JwZEd4bFBqeGtaWE5qSUdsa1BTSmtaWE5qSWo1QklIQnBlR1ZzSUdoaGJYTjBaWElnY21WbWJHVmpkR2x1WnlCelpYUjBiR1ZrSUhkb1pXVnNJR0ZqZEdsMmFYUjVMaUJUY1hWbFpXc2dZbXh2WTJzZ05ESXVQQzlrWlhOalBqeHlaV04wSUhkcFpIUm9QU0l6TWpBaUlHaGxhV2RvZEQwaU16WXdJaUJtYVd4c1BTSWpaamhrT1RsaklpOCtQSEpsWTNRZ2VEMGlNVElpSUhrOUlqRXlJaUIzYVdSMGFEMGlNamsySWlCb1pXbG5hSFE5SWpNek5pSWdabWxzYkQwaWJtOXVaU0lnYzNSeWIydGxQU0lqTlRFek9ESmxJaUJ2Y0dGamFYUjVQU0l1TXpVaUx6NDhaeUJtYVd4c1BTSWpOVEV6T0RKbElpQm1iMjUwTFdaaGJXbHNlVDBpYlc5dWIzTndZV05sSWlCMFpYaDBMV0Z1WTJodmNqMGliV2xrWkd4bElqNDhkR1Y0ZENCNFBTSXhOakFpSUhrOUlqTTVJaUJtYjI1MExYTnBlbVU5SWpFMUlpQnNaWFIwWlhJdGMzQmhZMmx1WnowaU1pSStYMU5SVlVWRlN5QkRUMDFRUVU1SlQwNDhMM1JsZUhRK1BIUmxlSFFnZUQwaU1UWXdJaUI1UFNJMk5pSWdabTl1ZEMxemFYcGxQU0l4TVNJZ2JHVjBkR1Z5TFhOd1lXTnBibWM5SWpNaVBsSlZUazVKVGtjOEwzUmxlSFErUEM5blBqeG5JR2xrUFNKM2FHVmxiQ0lnWm1sc2JEMGlibTl1WlNJZ2MzUnliMnRsUFNJalltSTROalUySWlCemRISnZhMlV0ZDJsa2RHZzlJallpUGp4amFYSmpiR1VnWTNnOUlqRTJNQ0lnWTNrOUlqRTJPU0lnY2owaU9EZ2lMejQ4Y0dGMGFDQmtQU0pOT1RZZ01UQTFiREV5T0NBeE1qaE5OeklnTVRZNWFERTNOazB4TmpBZ09ERjJNVGMyVFRrMklESXpNMnd4TWpndE1USTRJaUJ2Y0dGamFYUjVQU0l1TXpVaUx6NDhMMmMrUEdjZ2FXUTlJbTF2ZEdsdmJpMXNhVzVsY3lJZ1ptbHNiRDBpSTJKaU5tRXpOaUkrUEhCaGRHZ2daRDBpVFRNd0lERTBOMmd6T1hZMlNETXdlazB5TWlBeE5qUm9NemgyTmtneU1ucE5NekFnTVRneGFETTBkalpJTXpCNlRUSTFNeUF4TkRkb01qVjJObWd0TWpWNlRUSTJNQ0F4TmpSb016aDJObWd0TXpoNlRUSTFNeUF4T0RGb01qVjJObWd0TWpWNklpOCtQQzluUGp4d1lYUm9JR1E5SWsweE1qWWdNalUwYURZNGRqWm9MVFk0ZWlJZ1ptbHNiRDBpSTJKaU9EWTFOaUl2UGp4bklITm9ZWEJsTFhKbGJtUmxjbWx1WnowaVkzSnBjM0JGWkdkbGN5SStQR2NnYzNSeWIydGxQU0lqTlRFek9ESmxJaUJ6ZEhKdmEyVXRkMmxrZEdnOUlqWWlJSE4wY205clpTMXNhVzVsYW05cGJqMGliV2wwWlhJaVBqeHdZWFJvSUdROUlrMHhNRFFnTVRReGRpMHpNR2c0ZGkwNGFESTBkamhvT0hZek1FMHhOellnTVRReGRpMHpNR2c0ZGkwNGFESTBkamhvT0hZek1DSWdabWxzYkQwaUkyUTJPV0UyTkNJdlBqeHdZWFJvSUdROUlrMHhNRFFnTVRRemFERTJkaTB4TW1nNE1IWXhNbWd4Tm5ZeE5tZ3hNblkyTkdndE1USjJNVFpvTFRFMmRqaG9MVGd3ZGkwNGFDMHhObll0TVRaSU9USjJMVFkwYURFeWVpSWdabWxzYkQwaUkyUTJPV0UyTkNJdlBqd3ZaejQ4Y0dGMGFDQmtQU0pOTVRFMUlERXhObWd4Tm5ZeE9XZ3RNVFo2VFRFNE9TQXhNVFpvTVRaMk1UbG9MVEUyZWlJZ1ptbHNiRDBpSTJWbVlqQmhNQ0l2UGp4d1lYUm9JR1E5SWsweE1Ua2dNVGMxYURneWRqRXlhREV5ZGpNMmFDMHhNbll4TW1ndE9ESjJMVEV5YUMweE1uWXRNelpvTVRKNklpQm1hV3hzUFNJalptWm1NR05sSWk4K1BIQmhkR2dnWkQwaVRURXhNQ0F4T1Rkb01UUjJPR2d0TVRSNlRURTVOaUF4T1Rkb01UUjJPR2d0TVRSNklpQm1hV3hzUFNJalpXWmhNVGhqSWk4K1BIQmhkR2dnWkQwaVRURTFOQ0F4T1Rob01USjJOMmd0TVRKNklpQm1hV3hzUFNJak9XSTJNelZoSWk4K1BIQmhkR2dnWkQwaVRURTFOeUF5TURWb05uWTVhQzAyZWsweE5EWWdNakUwYURFeGRqVm9MVEV4ZWsweE5qTWdNakUwYURFeGRqVm9MVEV4ZWlJZ1ptbHNiRDBpSXpVeE16Z3laU0l2UGp4d1lYUm9JR1E5SWsweE1ESWdNakl5YURFNGRqRXphQzB4T0hwTk1qQXdJREl5TW1neE9IWXhNMmd0TVRoNklpQm1hV3hzUFNJall6UTROalU0SWk4K1BIQmhkR2dnWkQwaVRURXhOaUF5TkRKb01qUjJNVEJvTFRJMGVrMHhPREFnTWpReWFESTBkakV3YUMweU5Ib2lJR1pwYkd3OUlpTmxabUl3WVRBaUx6NDhaeUJwWkQwaWIzQmxiaTFsZVdWeklpQm1hV3hzUFNJak16TXlPREpqSWo0OGNHRjBhQ0JrUFNKTk1USTFJREUzTTJneE1uWXhOMmd0TVRKNlRURTRNeUF4TnpOb01USjJNVGRvTFRFeWVpSXZQand2Wno0OGNHRjBhQ0JrUFNKTk1USTNJREUzTldnMGRqVm9MVFI2VFRFNE5TQXhOelZvTkhZMWFDMDBlaUlnWm1sc2JEMGlJMlptWmpsbE9TSXZQand2Wno0OFp5Qm1hV3hzUFNJak5URXpPREpsSWlCbWIyNTBMV1poYldsc2VUMGliVzl1YjNOd1lXTmxJaUIwWlhoMExXRnVZMmh2Y2owaWJXbGtaR3hsSWo0OGRHVjRkQ0I0UFNJeE5qQWlJSGs5SWpJNU1pSWdabTl1ZEMxemFYcGxQU0l4TUNJZ2JHVjBkR1Z5TFhOd1lXTnBibWM5SWpJaVBsTlJWVVZGU3lCQ1RFOURTend2ZEdWNGRENDhkR1Y0ZENCNFBTSXhOakFpSUhrOUlqTXhOeUlnWm05dWRDMXphWHBsUFNJeE5pSStOREk4TDNSbGVIUStQSFJsZUhRZ2VEMGlNVFl3SWlCNVBTSXpNemNpSUdadmJuUXRjMmw2WlQwaU9DSWdiM0JoWTJsMGVUMGlMamNpUGtFZ1RFbFVWRXhGSUVOUFRWQkJUa2xQVGlCVVR5QlVTRVVnVjBoRlJVdzhMM1JsZUhRK1BDOW5Qand2YzNablBnPT0iLCJhdHRyaWJ1dGVzIjpbeyJ0cmFpdF90eXBlIjoic3RhdGUiLCJ2YWx1ZSI6IlJVTk5JTkcifSx7ImRpc3BsYXlfdHlwZSI6Im51bWJlciIsInRyYWl0X3R5cGUiOiJzcXVlZWtfYmxvY2siLCJ2YWx1ZSI6NDJ9LHsiZGlzcGxheV90eXBlIjoibnVtYmVyIiwidHJhaXRfdHlwZSI6Im1pbnRfYmxvY2siLCJ2YWx1ZSI6MjAwMDAwMDB9XX0=\n  PREVIEW_NAPPING=data:application/json;base64,eyJuYW1lIjoiX1NxdWVlayBDb21wYW5pb24gIzEwMCIsImRlc2NyaXB0aW9uIjoiQSBjb21wYW5pb24gcmVmbGVjdGluZyBTcXVlZWt0b3NoaSdzIHNldHRsZWQgb24tY2hhaW4gd2hlZWwgYWN0aXZpdHkuIG1pbnRfYmxvY2sgaXMgdGhlIFNlcG9saWEgYmxvY2sgYXQgbWludC4gTm8gcmV3YXJkcyBvciB1cGtlZXAuIiwiaW1hZ2UiOiJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSFpwWlhkQ2IzZzlJakFnTUNBek1qQWdNell3SWlCeWIyeGxQU0pwYldjaUlHRnlhV0V0YkdGaVpXeHNaV1JpZVQwaWRHbDBiR1VnWkdWell5SStQSFJwZEd4bElHbGtQU0owYVhSc1pTSStYMU54ZFdWbGF5QkRiMjF3WVc1cGIyNDZJRTVCVUZCSlRrYzhMM1JwZEd4bFBqeGtaWE5qSUdsa1BTSmtaWE5qSWo1QklIQnBlR1ZzSUdoaGJYTjBaWElnY21WbWJHVmpkR2x1WnlCelpYUjBiR1ZrSUhkb1pXVnNJR0ZqZEdsMmFYUjVMaUJUY1hWbFpXc2dZbXh2WTJzZ05ESXVQQzlrWlhOalBqeHlaV04wSUhkcFpIUm9QU0l6TWpBaUlHaGxhV2RvZEQwaU16WXdJaUJtYVd4c1BTSWpNalF6TmpWaUlpOCtQSEpsWTNRZ2VEMGlNVElpSUhrOUlqRXlJaUIzYVdSMGFEMGlNamsySWlCb1pXbG5hSFE5SWpNek5pSWdabWxzYkQwaWJtOXVaU0lnYzNSeWIydGxQU0lqWmpkbE5HSmlJaUJ2Y0dGamFYUjVQU0l1TXpVaUx6NDhaeUJtYVd4c1BTSWpaamRsTkdKaUlpQm1iMjUwTFdaaGJXbHNlVDBpYlc5dWIzTndZV05sSWlCMFpYaDBMV0Z1WTJodmNqMGliV2xrWkd4bElqNDhkR1Y0ZENCNFBTSXhOakFpSUhrOUlqTTVJaUJtYjI1MExYTnBlbVU5SWpFMUlpQnNaWFIwWlhJdGMzQmhZMmx1WnowaU1pSStYMU5SVlVWRlN5QkRUMDFRUVU1SlQwNDhMM1JsZUhRK1BIUmxlSFFnZUQwaU1UWXdJaUI1UFNJMk5pSWdabTl1ZEMxemFYcGxQU0l4TVNJZ2JHVjBkR1Z5TFhOd1lXTnBibWM5SWpNaVBrNUJVRkJKVGtjOEwzUmxlSFErUEM5blBqeG5JR2xrUFNKemRHRnljeUlnWm1sc2JEMGlJMkk1WXpsbFpTSStQSEJoZEdnZ1pEMGlUVFEwSURFd00yZzBkalJvTFRSNlRUYzNJREV6TldnMGRqUm9MVFI2VFRJMU9DQXhOREZvTkhZMGFDMDBlazB5TnpJZ01UQXphRFIyTkdndE5IcE5ORGtnTWpFMWFEUjJOR2d0TkhwTk1qTTVJREl3T1dnMGRqUm9MVFI2SWk4K1BDOW5Qanh3WVhSb0lHUTlJazA0TkNBeU5EVm9NVFV5ZGpoSU9EUjZUVGsySURJMU0yZ3hNamgyTmtnNU5ub2lJR1pwYkd3OUlpTTFPVFppT0RnaUx6NDhaeUJwWkQwaWVucDZJaUJtYVd4c1BTSWpaREJrWTJZeklpQm1iMjUwTFdaaGJXbHNlVDBpYlc5dWIzTndZV05sSWo0OGRHVjRkQ0I0UFNJeU1Ua2lJSGs5SWpFek5pSWdabTl1ZEMxemFYcGxQU0l5TWlJK1dqd3ZkR1Y0ZEQ0OGRHVjRkQ0I0UFNJeU16a2lJSGs5SWpFeE9TSWdabTl1ZEMxemFYcGxQU0l4TnlJK2Vqd3ZkR1Y0ZEQ0OGRHVjRkQ0I0UFNJeU5UWWlJSGs5SWpFd05DSWdabTl1ZEMxemFYcGxQU0l4TWlJK2Vqd3ZkR1Y0ZEQ0OEwyYytQR2NnYzJoaGNHVXRjbVZ1WkdWeWFXNW5QU0pqY21semNFVmtaMlZ6SWo0OFp5QnpkSEp2YTJVOUlpTTFNVE00TW1VaUlITjBjbTlyWlMxM2FXUjBhRDBpTmlJZ2MzUnliMnRsTFd4cGJtVnFiMmx1UFNKdGFYUmxjaUkrUEhCaGRHZ2daRDBpVFRFd05DQXhOREYyTFRNd2FEaDJMVGhvTWpSMk9HZzRkak13VFRFM05pQXhOREYyTFRNd2FEaDJMVGhvTWpSMk9HZzRkak13SWlCbWFXeHNQU0lqWkRZNVlUWTBJaTgrUEhCaGRHZ2daRDBpVFRFd05DQXhORE5vTVRaMkxURXlhRGd3ZGpFeWFERTJkakUyYURFeWRqWTBhQzB4TW5ZeE5tZ3RNVFoyT0dndE9EQjJMVGhvTFRFMmRpMHhOa2c1TW5ZdE5qUm9NVEo2SWlCbWFXeHNQU0lqWkRZNVlUWTBJaTgrUEM5blBqeHdZWFJvSUdROUlrMHhNVFVnTVRFMmFERTJkakU1YUMweE5ucE5NVGc1SURFeE5tZ3hObll4T1dndE1UWjZJaUJtYVd4c1BTSWpaV1ppTUdFd0lpOCtQSEJoZEdnZ1pEMGlUVEV4T1NBeE56Vm9PREoyTVRKb01USjJNelpvTFRFeWRqRXlhQzA0TW5ZdE1USm9MVEV5ZGkwek5tZ3hNbm9pSUdacGJHdzlJaU5tWm1Zd1kyVWlMejQ4Y0dGMGFDQmtQU0pOTVRFd0lERTVOMmd4TkhZNGFDMHhOSHBOTVRrMklERTVOMmd4TkhZNGFDMHhOSG9pSUdacGJHdzlJaU5sWm1FeE9HTWlMejQ4Y0dGMGFDQmtQU0pOTVRVMElERTVPR2d4TW5ZM2FDMHhNbm9pSUdacGJHdzlJaU01WWpZek5XRWlMejQ4Y0dGMGFDQmtQU0pOTVRVM0lESXdOV2cyZGpsb0xUWjZUVEUwTmlBeU1UUm9NVEYyTldndE1URjZUVEUyTXlBeU1UUm9NVEYyTldndE1URjZJaUJtYVd4c1BTSWpOVEV6T0RKbElpOCtQSEJoZEdnZ1pEMGlUVEV3TWlBeU1qSm9NVGgyTVROb0xURTRlazB5TURBZ01qSXlhREU0ZGpFemFDMHhPSG9pSUdacGJHdzlJaU5qTkRnMk5UZ2lMejQ4Y0dGMGFDQmtQU0pOTVRFMklESTBNbWd5TkhZeE1HZ3RNalI2VFRFNE1DQXlOREpvTWpSMk1UQm9MVEkwZWlJZ1ptbHNiRDBpSTJWbVlqQmhNQ0l2UGp4d1lYUm9JR2xrUFNKamJHOXpaV1F0WlhsbGN5SWdaRDBpVFRFeU1pQXhPREZvT0hZMWFERXlkaTAxYURWTk1UY3pJREU0TVdnNGRqVm9NVEoyTFRWb05TSWdabWxzYkQwaWJtOXVaU0lnYzNSeWIydGxQU0lqTXpNeU9ESmpJaUJ6ZEhKdmEyVXRkMmxrZEdnOUlqVWlMejQ4TDJjK1BHY2dabWxzYkQwaUkyWTNaVFJpWWlJZ1ptOXVkQzFtWVcxcGJIazlJbTF2Ym05emNHRmpaU0lnZEdWNGRDMWhibU5vYjNJOUltMXBaR1JzWlNJK1BIUmxlSFFnZUQwaU1UWXdJaUI1UFNJeU9USWlJR1p2Ym5RdGMybDZaVDBpTVRBaUlHeGxkSFJsY2kxemNHRmphVzVuUFNJeUlqNVRVVlZGUlVzZ1FreFBRMHM4TDNSbGVIUStQSFJsZUhRZ2VEMGlNVFl3SWlCNVBTSXpNVGNpSUdadmJuUXRjMmw2WlQwaU1UWWlQalF5UEM5MFpYaDBQangwWlhoMElIZzlJakUyTUNJZ2VUMGlNek0zSWlCbWIyNTBMWE5wZW1VOUlqZ2lJRzl3WVdOcGRIazlJaTQzSWo1QklFeEpWRlJNUlNCRFQwMVFRVTVKVDA0Z1ZFOGdWRWhGSUZkSVJVVk1QQzkwWlhoMFBqd3ZaejQ4TDNOMlp6ND0iLCJhdHRyaWJ1dGVzIjpbeyJ0cmFpdF90eXBlIjoic3RhdGUiLCJ2YWx1ZSI6Ik5BUFBJTkcifSx7ImRpc3BsYXlfdHlwZSI6Im51bWJlciIsInRyYWl0X3R5cGUiOiJzcXVlZWtfYmxvY2siLCJ2YWx1ZSI6NDJ9LHsiZGlzcGxheV90eXBlIjoibnVtYmVyIiwidHJhaXRfdHlwZSI6Im1pbnRfYmxvY2siLCJ2YWx1ZSI6MjAwMDAwMDB9XX0=\n  PREVIEW_SLEEPING=data:application/json;base64,eyJuYW1lIjoiX1NxdWVlayBDb21wYW5pb24gIzEwMCIsImRlc2NyaXB0aW9uIjoiQSBjb21wYW5pb24gcmVmbGVjdGluZyBTcXVlZWt0b3NoaSdzIHNldHRsZWQgb24tY2hhaW4gd2hlZWwgYWN0aXZpdHkuIG1pbnRfYmxvY2sgaXMgdGhlIFNlcG9saWEgYmxvY2sgYXQgbWludC4gTm8gcmV3YXJkcyBvciB1cGtlZXAuIiwiaW1hZ2UiOiJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSFpwWlhkQ2IzZzlJakFnTUNBek1qQWdNell3SWlCeWIyeGxQU0pwYldjaUlHRnlhV0V0YkdGaVpXeHNaV1JpZVQwaWRHbDBiR1VnWkdWell5SStQSFJwZEd4bElHbGtQU0owYVhSc1pTSStYMU54ZFdWbGF5QkRiMjF3WVc1cGIyNDZJRk5NUlVWUVNVNUhQQzkwYVhSc1pUNDhaR1Z6WXlCcFpEMGlaR1Z6WXlJK1FTQndhWGhsYkNCb1lXMXpkR1Z5SUhKbFpteGxZM1JwYm1jZ2MyVjBkR3hsWkNCM2FHVmxiQ0JoWTNScGRtbDBlUzRnVTNGMVpXVnJJR0pzYjJOcklEUXlMand2WkdWell6NDhjbVZqZENCM2FXUjBhRDBpTXpJd0lpQm9aV2xuYUhROUlqTTJNQ0lnWm1sc2JEMGlJekV3TVRjeVpTSXZQanh5WldOMElIZzlJakV5SWlCNVBTSXhNaUlnZDJsa2RHZzlJakk1TmlJZ2FHVnBaMmgwUFNJek16WWlJR1pwYkd3OUltNXZibVVpSUhOMGNtOXJaVDBpSTJZM1pUUmlZaUlnYjNCaFkybDBlVDBpTGpNMUlpOCtQR2NnWm1sc2JEMGlJMlkzWlRSaVlpSWdabTl1ZEMxbVlXMXBiSGs5SW0xdmJtOXpjR0ZqWlNJZ2RHVjRkQzFoYm1Ob2IzSTlJbTFwWkdSc1pTSStQSFJsZUhRZ2VEMGlNVFl3SWlCNVBTSXpPU0lnWm05dWRDMXphWHBsUFNJeE5TSWdiR1YwZEdWeUxYTndZV05wYm1jOUlqSWlQbDlUVVZWRlJVc2dRMDlOVUVGT1NVOU9QQzkwWlhoMFBqeDBaWGgwSUhnOUlqRTJNQ0lnZVQwaU5qWWlJR1p2Ym5RdGMybDZaVDBpTVRFaUlHeGxkSFJsY2kxemNHRmphVzVuUFNJeklqNVRURVZGVUVsT1J6d3ZkR1Y0ZEQ0OEwyYytQR2NnYVdROUluTjBZWEp6SWlCbWFXeHNQU0lqWWpsak9XVmxJajQ4Y0dGMGFDQmtQU0pOTkRRZ01UQXphRFIyTkdndE5IcE5OemNnTVRNMWFEUjJOR2d0TkhwTk1qVTRJREUwTVdnMGRqUm9MVFI2VFRJM01pQXhNRE5vTkhZMGFDMDBlazAwT1NBeU1UVm9OSFkwYUMwMGVrMHlNemtnTWpBNWFEUjJOR2d0TkhvaUx6NDhMMmMrUEhCaGRHZ2daRDBpVFRnMElESTBOV2d4TlRKMk9FZzROSHBOT1RZZ01qVXphREV5T0hZMlNEazJlaUlnWm1sc2JEMGlJelU1Tm1JNE9DSXZQanh3WVhSb0lHbGtQU0p0YjI5dUlpQmtQU0pOTWpRMElEZzBhREl3ZGpab0xURTBkamhvTFRaMk1UaG9Oblk0YURFMGRqWm9MVEl3ZGkwMmFDMDRkaTA0YUMwMlZqazRhRFoyTFRob09Ib2lJR1pwYkd3OUlpTm1ObVUyWWpBaUx6NDhjR0YwYUNCa1BTSk5OemNnTWpRd2FERTJOblkzU0RjM2VpSWdabWxzYkQwaUl6TTFOREUxWlNJdlBqeG5JSE5vWVhCbExYSmxibVJsY21sdVp6MGlZM0pwYzNCRlpHZGxjeUkrUEdjZ2MzUnliMnRsUFNJak5URXpPREpsSWlCemRISnZhMlV0ZDJsa2RHZzlJallpSUhOMGNtOXJaUzFzYVc1bGFtOXBiajBpYldsMFpYSWlQanh3WVhSb0lHUTlJazB4TURRZ01UUXhkaTB6TUdnNGRpMDRhREkwZGpob09IWXpNRTB4TnpZZ01UUXhkaTB6TUdnNGRpMDRhREkwZGpob09IWXpNQ0lnWm1sc2JEMGlJMlEyT1dFMk5DSXZQanh3WVhSb0lHUTlJazB4TURRZ01UUXphREUyZGkweE1tZzRNSFl4TW1neE5uWXhObWd4TW5ZMk5HZ3RNVEoyTVRab0xURTJkamhvTFRnd2RpMDRhQzB4Tm5ZdE1UWklPVEoyTFRZMGFERXllaUlnWm1sc2JEMGlJMlEyT1dFMk5DSXZQand2Wno0OGNHRjBhQ0JrUFNKTk1URTFJREV4Tm1neE5uWXhPV2d0TVRaNlRURTRPU0F4TVRab01UWjJNVGxvTFRFMmVpSWdabWxzYkQwaUkyVm1ZakJoTUNJdlBqeHdZWFJvSUdROUlrMHhNVGtnTVRjMWFEZ3lkakV5YURFeWRqTTJhQzB4TW5ZeE1tZ3RPREoyTFRFeWFDMHhNbll0TXpab01USjZJaUJtYVd4c1BTSWpabVptTUdObElpOCtQSEJoZEdnZ1pEMGlUVEV4TUNBeE9UZG9NVFIyT0dndE1UUjZUVEU1TmlBeE9UZG9NVFIyT0dndE1UUjZJaUJtYVd4c1BTSWpaV1poTVRoaklpOCtQSEJoZEdnZ1pEMGlUVEUxTkNBeE9UaG9NVEoyTjJndE1USjZJaUJtYVd4c1BTSWpPV0kyTXpWaElpOCtQSEJoZEdnZ1pEMGlUVEUxTnlBeU1EVm9Oblk1YUMwMmVrMHhORFlnTWpFMGFERXhkalZvTFRFeGVrMHhOak1nTWpFMGFERXhkalZvTFRFeGVpSWdabWxzYkQwaUl6VXhNemd5WlNJdlBqeHdZWFJvSUdROUlrMHhNRElnTWpJeWFERTRkakV6YUMweE9IcE5NakF3SURJeU1tZ3hPSFl4TTJndE1UaDZJaUJtYVd4c1BTSWpZelE0TmpVNElpOCtQSEJoZEdnZ1pEMGlUVEV4TmlBeU5ESm9NalIyTVRCb0xUSTBlazB4T0RBZ01qUXlhREkwZGpFd2FDMHlOSG9pSUdacGJHdzlJaU5sWm1Jd1lUQWlMejQ4Y0dGMGFDQnBaRDBpWTJ4dmMyVmtMV1Y1WlhNaUlHUTlJazB4TWpJZ01UZ3hhRGgyTldneE1uWXROV2cxVFRFM015QXhPREZvT0hZMWFERXlkaTAxYURVaUlHWnBiR3c5SW01dmJtVWlJSE4wY205clpUMGlJek16TWpneVl5SWdjM1J5YjJ0bExYZHBaSFJvUFNJMUlpOCtQQzluUGp4bklHWnBiR3c5SWlObU4yVTBZbUlpSUdadmJuUXRabUZ0YVd4NVBTSnRiMjV2YzNCaFkyVWlJSFJsZUhRdFlXNWphRzl5UFNKdGFXUmtiR1VpUGp4MFpYaDBJSGc5SWpFMk1DSWdlVDBpTWpreUlpQm1iMjUwTFhOcGVtVTlJakV3SWlCc1pYUjBaWEl0YzNCaFkybHVaejBpTWlJK1UxRlZSVVZMSUVKTVQwTkxQQzkwWlhoMFBqeDBaWGgwSUhnOUlqRTJNQ0lnZVQwaU16RTNJaUJtYjI1MExYTnBlbVU5SWpFMklqNDBNand2ZEdWNGRENDhkR1Y0ZENCNFBTSXhOakFpSUhrOUlqTXpOeUlnWm05dWRDMXphWHBsUFNJNElpQnZjR0ZqYVhSNVBTSXVOeUkrUVNCTVNWUlVURVVnUTA5TlVFRk9TVTlPSUZSUElGUklSU0JYU0VWRlREd3ZkR1Y0ZEQ0OEwyYytQQzl6ZG1jKyIsImF0dHJpYnV0ZXMiOlt7InRyYWl0X3R5cGUiOiJzdGF0ZSIsInZhbHVlIjoiU0xFRVBJTkcifSx7ImRpc3BsYXlfdHlwZSI6Im51bWJlciIsInRyYWl0X3R5cGUiOiJzcXVlZWtfYmxvY2siLCJ2YWx1ZSI6NDJ9LHsiZGlzcGxheV90eXBlIjoibnVtYmVyIiwidHJhaXRfdHlwZSI6Im1pbnRfYmxvY2siLCJ2YWx1ZSI6MjAwMDAwMDB9XX0=\n\n[PASS] testReserveTokenMetadataAvailableWithoutPublicMint() (gas: 4456723)\n[PASS] testSleepingArtHasMoonAndDeeperNightBackground() (gas: 4599478)\n[PASS] testUnchangedCoreProducesIdenticalMetadataRegardlessOfTime() (gas: 1053477)\n[PASS] testUnknownTokenRevertsBeforeDependencyRead() (gas: 37287)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 552.54ms (681.48ms CPU time)\n\nRan 21 tests for test/Minting.t.sol:MintingTest\n[PASS] testAll900PublicMintsReach999AndCannotTouchReserve() (gas: 118826395)\n[PASS] testCallbackTransferAndReentryCannotClaimTwice() (gas: 883516)\n[PASS] testConstructorNeedsNoExternalCodeAndFactoryHasNoPrivilege() (gas: 7888917)\n[PASS] testContractWalletCanMintWithReceiverHook() (gas: 432358)\n[PASS] testDirectEtherRejected() (gas: 39388)\n[PASS] testExactCollectionIdentityAndInterfaces() (gas: 108301)\n[PASS] testFreeMintRecordsOwnerSupplyAndStaticBlockAndEmitsTransfer() (gas: 219355)\n[PASS] testFuzzDistinctWalletsReceiveDistinctPublicTokens(uint8) (runs: 512, μ: 1739570, ~: 1351165)\nLogs:\n  Bound result 19\n\n[PASS] testInvalidReceiverRollsBackThenCanRetry() (gas: 616554)\n[PASS] testMintDoesNotDependOnCoreAvailability() (gas: 230578)\n[PASS] testMintRejectsEtherWithoutConsumingEligibility() (gas: 204100)\n[PASS] testMissingReceiverHookRollsBack() (gas: 300857)\n[PASS] testNoOwnerMintPauseOrUpgradeBackdoors() (gas: 107762)\n[PASS] testOneLifetimePublicMintPerWallet() (gas: 177681)\n[PASS] testRecipientCanClaimOnceEvenWhenAlreadyHoldingAnotherToken() (gas: 325785)\n[PASS] testReserveHeldByNamedOwnerAtDeployment() (gas: 2359803)\n[PASS] testReserveOwnerCanClaimOneOfThePublicAllocation() (gas: 172856)\n[PASS] testReserveOwnerMayTransferTheirTokens() (gas: 112079)\n[PASS] testRevertingReceiverCannotBlockOtherMinters() (gas: 486253)\n[PASS] testTransferringAwayDoesNotRestoreMintEligibility() (gas: 241933)\n[PASS] testUnauthorizedReserveTransferRejected() (gas: 40834)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 552.49ms (158.52ms CPU time)\n\nRan 1 test for test/Invariants.t.sol:CompanionInvariantTest\n[PASS]\nCompanionInvariantTest invariants:\n[PASS] invariantLifetimeClaimsPersistAfterArbitraryTransfers\n[PASS] invariantMintedPublicIdsExistAndMintBlocksNeverChange\n[PASS] invariantReserveNeverEntersPublicMintPool\n[PASS] invariantSupplyAndBalancesAreConserved\n CompanionInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭---------------------+----------------------+-------+---------+----------╮\n| Contract            | Selector             | Calls | Reverts | Discards |\n+=========================================================================+\n| MintTransferHandler | mint                 | 2719  | 0       | 0        |\n|---------------------+----------------------+-------+---------+----------|\n| MintTransferHandler | transfer             | 2748  | 0       | 0        |\n|---------------------+----------------------+-------+---------+----------|\n| MintTransferHandler | unauthorizedTransfer | 2725  | 0       | 0        |\n╰---------------------+----------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 8.91s (8.91s CPU time)\n\nRan 6 test suites in 8.92s (10.61s CPU time): 76 tests passed, 0 failed, 0 skipped (76 total tests)\n","passed":true},{"durationMs":39,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"SqueekCompanion.approve(address,uint256)\",\"SqueekCompanion.mint()\",\"SqueekCompanion.safeTransferFrom(address,address,uint256)\",\"SqueekCompanion.safeTransferFrom(address,address,uint256,bytes)\",\"SqueekCompanion.setApprovalForAll(address,bool)\",\"SqueekCompanion.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":5,\"LICENSE\":21,\"README.md\":119,\"docs/VALIDATION.md\":36,\"docs/abi/SqueekCompanion.json\":672,\"docs/abi/SqueekCore.reads.json\":169,\"docs/dependencies.json\":64,\"docs/previews/napping.json\":21,\"docs/previews/napping.svg\":1,\"docs/previews/running.json\":21,\"docs/previews/running.svg\":1,\"docs/previews/sleeping.json\":21,\"docs/previews/sleeping.svg\":1,\"foundry.toml\":22,\"remappings.txt\":2,\"scripts/export_artifacts.py\":95,\"src/SqueekCompanion.sol\":126,\"src/interfaces/ISqueekCore.sol\":47,\"src/libraries/CompanionArt.sol\":115,\"test/DeploymentAndABI.t.sol\":74,\"test/ERC721.t.sol\":85,\"test/Invariants.t.sol\":105,\"test/Metadata.t.sol\":143,\"test/Minting.t.sol\":265,\"test/StateDerivation.t.sol\":271,\"test/helpers/CompanionTestBase.sol\":52,\"test/helpers/DataUri.sol\":41,\"test/mocks/MintReceivers.sol\":79,\"test/mocks/MockSqueekCore.sol\":86},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":1491,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":391,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/SqueekCompanion.sol:17: Large Numeric Literal\n[low] require-revert-in-loop at src/SqueekCompanion.sol:85: Loop Contains `require`/`revert`\n[low] unchecked-return at src/SqueekCompanion.sol:58: Unchecked Return (2 places)\n[low] uninitialized-local-variable at src/SqueekCompanion.sol:85: Uninitialized Local Variable\n[low] unsafe-oz-erc721-mint at src/SqueekCompanion.sol:37: Unsafe `ERC721::_mint()`\n[low] unused-public-function at src/SqueekCompanion.sol:57: Public Function Not Used Internally","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"cc50b8f1fc216b8fc07dde81e2caf069e04befc5ad81b6a6f8dd5cc461e4fc88","verifiedTreeHash":"fb92c42d95430f897c6d5b763a0fbc3bc6af7125","verifierVersion":"0.1.0+d372f99e"}]}