diff --git a/README.md b/README.md index 65abdbc..d8c9638 100644 --- a/README.md +++ b/README.md @@ -170,7 +170,8 @@ The following is a list of contracts that are deployed by this script. │ clawback │ ClawbackMetadata │ 0x335411eAA9D63251f8c0867600Be4d0C190a3b1f │ │ developer-multisig │ DeveloperMultisig │ 0x007a47e6BF40C1e0ed5c01aE42fDC75879140bc4 │ │ factories │ Erc1155Factory │ 0x024b9949FeD1c8dd7154DE653456d64Aa1093384 │ -│ factories │ Erc1155PackFactory │ 0x5B2f47ee798eee52cE184C9eC4d60873185836d8 │ +│ factories │ Erc1155Holder │ 0x3883491F1433dafafd20FB8FD9ec1fE032Ca5e3B │ +│ factories │ Erc1155PackFactory │ 0xC4F1ABB23d8CC6E2786fBe7374A1162C499E1701 │ │ factories │ Erc1155SaleFactory │ 0xFb89C8A7DF9A1e0299088C3fC46fd87D3FcbcDBd │ │ factories │ Erc1155SoulboundFactory │ 0xCCbB517AaCAb6680A2ad08ef5A593677dDE17284 │ │ factories │ Erc20Factory │ 0x434c9C50b0Ca6b67AbB71F667C822d5451265062 │ diff --git a/jobs/builder/build-info/v2/ERC1155-Holder.json b/jobs/builder/build-info/v2/ERC1155-Holder.json new file mode 100644 index 0000000..e25e1f1 --- /dev/null +++ b/jobs/builder/build-info/v2/ERC1155-Holder.json @@ -0,0 +1,1947 @@ +{ + "id": "ff48c684536c36af5e56ae1ff604caec218a09fd", + "source_id_to_path": { + "0": "src/tokens/ERC1155/utility/holder/ERC1155Holder.sol", + "1": "lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol", + "2": "lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155Receiver.sol", + "3": "lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol" + }, + "language": "Solidity", + "_format": "ethers-rs-sol-build-info-1", + "input": { + "version": "0.8.27", + "language": "Solidity", + "sources": { + "src/tokens/ERC1155/utility/holder/ERC1155Holder.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.19;\n\nimport { IERC1155 } from \"openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol\";\nimport { IERC1155Receiver, IERC165 } from \"openzeppelin-contracts/contracts/token/ERC1155/IERC1155Receiver.sol\";\n\n/**\n * An ERC-1155 contract that allows permissive minting.\n */\ncontract ERC1155Holder is IERC1155Receiver {\n\n /// @dev Emitted when a claim is added.\n event ClaimAdded(address claimant, address tokenAddress, uint256 tokenId, uint256 amount);\n /// @dev Emitted when a batch of claims is added.\n event ClaimAddedBatch(address claimant, address tokenAddress, uint256[] tokenIds, uint256[] amounts);\n\n /// @dev Emitted when a claim is claimed.\n event Claimed(address claimant, address tokenAddress, uint256 tokenId, uint256 amount);\n /// @dev Emitted when a batch of claims is claimed.\n event ClaimedBatch(address claimant, address tokenAddress, uint256[] tokenIds, uint256[] amounts);\n\n /// @dev Error thrown when the claimant is invalid.\n error InvalidClaimant();\n\n /// @dev claimant -> tokenAddress -> tokenId -> amount\n mapping(address => mapping(address => mapping(uint256 => uint256))) public claims;\n\n /// @dev Claims a token.\n /// @param claimant The claimant.\n /// @param tokenAddress The token address.\n /// @param tokenId The token id.\n function claim(address claimant, address tokenAddress, uint256 tokenId) public {\n uint256 amount = claims[claimant][tokenAddress][tokenId];\n delete claims[claimant][tokenAddress][tokenId];\n emit Claimed(claimant, tokenAddress, tokenId, amount);\n IERC1155(tokenAddress).safeTransferFrom(address(this), claimant, tokenId, amount, \"\");\n }\n\n /// @dev Claims a batch of tokens.\n /// @param claimant The claimant.\n /// @param tokenAddress The token address.\n /// @param tokenIds The token ids.\n function claimBatch(address claimant, address tokenAddress, uint256[] memory tokenIds) public {\n uint256[] memory amounts = new uint256[](tokenIds.length);\n for (uint256 i = 0; i < tokenIds.length; i++) {\n amounts[i] = claims[claimant][tokenAddress][tokenIds[i]];\n delete claims[claimant][tokenAddress][tokenIds[i]];\n }\n emit ClaimedBatch(claimant, tokenAddress, tokenIds, amounts);\n IERC1155(tokenAddress).safeBatchTransferFrom(address(this), claimant, tokenIds, amounts, \"\");\n }\n\n /// @inheritdoc IERC1155Receiver\n /// @param claimData The encoded claimant.\n function onERC1155Received(\n address,\n address,\n uint256 tokenId,\n uint256 amount,\n bytes calldata claimData\n ) public virtual override returns (bytes4) {\n address claimant = _decodeClaimant(claimData);\n address tokenAddress = msg.sender;\n claims[claimant][tokenAddress][tokenId] += amount;\n emit ClaimAdded(claimant, tokenAddress, tokenId, amount);\n return this.onERC1155Received.selector;\n }\n\n /// @inheritdoc IERC1155Receiver\n /// @param claimData The encoded claimant.\n function onERC1155BatchReceived(\n address,\n address,\n uint256[] calldata tokenIds,\n uint256[] calldata amounts,\n bytes calldata claimData\n ) public virtual override returns (bytes4) {\n address claimant = _decodeClaimant(claimData);\n address tokenAddress = msg.sender;\n for (uint256 i = 0; i < tokenIds.length; i++) {\n claims[claimant][tokenAddress][tokenIds[i]] += amounts[i];\n }\n emit ClaimAddedBatch(claimant, tokenAddress, tokenIds, amounts);\n return this.onERC1155BatchReceived.selector;\n }\n\n /// @dev Decodes the claimant from the claim data.\n function _decodeClaimant(\n bytes calldata claimData\n ) internal pure returns (address claimant) {\n if (claimData.length == 20) {\n // Packed address format\n assembly {\n calldatacopy(0, claimData.offset, 20)\n claimant := shr(96, mload(0))\n }\n } else if (claimData.length == 32) {\n // ABI encoded address format\n (claimant) = abi.decode(claimData, (address));\n }\n if (claimant == address(0)) {\n revert InvalidClaimant();\n }\n return claimant;\n }\n\n /// @inheritdoc IERC165\n function supportsInterface(\n bytes4 interfaceId\n ) public view virtual override(IERC165) returns (bool) {\n return interfaceId == type(IERC1155Receiver).interfaceId || interfaceId == type(IERC165).interfaceId;\n }\n\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/IERC1155.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev Required interface of an ERC1155 compliant contract, as defined in the\n * https://eips.ethereum.org/EIPS/eip-1155[EIP].\n *\n * _Available since v3.1._\n */\ninterface IERC1155 is IERC165 {\n /**\n * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.\n */\n event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\n\n /**\n * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all\n * transfers.\n */\n event TransferBatch(\n address indexed operator,\n address indexed from,\n address indexed to,\n uint256[] ids,\n uint256[] values\n );\n\n /**\n * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to\n * `approved`.\n */\n event ApprovalForAll(address indexed account, address indexed operator, bool approved);\n\n /**\n * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.\n *\n * If an {URI} event was emitted for `id`, the standard\n * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value\n * returned by {IERC1155MetadataURI-uri}.\n */\n event URI(string value, uint256 indexed id);\n\n /**\n * @dev Returns the amount of tokens of token type `id` owned by `account`.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function balanceOf(address account, uint256 id) external view returns (uint256);\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.\n *\n * Requirements:\n *\n * - `accounts` and `ids` must have the same length.\n */\n function balanceOfBatch(\n address[] calldata accounts,\n uint256[] calldata ids\n ) external view returns (uint256[] memory);\n\n /**\n * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,\n *\n * Emits an {ApprovalForAll} event.\n *\n * Requirements:\n *\n * - `operator` cannot be the caller.\n */\n function setApprovalForAll(address operator, bool approved) external;\n\n /**\n * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.\n *\n * See {setApprovalForAll}.\n */\n function isApprovedForAll(address account, address operator) external view returns (bool);\n\n /**\n * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.\n *\n * Emits a {TransferSingle} event.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.\n * - `from` must have a balance of tokens of type `id` of at least `amount`.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\n * acceptance magic value.\n */\n function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external;\n\n /**\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.\n *\n * Emits a {TransferBatch} event.\n *\n * Requirements:\n *\n * - `ids` and `amounts` must have the same length.\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\n * acceptance magic value.\n */\n function safeBatchTransferFrom(\n address from,\n address to,\n uint256[] calldata ids,\n uint256[] calldata amounts,\n bytes calldata data\n ) external;\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155Receiver.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev _Available since v3.1._\n */\ninterface IERC1155Receiver is IERC165 {\n /**\n * @dev Handles the receipt of a single ERC1155 token type. This function is\n * called at the end of a `safeTransferFrom` after the balance has been updated.\n *\n * NOTE: To accept the transfer, this must return\n * `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))`\n * (i.e. 0xf23a6e61, or its own function selector).\n *\n * @param operator The address which initiated the transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param id The ID of the token being transferred\n * @param value The amount of tokens being transferred\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` if transfer is allowed\n */\n function onERC1155Received(\n address operator,\n address from,\n uint256 id,\n uint256 value,\n bytes calldata data\n ) external returns (bytes4);\n\n /**\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\n * is called at the end of a `safeBatchTransferFrom` after the balances have\n * been updated.\n *\n * NOTE: To accept the transfer(s), this must return\n * `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))`\n * (i.e. 0xbc197c81, or its own function selector).\n *\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\n * @param from The address which previously owned the token\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\n * @param data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` if transfer is allowed\n */\n function onERC1155BatchReceived(\n address operator,\n address from,\n uint256[] calldata ids,\n uint256[] calldata values,\n bytes calldata data\n ) external returns (bytes4);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" + } + }, + "settings": { + "remappings": [ + "@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/", + "ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/", + "erc2470-libs/=lib/erc2470-libs/", + "erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/", + "forge-std/=lib/forge-std/src/", + "halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/", + "murky/=lib/murky/", + "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/", + "openzeppelin-contracts/=lib/openzeppelin-contracts/", + "openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/", + "sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/", + "signals-implicit-mode/=lib/signals-implicit-mode/", + "solady/=lib/solady/src/" + ], + "optimizer": { + "enabled": false, + "runs": 200 + }, + "metadata": { + "useLiteralContent": true, + "bytecodeHash": "ipfs", + "appendCBOR": true + }, + "outputSelection": { + "*": { + "*": [ + "evm.bytecode", + "evm.deployedBytecode", + "devdoc", + "userdoc", + "metadata", + "abi", + "evm.methodIdentifiers" + ] + } + }, + "evmVersion": "paris", + "viaIR": true + }, + "evmVersion": "paris", + "viaIR": true, + "libraries": {} + }, + "allowPaths": [ + "/home/michael/Code/Horizon/live-contracts" + ], + "basePath": "/home/michael/Code/Horizon/live-contracts", + "includePaths": [ + "/home/michael/Code/Horizon/live-contracts" + ], + "output": { + "contracts": { + "lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol": { + "IERC1155": { + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "ApprovalForAll", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "ids", + "type": "uint256[]" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + } + ], + "name": "TransferBatch", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "TransferSingle", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "value", + "type": "string" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "URI", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "accounts", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "ids", + "type": "uint256[]" + } + ], + "name": "balanceOfBatch", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "ids", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "safeBatchTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "setApprovalForAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "details": "Required interface of an ERC1155 compliant contract, as defined in the https://eips.ethereum.org/EIPS/eip-1155[EIP]. _Available since v3.1._", + "events": { + "ApprovalForAll(address,address,bool)": { + "details": "Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to `approved`." + }, + "TransferBatch(address,address,address,uint256[],uint256[])": { + "details": "Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all transfers." + }, + "TransferSingle(address,address,address,uint256,uint256)": { + "details": "Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`." + }, + "URI(string,uint256)": { + "details": "Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. If an {URI} event was emitted for `id`, the standard https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value returned by {IERC1155MetadataURI-uri}." + } + }, + "kind": "dev", + "methods": { + "balanceOf(address,uint256)": { + "details": "Returns the amount of tokens of token type `id` owned by `account`. Requirements: - `account` cannot be the zero address." + }, + "balanceOfBatch(address[],uint256[])": { + "details": "xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. Requirements: - `accounts` and `ids` must have the same length." + }, + "isApprovedForAll(address,address)": { + "details": "Returns true if `operator` is approved to transfer ``account``'s tokens. See {setApprovalForAll}." + }, + "safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)": { + "details": "xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. Emits a {TransferBatch} event. Requirements: - `ids` and `amounts` must have the same length. - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the acceptance magic value." + }, + "safeTransferFrom(address,address,uint256,uint256,bytes)": { + "details": "Transfers `amount` tokens of token type `id` from `from` to `to`. Emits a {TransferSingle} event. Requirements: - `to` cannot be the zero address. - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}. - `from` must have a balance of tokens of type `id` of at least `amount`. - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the acceptance magic value." + }, + "setApprovalForAll(address,bool)": { + "details": "Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, Emits an {ApprovalForAll} event. Requirements: - `operator` cannot be the caller." + }, + "supportsInterface(bytes4)": { + "details": "Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas." + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "balanceOf(address,uint256)": "00fdd58e", + "balanceOfBatch(address[],uint256[])": "4e1273f4", + "isApprovedForAll(address,address)": "e985e9c5", + "safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)": "2eb2c2d6", + "safeTransferFrom(address,address,uint256,uint256,bytes)": "f242432a", + "setApprovalForAll(address,bool)": "a22cb465", + "supportsInterface(bytes4)": "01ffc9a7" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"TransferBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"TransferSingle\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"value\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"URI\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"}],\"name\":\"balanceOfBatch\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeBatchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Required interface of an ERC1155 compliant contract, as defined in the https://eips.ethereum.org/EIPS/eip-1155[EIP]. _Available since v3.1._\",\"events\":{\"ApprovalForAll(address,address,bool)\":{\"details\":\"Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to `approved`.\"},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"details\":\"Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all transfers.\"},\"TransferSingle(address,address,address,uint256,uint256)\":{\"details\":\"Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.\"},\"URI(string,uint256)\":{\"details\":\"Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. If an {URI} event was emitted for `id`, the standard https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value returned by {IERC1155MetadataURI-uri}.\"}},\"kind\":\"dev\",\"methods\":{\"balanceOf(address,uint256)\":{\"details\":\"Returns the amount of tokens of token type `id` owned by `account`. Requirements: - `account` cannot be the zero address.\"},\"balanceOfBatch(address[],uint256[])\":{\"details\":\"xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. Requirements: - `accounts` and `ids` must have the same length.\"},\"isApprovedForAll(address,address)\":{\"details\":\"Returns true if `operator` is approved to transfer ``account``'s tokens. See {setApprovalForAll}.\"},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"details\":\"xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. Emits a {TransferBatch} event. Requirements: - `ids` and `amounts` must have the same length. - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the acceptance magic value.\"},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"details\":\"Transfers `amount` tokens of token type `id` from `from` to `to`. Emits a {TransferSingle} event. Requirements: - `to` cannot be the zero address. - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}. - `from` must have a balance of tokens of type `id` of at least `amount`. - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the acceptance magic value.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, Emits an {ApprovalForAll} event. Requirements: - `operator` cannot be the caller.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol\":\"IERC1155\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/IERC1155.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC1155 compliant contract, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-1155[EIP].\\n *\\n * _Available since v3.1._\\n */\\ninterface IERC1155 is IERC165 {\\n /**\\n * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.\\n */\\n event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n /**\\n * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all\\n * transfers.\\n */\\n event TransferBatch(\\n address indexed operator,\\n address indexed from,\\n address indexed to,\\n uint256[] ids,\\n uint256[] values\\n );\\n\\n /**\\n * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to\\n * `approved`.\\n */\\n event ApprovalForAll(address indexed account, address indexed operator, bool approved);\\n\\n /**\\n * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.\\n *\\n * If an {URI} event was emitted for `id`, the standard\\n * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value\\n * returned by {IERC1155MetadataURI-uri}.\\n */\\n event URI(string value, uint256 indexed id);\\n\\n /**\\n * @dev Returns the amount of tokens of token type `id` owned by `account`.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function balanceOf(address account, uint256 id) external view returns (uint256);\\n\\n /**\\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.\\n *\\n * Requirements:\\n *\\n * - `accounts` and `ids` must have the same length.\\n */\\n function balanceOfBatch(\\n address[] calldata accounts,\\n uint256[] calldata ids\\n ) external view returns (uint256[] memory);\\n\\n /**\\n * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,\\n *\\n * Emits an {ApprovalForAll} event.\\n *\\n * Requirements:\\n *\\n * - `operator` cannot be the caller.\\n */\\n function setApprovalForAll(address operator, bool approved) external;\\n\\n /**\\n * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.\\n *\\n * See {setApprovalForAll}.\\n */\\n function isApprovedForAll(address account, address operator) external view returns (bool);\\n\\n /**\\n * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.\\n *\\n * Emits a {TransferSingle} event.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.\\n * - `from` must have a balance of tokens of type `id` of at least `amount`.\\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\\n * acceptance magic value.\\n */\\n function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external;\\n\\n /**\\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.\\n *\\n * Emits a {TransferBatch} event.\\n *\\n * Requirements:\\n *\\n * - `ids` and `amounts` must have the same length.\\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\\n * acceptance magic value.\\n */\\n function safeBatchTransferFrom(\\n address from,\\n address to,\\n uint256[] calldata ids,\\n uint256[] calldata amounts,\\n bytes calldata data\\n ) external;\\n}\\n\",\"keccak256\":\"0xcab667ddad478ff0d39c2053ca77fac778af8483c18ab07d810277b4216fd582\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155Receiver.sol": { + "IERC1155Receiver": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "ids", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "onERC1155BatchReceived", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "onERC1155Received", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "details": "_Available since v3.1._", + "kind": "dev", + "methods": { + "onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)": { + "details": "Handles the receipt of a multiple ERC1155 token types. This function is called at the end of a `safeBatchTransferFrom` after the balances have been updated. NOTE: To accept the transfer(s), this must return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` (i.e. 0xbc197c81, or its own function selector).", + "params": { + "data": "Additional data with no specified format", + "from": "The address which previously owned the token", + "ids": "An array containing ids of each token being transferred (order and length must match values array)", + "operator": "The address which initiated the batch transfer (i.e. msg.sender)", + "values": "An array containing amounts of each token being transferred (order and length must match ids array)" + }, + "returns": { + "_0": "`bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` if transfer is allowed" + } + }, + "onERC1155Received(address,address,uint256,uint256,bytes)": { + "details": "Handles the receipt of a single ERC1155 token type. This function is called at the end of a `safeTransferFrom` after the balance has been updated. NOTE: To accept the transfer, this must return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` (i.e. 0xf23a6e61, or its own function selector).", + "params": { + "data": "Additional data with no specified format", + "from": "The address which previously owned the token", + "id": "The ID of the token being transferred", + "operator": "The address which initiated the transfer (i.e. msg.sender)", + "value": "The amount of tokens being transferred" + }, + "returns": { + "_0": "`bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` if transfer is allowed" + } + }, + "supportsInterface(bytes4)": { + "details": "Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas." + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)": "bc197c81", + "onERC1155Received(address,address,uint256,uint256,bytes)": "f23a6e61", + "supportsInterface(bytes4)": "01ffc9a7" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"_Available since v3.1._\",\"kind\":\"dev\",\"methods\":{\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\":{\"details\":\"Handles the receipt of a multiple ERC1155 token types. This function is called at the end of a `safeBatchTransferFrom` after the balances have been updated. NOTE: To accept the transfer(s), this must return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (i.e. 0xbc197c81, or its own function selector).\",\"params\":{\"data\":\"Additional data with no specified format\",\"from\":\"The address which previously owned the token\",\"ids\":\"An array containing ids of each token being transferred (order and length must match values array)\",\"operator\":\"The address which initiated the batch transfer (i.e. msg.sender)\",\"values\":\"An array containing amounts of each token being transferred (order and length must match ids array)\"},\"returns\":{\"_0\":\"`bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\"}},\"onERC1155Received(address,address,uint256,uint256,bytes)\":{\"details\":\"Handles the receipt of a single ERC1155 token type. This function is called at the end of a `safeTransferFrom` after the balance has been updated. NOTE: To accept the transfer, this must return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (i.e. 0xf23a6e61, or its own function selector).\",\"params\":{\"data\":\"Additional data with no specified format\",\"from\":\"The address which previously owned the token\",\"id\":\"The ID of the token being transferred\",\"operator\":\"The address which initiated the transfer (i.e. msg.sender)\",\"value\":\"The amount of tokens being transferred\"},\"returns\":{\"_0\":\"`bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\"}},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155Receiver.sol\":\"IERC1155Receiver\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev _Available since v3.1._\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol": { + "IERC165": { + "abi": [ + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "details": "Interface of the ERC165 standard, as defined in the https://eips.ethereum.org/EIPS/eip-165[EIP]. Implementers can declare support of contract interfaces, which can then be queried by others ({ERC165Checker}). For an implementation, see {ERC165}.", + "kind": "dev", + "methods": { + "supportsInterface(bytes4)": { + "details": "Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas." + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "supportsInterface(bytes4)": "01ffc9a7" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Interface of the ERC165 standard, as defined in the https://eips.ethereum.org/EIPS/eip-165[EIP]. Implementers can declare support of contract interfaces, which can then be queried by others ({ERC165Checker}). For an implementation, see {ERC165}.\",\"kind\":\"dev\",\"methods\":{\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":\"IERC165\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "src/tokens/ERC1155/utility/holder/ERC1155Holder.sol": { + "ERC1155Holder": { + "abi": [ + { + "inputs": [], + "name": "InvalidClaimant", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "claimant", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "tokenAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "ClaimAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "claimant", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "tokenAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "name": "ClaimAddedBatch", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "claimant", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "tokenAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Claimed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "claimant", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "tokenAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "name": "ClaimedBatch", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "claimant", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "claim", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "claimant", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenAddress", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + } + ], + "name": "claimBatch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "claims", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "claimData", + "type": "bytes" + } + ], + "name": "onERC1155BatchReceived", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "claimData", + "type": "bytes" + } + ], + "name": "onERC1155Received", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "errors": { + "InvalidClaimant()": [ + { + "details": "Error thrown when the claimant is invalid." + } + ] + }, + "events": { + "ClaimAdded(address,address,uint256,uint256)": { + "details": "Emitted when a claim is added." + }, + "ClaimAddedBatch(address,address,uint256[],uint256[])": { + "details": "Emitted when a batch of claims is added." + }, + "Claimed(address,address,uint256,uint256)": { + "details": "Emitted when a claim is claimed." + }, + "ClaimedBatch(address,address,uint256[],uint256[])": { + "details": "Emitted when a batch of claims is claimed." + } + }, + "kind": "dev", + "methods": { + "claim(address,address,uint256)": { + "details": "Claims a token.", + "params": { + "claimant": "The claimant.", + "tokenAddress": "The token address.", + "tokenId": "The token id." + } + }, + "claimBatch(address,address,uint256[])": { + "details": "Claims a batch of tokens.", + "params": { + "claimant": "The claimant.", + "tokenAddress": "The token address.", + "tokenIds": "The token ids." + } + }, + "onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)": { + "details": "Handles the receipt of a multiple ERC1155 token types. This function is called at the end of a `safeBatchTransferFrom` after the balances have been updated. NOTE: To accept the transfer(s), this must return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` (i.e. 0xbc197c81, or its own function selector).", + "params": { + "claimData": "The encoded claimant." + }, + "returns": { + "_0": "`bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` if transfer is allowed" + } + }, + "onERC1155Received(address,address,uint256,uint256,bytes)": { + "details": "Handles the receipt of a single ERC1155 token type. This function is called at the end of a `safeTransferFrom` after the balance has been updated. NOTE: To accept the transfer, this must return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` (i.e. 0xf23a6e61, or its own function selector).", + "params": { + "claimData": "The encoded claimant." + }, + "returns": { + "_0": "`bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` if transfer is allowed" + } + }, + "supportsInterface(bytes4)": { + "details": "Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas." + } + }, + "stateVariables": { + "claims": { + "details": "claimant -> tokenAddress -> tokenId -> amount" + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": { + "allocate_unbounded": { + "entryPoint": 32, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb": { + "entryPoint": 38, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + } + }, + "generatedSources": [], + "linkReferences": {}, + "object": "608060405234601c57600e6020565b6112af61002c82396112af90f35b6026565b60405190565b600080fdfe60806040526004361015610013575b610722565b61001e60003561007d565b806301ffc9a7146100785780633f2e7821146100735780638f98c8fb1461006e578063996cba6814610069578063bc197c81146100645763f23a6e610361000e576106e6565b610636565b6104b9565b610485565b6102f8565b61010f565b60e01c90565b60405190565b600080fd5b600080fd5b600080fd5b63ffffffff60e01b1690565b6100ad81610098565b036100b457565b600080fd5b905035906100c6826100a4565b565b906020828203126100e2576100df916000016100b9565b90565b61008e565b151590565b6100f5906100e7565b9052565b919061010d906000602085019401906100ec565b565b3461013f5761013b61012a6101253660046100c8565b61072c565b610132610083565b918291826100f9565b0390f35b610089565b60018060a01b031690565b61015890610144565b90565b6101648161014f565b0361016b57565b600080fd5b9050359061017d8261015b565b565b90565b61018b8161017f565b0361019257565b600080fd5b905035906101a482610182565b565b90916060828403126101dc576101d96101c28460008501610170565b936101d08160208601610170565b93604001610197565b90565b61008e565b90565b6101f86101f36101fd92610144565b6101e1565b610144565b90565b610209906101e4565b90565b61021590610200565b90565b906102229061020c565b600052602052604060002090565b9061023a9061020c565b600052602052604060002090565b61025c6102576102619261017f565b6101e1565b61017f565b90565b9061026e90610248565b600052602052604060002090565b1c90565b90565b610293906008610298930261027c565b610280565b90565b906102a69154610283565b90565b906102d2926102c86102cd926102c3600095600096610218565b610230565b610264565b61029b565b90565b6102de9061017f565b9052565b91906102f6906000602085019401906102d5565b565b346103295761032561031461030e3660046101a6565b916102a9565b61031c610083565b918291826102e2565b0390f35b610089565b600080fd5b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b9061035d90610333565b810190811067ffffffffffffffff82111761037757604052565b61033d565b9061038f610388610083565b9283610353565b565b67ffffffffffffffff81116103a95760208091020190565b61033d565b600080fd5b909291926103c86103c382610391565b61037c565b938185526020808601920283019281841161040557915b8383106103ec5750505050565b602080916103fa8486610197565b8152019201916103df565b6103ae565b9080601f8301121561042857816020610425933591016103b3565b90565b61032e565b9160608383031261047a576104458260008501610170565b926104538360208301610170565b92604082013567ffffffffffffffff811161047557610472920161040a565b90565b610093565b61008e565b60000190565b346104b45761049e61049836600461042d565b91610a7a565b6104a6610083565b806104b08161047f565b0390f35b610089565b346104e8576104d26104cc3660046101a6565b91610cbd565b6104da610083565b806104e48161047f565b0390f35b610089565b600080fd5b909182601f8301121561052c5781359167ffffffffffffffff831161052757602001926020830284011161052257565b6103ae565b6104ed565b61032e565b909182601f8301121561056b5781359167ffffffffffffffff831161056657602001926001830284011161056157565b6103ae565b6104ed565b61032e565b9160a08383031261060e576105888260008501610170565b926105968360208301610170565b92604082013567ffffffffffffffff811161060957816105b79184016104f2565b929093606082013567ffffffffffffffff811161060457836105da9184016104f2565b929093608082013567ffffffffffffffff81116105ff576105fb9201610531565b9091565b610093565b610093565b610093565b61008e565b61061c90610098565b9052565b919061063490600060208501940190610613565b565b346106705761066c61065b61064c366004610570565b96959095949194939293610f38565b610663610083565b91829182610620565b0390f35b610089565b91909160a0818403126106e15761068f8360008301610170565b9261069d8160208401610170565b926106ab8260408501610197565b926106b98360608301610197565b92608082013567ffffffffffffffff81116106dc576106d89201610531565b9091565b610093565b61008e565b3461071d576107196107086106fc366004610675565b94939093929192611044565b610710610083565b91829182610620565b0390f35b610089565b600080fd5b600090565b610734610727565b508061074f610749630271189760e51b610098565b91610098565b1490811561075c575b5090565b90506107776107716301ffc9a760e01b610098565b91610098565b1438610758565b5190565b9061079461078f83610391565b61037c565b918252565b369037565b906107c36107ab83610782565b926020806107b98693610391565b9201910390610799565b565b90565b6107dc6107d76107e1926107c5565b6101e1565b61017f565b90565b60016107f0910161017f565b90565b634e487b7160e01b600052603260045260246000fd5b906108138261077e565b811015610824576020809102010190565b6107f3565b610833905161017f565b90565b60001c90565b61084861084d91610836565b610280565b90565b61085a905461083c565b90565b906108679061017f565b9052565b1b90565b9190600861088b9102916108856000198461086b565b9261086b565b9181191691161790565b90565b91906108ae6108a96108b693610248565b610895565b90835461086f565b9055565b600090565b6108d1916108cb6108ba565b91610898565b565b6108dc9061014f565b9052565b60209181520190565b60200190565b6108f89061017f565b9052565b90610909816020936108ef565b0190565b60200190565b9061093061092a6109238461077e565b80936108e0565b926108e9565b9060005b8181106109415750505090565b90919261095a61095460019286516108fc565b9461090d565b9101919091610934565b929061099b9161098e6109a99694610984608088019460008901906108d3565b60208701906108d3565b8482036040860152610913565b916060818403910152610913565b90565b6109b5906101e4565b90565b6109c1906109ac565b90565b6109cd90610200565b90565b6109d990610200565b90565b600080fd5b60e01b90565b60009103126109f257565b61008e565b60209181520190565b610a0c600080926109f7565b0190565b92610a669491610a4a91610a3d610a5895610a3360a089019460008a01906108d3565b60208801906108d3565b8582036040870152610913565b908382036060850152610913565b906080818303910152610a00565b90565b610a71610083565b3d6000823e3d90fd5b610a8b610a868461077e565b61079e565b610a9560006107c8565b5b80610ab1610aab610aa68861077e565b61017f565b9161017f565b1015610b4f57610b4a90610b0a610af8610af3610ada610ad360008990610218565b8990610230565b610aed610ae88b8790610809565b610829565b90610264565b610850565b610b058591849092610809565b61085d565b610b456000610b40610b27610b20838990610218565b8990610230565b610b3a610b358b8790610809565b610829565b90610264565b6108bf565b6107e4565b610a96565b5091610b9b610ba09183818791610b93887f52afae05d11477135f8797c76d1235e9ca8bfec06367627f38f22ff5019379a394610b8a610083565b94859485610964565b0390a16109b8565b6109c4565b632eb2c2d692610baf306109d0565b929490823b15610c2857600094610be48692610bd994610bcd610083565b998a98899788966109e1565b865260048601610a10565b03925af18015610c2357610bf6575b50565b610c169060003d8111610c1c575b610c0e8183610353565b8101906109e7565b38610bf3565b503d610c04565b610a69565b6109dc565b610c63610c6a94610c59606094989795610c4f608086019a60008701906108d3565b60208501906108d3565b60408301906102d5565b01906102d5565b565b9193610ca3610cad9294610c99610cba97610c8f60a088019860008901906108d3565b60208701906108d3565b60408501906102d5565b60608301906102d5565b6080818303910152610a00565b90565b610d5d610d58610ceb610ce6610cdf610cd860008790610218565b8790610230565b8790610264565b610850565b93610d156000610d10610d09610d02838990610218565b8590610230565b8990610264565b6108bf565b83818791610d50887f2f6639d24651730c7bf57c95ddbf96d66d11477e4ec626876f92c22e5f365e6894610d47610083565b94859485610c2d565b0390a16109b8565b6109c4565b63f242432a92610d6c306109d0565b929490823b15610de557600094610da18692610d9694610d8a610083565b998a98899788966109e1565b865260048601610c6c565b03925af18015610de057610db3575b50565b610dd39060003d8111610dd9575b610dcb8183610353565b8101906109e7565b38610db0565b503d610dc1565b610a69565b6109dc565b600090565b5090565b9190811015610e03576020020190565b6107f3565b35610e1281610182565b90565b634e487b7160e01b600052601160045260246000fd5b610e3a610e409193929361017f565b9261017f565b8201809211610e4b57565b610e15565b60001b90565b90610e6360001991610e50565b9181191691161790565b90610e82610e7d610e8992610248565b610895565b8254610e56565b9055565b600080fd5b9037565b909182610ea2916108e0565b9160018060fb1b038111610ec55782916020610ec19202938491610e92565b0190565b610e8d565b949293610f109694610ef5610f0294610eeb60808a019560008b01906108d3565b60208901906108d3565b8683036040880152610e96565b926060818503910152610e96565b90565b63ffffffff1690565b610f30610f2b610f3592610f13565b6109e1565b610098565b90565b50509394610f50919395610f4a610dea565b506111af565b933391610f5d60006107c8565b5b80610f7b610f75610f70898990610def565b61017f565b9161017f565b1015610ff057610feb90610fe6610f9c610f9785878591610df3565b610e08565b610fe0610fd1610fb7610fb08d6000610218565b8a90610230565b610fcb610fc68d8d8991610df3565b610e08565b90610264565b91610fdb83610850565b610e2b565b90610e6d565b6107e4565b610f5e565b50906110319293959394959190917f8bc34feed688351319653dd43606ecff95d859489d6a570f0dc355c98a00722596611028610083565b96879687610eca565b0390a161104163bc197c81610f1c565b90565b5050919261105b9193611055610dea565b506111af565b6110d2339161109c8561109661108761108061107960008790610218565b8890610230565b8890610264565b9161109183610850565b610e2b565b90610e6d565b9192937f13805c88d507c700be6b306c02e8a12f22987364d2fadeff7d4fa5392508fdbf946110c9610083565b94859485610c2d565b0390a16110e263f23a6e61610f1c565b90565b600090565b5090565b90565b61110561110061110a926110ee565b6101e1565b61017f565b90565b90565b61112461111f6111299261110d565b6101e1565b61017f565b90565b61113590610144565b90565b6111418161112c565b0361114857565b600080fd5b9050359061115a82611138565b565b90602082820312611176576111739160000161114d565b90565b61008e565b61118490610200565b90565b61119b6111966111a0926107c5565b6101e1565b610144565b90565b6111ac90611187565b90565b6111b76110e5565b916111c38282906110ea565b6111d66111d060146110f1565b9161017f565b1460001461122e57506014915060003760005160601c5b806112096112036111fe60006111a3565b61014f565b9161014f565b146112115790565b6000636defbeed60e11b81528061122a6004820161047f565b0390fd5b9061123a8183906110ea565b61124d6112476020611110565b9161017f565b1461125a575b50506111ed565b61127292509061126d919081019061115c565b61117b565b388061125356fea264697066735822122053fe3202c90166dfc5f174690e2f90e7bb621873ff493562423af78ab974dbb564736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x1C JUMPI PUSH1 0xE PUSH1 0x20 JUMP JUMPDEST PUSH2 0x12AF PUSH2 0x2C DUP3 CODECOPY PUSH2 0x12AF SWAP1 RETURN JUMPDEST PUSH1 0x26 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x13 JUMPI JUMPDEST PUSH2 0x722 JUMP JUMPDEST PUSH2 0x1E PUSH1 0x0 CALLDATALOAD PUSH2 0x7D JUMP JUMPDEST DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x78 JUMPI DUP1 PUSH4 0x3F2E7821 EQ PUSH2 0x73 JUMPI DUP1 PUSH4 0x8F98C8FB EQ PUSH2 0x6E JUMPI DUP1 PUSH4 0x996CBA68 EQ PUSH2 0x69 JUMPI DUP1 PUSH4 0xBC197C81 EQ PUSH2 0x64 JUMPI PUSH4 0xF23A6E61 SUB PUSH2 0xE JUMPI PUSH2 0x6E6 JUMP JUMPDEST PUSH2 0x636 JUMP JUMPDEST PUSH2 0x4B9 JUMP JUMPDEST PUSH2 0x485 JUMP JUMPDEST PUSH2 0x2F8 JUMP JUMPDEST PUSH2 0x10F JUMP JUMPDEST PUSH1 0xE0 SHR SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL AND SWAP1 JUMP JUMPDEST PUSH2 0xAD DUP2 PUSH2 0x98 JUMP JUMPDEST SUB PUSH2 0xB4 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0xC6 DUP3 PUSH2 0xA4 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0xE2 JUMPI PUSH2 0xDF SWAP2 PUSH1 0x0 ADD PUSH2 0xB9 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x8E JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH2 0xF5 SWAP1 PUSH2 0xE7 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x10D SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0xEC JUMP JUMPDEST JUMP JUMPDEST CALLVALUE PUSH2 0x13F JUMPI PUSH2 0x13B PUSH2 0x12A PUSH2 0x125 CALLDATASIZE PUSH1 0x4 PUSH2 0xC8 JUMP JUMPDEST PUSH2 0x72C JUMP JUMPDEST PUSH2 0x132 PUSH2 0x83 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xF9 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x89 JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x158 SWAP1 PUSH2 0x144 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x164 DUP2 PUSH2 0x14F JUMP JUMPDEST SUB PUSH2 0x16B JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x17D DUP3 PUSH2 0x15B JUMP JUMPDEST JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x18B DUP2 PUSH2 0x17F JUMP JUMPDEST SUB PUSH2 0x192 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x1A4 DUP3 PUSH2 0x182 JUMP JUMPDEST JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x60 DUP3 DUP5 SUB SLT PUSH2 0x1DC JUMPI PUSH2 0x1D9 PUSH2 0x1C2 DUP5 PUSH1 0x0 DUP6 ADD PUSH2 0x170 JUMP JUMPDEST SWAP4 PUSH2 0x1D0 DUP2 PUSH1 0x20 DUP7 ADD PUSH2 0x170 JUMP JUMPDEST SWAP4 PUSH1 0x40 ADD PUSH2 0x197 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x8E JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1F8 PUSH2 0x1F3 PUSH2 0x1FD SWAP3 PUSH2 0x144 JUMP JUMPDEST PUSH2 0x1E1 JUMP JUMPDEST PUSH2 0x144 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x209 SWAP1 PUSH2 0x1E4 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x215 SWAP1 PUSH2 0x200 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x222 SWAP1 PUSH2 0x20C JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x23A SWAP1 PUSH2 0x20C JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH2 0x25C PUSH2 0x257 PUSH2 0x261 SWAP3 PUSH2 0x17F JUMP JUMPDEST PUSH2 0x1E1 JUMP JUMPDEST PUSH2 0x17F JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x26E SWAP1 PUSH2 0x248 JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SHR SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x293 SWAP1 PUSH1 0x8 PUSH2 0x298 SWAP4 MUL PUSH2 0x27C JUMP JUMPDEST PUSH2 0x280 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2A6 SWAP2 SLOAD PUSH2 0x283 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2D2 SWAP3 PUSH2 0x2C8 PUSH2 0x2CD SWAP3 PUSH2 0x2C3 PUSH1 0x0 SWAP6 PUSH1 0x0 SWAP7 PUSH2 0x218 JUMP JUMPDEST PUSH2 0x230 JUMP JUMPDEST PUSH2 0x264 JUMP JUMPDEST PUSH2 0x29B JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2DE SWAP1 PUSH2 0x17F JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x2F6 SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0x2D5 JUMP JUMPDEST JUMP JUMPDEST CALLVALUE PUSH2 0x329 JUMPI PUSH2 0x325 PUSH2 0x314 PUSH2 0x30E CALLDATASIZE PUSH1 0x4 PUSH2 0x1A6 JUMP JUMPDEST SWAP2 PUSH2 0x2A9 JUMP JUMPDEST PUSH2 0x31C PUSH2 0x83 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x2E2 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x89 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1F DUP1 NOT SWAP2 ADD AND SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH2 0x35D SWAP1 PUSH2 0x333 JUMP JUMPDEST DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x377 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH2 0x33D JUMP JUMPDEST SWAP1 PUSH2 0x38F PUSH2 0x388 PUSH2 0x83 JUMP JUMPDEST SWAP3 DUP4 PUSH2 0x353 JUMP JUMPDEST JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3A9 JUMPI PUSH1 0x20 DUP1 SWAP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH2 0x33D JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x3C8 PUSH2 0x3C3 DUP3 PUSH2 0x391 JUMP JUMPDEST PUSH2 0x37C JUMP JUMPDEST SWAP4 DUP2 DUP6 MSTORE PUSH1 0x20 DUP1 DUP7 ADD SWAP3 MUL DUP4 ADD SWAP3 DUP2 DUP5 GT PUSH2 0x405 JUMPI SWAP2 JUMPDEST DUP4 DUP4 LT PUSH2 0x3EC JUMPI POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 SWAP2 PUSH2 0x3FA DUP5 DUP7 PUSH2 0x197 JUMP JUMPDEST DUP2 MSTORE ADD SWAP3 ADD SWAP2 PUSH2 0x3DF JUMP JUMPDEST PUSH2 0x3AE JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x428 JUMPI DUP2 PUSH1 0x20 PUSH2 0x425 SWAP4 CALLDATALOAD SWAP2 ADD PUSH2 0x3B3 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x32E JUMP JUMPDEST SWAP2 PUSH1 0x60 DUP4 DUP4 SUB SLT PUSH2 0x47A JUMPI PUSH2 0x445 DUP3 PUSH1 0x0 DUP6 ADD PUSH2 0x170 JUMP JUMPDEST SWAP3 PUSH2 0x453 DUP4 PUSH1 0x20 DUP4 ADD PUSH2 0x170 JUMP JUMPDEST SWAP3 PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x475 JUMPI PUSH2 0x472 SWAP3 ADD PUSH2 0x40A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x93 JUMP JUMPDEST PUSH2 0x8E JUMP JUMPDEST PUSH1 0x0 ADD SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x4B4 JUMPI PUSH2 0x49E PUSH2 0x498 CALLDATASIZE PUSH1 0x4 PUSH2 0x42D JUMP JUMPDEST SWAP2 PUSH2 0xA7A JUMP JUMPDEST PUSH2 0x4A6 PUSH2 0x83 JUMP JUMPDEST DUP1 PUSH2 0x4B0 DUP2 PUSH2 0x47F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x89 JUMP JUMPDEST CALLVALUE PUSH2 0x4E8 JUMPI PUSH2 0x4D2 PUSH2 0x4CC CALLDATASIZE PUSH1 0x4 PUSH2 0x1A6 JUMP JUMPDEST SWAP2 PUSH2 0xCBD JUMP JUMPDEST PUSH2 0x4DA PUSH2 0x83 JUMP JUMPDEST DUP1 PUSH2 0x4E4 DUP2 PUSH2 0x47F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x89 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP2 DUP3 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x52C JUMPI DUP2 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x527 JUMPI PUSH1 0x20 ADD SWAP3 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH2 0x522 JUMPI JUMP JUMPDEST PUSH2 0x3AE JUMP JUMPDEST PUSH2 0x4ED JUMP JUMPDEST PUSH2 0x32E JUMP JUMPDEST SWAP1 SWAP2 DUP3 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x56B JUMPI DUP2 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x566 JUMPI PUSH1 0x20 ADD SWAP3 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH2 0x561 JUMPI JUMP JUMPDEST PUSH2 0x3AE JUMP JUMPDEST PUSH2 0x4ED JUMP JUMPDEST PUSH2 0x32E JUMP JUMPDEST SWAP2 PUSH1 0xA0 DUP4 DUP4 SUB SLT PUSH2 0x60E JUMPI PUSH2 0x588 DUP3 PUSH1 0x0 DUP6 ADD PUSH2 0x170 JUMP JUMPDEST SWAP3 PUSH2 0x596 DUP4 PUSH1 0x20 DUP4 ADD PUSH2 0x170 JUMP JUMPDEST SWAP3 PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x609 JUMPI DUP2 PUSH2 0x5B7 SWAP2 DUP5 ADD PUSH2 0x4F2 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x604 JUMPI DUP4 PUSH2 0x5DA SWAP2 DUP5 ADD PUSH2 0x4F2 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH1 0x80 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x5FF JUMPI PUSH2 0x5FB SWAP3 ADD PUSH2 0x531 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH2 0x93 JUMP JUMPDEST PUSH2 0x93 JUMP JUMPDEST PUSH2 0x93 JUMP JUMPDEST PUSH2 0x8E JUMP JUMPDEST PUSH2 0x61C SWAP1 PUSH2 0x98 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x634 SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0x613 JUMP JUMPDEST JUMP JUMPDEST CALLVALUE PUSH2 0x670 JUMPI PUSH2 0x66C PUSH2 0x65B PUSH2 0x64C CALLDATASIZE PUSH1 0x4 PUSH2 0x570 JUMP JUMPDEST SWAP7 SWAP6 SWAP1 SWAP6 SWAP5 SWAP2 SWAP5 SWAP4 SWAP3 SWAP4 PUSH2 0xF38 JUMP JUMPDEST PUSH2 0x663 PUSH2 0x83 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x620 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x89 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH1 0xA0 DUP2 DUP5 SUB SLT PUSH2 0x6E1 JUMPI PUSH2 0x68F DUP4 PUSH1 0x0 DUP4 ADD PUSH2 0x170 JUMP JUMPDEST SWAP3 PUSH2 0x69D DUP2 PUSH1 0x20 DUP5 ADD PUSH2 0x170 JUMP JUMPDEST SWAP3 PUSH2 0x6AB DUP3 PUSH1 0x40 DUP6 ADD PUSH2 0x197 JUMP JUMPDEST SWAP3 PUSH2 0x6B9 DUP4 PUSH1 0x60 DUP4 ADD PUSH2 0x197 JUMP JUMPDEST SWAP3 PUSH1 0x80 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x6DC JUMPI PUSH2 0x6D8 SWAP3 ADD PUSH2 0x531 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH2 0x93 JUMP JUMPDEST PUSH2 0x8E JUMP JUMPDEST CALLVALUE PUSH2 0x71D JUMPI PUSH2 0x719 PUSH2 0x708 PUSH2 0x6FC CALLDATASIZE PUSH1 0x4 PUSH2 0x675 JUMP JUMPDEST SWAP5 SWAP4 SWAP1 SWAP4 SWAP3 SWAP2 SWAP3 PUSH2 0x1044 JUMP JUMPDEST PUSH2 0x710 PUSH2 0x83 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x620 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x89 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x734 PUSH2 0x727 JUMP JUMPDEST POP DUP1 PUSH2 0x74F PUSH2 0x749 PUSH4 0x2711897 PUSH1 0xE5 SHL PUSH2 0x98 JUMP JUMPDEST SWAP2 PUSH2 0x98 JUMP JUMPDEST EQ SWAP1 DUP2 ISZERO PUSH2 0x75C JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 POP PUSH2 0x777 PUSH2 0x771 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL PUSH2 0x98 JUMP JUMPDEST SWAP2 PUSH2 0x98 JUMP JUMPDEST EQ CODESIZE PUSH2 0x758 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x794 PUSH2 0x78F DUP4 PUSH2 0x391 JUMP JUMPDEST PUSH2 0x37C JUMP JUMPDEST SWAP2 DUP3 MSTORE JUMP JUMPDEST CALLDATASIZE SWAP1 CALLDATACOPY JUMP JUMPDEST SWAP1 PUSH2 0x7C3 PUSH2 0x7AB DUP4 PUSH2 0x782 JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP1 PUSH2 0x7B9 DUP7 SWAP4 PUSH2 0x391 JUMP JUMPDEST SWAP3 ADD SWAP2 SUB SWAP1 PUSH2 0x799 JUMP JUMPDEST JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x7DC PUSH2 0x7D7 PUSH2 0x7E1 SWAP3 PUSH2 0x7C5 JUMP JUMPDEST PUSH2 0x1E1 JUMP JUMPDEST PUSH2 0x17F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH2 0x7F0 SWAP2 ADD PUSH2 0x17F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH2 0x813 DUP3 PUSH2 0x77E JUMP JUMPDEST DUP2 LT ISZERO PUSH2 0x824 JUMPI PUSH1 0x20 DUP1 SWAP2 MUL ADD ADD SWAP1 JUMP JUMPDEST PUSH2 0x7F3 JUMP JUMPDEST PUSH2 0x833 SWAP1 MLOAD PUSH2 0x17F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SHR SWAP1 JUMP JUMPDEST PUSH2 0x848 PUSH2 0x84D SWAP2 PUSH2 0x836 JUMP JUMPDEST PUSH2 0x280 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x85A SWAP1 SLOAD PUSH2 0x83C JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x867 SWAP1 PUSH2 0x17F JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SHL SWAP1 JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x8 PUSH2 0x88B SWAP2 MUL SWAP2 PUSH2 0x885 PUSH1 0x0 NOT DUP5 PUSH2 0x86B JUMP JUMPDEST SWAP3 PUSH2 0x86B JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x8AE PUSH2 0x8A9 PUSH2 0x8B6 SWAP4 PUSH2 0x248 JUMP JUMPDEST PUSH2 0x895 JUMP JUMPDEST SWAP1 DUP4 SLOAD PUSH2 0x86F JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x8D1 SWAP2 PUSH2 0x8CB PUSH2 0x8BA JUMP JUMPDEST SWAP2 PUSH2 0x898 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x8DC SWAP1 PUSH2 0x14F JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH2 0x8F8 SWAP1 PUSH2 0x17F JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP1 PUSH2 0x909 DUP2 PUSH1 0x20 SWAP4 PUSH2 0x8EF JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x930 PUSH2 0x92A PUSH2 0x923 DUP5 PUSH2 0x77E JUMP JUMPDEST DUP1 SWAP4 PUSH2 0x8E0 JUMP JUMPDEST SWAP3 PUSH2 0x8E9 JUMP JUMPDEST SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x941 JUMPI POP POP POP SWAP1 JUMP JUMPDEST SWAP1 SWAP2 SWAP3 PUSH2 0x95A PUSH2 0x954 PUSH1 0x1 SWAP3 DUP7 MLOAD PUSH2 0x8FC JUMP JUMPDEST SWAP5 PUSH2 0x90D JUMP JUMPDEST SWAP2 ADD SWAP2 SWAP1 SWAP2 PUSH2 0x934 JUMP JUMPDEST SWAP3 SWAP1 PUSH2 0x99B SWAP2 PUSH2 0x98E PUSH2 0x9A9 SWAP7 SWAP5 PUSH2 0x984 PUSH1 0x80 DUP9 ADD SWAP5 PUSH1 0x0 DUP10 ADD SWAP1 PUSH2 0x8D3 JUMP JUMPDEST PUSH1 0x20 DUP8 ADD SWAP1 PUSH2 0x8D3 JUMP JUMPDEST DUP5 DUP3 SUB PUSH1 0x40 DUP7 ADD MSTORE PUSH2 0x913 JUMP JUMPDEST SWAP2 PUSH1 0x60 DUP2 DUP5 SUB SWAP2 ADD MSTORE PUSH2 0x913 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x9B5 SWAP1 PUSH2 0x1E4 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x9C1 SWAP1 PUSH2 0x9AC JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x9CD SWAP1 PUSH2 0x200 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x9D9 SWAP1 PUSH2 0x200 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0xE0 SHL SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP2 SUB SLT PUSH2 0x9F2 JUMPI JUMP JUMPDEST PUSH2 0x8E JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH2 0xA0C PUSH1 0x0 DUP1 SWAP3 PUSH2 0x9F7 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST SWAP3 PUSH2 0xA66 SWAP5 SWAP2 PUSH2 0xA4A SWAP2 PUSH2 0xA3D PUSH2 0xA58 SWAP6 PUSH2 0xA33 PUSH1 0xA0 DUP10 ADD SWAP5 PUSH1 0x0 DUP11 ADD SWAP1 PUSH2 0x8D3 JUMP JUMPDEST PUSH1 0x20 DUP9 ADD SWAP1 PUSH2 0x8D3 JUMP JUMPDEST DUP6 DUP3 SUB PUSH1 0x40 DUP8 ADD MSTORE PUSH2 0x913 JUMP JUMPDEST SWAP1 DUP4 DUP3 SUB PUSH1 0x60 DUP6 ADD MSTORE PUSH2 0x913 JUMP JUMPDEST SWAP1 PUSH1 0x80 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0xA00 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xA71 PUSH2 0x83 JUMP JUMPDEST RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH2 0xA8B PUSH2 0xA86 DUP5 PUSH2 0x77E JUMP JUMPDEST PUSH2 0x79E JUMP JUMPDEST PUSH2 0xA95 PUSH1 0x0 PUSH2 0x7C8 JUMP JUMPDEST JUMPDEST DUP1 PUSH2 0xAB1 PUSH2 0xAAB PUSH2 0xAA6 DUP9 PUSH2 0x77E JUMP JUMPDEST PUSH2 0x17F JUMP JUMPDEST SWAP2 PUSH2 0x17F JUMP JUMPDEST LT ISZERO PUSH2 0xB4F JUMPI PUSH2 0xB4A SWAP1 PUSH2 0xB0A PUSH2 0xAF8 PUSH2 0xAF3 PUSH2 0xADA PUSH2 0xAD3 PUSH1 0x0 DUP10 SWAP1 PUSH2 0x218 JUMP JUMPDEST DUP10 SWAP1 PUSH2 0x230 JUMP JUMPDEST PUSH2 0xAED PUSH2 0xAE8 DUP12 DUP8 SWAP1 PUSH2 0x809 JUMP JUMPDEST PUSH2 0x829 JUMP JUMPDEST SWAP1 PUSH2 0x264 JUMP JUMPDEST PUSH2 0x850 JUMP JUMPDEST PUSH2 0xB05 DUP6 SWAP2 DUP5 SWAP1 SWAP3 PUSH2 0x809 JUMP JUMPDEST PUSH2 0x85D JUMP JUMPDEST PUSH2 0xB45 PUSH1 0x0 PUSH2 0xB40 PUSH2 0xB27 PUSH2 0xB20 DUP4 DUP10 SWAP1 PUSH2 0x218 JUMP JUMPDEST DUP10 SWAP1 PUSH2 0x230 JUMP JUMPDEST PUSH2 0xB3A PUSH2 0xB35 DUP12 DUP8 SWAP1 PUSH2 0x809 JUMP JUMPDEST PUSH2 0x829 JUMP JUMPDEST SWAP1 PUSH2 0x264 JUMP JUMPDEST PUSH2 0x8BF JUMP JUMPDEST PUSH2 0x7E4 JUMP JUMPDEST PUSH2 0xA96 JUMP JUMPDEST POP SWAP2 PUSH2 0xB9B PUSH2 0xBA0 SWAP2 DUP4 DUP2 DUP8 SWAP2 PUSH2 0xB93 DUP9 PUSH32 0x52AFAE05D11477135F8797C76D1235E9CA8BFEC06367627F38F22FF5019379A3 SWAP5 PUSH2 0xB8A PUSH2 0x83 JUMP JUMPDEST SWAP5 DUP6 SWAP5 DUP6 PUSH2 0x964 JUMP JUMPDEST SUB SWAP1 LOG1 PUSH2 0x9B8 JUMP JUMPDEST PUSH2 0x9C4 JUMP JUMPDEST PUSH4 0x2EB2C2D6 SWAP3 PUSH2 0xBAF ADDRESS PUSH2 0x9D0 JUMP JUMPDEST SWAP3 SWAP5 SWAP1 DUP3 EXTCODESIZE ISZERO PUSH2 0xC28 JUMPI PUSH1 0x0 SWAP5 PUSH2 0xBE4 DUP7 SWAP3 PUSH2 0xBD9 SWAP5 PUSH2 0xBCD PUSH2 0x83 JUMP JUMPDEST SWAP10 DUP11 SWAP9 DUP10 SWAP8 DUP9 SWAP7 PUSH2 0x9E1 JUMP JUMPDEST DUP7 MSTORE PUSH1 0x4 DUP7 ADD PUSH2 0xA10 JUMP JUMPDEST SUB SWAP3 GAS CALL DUP1 ISZERO PUSH2 0xC23 JUMPI PUSH2 0xBF6 JUMPI JUMPDEST POP JUMP JUMPDEST PUSH2 0xC16 SWAP1 PUSH1 0x0 RETURNDATASIZE DUP2 GT PUSH2 0xC1C JUMPI JUMPDEST PUSH2 0xC0E DUP2 DUP4 PUSH2 0x353 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x9E7 JUMP JUMPDEST CODESIZE PUSH2 0xBF3 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xC04 JUMP JUMPDEST PUSH2 0xA69 JUMP JUMPDEST PUSH2 0x9DC JUMP JUMPDEST PUSH2 0xC63 PUSH2 0xC6A SWAP5 PUSH2 0xC59 PUSH1 0x60 SWAP5 SWAP9 SWAP8 SWAP6 PUSH2 0xC4F PUSH1 0x80 DUP7 ADD SWAP11 PUSH1 0x0 DUP8 ADD SWAP1 PUSH2 0x8D3 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD SWAP1 PUSH2 0x8D3 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD SWAP1 PUSH2 0x2D5 JUMP JUMPDEST ADD SWAP1 PUSH2 0x2D5 JUMP JUMPDEST JUMP JUMPDEST SWAP2 SWAP4 PUSH2 0xCA3 PUSH2 0xCAD SWAP3 SWAP5 PUSH2 0xC99 PUSH2 0xCBA SWAP8 PUSH2 0xC8F PUSH1 0xA0 DUP9 ADD SWAP9 PUSH1 0x0 DUP10 ADD SWAP1 PUSH2 0x8D3 JUMP JUMPDEST PUSH1 0x20 DUP8 ADD SWAP1 PUSH2 0x8D3 JUMP JUMPDEST PUSH1 0x40 DUP6 ADD SWAP1 PUSH2 0x2D5 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD SWAP1 PUSH2 0x2D5 JUMP JUMPDEST PUSH1 0x80 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0xA00 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xD5D PUSH2 0xD58 PUSH2 0xCEB PUSH2 0xCE6 PUSH2 0xCDF PUSH2 0xCD8 PUSH1 0x0 DUP8 SWAP1 PUSH2 0x218 JUMP JUMPDEST DUP8 SWAP1 PUSH2 0x230 JUMP JUMPDEST DUP8 SWAP1 PUSH2 0x264 JUMP JUMPDEST PUSH2 0x850 JUMP JUMPDEST SWAP4 PUSH2 0xD15 PUSH1 0x0 PUSH2 0xD10 PUSH2 0xD09 PUSH2 0xD02 DUP4 DUP10 SWAP1 PUSH2 0x218 JUMP JUMPDEST DUP6 SWAP1 PUSH2 0x230 JUMP JUMPDEST DUP10 SWAP1 PUSH2 0x264 JUMP JUMPDEST PUSH2 0x8BF JUMP JUMPDEST DUP4 DUP2 DUP8 SWAP2 PUSH2 0xD50 DUP9 PUSH32 0x2F6639D24651730C7BF57C95DDBF96D66D11477E4EC626876F92C22E5F365E68 SWAP5 PUSH2 0xD47 PUSH2 0x83 JUMP JUMPDEST SWAP5 DUP6 SWAP5 DUP6 PUSH2 0xC2D JUMP JUMPDEST SUB SWAP1 LOG1 PUSH2 0x9B8 JUMP JUMPDEST PUSH2 0x9C4 JUMP JUMPDEST PUSH4 0xF242432A SWAP3 PUSH2 0xD6C ADDRESS PUSH2 0x9D0 JUMP JUMPDEST SWAP3 SWAP5 SWAP1 DUP3 EXTCODESIZE ISZERO PUSH2 0xDE5 JUMPI PUSH1 0x0 SWAP5 PUSH2 0xDA1 DUP7 SWAP3 PUSH2 0xD96 SWAP5 PUSH2 0xD8A PUSH2 0x83 JUMP JUMPDEST SWAP10 DUP11 SWAP9 DUP10 SWAP8 DUP9 SWAP7 PUSH2 0x9E1 JUMP JUMPDEST DUP7 MSTORE PUSH1 0x4 DUP7 ADD PUSH2 0xC6C JUMP JUMPDEST SUB SWAP3 GAS CALL DUP1 ISZERO PUSH2 0xDE0 JUMPI PUSH2 0xDB3 JUMPI JUMPDEST POP JUMP JUMPDEST PUSH2 0xDD3 SWAP1 PUSH1 0x0 RETURNDATASIZE DUP2 GT PUSH2 0xDD9 JUMPI JUMPDEST PUSH2 0xDCB DUP2 DUP4 PUSH2 0x353 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x9E7 JUMP JUMPDEST CODESIZE PUSH2 0xDB0 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xDC1 JUMP JUMPDEST PUSH2 0xA69 JUMP JUMPDEST PUSH2 0x9DC JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0xE03 JUMPI PUSH1 0x20 MUL ADD SWAP1 JUMP JUMPDEST PUSH2 0x7F3 JUMP JUMPDEST CALLDATALOAD PUSH2 0xE12 DUP2 PUSH2 0x182 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xE3A PUSH2 0xE40 SWAP2 SWAP4 SWAP3 SWAP4 PUSH2 0x17F JUMP JUMPDEST SWAP3 PUSH2 0x17F JUMP JUMPDEST DUP3 ADD DUP1 SWAP3 GT PUSH2 0xE4B JUMPI JUMP JUMPDEST PUSH2 0xE15 JUMP JUMPDEST PUSH1 0x0 SHL SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0xE63 PUSH1 0x0 NOT SWAP2 PUSH2 0xE50 JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0xE82 PUSH2 0xE7D PUSH2 0xE89 SWAP3 PUSH2 0x248 JUMP JUMPDEST PUSH2 0x895 JUMP JUMPDEST DUP3 SLOAD PUSH2 0xE56 JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 CALLDATACOPY JUMP JUMPDEST SWAP1 SWAP2 DUP3 PUSH2 0xEA2 SWAP2 PUSH2 0x8E0 JUMP JUMPDEST SWAP2 PUSH1 0x1 DUP1 PUSH1 0xFB SHL SUB DUP2 GT PUSH2 0xEC5 JUMPI DUP3 SWAP2 PUSH1 0x20 PUSH2 0xEC1 SWAP3 MUL SWAP4 DUP5 SWAP2 PUSH2 0xE92 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0xE8D JUMP JUMPDEST SWAP5 SWAP3 SWAP4 PUSH2 0xF10 SWAP7 SWAP5 PUSH2 0xEF5 PUSH2 0xF02 SWAP5 PUSH2 0xEEB PUSH1 0x80 DUP11 ADD SWAP6 PUSH1 0x0 DUP12 ADD SWAP1 PUSH2 0x8D3 JUMP JUMPDEST PUSH1 0x20 DUP10 ADD SWAP1 PUSH2 0x8D3 JUMP JUMPDEST DUP7 DUP4 SUB PUSH1 0x40 DUP9 ADD MSTORE PUSH2 0xE96 JUMP JUMPDEST SWAP3 PUSH1 0x60 DUP2 DUP6 SUB SWAP2 ADD MSTORE PUSH2 0xE96 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH4 0xFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0xF30 PUSH2 0xF2B PUSH2 0xF35 SWAP3 PUSH2 0xF13 JUMP JUMPDEST PUSH2 0x9E1 JUMP JUMPDEST PUSH2 0x98 JUMP JUMPDEST SWAP1 JUMP JUMPDEST POP POP SWAP4 SWAP5 PUSH2 0xF50 SWAP2 SWAP4 SWAP6 PUSH2 0xF4A PUSH2 0xDEA JUMP JUMPDEST POP PUSH2 0x11AF JUMP JUMPDEST SWAP4 CALLER SWAP2 PUSH2 0xF5D PUSH1 0x0 PUSH2 0x7C8 JUMP JUMPDEST JUMPDEST DUP1 PUSH2 0xF7B PUSH2 0xF75 PUSH2 0xF70 DUP10 DUP10 SWAP1 PUSH2 0xDEF JUMP JUMPDEST PUSH2 0x17F JUMP JUMPDEST SWAP2 PUSH2 0x17F JUMP JUMPDEST LT ISZERO PUSH2 0xFF0 JUMPI PUSH2 0xFEB SWAP1 PUSH2 0xFE6 PUSH2 0xF9C PUSH2 0xF97 DUP6 DUP8 DUP6 SWAP2 PUSH2 0xDF3 JUMP JUMPDEST PUSH2 0xE08 JUMP JUMPDEST PUSH2 0xFE0 PUSH2 0xFD1 PUSH2 0xFB7 PUSH2 0xFB0 DUP14 PUSH1 0x0 PUSH2 0x218 JUMP JUMPDEST DUP11 SWAP1 PUSH2 0x230 JUMP JUMPDEST PUSH2 0xFCB PUSH2 0xFC6 DUP14 DUP14 DUP10 SWAP2 PUSH2 0xDF3 JUMP JUMPDEST PUSH2 0xE08 JUMP JUMPDEST SWAP1 PUSH2 0x264 JUMP JUMPDEST SWAP2 PUSH2 0xFDB DUP4 PUSH2 0x850 JUMP JUMPDEST PUSH2 0xE2B JUMP JUMPDEST SWAP1 PUSH2 0xE6D JUMP JUMPDEST PUSH2 0x7E4 JUMP JUMPDEST PUSH2 0xF5E JUMP JUMPDEST POP SWAP1 PUSH2 0x1031 SWAP3 SWAP4 SWAP6 SWAP4 SWAP5 SWAP6 SWAP2 SWAP1 SWAP2 PUSH32 0x8BC34FEED688351319653DD43606ECFF95D859489D6A570F0DC355C98A007225 SWAP7 PUSH2 0x1028 PUSH2 0x83 JUMP JUMPDEST SWAP7 DUP8 SWAP7 DUP8 PUSH2 0xECA JUMP JUMPDEST SUB SWAP1 LOG1 PUSH2 0x1041 PUSH4 0xBC197C81 PUSH2 0xF1C JUMP JUMPDEST SWAP1 JUMP JUMPDEST POP POP SWAP2 SWAP3 PUSH2 0x105B SWAP2 SWAP4 PUSH2 0x1055 PUSH2 0xDEA JUMP JUMPDEST POP PUSH2 0x11AF JUMP JUMPDEST PUSH2 0x10D2 CALLER SWAP2 PUSH2 0x109C DUP6 PUSH2 0x1096 PUSH2 0x1087 PUSH2 0x1080 PUSH2 0x1079 PUSH1 0x0 DUP8 SWAP1 PUSH2 0x218 JUMP JUMPDEST DUP9 SWAP1 PUSH2 0x230 JUMP JUMPDEST DUP9 SWAP1 PUSH2 0x264 JUMP JUMPDEST SWAP2 PUSH2 0x1091 DUP4 PUSH2 0x850 JUMP JUMPDEST PUSH2 0xE2B JUMP JUMPDEST SWAP1 PUSH2 0xE6D JUMP JUMPDEST SWAP2 SWAP3 SWAP4 PUSH32 0x13805C88D507C700BE6B306C02E8A12F22987364D2FADEFF7D4FA5392508FDBF SWAP5 PUSH2 0x10C9 PUSH2 0x83 JUMP JUMPDEST SWAP5 DUP6 SWAP5 DUP6 PUSH2 0xC2D JUMP JUMPDEST SUB SWAP1 LOG1 PUSH2 0x10E2 PUSH4 0xF23A6E61 PUSH2 0xF1C JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1105 PUSH2 0x1100 PUSH2 0x110A SWAP3 PUSH2 0x10EE JUMP JUMPDEST PUSH2 0x1E1 JUMP JUMPDEST PUSH2 0x17F JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1124 PUSH2 0x111F PUSH2 0x1129 SWAP3 PUSH2 0x110D JUMP JUMPDEST PUSH2 0x1E1 JUMP JUMPDEST PUSH2 0x17F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1135 SWAP1 PUSH2 0x144 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1141 DUP2 PUSH2 0x112C JUMP JUMPDEST SUB PUSH2 0x1148 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x115A DUP3 PUSH2 0x1138 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x1176 JUMPI PUSH2 0x1173 SWAP2 PUSH1 0x0 ADD PUSH2 0x114D JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x8E JUMP JUMPDEST PUSH2 0x1184 SWAP1 PUSH2 0x200 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x119B PUSH2 0x1196 PUSH2 0x11A0 SWAP3 PUSH2 0x7C5 JUMP JUMPDEST PUSH2 0x1E1 JUMP JUMPDEST PUSH2 0x144 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x11AC SWAP1 PUSH2 0x1187 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x11B7 PUSH2 0x10E5 JUMP JUMPDEST SWAP2 PUSH2 0x11C3 DUP3 DUP3 SWAP1 PUSH2 0x10EA JUMP JUMPDEST PUSH2 0x11D6 PUSH2 0x11D0 PUSH1 0x14 PUSH2 0x10F1 JUMP JUMPDEST SWAP2 PUSH2 0x17F JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0x122E JUMPI POP PUSH1 0x14 SWAP2 POP PUSH1 0x0 CALLDATACOPY PUSH1 0x0 MLOAD PUSH1 0x60 SHR JUMPDEST DUP1 PUSH2 0x1209 PUSH2 0x1203 PUSH2 0x11FE PUSH1 0x0 PUSH2 0x11A3 JUMP JUMPDEST PUSH2 0x14F JUMP JUMPDEST SWAP2 PUSH2 0x14F JUMP JUMPDEST EQ PUSH2 0x1211 JUMPI SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH4 0x6DEFBEED PUSH1 0xE1 SHL DUP2 MSTORE DUP1 PUSH2 0x122A PUSH1 0x4 DUP3 ADD PUSH2 0x47F JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP1 PUSH2 0x123A DUP2 DUP4 SWAP1 PUSH2 0x10EA JUMP JUMPDEST PUSH2 0x124D PUSH2 0x1247 PUSH1 0x20 PUSH2 0x1110 JUMP JUMPDEST SWAP2 PUSH2 0x17F JUMP JUMPDEST EQ PUSH2 0x125A JUMPI JUMPDEST POP POP PUSH2 0x11ED JUMP JUMPDEST PUSH2 0x1272 SWAP3 POP SWAP1 PUSH2 0x126D SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x115C JUMP JUMPDEST PUSH2 0x117B JUMP JUMPDEST CODESIZE DUP1 PUSH2 0x1253 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 MSTORE8 INVALID ORIGIN MUL 0xC9 ADD PUSH7 0xDFC5F174690E2F SWAP1 0xE7 0xBB PUSH3 0x1873FF BLOBHASH CALLDATALOAD PUSH3 0x423AF7 DUP11 0xB9 PUSH21 0xDBB564736F6C634300081B00330000000000000000 ", + "sourceMap": "331:4265:3:-:0;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "abi_decode_address": { + "entryPoint": 368, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_address_payable": { + "entryPoint": 4429, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_addresst_addresst_array_uint256_dyn": { + "entryPoint": 1069, + "id": null, + "parameterSlots": 2, + "returnSlots": 3 + }, + "abi_decode_addresst_addresst_array_uint256_dyn_calldatat_array_uint256_dyn_calldatat_bytes_calldata": { + "entryPoint": 1392, + "id": null, + "parameterSlots": 2, + "returnSlots": 8 + }, + "abi_decode_addresst_addresst_uint256": { + "entryPoint": 422, + "id": null, + "parameterSlots": 2, + "returnSlots": 3 + }, + "abi_decode_addresst_addresst_uint256t_uint256t_bytes_calldata": { + "entryPoint": 1653, + "id": null, + "parameterSlots": 2, + "returnSlots": 6 + }, + "abi_decode_array_uint256_dyn": { + "entryPoint": 1034, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_array_uint256_dyn_calldata": { + "entryPoint": 1266, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_available_length_array_uint256_dyn": { + "entryPoint": 947, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_decode_bytes4": { + "entryPoint": 200, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_bytes_calldata": { + "entryPoint": 1329, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_fromMemory": { + "entryPoint": 2535, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_decode_t_bytes4": { + "entryPoint": 185, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_address_payable": { + "entryPoint": 4444, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_uint256": { + "entryPoint": 407, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encodeUpdatedPos_uint256": { + "entryPoint": 2300, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_address": { + "entryPoint": 2259, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_address_address_array_uint256_dyn_array_uint256_dyn": { + "entryPoint": 2404, + "id": null, + "parameterSlots": 5, + "returnSlots": 1 + }, + "abi_encode_address_address_array_uint256_dyn_array_uint256_dyn_stringliteral_c5d2": { + "entryPoint": 2576, + "id": null, + "parameterSlots": 5, + "returnSlots": 1 + }, + "abi_encode_address_address_array_uint256_dyn_calldata_array_uint256_dyn_calldata": { + "entryPoint": 3786, + "id": null, + "parameterSlots": 7, + "returnSlots": 1 + }, + "abi_encode_address_address_uint256_uint256": { + "entryPoint": 3117, + "id": null, + "parameterSlots": 5, + "returnSlots": 1 + }, + "abi_encode_address_address_uint256_uint256_stringliteral_c5d2": { + "entryPoint": 3180, + "id": null, + "parameterSlots": 5, + "returnSlots": 1 + }, + "abi_encode_array_uint256_dyn": { + "entryPoint": 2323, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_array_uint256_dyn_calldata": { + "entryPoint": 3734, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_bool": { + "entryPoint": 249, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_bool_to_bool": { + "entryPoint": 236, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_bytes4": { + "entryPoint": 1555, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_stringliteral_c5d2": { + "entryPoint": 2560, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple": { + "entryPoint": 1151, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple_bytes4": { + "entryPoint": 1568, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_uint256": { + "entryPoint": 738, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_uint256_to_uint256": { + "entryPoint": 2287, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_uint256_to_uint256_fromStack": { + "entryPoint": 725, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "allocate_and_zero_memory_array_array_uint256_dyn": { + "entryPoint": 1950, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "allocate_memory": { + "entryPoint": 892, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "allocate_memory_array_array_uint256_dyn": { + "entryPoint": 1922, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "allocate_unbounded": { + "entryPoint": 131, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "array_allocation_size_array_uint256_dyn": { + "entryPoint": 913, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_dataslot_array_uint256_dyn": { + "entryPoint": 2281, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_length_array_uint256_dyn": { + "entryPoint": 1918, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_length_array_uint256_dyn_calldata": { + "entryPoint": 3567, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "array_length_bytes_calldata": { + "entryPoint": 4330, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "array_nextElement_array_uint256_dyn": { + "entryPoint": 2317, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_storeLengthForEncoding_array_uint256_dyn": { + "entryPoint": 2272, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "array_storeLengthForEncoding_bytes": { + "entryPoint": 2551, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "calldata_array_index_access_uint256_dyn_calldata": { + "entryPoint": 3571, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "checked_add_uint256": { + "entryPoint": 3627, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "cleanup_address": { + "entryPoint": 335, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_address_payable": { + "entryPoint": 4396, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_bool": { + "entryPoint": 231, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_bytes4": { + "entryPoint": 152, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_from_storage_uint256": { + "entryPoint": 640, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_rational_by": { + "entryPoint": 4365, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_rational_by_1": { + "entryPoint": 1989, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_t_rational_by": { + "entryPoint": 4334, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_uint160": { + "entryPoint": 324, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_uint256": { + "entryPoint": 383, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_uint32": { + "entryPoint": 3859, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_address_payable_to_address": { + "entryPoint": 4475, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_address_to_address": { + "entryPoint": 524, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_address_to_contract_IERC1155": { + "entryPoint": 2488, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_contract_ERC1155Holder_to_address": { + "entryPoint": 2512, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_contract_IERC1155_to_address": { + "entryPoint": 2500, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_0_by_1_to_uint256": { + "entryPoint": 1992, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_by_to_address": { + "entryPoint": 4515, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_by_to_uint160": { + "entryPoint": 4487, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_by_to_uint256": { + "entryPoint": 4337, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_t_rational_by_to_t_uint256": { + "entryPoint": 4368, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint160_to_address": { + "entryPoint": 512, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint160_to_contract_IERC1155": { + "entryPoint": 2476, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint160_to_uint160": { + "entryPoint": 484, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint256_to_uint256": { + "entryPoint": 584, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint32_to_bytes4": { + "entryPoint": 3868, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "copy_calldata_to_memory": { + "entryPoint": 3730, + "id": null, + "parameterSlots": 3, + "returnSlots": 0 + }, + "external_fun_claim": { + "entryPoint": 1209, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_claimBatch": { + "entryPoint": 1157, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_claims": { + "entryPoint": 760, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_onERC1155BatchReceived": { + "entryPoint": 1590, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_onERC1155Received": { + "entryPoint": 1766, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_supportsInterface": { + "entryPoint": 271, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "extract_from_storage_value_dynamict_uint256": { + "entryPoint": 643, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "extract_from_storage_value_offsett_uint256": { + "entryPoint": 2108, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "finalize_allocation": { + "entryPoint": 851, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun_claim": { + "entryPoint": 3261, + "id": 295, + "parameterSlots": 3, + "returnSlots": 0 + }, + "fun_claimBatch": { + "entryPoint": 2682, + "id": 378, + "parameterSlots": 3, + "returnSlots": 0 + }, + "fun_decodeClaimant": { + "entryPoint": 4527, + "id": 543, + "parameterSlots": 2, + "returnSlots": 1 + }, + "fun_onERC1155BatchReceived": { + "entryPoint": 3896, + "id": 497, + "parameterSlots": 8, + "returnSlots": 1 + }, + "fun_onERC1155Received": { + "entryPoint": 4164, + "id": 428, + "parameterSlots": 6, + "returnSlots": 1 + }, + "fun_supportsInterface": { + "entryPoint": 1836, + "id": 568, + "parameterSlots": 1, + "returnSlots": 1 + }, + "getter_fun_claims": { + "entryPoint": 681, + "id": 244, + "parameterSlots": 3, + "returnSlots": 1 + }, + "identity": { + "entryPoint": 481, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "increment_wrapping_uint256": { + "entryPoint": 2020, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "mapping_index_access_mapping_address_mapping_address_mapping_uint256_uint256_of_address": { + "entryPoint": 536, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "mapping_index_access_mapping_address_mapping_uint256_uint256_of_address": { + "entryPoint": 560, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "mapping_index_access_mapping_uint256_uint256_of_uint256": { + "entryPoint": 612, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "memory_array_index_access_uint256_dyn": { + "entryPoint": 2057, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "panic_error_0x11": { + "entryPoint": 3605, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "panic_error_0x32": { + "entryPoint": 2035, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "panic_error_0x41": { + "entryPoint": 829, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "prepare_store_uint256": { + "entryPoint": 2197, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "read_from_calldatat_uint256": { + "entryPoint": 3592, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "read_from_memoryt_uint256": { + "entryPoint": 2089, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "read_from_storage_split_dynamic_uint256": { + "entryPoint": 667, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "read_from_storage_split_offset_uint256": { + "entryPoint": 2128, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "revert_error_0cc013b6b3b6beabea4e3a74a6d380f0df81852ca99887912475e1f66b2a2c20": { + "entryPoint": 2524, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_15abf5612cd996bc235ba1e55a4a30ac60e6bb601ff7ba4ad3f179b6be8d0490": { + "entryPoint": 1261, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_1b9f4a0a5773e33b91aa01db23bf8c55fce1411167c872835e7fa00a4f17d46d": { + "entryPoint": 814, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74": { + "entryPoint": 1826, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_81385d8c0b31fffe14be1da910c8bd3a80be4cfa248e04f42ec0faea3132a8ef": { + "entryPoint": 942, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db": { + "entryPoint": 147, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb": { + "entryPoint": 137, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_d0468cefdb41083d2ff66f1e66140f10c9da08cd905521a779422e76a84d11ec": { + "entryPoint": 3725, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b": { + "entryPoint": 142, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_forward": { + "entryPoint": 2665, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "round_up_to_mul_of": { + "entryPoint": 819, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_left": { + "entryPoint": 3664, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_left_224": { + "entryPoint": 2529, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_left_dynamic": { + "entryPoint": 2155, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "shift_right_0_unsigned": { + "entryPoint": 2102, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_right_unsigned": { + "entryPoint": 125, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_right_unsigned_dynamic": { + "entryPoint": 636, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "storage_set_to_zero_uint256": { + "entryPoint": 2239, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "update_byte_slice_dynamic32": { + "entryPoint": 2159, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "update_byte_slice_shift": { + "entryPoint": 3670, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "update_storage_value_offsett_uint256_to_uint256": { + "entryPoint": 3693, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "update_storage_value_uint256_to_uint256": { + "entryPoint": 2200, + "id": null, + "parameterSlots": 3, + "returnSlots": 0 + }, + "validator_revert_address": { + "entryPoint": 347, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "validator_revert_address_payable": { + "entryPoint": 4408, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "validator_revert_bytes4": { + "entryPoint": 164, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "validator_revert_uint256": { + "entryPoint": 386, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "write_to_memory_uint256": { + "entryPoint": 2141, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "zero_memory_chunk_uint256": { + "entryPoint": 1945, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "zero_value_for_split_address": { + "entryPoint": 4325, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "zero_value_for_split_bool": { + "entryPoint": 1831, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "zero_value_for_split_bytes4": { + "entryPoint": 3562, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "zero_value_for_split_uint256": { + "entryPoint": 2234, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + } + }, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "60806040526004361015610013575b610722565b61001e60003561007d565b806301ffc9a7146100785780633f2e7821146100735780638f98c8fb1461006e578063996cba6814610069578063bc197c81146100645763f23a6e610361000e576106e6565b610636565b6104b9565b610485565b6102f8565b61010f565b60e01c90565b60405190565b600080fd5b600080fd5b600080fd5b63ffffffff60e01b1690565b6100ad81610098565b036100b457565b600080fd5b905035906100c6826100a4565b565b906020828203126100e2576100df916000016100b9565b90565b61008e565b151590565b6100f5906100e7565b9052565b919061010d906000602085019401906100ec565b565b3461013f5761013b61012a6101253660046100c8565b61072c565b610132610083565b918291826100f9565b0390f35b610089565b60018060a01b031690565b61015890610144565b90565b6101648161014f565b0361016b57565b600080fd5b9050359061017d8261015b565b565b90565b61018b8161017f565b0361019257565b600080fd5b905035906101a482610182565b565b90916060828403126101dc576101d96101c28460008501610170565b936101d08160208601610170565b93604001610197565b90565b61008e565b90565b6101f86101f36101fd92610144565b6101e1565b610144565b90565b610209906101e4565b90565b61021590610200565b90565b906102229061020c565b600052602052604060002090565b9061023a9061020c565b600052602052604060002090565b61025c6102576102619261017f565b6101e1565b61017f565b90565b9061026e90610248565b600052602052604060002090565b1c90565b90565b610293906008610298930261027c565b610280565b90565b906102a69154610283565b90565b906102d2926102c86102cd926102c3600095600096610218565b610230565b610264565b61029b565b90565b6102de9061017f565b9052565b91906102f6906000602085019401906102d5565b565b346103295761032561031461030e3660046101a6565b916102a9565b61031c610083565b918291826102e2565b0390f35b610089565b600080fd5b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b9061035d90610333565b810190811067ffffffffffffffff82111761037757604052565b61033d565b9061038f610388610083565b9283610353565b565b67ffffffffffffffff81116103a95760208091020190565b61033d565b600080fd5b909291926103c86103c382610391565b61037c565b938185526020808601920283019281841161040557915b8383106103ec5750505050565b602080916103fa8486610197565b8152019201916103df565b6103ae565b9080601f8301121561042857816020610425933591016103b3565b90565b61032e565b9160608383031261047a576104458260008501610170565b926104538360208301610170565b92604082013567ffffffffffffffff811161047557610472920161040a565b90565b610093565b61008e565b60000190565b346104b45761049e61049836600461042d565b91610a7a565b6104a6610083565b806104b08161047f565b0390f35b610089565b346104e8576104d26104cc3660046101a6565b91610cbd565b6104da610083565b806104e48161047f565b0390f35b610089565b600080fd5b909182601f8301121561052c5781359167ffffffffffffffff831161052757602001926020830284011161052257565b6103ae565b6104ed565b61032e565b909182601f8301121561056b5781359167ffffffffffffffff831161056657602001926001830284011161056157565b6103ae565b6104ed565b61032e565b9160a08383031261060e576105888260008501610170565b926105968360208301610170565b92604082013567ffffffffffffffff811161060957816105b79184016104f2565b929093606082013567ffffffffffffffff811161060457836105da9184016104f2565b929093608082013567ffffffffffffffff81116105ff576105fb9201610531565b9091565b610093565b610093565b610093565b61008e565b61061c90610098565b9052565b919061063490600060208501940190610613565b565b346106705761066c61065b61064c366004610570565b96959095949194939293610f38565b610663610083565b91829182610620565b0390f35b610089565b91909160a0818403126106e15761068f8360008301610170565b9261069d8160208401610170565b926106ab8260408501610197565b926106b98360608301610197565b92608082013567ffffffffffffffff81116106dc576106d89201610531565b9091565b610093565b61008e565b3461071d576107196107086106fc366004610675565b94939093929192611044565b610710610083565b91829182610620565b0390f35b610089565b600080fd5b600090565b610734610727565b508061074f610749630271189760e51b610098565b91610098565b1490811561075c575b5090565b90506107776107716301ffc9a760e01b610098565b91610098565b1438610758565b5190565b9061079461078f83610391565b61037c565b918252565b369037565b906107c36107ab83610782565b926020806107b98693610391565b9201910390610799565b565b90565b6107dc6107d76107e1926107c5565b6101e1565b61017f565b90565b60016107f0910161017f565b90565b634e487b7160e01b600052603260045260246000fd5b906108138261077e565b811015610824576020809102010190565b6107f3565b610833905161017f565b90565b60001c90565b61084861084d91610836565b610280565b90565b61085a905461083c565b90565b906108679061017f565b9052565b1b90565b9190600861088b9102916108856000198461086b565b9261086b565b9181191691161790565b90565b91906108ae6108a96108b693610248565b610895565b90835461086f565b9055565b600090565b6108d1916108cb6108ba565b91610898565b565b6108dc9061014f565b9052565b60209181520190565b60200190565b6108f89061017f565b9052565b90610909816020936108ef565b0190565b60200190565b9061093061092a6109238461077e565b80936108e0565b926108e9565b9060005b8181106109415750505090565b90919261095a61095460019286516108fc565b9461090d565b9101919091610934565b929061099b9161098e6109a99694610984608088019460008901906108d3565b60208701906108d3565b8482036040860152610913565b916060818403910152610913565b90565b6109b5906101e4565b90565b6109c1906109ac565b90565b6109cd90610200565b90565b6109d990610200565b90565b600080fd5b60e01b90565b60009103126109f257565b61008e565b60209181520190565b610a0c600080926109f7565b0190565b92610a669491610a4a91610a3d610a5895610a3360a089019460008a01906108d3565b60208801906108d3565b8582036040870152610913565b908382036060850152610913565b906080818303910152610a00565b90565b610a71610083565b3d6000823e3d90fd5b610a8b610a868461077e565b61079e565b610a9560006107c8565b5b80610ab1610aab610aa68861077e565b61017f565b9161017f565b1015610b4f57610b4a90610b0a610af8610af3610ada610ad360008990610218565b8990610230565b610aed610ae88b8790610809565b610829565b90610264565b610850565b610b058591849092610809565b61085d565b610b456000610b40610b27610b20838990610218565b8990610230565b610b3a610b358b8790610809565b610829565b90610264565b6108bf565b6107e4565b610a96565b5091610b9b610ba09183818791610b93887f52afae05d11477135f8797c76d1235e9ca8bfec06367627f38f22ff5019379a394610b8a610083565b94859485610964565b0390a16109b8565b6109c4565b632eb2c2d692610baf306109d0565b929490823b15610c2857600094610be48692610bd994610bcd610083565b998a98899788966109e1565b865260048601610a10565b03925af18015610c2357610bf6575b50565b610c169060003d8111610c1c575b610c0e8183610353565b8101906109e7565b38610bf3565b503d610c04565b610a69565b6109dc565b610c63610c6a94610c59606094989795610c4f608086019a60008701906108d3565b60208501906108d3565b60408301906102d5565b01906102d5565b565b9193610ca3610cad9294610c99610cba97610c8f60a088019860008901906108d3565b60208701906108d3565b60408501906102d5565b60608301906102d5565b6080818303910152610a00565b90565b610d5d610d58610ceb610ce6610cdf610cd860008790610218565b8790610230565b8790610264565b610850565b93610d156000610d10610d09610d02838990610218565b8590610230565b8990610264565b6108bf565b83818791610d50887f2f6639d24651730c7bf57c95ddbf96d66d11477e4ec626876f92c22e5f365e6894610d47610083565b94859485610c2d565b0390a16109b8565b6109c4565b63f242432a92610d6c306109d0565b929490823b15610de557600094610da18692610d9694610d8a610083565b998a98899788966109e1565b865260048601610c6c565b03925af18015610de057610db3575b50565b610dd39060003d8111610dd9575b610dcb8183610353565b8101906109e7565b38610db0565b503d610dc1565b610a69565b6109dc565b600090565b5090565b9190811015610e03576020020190565b6107f3565b35610e1281610182565b90565b634e487b7160e01b600052601160045260246000fd5b610e3a610e409193929361017f565b9261017f565b8201809211610e4b57565b610e15565b60001b90565b90610e6360001991610e50565b9181191691161790565b90610e82610e7d610e8992610248565b610895565b8254610e56565b9055565b600080fd5b9037565b909182610ea2916108e0565b9160018060fb1b038111610ec55782916020610ec19202938491610e92565b0190565b610e8d565b949293610f109694610ef5610f0294610eeb60808a019560008b01906108d3565b60208901906108d3565b8683036040880152610e96565b926060818503910152610e96565b90565b63ffffffff1690565b610f30610f2b610f3592610f13565b6109e1565b610098565b90565b50509394610f50919395610f4a610dea565b506111af565b933391610f5d60006107c8565b5b80610f7b610f75610f70898990610def565b61017f565b9161017f565b1015610ff057610feb90610fe6610f9c610f9785878591610df3565b610e08565b610fe0610fd1610fb7610fb08d6000610218565b8a90610230565b610fcb610fc68d8d8991610df3565b610e08565b90610264565b91610fdb83610850565b610e2b565b90610e6d565b6107e4565b610f5e565b50906110319293959394959190917f8bc34feed688351319653dd43606ecff95d859489d6a570f0dc355c98a00722596611028610083565b96879687610eca565b0390a161104163bc197c81610f1c565b90565b5050919261105b9193611055610dea565b506111af565b6110d2339161109c8561109661108761108061107960008790610218565b8890610230565b8890610264565b9161109183610850565b610e2b565b90610e6d565b9192937f13805c88d507c700be6b306c02e8a12f22987364d2fadeff7d4fa5392508fdbf946110c9610083565b94859485610c2d565b0390a16110e263f23a6e61610f1c565b90565b600090565b5090565b90565b61110561110061110a926110ee565b6101e1565b61017f565b90565b90565b61112461111f6111299261110d565b6101e1565b61017f565b90565b61113590610144565b90565b6111418161112c565b0361114857565b600080fd5b9050359061115a82611138565b565b90602082820312611176576111739160000161114d565b90565b61008e565b61118490610200565b90565b61119b6111966111a0926107c5565b6101e1565b610144565b90565b6111ac90611187565b90565b6111b76110e5565b916111c38282906110ea565b6111d66111d060146110f1565b9161017f565b1460001461122e57506014915060003760005160601c5b806112096112036111fe60006111a3565b61014f565b9161014f565b146112115790565b6000636defbeed60e11b81528061122a6004820161047f565b0390fd5b9061123a8183906110ea565b61124d6112476020611110565b9161017f565b1461125a575b50506111ed565b61127292509061126d919081019061115c565b61117b565b388061125356fea264697066735822122053fe3202c90166dfc5f174690e2f90e7bb621873ff493562423af78ab974dbb564736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x13 JUMPI JUMPDEST PUSH2 0x722 JUMP JUMPDEST PUSH2 0x1E PUSH1 0x0 CALLDATALOAD PUSH2 0x7D JUMP JUMPDEST DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x78 JUMPI DUP1 PUSH4 0x3F2E7821 EQ PUSH2 0x73 JUMPI DUP1 PUSH4 0x8F98C8FB EQ PUSH2 0x6E JUMPI DUP1 PUSH4 0x996CBA68 EQ PUSH2 0x69 JUMPI DUP1 PUSH4 0xBC197C81 EQ PUSH2 0x64 JUMPI PUSH4 0xF23A6E61 SUB PUSH2 0xE JUMPI PUSH2 0x6E6 JUMP JUMPDEST PUSH2 0x636 JUMP JUMPDEST PUSH2 0x4B9 JUMP JUMPDEST PUSH2 0x485 JUMP JUMPDEST PUSH2 0x2F8 JUMP JUMPDEST PUSH2 0x10F JUMP JUMPDEST PUSH1 0xE0 SHR SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL AND SWAP1 JUMP JUMPDEST PUSH2 0xAD DUP2 PUSH2 0x98 JUMP JUMPDEST SUB PUSH2 0xB4 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0xC6 DUP3 PUSH2 0xA4 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0xE2 JUMPI PUSH2 0xDF SWAP2 PUSH1 0x0 ADD PUSH2 0xB9 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x8E JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH2 0xF5 SWAP1 PUSH2 0xE7 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x10D SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0xEC JUMP JUMPDEST JUMP JUMPDEST CALLVALUE PUSH2 0x13F JUMPI PUSH2 0x13B PUSH2 0x12A PUSH2 0x125 CALLDATASIZE PUSH1 0x4 PUSH2 0xC8 JUMP JUMPDEST PUSH2 0x72C JUMP JUMPDEST PUSH2 0x132 PUSH2 0x83 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xF9 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x89 JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x158 SWAP1 PUSH2 0x144 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x164 DUP2 PUSH2 0x14F JUMP JUMPDEST SUB PUSH2 0x16B JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x17D DUP3 PUSH2 0x15B JUMP JUMPDEST JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x18B DUP2 PUSH2 0x17F JUMP JUMPDEST SUB PUSH2 0x192 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x1A4 DUP3 PUSH2 0x182 JUMP JUMPDEST JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x60 DUP3 DUP5 SUB SLT PUSH2 0x1DC JUMPI PUSH2 0x1D9 PUSH2 0x1C2 DUP5 PUSH1 0x0 DUP6 ADD PUSH2 0x170 JUMP JUMPDEST SWAP4 PUSH2 0x1D0 DUP2 PUSH1 0x20 DUP7 ADD PUSH2 0x170 JUMP JUMPDEST SWAP4 PUSH1 0x40 ADD PUSH2 0x197 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x8E JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1F8 PUSH2 0x1F3 PUSH2 0x1FD SWAP3 PUSH2 0x144 JUMP JUMPDEST PUSH2 0x1E1 JUMP JUMPDEST PUSH2 0x144 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x209 SWAP1 PUSH2 0x1E4 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x215 SWAP1 PUSH2 0x200 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x222 SWAP1 PUSH2 0x20C JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x23A SWAP1 PUSH2 0x20C JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH2 0x25C PUSH2 0x257 PUSH2 0x261 SWAP3 PUSH2 0x17F JUMP JUMPDEST PUSH2 0x1E1 JUMP JUMPDEST PUSH2 0x17F JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x26E SWAP1 PUSH2 0x248 JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SHR SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x293 SWAP1 PUSH1 0x8 PUSH2 0x298 SWAP4 MUL PUSH2 0x27C JUMP JUMPDEST PUSH2 0x280 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2A6 SWAP2 SLOAD PUSH2 0x283 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2D2 SWAP3 PUSH2 0x2C8 PUSH2 0x2CD SWAP3 PUSH2 0x2C3 PUSH1 0x0 SWAP6 PUSH1 0x0 SWAP7 PUSH2 0x218 JUMP JUMPDEST PUSH2 0x230 JUMP JUMPDEST PUSH2 0x264 JUMP JUMPDEST PUSH2 0x29B JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2DE SWAP1 PUSH2 0x17F JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x2F6 SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0x2D5 JUMP JUMPDEST JUMP JUMPDEST CALLVALUE PUSH2 0x329 JUMPI PUSH2 0x325 PUSH2 0x314 PUSH2 0x30E CALLDATASIZE PUSH1 0x4 PUSH2 0x1A6 JUMP JUMPDEST SWAP2 PUSH2 0x2A9 JUMP JUMPDEST PUSH2 0x31C PUSH2 0x83 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x2E2 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x89 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1F DUP1 NOT SWAP2 ADD AND SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH2 0x35D SWAP1 PUSH2 0x333 JUMP JUMPDEST DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x377 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH2 0x33D JUMP JUMPDEST SWAP1 PUSH2 0x38F PUSH2 0x388 PUSH2 0x83 JUMP JUMPDEST SWAP3 DUP4 PUSH2 0x353 JUMP JUMPDEST JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3A9 JUMPI PUSH1 0x20 DUP1 SWAP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH2 0x33D JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x3C8 PUSH2 0x3C3 DUP3 PUSH2 0x391 JUMP JUMPDEST PUSH2 0x37C JUMP JUMPDEST SWAP4 DUP2 DUP6 MSTORE PUSH1 0x20 DUP1 DUP7 ADD SWAP3 MUL DUP4 ADD SWAP3 DUP2 DUP5 GT PUSH2 0x405 JUMPI SWAP2 JUMPDEST DUP4 DUP4 LT PUSH2 0x3EC JUMPI POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 SWAP2 PUSH2 0x3FA DUP5 DUP7 PUSH2 0x197 JUMP JUMPDEST DUP2 MSTORE ADD SWAP3 ADD SWAP2 PUSH2 0x3DF JUMP JUMPDEST PUSH2 0x3AE JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x428 JUMPI DUP2 PUSH1 0x20 PUSH2 0x425 SWAP4 CALLDATALOAD SWAP2 ADD PUSH2 0x3B3 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x32E JUMP JUMPDEST SWAP2 PUSH1 0x60 DUP4 DUP4 SUB SLT PUSH2 0x47A JUMPI PUSH2 0x445 DUP3 PUSH1 0x0 DUP6 ADD PUSH2 0x170 JUMP JUMPDEST SWAP3 PUSH2 0x453 DUP4 PUSH1 0x20 DUP4 ADD PUSH2 0x170 JUMP JUMPDEST SWAP3 PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x475 JUMPI PUSH2 0x472 SWAP3 ADD PUSH2 0x40A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x93 JUMP JUMPDEST PUSH2 0x8E JUMP JUMPDEST PUSH1 0x0 ADD SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x4B4 JUMPI PUSH2 0x49E PUSH2 0x498 CALLDATASIZE PUSH1 0x4 PUSH2 0x42D JUMP JUMPDEST SWAP2 PUSH2 0xA7A JUMP JUMPDEST PUSH2 0x4A6 PUSH2 0x83 JUMP JUMPDEST DUP1 PUSH2 0x4B0 DUP2 PUSH2 0x47F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x89 JUMP JUMPDEST CALLVALUE PUSH2 0x4E8 JUMPI PUSH2 0x4D2 PUSH2 0x4CC CALLDATASIZE PUSH1 0x4 PUSH2 0x1A6 JUMP JUMPDEST SWAP2 PUSH2 0xCBD JUMP JUMPDEST PUSH2 0x4DA PUSH2 0x83 JUMP JUMPDEST DUP1 PUSH2 0x4E4 DUP2 PUSH2 0x47F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x89 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP2 DUP3 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x52C JUMPI DUP2 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x527 JUMPI PUSH1 0x20 ADD SWAP3 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH2 0x522 JUMPI JUMP JUMPDEST PUSH2 0x3AE JUMP JUMPDEST PUSH2 0x4ED JUMP JUMPDEST PUSH2 0x32E JUMP JUMPDEST SWAP1 SWAP2 DUP3 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x56B JUMPI DUP2 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x566 JUMPI PUSH1 0x20 ADD SWAP3 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH2 0x561 JUMPI JUMP JUMPDEST PUSH2 0x3AE JUMP JUMPDEST PUSH2 0x4ED JUMP JUMPDEST PUSH2 0x32E JUMP JUMPDEST SWAP2 PUSH1 0xA0 DUP4 DUP4 SUB SLT PUSH2 0x60E JUMPI PUSH2 0x588 DUP3 PUSH1 0x0 DUP6 ADD PUSH2 0x170 JUMP JUMPDEST SWAP3 PUSH2 0x596 DUP4 PUSH1 0x20 DUP4 ADD PUSH2 0x170 JUMP JUMPDEST SWAP3 PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x609 JUMPI DUP2 PUSH2 0x5B7 SWAP2 DUP5 ADD PUSH2 0x4F2 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x604 JUMPI DUP4 PUSH2 0x5DA SWAP2 DUP5 ADD PUSH2 0x4F2 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH1 0x80 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x5FF JUMPI PUSH2 0x5FB SWAP3 ADD PUSH2 0x531 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH2 0x93 JUMP JUMPDEST PUSH2 0x93 JUMP JUMPDEST PUSH2 0x93 JUMP JUMPDEST PUSH2 0x8E JUMP JUMPDEST PUSH2 0x61C SWAP1 PUSH2 0x98 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x634 SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0x613 JUMP JUMPDEST JUMP JUMPDEST CALLVALUE PUSH2 0x670 JUMPI PUSH2 0x66C PUSH2 0x65B PUSH2 0x64C CALLDATASIZE PUSH1 0x4 PUSH2 0x570 JUMP JUMPDEST SWAP7 SWAP6 SWAP1 SWAP6 SWAP5 SWAP2 SWAP5 SWAP4 SWAP3 SWAP4 PUSH2 0xF38 JUMP JUMPDEST PUSH2 0x663 PUSH2 0x83 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x620 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x89 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH1 0xA0 DUP2 DUP5 SUB SLT PUSH2 0x6E1 JUMPI PUSH2 0x68F DUP4 PUSH1 0x0 DUP4 ADD PUSH2 0x170 JUMP JUMPDEST SWAP3 PUSH2 0x69D DUP2 PUSH1 0x20 DUP5 ADD PUSH2 0x170 JUMP JUMPDEST SWAP3 PUSH2 0x6AB DUP3 PUSH1 0x40 DUP6 ADD PUSH2 0x197 JUMP JUMPDEST SWAP3 PUSH2 0x6B9 DUP4 PUSH1 0x60 DUP4 ADD PUSH2 0x197 JUMP JUMPDEST SWAP3 PUSH1 0x80 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x6DC JUMPI PUSH2 0x6D8 SWAP3 ADD PUSH2 0x531 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH2 0x93 JUMP JUMPDEST PUSH2 0x8E JUMP JUMPDEST CALLVALUE PUSH2 0x71D JUMPI PUSH2 0x719 PUSH2 0x708 PUSH2 0x6FC CALLDATASIZE PUSH1 0x4 PUSH2 0x675 JUMP JUMPDEST SWAP5 SWAP4 SWAP1 SWAP4 SWAP3 SWAP2 SWAP3 PUSH2 0x1044 JUMP JUMPDEST PUSH2 0x710 PUSH2 0x83 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x620 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x89 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x734 PUSH2 0x727 JUMP JUMPDEST POP DUP1 PUSH2 0x74F PUSH2 0x749 PUSH4 0x2711897 PUSH1 0xE5 SHL PUSH2 0x98 JUMP JUMPDEST SWAP2 PUSH2 0x98 JUMP JUMPDEST EQ SWAP1 DUP2 ISZERO PUSH2 0x75C JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 POP PUSH2 0x777 PUSH2 0x771 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL PUSH2 0x98 JUMP JUMPDEST SWAP2 PUSH2 0x98 JUMP JUMPDEST EQ CODESIZE PUSH2 0x758 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x794 PUSH2 0x78F DUP4 PUSH2 0x391 JUMP JUMPDEST PUSH2 0x37C JUMP JUMPDEST SWAP2 DUP3 MSTORE JUMP JUMPDEST CALLDATASIZE SWAP1 CALLDATACOPY JUMP JUMPDEST SWAP1 PUSH2 0x7C3 PUSH2 0x7AB DUP4 PUSH2 0x782 JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP1 PUSH2 0x7B9 DUP7 SWAP4 PUSH2 0x391 JUMP JUMPDEST SWAP3 ADD SWAP2 SUB SWAP1 PUSH2 0x799 JUMP JUMPDEST JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x7DC PUSH2 0x7D7 PUSH2 0x7E1 SWAP3 PUSH2 0x7C5 JUMP JUMPDEST PUSH2 0x1E1 JUMP JUMPDEST PUSH2 0x17F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH2 0x7F0 SWAP2 ADD PUSH2 0x17F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH2 0x813 DUP3 PUSH2 0x77E JUMP JUMPDEST DUP2 LT ISZERO PUSH2 0x824 JUMPI PUSH1 0x20 DUP1 SWAP2 MUL ADD ADD SWAP1 JUMP JUMPDEST PUSH2 0x7F3 JUMP JUMPDEST PUSH2 0x833 SWAP1 MLOAD PUSH2 0x17F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SHR SWAP1 JUMP JUMPDEST PUSH2 0x848 PUSH2 0x84D SWAP2 PUSH2 0x836 JUMP JUMPDEST PUSH2 0x280 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x85A SWAP1 SLOAD PUSH2 0x83C JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x867 SWAP1 PUSH2 0x17F JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SHL SWAP1 JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x8 PUSH2 0x88B SWAP2 MUL SWAP2 PUSH2 0x885 PUSH1 0x0 NOT DUP5 PUSH2 0x86B JUMP JUMPDEST SWAP3 PUSH2 0x86B JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x8AE PUSH2 0x8A9 PUSH2 0x8B6 SWAP4 PUSH2 0x248 JUMP JUMPDEST PUSH2 0x895 JUMP JUMPDEST SWAP1 DUP4 SLOAD PUSH2 0x86F JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x8D1 SWAP2 PUSH2 0x8CB PUSH2 0x8BA JUMP JUMPDEST SWAP2 PUSH2 0x898 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x8DC SWAP1 PUSH2 0x14F JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH2 0x8F8 SWAP1 PUSH2 0x17F JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP1 PUSH2 0x909 DUP2 PUSH1 0x20 SWAP4 PUSH2 0x8EF JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x930 PUSH2 0x92A PUSH2 0x923 DUP5 PUSH2 0x77E JUMP JUMPDEST DUP1 SWAP4 PUSH2 0x8E0 JUMP JUMPDEST SWAP3 PUSH2 0x8E9 JUMP JUMPDEST SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x941 JUMPI POP POP POP SWAP1 JUMP JUMPDEST SWAP1 SWAP2 SWAP3 PUSH2 0x95A PUSH2 0x954 PUSH1 0x1 SWAP3 DUP7 MLOAD PUSH2 0x8FC JUMP JUMPDEST SWAP5 PUSH2 0x90D JUMP JUMPDEST SWAP2 ADD SWAP2 SWAP1 SWAP2 PUSH2 0x934 JUMP JUMPDEST SWAP3 SWAP1 PUSH2 0x99B SWAP2 PUSH2 0x98E PUSH2 0x9A9 SWAP7 SWAP5 PUSH2 0x984 PUSH1 0x80 DUP9 ADD SWAP5 PUSH1 0x0 DUP10 ADD SWAP1 PUSH2 0x8D3 JUMP JUMPDEST PUSH1 0x20 DUP8 ADD SWAP1 PUSH2 0x8D3 JUMP JUMPDEST DUP5 DUP3 SUB PUSH1 0x40 DUP7 ADD MSTORE PUSH2 0x913 JUMP JUMPDEST SWAP2 PUSH1 0x60 DUP2 DUP5 SUB SWAP2 ADD MSTORE PUSH2 0x913 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x9B5 SWAP1 PUSH2 0x1E4 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x9C1 SWAP1 PUSH2 0x9AC JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x9CD SWAP1 PUSH2 0x200 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x9D9 SWAP1 PUSH2 0x200 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0xE0 SHL SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP2 SUB SLT PUSH2 0x9F2 JUMPI JUMP JUMPDEST PUSH2 0x8E JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH2 0xA0C PUSH1 0x0 DUP1 SWAP3 PUSH2 0x9F7 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST SWAP3 PUSH2 0xA66 SWAP5 SWAP2 PUSH2 0xA4A SWAP2 PUSH2 0xA3D PUSH2 0xA58 SWAP6 PUSH2 0xA33 PUSH1 0xA0 DUP10 ADD SWAP5 PUSH1 0x0 DUP11 ADD SWAP1 PUSH2 0x8D3 JUMP JUMPDEST PUSH1 0x20 DUP9 ADD SWAP1 PUSH2 0x8D3 JUMP JUMPDEST DUP6 DUP3 SUB PUSH1 0x40 DUP8 ADD MSTORE PUSH2 0x913 JUMP JUMPDEST SWAP1 DUP4 DUP3 SUB PUSH1 0x60 DUP6 ADD MSTORE PUSH2 0x913 JUMP JUMPDEST SWAP1 PUSH1 0x80 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0xA00 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xA71 PUSH2 0x83 JUMP JUMPDEST RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH2 0xA8B PUSH2 0xA86 DUP5 PUSH2 0x77E JUMP JUMPDEST PUSH2 0x79E JUMP JUMPDEST PUSH2 0xA95 PUSH1 0x0 PUSH2 0x7C8 JUMP JUMPDEST JUMPDEST DUP1 PUSH2 0xAB1 PUSH2 0xAAB PUSH2 0xAA6 DUP9 PUSH2 0x77E JUMP JUMPDEST PUSH2 0x17F JUMP JUMPDEST SWAP2 PUSH2 0x17F JUMP JUMPDEST LT ISZERO PUSH2 0xB4F JUMPI PUSH2 0xB4A SWAP1 PUSH2 0xB0A PUSH2 0xAF8 PUSH2 0xAF3 PUSH2 0xADA PUSH2 0xAD3 PUSH1 0x0 DUP10 SWAP1 PUSH2 0x218 JUMP JUMPDEST DUP10 SWAP1 PUSH2 0x230 JUMP JUMPDEST PUSH2 0xAED PUSH2 0xAE8 DUP12 DUP8 SWAP1 PUSH2 0x809 JUMP JUMPDEST PUSH2 0x829 JUMP JUMPDEST SWAP1 PUSH2 0x264 JUMP JUMPDEST PUSH2 0x850 JUMP JUMPDEST PUSH2 0xB05 DUP6 SWAP2 DUP5 SWAP1 SWAP3 PUSH2 0x809 JUMP JUMPDEST PUSH2 0x85D JUMP JUMPDEST PUSH2 0xB45 PUSH1 0x0 PUSH2 0xB40 PUSH2 0xB27 PUSH2 0xB20 DUP4 DUP10 SWAP1 PUSH2 0x218 JUMP JUMPDEST DUP10 SWAP1 PUSH2 0x230 JUMP JUMPDEST PUSH2 0xB3A PUSH2 0xB35 DUP12 DUP8 SWAP1 PUSH2 0x809 JUMP JUMPDEST PUSH2 0x829 JUMP JUMPDEST SWAP1 PUSH2 0x264 JUMP JUMPDEST PUSH2 0x8BF JUMP JUMPDEST PUSH2 0x7E4 JUMP JUMPDEST PUSH2 0xA96 JUMP JUMPDEST POP SWAP2 PUSH2 0xB9B PUSH2 0xBA0 SWAP2 DUP4 DUP2 DUP8 SWAP2 PUSH2 0xB93 DUP9 PUSH32 0x52AFAE05D11477135F8797C76D1235E9CA8BFEC06367627F38F22FF5019379A3 SWAP5 PUSH2 0xB8A PUSH2 0x83 JUMP JUMPDEST SWAP5 DUP6 SWAP5 DUP6 PUSH2 0x964 JUMP JUMPDEST SUB SWAP1 LOG1 PUSH2 0x9B8 JUMP JUMPDEST PUSH2 0x9C4 JUMP JUMPDEST PUSH4 0x2EB2C2D6 SWAP3 PUSH2 0xBAF ADDRESS PUSH2 0x9D0 JUMP JUMPDEST SWAP3 SWAP5 SWAP1 DUP3 EXTCODESIZE ISZERO PUSH2 0xC28 JUMPI PUSH1 0x0 SWAP5 PUSH2 0xBE4 DUP7 SWAP3 PUSH2 0xBD9 SWAP5 PUSH2 0xBCD PUSH2 0x83 JUMP JUMPDEST SWAP10 DUP11 SWAP9 DUP10 SWAP8 DUP9 SWAP7 PUSH2 0x9E1 JUMP JUMPDEST DUP7 MSTORE PUSH1 0x4 DUP7 ADD PUSH2 0xA10 JUMP JUMPDEST SUB SWAP3 GAS CALL DUP1 ISZERO PUSH2 0xC23 JUMPI PUSH2 0xBF6 JUMPI JUMPDEST POP JUMP JUMPDEST PUSH2 0xC16 SWAP1 PUSH1 0x0 RETURNDATASIZE DUP2 GT PUSH2 0xC1C JUMPI JUMPDEST PUSH2 0xC0E DUP2 DUP4 PUSH2 0x353 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x9E7 JUMP JUMPDEST CODESIZE PUSH2 0xBF3 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xC04 JUMP JUMPDEST PUSH2 0xA69 JUMP JUMPDEST PUSH2 0x9DC JUMP JUMPDEST PUSH2 0xC63 PUSH2 0xC6A SWAP5 PUSH2 0xC59 PUSH1 0x60 SWAP5 SWAP9 SWAP8 SWAP6 PUSH2 0xC4F PUSH1 0x80 DUP7 ADD SWAP11 PUSH1 0x0 DUP8 ADD SWAP1 PUSH2 0x8D3 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD SWAP1 PUSH2 0x8D3 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD SWAP1 PUSH2 0x2D5 JUMP JUMPDEST ADD SWAP1 PUSH2 0x2D5 JUMP JUMPDEST JUMP JUMPDEST SWAP2 SWAP4 PUSH2 0xCA3 PUSH2 0xCAD SWAP3 SWAP5 PUSH2 0xC99 PUSH2 0xCBA SWAP8 PUSH2 0xC8F PUSH1 0xA0 DUP9 ADD SWAP9 PUSH1 0x0 DUP10 ADD SWAP1 PUSH2 0x8D3 JUMP JUMPDEST PUSH1 0x20 DUP8 ADD SWAP1 PUSH2 0x8D3 JUMP JUMPDEST PUSH1 0x40 DUP6 ADD SWAP1 PUSH2 0x2D5 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD SWAP1 PUSH2 0x2D5 JUMP JUMPDEST PUSH1 0x80 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0xA00 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xD5D PUSH2 0xD58 PUSH2 0xCEB PUSH2 0xCE6 PUSH2 0xCDF PUSH2 0xCD8 PUSH1 0x0 DUP8 SWAP1 PUSH2 0x218 JUMP JUMPDEST DUP8 SWAP1 PUSH2 0x230 JUMP JUMPDEST DUP8 SWAP1 PUSH2 0x264 JUMP JUMPDEST PUSH2 0x850 JUMP JUMPDEST SWAP4 PUSH2 0xD15 PUSH1 0x0 PUSH2 0xD10 PUSH2 0xD09 PUSH2 0xD02 DUP4 DUP10 SWAP1 PUSH2 0x218 JUMP JUMPDEST DUP6 SWAP1 PUSH2 0x230 JUMP JUMPDEST DUP10 SWAP1 PUSH2 0x264 JUMP JUMPDEST PUSH2 0x8BF JUMP JUMPDEST DUP4 DUP2 DUP8 SWAP2 PUSH2 0xD50 DUP9 PUSH32 0x2F6639D24651730C7BF57C95DDBF96D66D11477E4EC626876F92C22E5F365E68 SWAP5 PUSH2 0xD47 PUSH2 0x83 JUMP JUMPDEST SWAP5 DUP6 SWAP5 DUP6 PUSH2 0xC2D JUMP JUMPDEST SUB SWAP1 LOG1 PUSH2 0x9B8 JUMP JUMPDEST PUSH2 0x9C4 JUMP JUMPDEST PUSH4 0xF242432A SWAP3 PUSH2 0xD6C ADDRESS PUSH2 0x9D0 JUMP JUMPDEST SWAP3 SWAP5 SWAP1 DUP3 EXTCODESIZE ISZERO PUSH2 0xDE5 JUMPI PUSH1 0x0 SWAP5 PUSH2 0xDA1 DUP7 SWAP3 PUSH2 0xD96 SWAP5 PUSH2 0xD8A PUSH2 0x83 JUMP JUMPDEST SWAP10 DUP11 SWAP9 DUP10 SWAP8 DUP9 SWAP7 PUSH2 0x9E1 JUMP JUMPDEST DUP7 MSTORE PUSH1 0x4 DUP7 ADD PUSH2 0xC6C JUMP JUMPDEST SUB SWAP3 GAS CALL DUP1 ISZERO PUSH2 0xDE0 JUMPI PUSH2 0xDB3 JUMPI JUMPDEST POP JUMP JUMPDEST PUSH2 0xDD3 SWAP1 PUSH1 0x0 RETURNDATASIZE DUP2 GT PUSH2 0xDD9 JUMPI JUMPDEST PUSH2 0xDCB DUP2 DUP4 PUSH2 0x353 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x9E7 JUMP JUMPDEST CODESIZE PUSH2 0xDB0 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xDC1 JUMP JUMPDEST PUSH2 0xA69 JUMP JUMPDEST PUSH2 0x9DC JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0xE03 JUMPI PUSH1 0x20 MUL ADD SWAP1 JUMP JUMPDEST PUSH2 0x7F3 JUMP JUMPDEST CALLDATALOAD PUSH2 0xE12 DUP2 PUSH2 0x182 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0xE3A PUSH2 0xE40 SWAP2 SWAP4 SWAP3 SWAP4 PUSH2 0x17F JUMP JUMPDEST SWAP3 PUSH2 0x17F JUMP JUMPDEST DUP3 ADD DUP1 SWAP3 GT PUSH2 0xE4B JUMPI JUMP JUMPDEST PUSH2 0xE15 JUMP JUMPDEST PUSH1 0x0 SHL SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0xE63 PUSH1 0x0 NOT SWAP2 PUSH2 0xE50 JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0xE82 PUSH2 0xE7D PUSH2 0xE89 SWAP3 PUSH2 0x248 JUMP JUMPDEST PUSH2 0x895 JUMP JUMPDEST DUP3 SLOAD PUSH2 0xE56 JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 CALLDATACOPY JUMP JUMPDEST SWAP1 SWAP2 DUP3 PUSH2 0xEA2 SWAP2 PUSH2 0x8E0 JUMP JUMPDEST SWAP2 PUSH1 0x1 DUP1 PUSH1 0xFB SHL SUB DUP2 GT PUSH2 0xEC5 JUMPI DUP3 SWAP2 PUSH1 0x20 PUSH2 0xEC1 SWAP3 MUL SWAP4 DUP5 SWAP2 PUSH2 0xE92 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0xE8D JUMP JUMPDEST SWAP5 SWAP3 SWAP4 PUSH2 0xF10 SWAP7 SWAP5 PUSH2 0xEF5 PUSH2 0xF02 SWAP5 PUSH2 0xEEB PUSH1 0x80 DUP11 ADD SWAP6 PUSH1 0x0 DUP12 ADD SWAP1 PUSH2 0x8D3 JUMP JUMPDEST PUSH1 0x20 DUP10 ADD SWAP1 PUSH2 0x8D3 JUMP JUMPDEST DUP7 DUP4 SUB PUSH1 0x40 DUP9 ADD MSTORE PUSH2 0xE96 JUMP JUMPDEST SWAP3 PUSH1 0x60 DUP2 DUP6 SUB SWAP2 ADD MSTORE PUSH2 0xE96 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH4 0xFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0xF30 PUSH2 0xF2B PUSH2 0xF35 SWAP3 PUSH2 0xF13 JUMP JUMPDEST PUSH2 0x9E1 JUMP JUMPDEST PUSH2 0x98 JUMP JUMPDEST SWAP1 JUMP JUMPDEST POP POP SWAP4 SWAP5 PUSH2 0xF50 SWAP2 SWAP4 SWAP6 PUSH2 0xF4A PUSH2 0xDEA JUMP JUMPDEST POP PUSH2 0x11AF JUMP JUMPDEST SWAP4 CALLER SWAP2 PUSH2 0xF5D PUSH1 0x0 PUSH2 0x7C8 JUMP JUMPDEST JUMPDEST DUP1 PUSH2 0xF7B PUSH2 0xF75 PUSH2 0xF70 DUP10 DUP10 SWAP1 PUSH2 0xDEF JUMP JUMPDEST PUSH2 0x17F JUMP JUMPDEST SWAP2 PUSH2 0x17F JUMP JUMPDEST LT ISZERO PUSH2 0xFF0 JUMPI PUSH2 0xFEB SWAP1 PUSH2 0xFE6 PUSH2 0xF9C PUSH2 0xF97 DUP6 DUP8 DUP6 SWAP2 PUSH2 0xDF3 JUMP JUMPDEST PUSH2 0xE08 JUMP JUMPDEST PUSH2 0xFE0 PUSH2 0xFD1 PUSH2 0xFB7 PUSH2 0xFB0 DUP14 PUSH1 0x0 PUSH2 0x218 JUMP JUMPDEST DUP11 SWAP1 PUSH2 0x230 JUMP JUMPDEST PUSH2 0xFCB PUSH2 0xFC6 DUP14 DUP14 DUP10 SWAP2 PUSH2 0xDF3 JUMP JUMPDEST PUSH2 0xE08 JUMP JUMPDEST SWAP1 PUSH2 0x264 JUMP JUMPDEST SWAP2 PUSH2 0xFDB DUP4 PUSH2 0x850 JUMP JUMPDEST PUSH2 0xE2B JUMP JUMPDEST SWAP1 PUSH2 0xE6D JUMP JUMPDEST PUSH2 0x7E4 JUMP JUMPDEST PUSH2 0xF5E JUMP JUMPDEST POP SWAP1 PUSH2 0x1031 SWAP3 SWAP4 SWAP6 SWAP4 SWAP5 SWAP6 SWAP2 SWAP1 SWAP2 PUSH32 0x8BC34FEED688351319653DD43606ECFF95D859489D6A570F0DC355C98A007225 SWAP7 PUSH2 0x1028 PUSH2 0x83 JUMP JUMPDEST SWAP7 DUP8 SWAP7 DUP8 PUSH2 0xECA JUMP JUMPDEST SUB SWAP1 LOG1 PUSH2 0x1041 PUSH4 0xBC197C81 PUSH2 0xF1C JUMP JUMPDEST SWAP1 JUMP JUMPDEST POP POP SWAP2 SWAP3 PUSH2 0x105B SWAP2 SWAP4 PUSH2 0x1055 PUSH2 0xDEA JUMP JUMPDEST POP PUSH2 0x11AF JUMP JUMPDEST PUSH2 0x10D2 CALLER SWAP2 PUSH2 0x109C DUP6 PUSH2 0x1096 PUSH2 0x1087 PUSH2 0x1080 PUSH2 0x1079 PUSH1 0x0 DUP8 SWAP1 PUSH2 0x218 JUMP JUMPDEST DUP9 SWAP1 PUSH2 0x230 JUMP JUMPDEST DUP9 SWAP1 PUSH2 0x264 JUMP JUMPDEST SWAP2 PUSH2 0x1091 DUP4 PUSH2 0x850 JUMP JUMPDEST PUSH2 0xE2B JUMP JUMPDEST SWAP1 PUSH2 0xE6D JUMP JUMPDEST SWAP2 SWAP3 SWAP4 PUSH32 0x13805C88D507C700BE6B306C02E8A12F22987364D2FADEFF7D4FA5392508FDBF SWAP5 PUSH2 0x10C9 PUSH2 0x83 JUMP JUMPDEST SWAP5 DUP6 SWAP5 DUP6 PUSH2 0xC2D JUMP JUMPDEST SUB SWAP1 LOG1 PUSH2 0x10E2 PUSH4 0xF23A6E61 PUSH2 0xF1C JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1105 PUSH2 0x1100 PUSH2 0x110A SWAP3 PUSH2 0x10EE JUMP JUMPDEST PUSH2 0x1E1 JUMP JUMPDEST PUSH2 0x17F JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1124 PUSH2 0x111F PUSH2 0x1129 SWAP3 PUSH2 0x110D JUMP JUMPDEST PUSH2 0x1E1 JUMP JUMPDEST PUSH2 0x17F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1135 SWAP1 PUSH2 0x144 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1141 DUP2 PUSH2 0x112C JUMP JUMPDEST SUB PUSH2 0x1148 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x115A DUP3 PUSH2 0x1138 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x1176 JUMPI PUSH2 0x1173 SWAP2 PUSH1 0x0 ADD PUSH2 0x114D JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x8E JUMP JUMPDEST PUSH2 0x1184 SWAP1 PUSH2 0x200 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x119B PUSH2 0x1196 PUSH2 0x11A0 SWAP3 PUSH2 0x7C5 JUMP JUMPDEST PUSH2 0x1E1 JUMP JUMPDEST PUSH2 0x144 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x11AC SWAP1 PUSH2 0x1187 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x11B7 PUSH2 0x10E5 JUMP JUMPDEST SWAP2 PUSH2 0x11C3 DUP3 DUP3 SWAP1 PUSH2 0x10EA JUMP JUMPDEST PUSH2 0x11D6 PUSH2 0x11D0 PUSH1 0x14 PUSH2 0x10F1 JUMP JUMPDEST SWAP2 PUSH2 0x17F JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0x122E JUMPI POP PUSH1 0x14 SWAP2 POP PUSH1 0x0 CALLDATACOPY PUSH1 0x0 MLOAD PUSH1 0x60 SHR JUMPDEST DUP1 PUSH2 0x1209 PUSH2 0x1203 PUSH2 0x11FE PUSH1 0x0 PUSH2 0x11A3 JUMP JUMPDEST PUSH2 0x14F JUMP JUMPDEST SWAP2 PUSH2 0x14F JUMP JUMPDEST EQ PUSH2 0x1211 JUMPI SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH4 0x6DEFBEED PUSH1 0xE1 SHL DUP2 MSTORE DUP1 PUSH2 0x122A PUSH1 0x4 DUP3 ADD PUSH2 0x47F JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP1 PUSH2 0x123A DUP2 DUP4 SWAP1 PUSH2 0x10EA JUMP JUMPDEST PUSH2 0x124D PUSH2 0x1247 PUSH1 0x20 PUSH2 0x1110 JUMP JUMPDEST SWAP2 PUSH2 0x17F JUMP JUMPDEST EQ PUSH2 0x125A JUMPI JUMPDEST POP POP PUSH2 0x11ED JUMP JUMPDEST PUSH2 0x1272 SWAP3 POP SWAP1 PUSH2 0x126D SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x115C JUMP JUMPDEST PUSH2 0x117B JUMP JUMPDEST CODESIZE DUP1 PUSH2 0x1253 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 MSTORE8 INVALID ORIGIN MUL 0xC9 ADD PUSH7 0xDFC5F174690E2F SWAP1 0xE7 0xBB PUSH3 0x1873FF BLOBHASH CALLDATALOAD PUSH3 0x423AF7 DUP11 0xB9 PUSH21 0xDBB564736F6C634300081B00330000000000000000 ", + "sourceMap": "331:4265:3:-:0;;;;;;;;;-1:-1:-1;331:4265:3;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;:::o;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;:::o;:::-;;:::o;:::-;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;:::o;:::-;;:::o;:::-;;;;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::o;1124:81::-;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;331:4265::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;:::i;:::-;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;:::i;:::-;;;;:::o;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;:::o;4362:231::-;4470:4;;:::i;:::-;4493:11;;:49;;4508:34;;;4493:49;:::i;:::-;;;:::i;:::-;;:93;;;;;4362:231;4486:100;;:::o;4493:93::-;4546:11;;:40;;4561:25;;;4546:40;:::i;:::-;;;:::i;:::-;;4493:93;;;331:4265;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;;;:::o;:::-;;;;:::o;:::-;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;;:::o;:::-;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;:::o;:::-;;:::o;:::-;;;;;;;;:::i;:::-;;:::i;:::-;;;;;:::i;:::-;;;:::o;:::-;;;:::o;:::-;;;;;:::i;:::-;;;:::i;:::-;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::o;:::-;;;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;:::o;:::-;;;;:::o;:::-;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;:::o;:::-;;;:::i;:::-;;;;;;;;1898:540;2029:30;2043:15;:8;:15;:::i;:::-;2029:30;:::i;:::-;2074:13;2086:1;2074:13;:::i;:::-;2110:3;2089:1;:19;;2093:15;:8;:15;:::i;:::-;2089:19;:::i;:::-;;;:::i;:::-;;;;;2110:3;2142:6;2129:56;2142:43;;:30;:16;:6;2149:8;2142:16;;:::i;:::-;2159:12;2142:30;;:::i;:::-;2173:11;;:8;2182:1;2173:11;;:::i;:::-;;:::i;:::-;2142:43;;:::i;:::-;;:::i;:::-;2129:56;:7;2137:1;;2129:56;;;:::i;:::-;;:::i;:::-;2199:50;;2206:43;:30;:16;:6;2213:8;2206:16;;:::i;:::-;2223:12;2206:30;;:::i;:::-;2237:11;;:8;2246:1;2237:11;;:::i;:::-;;:::i;:::-;2206:43;;:::i;:::-;2199:50;:::i;:::-;2110:3;:::i;:::-;2074:13;;2089:19;;;2339:22;:44;2089:19;2287:8;2297:12;2311:8;2321:7;2274:55;2321:7;2274:55;;;;:::i;:::-;;;;;;:::i;:::-;;;;2339:22;:::i;:::-;:44;:::i;:::-;;2392:4;2384:13;2392:4;2384:13;:::i;:::-;2399:8;2409;2419:7;2339:92;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;2069:191;1898:540;:::o;2339:92::-;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;:::i;331:4265::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;:::o;1363:366::-;1637:39;:22;1469:39;;:30;:16;:6;1476:8;1469:16;;:::i;:::-;1486:12;1469:30;;:::i;:::-;1500:7;1469:39;;:::i;:::-;;:::i;:::-;1525:6;1518:46;;1525:39;:30;:16;:6;1532:8;1525:16;;:::i;:::-;1542:12;1525:30;;:::i;:::-;1556:7;1525:39;;:::i;:::-;1518:46;:::i;:::-;1587:8;1597:12;1611:7;1620:6;1579:48;1620:6;1579:48;;;;:::i;:::-;;;;;;:::i;:::-;;;;1637:22;:::i;:::-;:39;:::i;:::-;;1685:4;1677:13;1685:4;1677:13;:::i;:::-;1692:8;1702:7;1711:6;1637:85;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;1363:366;;:::o;1637:85::-;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;:::i;331:4265::-;;;:::o;:::-;;;:::o;:::-;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;:::o;:::-;;:::i;:::-;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;3087:588::-;;;;;3336:26;3087:588;;;3299:6;;:::i;:::-;3352:9;3336:26;:::i;:::-;3395:10;;3432:1;3420:13;3432:1;3420:13;:::i;:::-;3456:3;3435:1;:19;;3439:15;:8;;:15;;:::i;:::-;3435:19;:::i;:::-;;;:::i;:::-;;;;;3456:3;3522:7;3475:57;3522:10;;:7;;3530:1;3522:10;;:::i;:::-;;:::i;:::-;3475:57;:43;:30;:16;:6;;:16;:::i;:::-;3492:12;3475:30;;:::i;:::-;3506:11;;:8;;3515:1;3506:11;;:::i;:::-;;:::i;:::-;3475:43;;:::i;:::-;:57;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;3456:3;:::i;:::-;3420:13;;3435:19;;;3557:58;3435:19;;;3583:12;3597:8;;3607:7;;3557:58;;;;;:::i;:::-;;;;;;:::i;:::-;;;;3632:36;:27;:36;:::i;:::-;3625:43;:::o;2528:469::-;;;;;2748:26;2528:469;;2711:6;;:::i;:::-;2764:9;2748:26;:::i;:::-;2891:51;2807:10;2870:6;2827:49;2870:6;2827:49;:39;:30;:16;:6;2834:8;2827:16;;:::i;:::-;2844:12;2827:30;;:::i;:::-;2858:7;2827:39;;:::i;:::-;:49;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;2912:12;2926:7;2935:6;2891:51;;;;:::i;:::-;;;;;;:::i;:::-;;;;2959:31;:22;:31;:::i;:::-;2952:38;:::o;331:4265::-;;;:::o;:::-;;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;3736:592::-;3824:16;;:::i;:::-;3856:9;:16;:9;;:16;;:::i;:::-;:22;;3876:2;3856:22;:::i;:::-;;;:::i;:::-;;3852:359;;;;3931:124;;;;;;;;;;3852:359;4224:8;:22;;4236:10;4244:1;4236:10;:::i;:::-;4224:22;:::i;:::-;;;:::i;:::-;;4220:77;;4306:15;:::o;4220:77::-;4269:17;;;;;;;;;;;;:::i;:::-;;;;3852:359;4075:9;:16;:9;;:16;;:::i;:::-;:22;;4095:2;4075:22;:::i;:::-;;;:::i;:::-;;4071:140;;3852:359;;;;;4071:140;4155:45;4179:9;;;4168:32;4179:9;;4168:32;;;;:::i;:::-;4155:45;:::i;:::-;4071:140;;;" + }, + "methodIdentifiers": { + "claim(address,address,uint256)": "996cba68", + "claimBatch(address,address,uint256[])": "8f98c8fb", + "claims(address,address,uint256)": "3f2e7821", + "onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)": "bc197c81", + "onERC1155Received(address,address,uint256,uint256,bytes)": "f23a6e61", + "supportsInterface(bytes4)": "01ffc9a7" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidClaimant\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"claimant\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ClaimAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"claimant\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"ClaimAddedBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"claimant\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Claimed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"claimant\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"ClaimedBatch\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"claimant\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"claimant\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"claimBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"claims\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"claimData\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"claimData\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"InvalidClaimant()\":[{\"details\":\"Error thrown when the claimant is invalid.\"}]},\"events\":{\"ClaimAdded(address,address,uint256,uint256)\":{\"details\":\"Emitted when a claim is added.\"},\"ClaimAddedBatch(address,address,uint256[],uint256[])\":{\"details\":\"Emitted when a batch of claims is added.\"},\"Claimed(address,address,uint256,uint256)\":{\"details\":\"Emitted when a claim is claimed.\"},\"ClaimedBatch(address,address,uint256[],uint256[])\":{\"details\":\"Emitted when a batch of claims is claimed.\"}},\"kind\":\"dev\",\"methods\":{\"claim(address,address,uint256)\":{\"details\":\"Claims a token.\",\"params\":{\"claimant\":\"The claimant.\",\"tokenAddress\":\"The token address.\",\"tokenId\":\"The token id.\"}},\"claimBatch(address,address,uint256[])\":{\"details\":\"Claims a batch of tokens.\",\"params\":{\"claimant\":\"The claimant.\",\"tokenAddress\":\"The token address.\",\"tokenIds\":\"The token ids.\"}},\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\":{\"details\":\"Handles the receipt of a multiple ERC1155 token types. This function is called at the end of a `safeBatchTransferFrom` after the balances have been updated. NOTE: To accept the transfer(s), this must return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` (i.e. 0xbc197c81, or its own function selector).\",\"params\":{\"claimData\":\"The encoded claimant.\"},\"returns\":{\"_0\":\"`bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\"}},\"onERC1155Received(address,address,uint256,uint256,bytes)\":{\"details\":\"Handles the receipt of a single ERC1155 token type. This function is called at the end of a `safeTransferFrom` after the balance has been updated. NOTE: To accept the transfer, this must return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` (i.e. 0xf23a6e61, or its own function selector).\",\"params\":{\"claimData\":\"The encoded claimant.\"},\"returns\":{\"_0\":\"`bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\"}},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"}},\"stateVariables\":{\"claims\":{\"details\":\"claimant -> tokenAddress -> tokenId -> amount\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"An ERC-1155 contract that allows permissive minting.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/tokens/ERC1155/utility/holder/ERC1155Holder.sol\":\"ERC1155Holder\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/IERC1155.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC1155 compliant contract, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-1155[EIP].\\n *\\n * _Available since v3.1._\\n */\\ninterface IERC1155 is IERC165 {\\n /**\\n * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.\\n */\\n event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n /**\\n * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all\\n * transfers.\\n */\\n event TransferBatch(\\n address indexed operator,\\n address indexed from,\\n address indexed to,\\n uint256[] ids,\\n uint256[] values\\n );\\n\\n /**\\n * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to\\n * `approved`.\\n */\\n event ApprovalForAll(address indexed account, address indexed operator, bool approved);\\n\\n /**\\n * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.\\n *\\n * If an {URI} event was emitted for `id`, the standard\\n * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value\\n * returned by {IERC1155MetadataURI-uri}.\\n */\\n event URI(string value, uint256 indexed id);\\n\\n /**\\n * @dev Returns the amount of tokens of token type `id` owned by `account`.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function balanceOf(address account, uint256 id) external view returns (uint256);\\n\\n /**\\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.\\n *\\n * Requirements:\\n *\\n * - `accounts` and `ids` must have the same length.\\n */\\n function balanceOfBatch(\\n address[] calldata accounts,\\n uint256[] calldata ids\\n ) external view returns (uint256[] memory);\\n\\n /**\\n * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,\\n *\\n * Emits an {ApprovalForAll} event.\\n *\\n * Requirements:\\n *\\n * - `operator` cannot be the caller.\\n */\\n function setApprovalForAll(address operator, bool approved) external;\\n\\n /**\\n * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.\\n *\\n * See {setApprovalForAll}.\\n */\\n function isApprovedForAll(address account, address operator) external view returns (bool);\\n\\n /**\\n * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.\\n *\\n * Emits a {TransferSingle} event.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.\\n * - `from` must have a balance of tokens of type `id` of at least `amount`.\\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\\n * acceptance magic value.\\n */\\n function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external;\\n\\n /**\\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.\\n *\\n * Emits a {TransferBatch} event.\\n *\\n * Requirements:\\n *\\n * - `ids` and `amounts` must have the same length.\\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\\n * acceptance magic value.\\n */\\n function safeBatchTransferFrom(\\n address from,\\n address to,\\n uint256[] calldata ids,\\n uint256[] calldata amounts,\\n bytes calldata data\\n ) external;\\n}\\n\",\"keccak256\":\"0xcab667ddad478ff0d39c2053ca77fac778af8483c18ab07d810277b4216fd582\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev _Available since v3.1._\\n */\\ninterface IERC1155Receiver is IERC165 {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xeb373f1fdc7b755c6a750123a9b9e3a8a02c1470042fd6505d875000a80bde0b\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"src/tokens/ERC1155/utility/holder/ERC1155Holder.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\nimport { IERC1155 } from \\\"openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol\\\";\\nimport { IERC1155Receiver, IERC165 } from \\\"openzeppelin-contracts/contracts/token/ERC1155/IERC1155Receiver.sol\\\";\\n\\n/**\\n * An ERC-1155 contract that allows permissive minting.\\n */\\ncontract ERC1155Holder is IERC1155Receiver {\\n\\n /// @dev Emitted when a claim is added.\\n event ClaimAdded(address claimant, address tokenAddress, uint256 tokenId, uint256 amount);\\n /// @dev Emitted when a batch of claims is added.\\n event ClaimAddedBatch(address claimant, address tokenAddress, uint256[] tokenIds, uint256[] amounts);\\n\\n /// @dev Emitted when a claim is claimed.\\n event Claimed(address claimant, address tokenAddress, uint256 tokenId, uint256 amount);\\n /// @dev Emitted when a batch of claims is claimed.\\n event ClaimedBatch(address claimant, address tokenAddress, uint256[] tokenIds, uint256[] amounts);\\n\\n /// @dev Error thrown when the claimant is invalid.\\n error InvalidClaimant();\\n\\n /// @dev claimant -> tokenAddress -> tokenId -> amount\\n mapping(address => mapping(address => mapping(uint256 => uint256))) public claims;\\n\\n /// @dev Claims a token.\\n /// @param claimant The claimant.\\n /// @param tokenAddress The token address.\\n /// @param tokenId The token id.\\n function claim(address claimant, address tokenAddress, uint256 tokenId) public {\\n uint256 amount = claims[claimant][tokenAddress][tokenId];\\n delete claims[claimant][tokenAddress][tokenId];\\n emit Claimed(claimant, tokenAddress, tokenId, amount);\\n IERC1155(tokenAddress).safeTransferFrom(address(this), claimant, tokenId, amount, \\\"\\\");\\n }\\n\\n /// @dev Claims a batch of tokens.\\n /// @param claimant The claimant.\\n /// @param tokenAddress The token address.\\n /// @param tokenIds The token ids.\\n function claimBatch(address claimant, address tokenAddress, uint256[] memory tokenIds) public {\\n uint256[] memory amounts = new uint256[](tokenIds.length);\\n for (uint256 i = 0; i < tokenIds.length; i++) {\\n amounts[i] = claims[claimant][tokenAddress][tokenIds[i]];\\n delete claims[claimant][tokenAddress][tokenIds[i]];\\n }\\n emit ClaimedBatch(claimant, tokenAddress, tokenIds, amounts);\\n IERC1155(tokenAddress).safeBatchTransferFrom(address(this), claimant, tokenIds, amounts, \\\"\\\");\\n }\\n\\n /// @inheritdoc IERC1155Receiver\\n /// @param claimData The encoded claimant.\\n function onERC1155Received(\\n address,\\n address,\\n uint256 tokenId,\\n uint256 amount,\\n bytes calldata claimData\\n ) public virtual override returns (bytes4) {\\n address claimant = _decodeClaimant(claimData);\\n address tokenAddress = msg.sender;\\n claims[claimant][tokenAddress][tokenId] += amount;\\n emit ClaimAdded(claimant, tokenAddress, tokenId, amount);\\n return this.onERC1155Received.selector;\\n }\\n\\n /// @inheritdoc IERC1155Receiver\\n /// @param claimData The encoded claimant.\\n function onERC1155BatchReceived(\\n address,\\n address,\\n uint256[] calldata tokenIds,\\n uint256[] calldata amounts,\\n bytes calldata claimData\\n ) public virtual override returns (bytes4) {\\n address claimant = _decodeClaimant(claimData);\\n address tokenAddress = msg.sender;\\n for (uint256 i = 0; i < tokenIds.length; i++) {\\n claims[claimant][tokenAddress][tokenIds[i]] += amounts[i];\\n }\\n emit ClaimAddedBatch(claimant, tokenAddress, tokenIds, amounts);\\n return this.onERC1155BatchReceived.selector;\\n }\\n\\n /// @dev Decodes the claimant from the claim data.\\n function _decodeClaimant(\\n bytes calldata claimData\\n ) internal pure returns (address claimant) {\\n if (claimData.length == 20) {\\n // Packed address format\\n assembly {\\n calldatacopy(0, claimData.offset, 20)\\n claimant := shr(96, mload(0))\\n }\\n } else if (claimData.length == 32) {\\n // ABI encoded address format\\n (claimant) = abi.decode(claimData, (address));\\n }\\n if (claimant == address(0)) {\\n revert InvalidClaimant();\\n }\\n return claimant;\\n }\\n\\n /// @inheritdoc IERC165\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view virtual override(IERC165) returns (bool) {\\n return interfaceId == type(IERC1155Receiver).interfaceId || interfaceId == type(IERC165).interfaceId;\\n }\\n\\n}\\n\",\"keccak256\":\"0x9210aa3f64c5262c9e32fdf798691fb7d5a8b5d00b256c688bd039d0b0861f31\",\"license\":\"Apache-2.0\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": {}, + "notice": "An ERC-1155 contract that allows permissive minting.", + "version": 1 + } + } + } + }, + "sources": { + "lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol": { + "id": 0 + }, + "lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155Receiver.sol": { + "id": 1 + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol": { + "id": 2 + }, + "src/tokens/ERC1155/utility/holder/ERC1155Holder.sol": { + "id": 3 + } + } + }, + "solcLongVersion": "0.8.27+commit.40a35a09", + "solcVersion": "0.8.27" +} diff --git a/jobs/builder/build-info/v2/ERC1155-Pack-factory.json b/jobs/builder/build-info/v2/ERC1155-Pack-factory.json new file mode 100644 index 0000000..491d8bf --- /dev/null +++ b/jobs/builder/build-info/v2/ERC1155-Pack-factory.json @@ -0,0 +1,23356 @@ +{ + "id": "b86b87fbafaaad4b2f7a59d3dc64e32cf2fda868", + "source_id_to_path": { + "0": "src/tokens/ERC1155/presets/pack/ERC1155PackFactory.sol", + "1": "src/proxies/SequenceProxyFactory.sol", + "2": "src/tokens/ERC1155/presets/pack/ERC1155Pack.sol", + "3": "src/tokens/ERC1155/presets/pack/IERC1155PackFactory.sol", + "4": "src/proxies/TransparentUpgradeableBeaconProxy.sol", + "5": "lib/openzeppelin-contracts/contracts/access/Ownable.sol", + "6": "lib/openzeppelin-contracts/contracts/proxy/beacon/UpgradeableBeacon.sol", + "7": "lib/openzeppelin-contracts/contracts/utils/Create2.sol", + "8": "src/tokens/ERC721/presets/items/IERC721Items.sol", + "9": "src/tokens/ERC1155/presets/items/ERC1155Items.sol", + "10": "src/tokens/ERC1155/presets/items/IERC1155Items.sol", + "11": "src/tokens/ERC1155/presets/pack/IERC1155Pack.sol", + "12": "lib/solady/src/utils/MerkleProofLib.sol", + "13": "src/proxies/openzeppelin/BeaconProxy.sol", + "14": "src/proxies/openzeppelin/TransparentUpgradeableProxy.sol", + "15": "lib/openzeppelin-contracts/contracts/utils/Context.sol", + "16": "lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol", + "17": "lib/openzeppelin-contracts/contracts/utils/Address.sol", + "18": "src/tokens/ERC1155/ERC1155BaseToken.sol", + "19": "lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Upgrade.sol", + "20": "lib/openzeppelin-contracts/contracts/proxy/Proxy.sol", + "21": "src/proxies/openzeppelin/ERC1967Proxy.sol", + "22": "src/tokens/common/ERC2981Controlled.sol", + "23": "src/tokens/common/SignalsImplicitModeControlled.sol", + "24": "src/tokens/ERC1155/extensions/supply/ERC1155Supply.sol", + "25": "lib/solady/src/utils/LibString.sol", + "26": "lib/openzeppelin-contracts/contracts/interfaces/IERC1967.sol", + "27": "lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol", + "28": "lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol", + "29": "src/tokens/common/IERC2981Controlled.sol", + "30": "lib/openzeppelin-contracts/contracts/access/AccessControlEnumerable.sol", + "31": "lib/openzeppelin-contracts/contracts/token/common/ERC2981.sol", + "32": "lib/signals-implicit-mode/src/helper/SignalsImplicitMode.sol", + "33": "src/tokens/ERC1155/extensions/supply/IERC1155Supply.sol", + "34": "lib/solady/src/tokens/ERC1155.sol", + "35": "lib/solady/src/utils/LibBytes.sol", + "36": "lib/openzeppelin-contracts/contracts/access/IAccessControlEnumerable.sol", + "37": "lib/openzeppelin-contracts/contracts/access/AccessControl.sol", + "38": "lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol", + "39": "lib/openzeppelin-contracts/contracts/interfaces/IERC2981.sol", + "40": "lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol", + "41": "lib/signals-implicit-mode/src/registry/IImplicitProjectValidation.sol", + "42": "lib/signals-implicit-mode/lib/sequence-v3/src/extensions/sessions/implicit/Attestation.sol", + "43": "lib/signals-implicit-mode/lib/sequence-v3/src/extensions/sessions/implicit/ISignalsImplicitMode.sol", + "44": "lib/signals-implicit-mode/lib/sequence-v3/src/modules/Payload.sol", + "45": "lib/openzeppelin-contracts/contracts/access/IAccessControl.sol", + "46": "lib/openzeppelin-contracts/contracts/utils/Strings.sol", + "47": "lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol", + "48": "lib/signals-implicit-mode/lib/sequence-v3/src/utils/LibBytes.sol", + "49": "lib/openzeppelin-contracts/contracts/utils/math/Math.sol", + "50": "lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol" + }, + "language": "Solidity", + "_format": "ethers-rs-sol-build-info-1", + "input": { + "version": "0.8.27", + "language": "Solidity", + "sources": { + "src/tokens/ERC1155/presets/pack/ERC1155PackFactory.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.19;\n\nimport { SequenceProxyFactory } from \"../../../../proxies/SequenceProxyFactory.sol\";\nimport { ERC1155Pack } from \"./ERC1155Pack.sol\";\nimport { IERC1155PackFactory, IERC1155PackFactoryFunctions } from \"./IERC1155PackFactory.sol\";\n\n/**\n * Deployer of ERC-1155 Pack proxies.\n */\ncontract ERC1155PackFactory is IERC1155PackFactory, SequenceProxyFactory {\n\n /**\n * Creates an ERC-1155 Pack Factory.\n * @param factoryOwner The owner of the ERC-1155 Pack Factory\n * @param holderFallback The address of the ERC1155Holder fallback\n */\n constructor(address factoryOwner, address holderFallback) {\n ERC1155Pack impl = new ERC1155Pack(holderFallback);\n SequenceProxyFactory._initialize(address(impl), factoryOwner);\n }\n\n /// @inheritdoc IERC1155PackFactoryFunctions\n function deploy(\n address proxyOwner,\n address tokenOwner,\n string memory name,\n string memory baseURI,\n string memory contractURI,\n address royaltyReceiver,\n uint96 royaltyFeeNumerator,\n address implicitModeValidator,\n bytes32 implicitModeProjectId\n ) external override returns (address proxyAddr) {\n bytes32 salt = keccak256(\n abi.encode(\n tokenOwner,\n name,\n baseURI,\n contractURI,\n royaltyReceiver,\n royaltyFeeNumerator,\n implicitModeValidator,\n implicitModeProjectId\n )\n );\n proxyAddr = _createProxy(salt, proxyOwner, \"\");\n ERC1155Pack(proxyAddr).initialize(\n tokenOwner,\n name,\n baseURI,\n contractURI,\n royaltyReceiver,\n royaltyFeeNumerator,\n implicitModeValidator,\n implicitModeProjectId\n );\n emit ERC1155PackDeployed(proxyAddr);\n return proxyAddr;\n }\n\n /// @inheritdoc IERC1155PackFactoryFunctions\n function determineAddress(\n address proxyOwner,\n address tokenOwner,\n string memory name,\n string memory baseURI,\n string memory contractURI,\n address royaltyReceiver,\n uint96 royaltyFeeNumerator,\n address implicitModeValidator,\n bytes32 implicitModeProjectId\n ) external view override returns (address proxyAddr) {\n bytes32 salt = keccak256(\n abi.encode(\n tokenOwner,\n name,\n baseURI,\n contractURI,\n royaltyReceiver,\n royaltyFeeNumerator,\n implicitModeValidator,\n implicitModeProjectId\n )\n );\n return _computeProxyAddress(salt, proxyOwner, \"\");\n }\n\n}\n" + }, + "src/proxies/SequenceProxyFactory.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.19;\n\nimport {\n ITransparentUpgradeableBeaconProxy,\n TransparentUpgradeableBeaconProxy\n} from \"./TransparentUpgradeableBeaconProxy.sol\";\n\nimport { Ownable } from \"openzeppelin-contracts/contracts/access/Ownable.sol\";\nimport { UpgradeableBeacon } from \"openzeppelin-contracts/contracts/proxy/beacon/UpgradeableBeacon.sol\";\nimport { Create2 } from \"openzeppelin-contracts/contracts/utils/Create2.sol\";\n\n/**\n * An proxy factory that deploys upgradeable beacon proxies.\n * @dev The factory owner is able to upgrade the beacon implementation.\n * @dev Proxy deployers are able to override the beacon reference with their own.\n */\nabstract contract SequenceProxyFactory is Ownable {\n\n UpgradeableBeacon public beacon;\n\n /**\n * Initialize a Sequence Proxy Factory.\n * @param implementation The initial beacon implementation.\n * @param factoryOwner The owner of the factory.\n */\n function _initialize(address implementation, address factoryOwner) internal {\n beacon = new UpgradeableBeacon(implementation);\n Ownable._transferOwnership(factoryOwner);\n }\n\n /**\n * Deploys and initializes a new proxy instance.\n * @param _salt The deployment salt.\n * @param _proxyOwner The owner of the proxy.\n * @param _data The initialization data.\n * @return proxyAddress The address of the deployed proxy.\n */\n function _createProxy(\n bytes32 _salt,\n address _proxyOwner,\n bytes memory _data\n ) internal returns (address proxyAddress) {\n bytes32 saltedHash = keccak256(abi.encodePacked(_salt, _proxyOwner, address(beacon), _data));\n bytes memory bytecode = type(TransparentUpgradeableBeaconProxy).creationCode;\n\n proxyAddress = Create2.deploy(0, saltedHash, bytecode);\n ITransparentUpgradeableBeaconProxy(payable(proxyAddress)).initialize(_proxyOwner, address(beacon), _data);\n }\n\n /**\n * Computes the address of a proxy instance.\n * @param _salt The deployment salt.\n * @param _proxyOwner The owner of the proxy.\n * @return proxy The expected address of the deployed proxy.\n */\n function _computeProxyAddress(\n bytes32 _salt,\n address _proxyOwner,\n bytes memory _data\n ) internal view returns (address) {\n bytes32 saltedHash = keccak256(abi.encodePacked(_salt, _proxyOwner, address(beacon), _data));\n bytes32 bytecodeHash = keccak256(type(TransparentUpgradeableBeaconProxy).creationCode);\n\n return Create2.computeAddress(saltedHash, bytecodeHash);\n }\n\n /**\n * Upgrades the beacon implementation.\n * @param implementation The new beacon implementation.\n */\n function upgradeBeacon(\n address implementation\n ) public onlyOwner {\n beacon.upgradeTo(implementation);\n }\n\n}\n" + }, + "src/tokens/ERC1155/presets/pack/ERC1155Pack.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.19;\n\nimport { IERC721ItemsFunctions } from \"../../../ERC721/presets/items/IERC721Items.sol\";\nimport { ERC1155Items } from \"../items/ERC1155Items.sol\";\nimport { IERC1155ItemsFunctions } from \"../items/IERC1155Items.sol\";\nimport { IERC1155Pack } from \"./IERC1155Pack.sol\";\n\nimport { MerkleProofLib } from \"solady/utils/MerkleProofLib.sol\";\n\ncontract ERC1155Pack is ERC1155Items, IERC1155Pack {\n\n bytes32 internal constant PACK_ADMIN_ROLE = keccak256(\"PACK_ADMIN_ROLE\");\n\n address public immutable erc1155Holder;\n\n mapping(uint256 => bytes32) public merkleRoot;\n mapping(uint256 => uint256) public supply;\n mapping(uint256 => uint256) public remainingSupply;\n\n mapping(address => mapping(uint256 => uint256)) internal _commitments;\n mapping(uint256 => mapping(uint256 => uint256)) internal _availableIndices;\n\n constructor(\n address _erc1155Holder\n ) {\n erc1155Holder = _erc1155Holder;\n }\n\n /// @inheritdoc ERC1155Items\n function initialize(\n address owner,\n string memory tokenName,\n string memory tokenBaseURI,\n string memory tokenContractURI,\n address royaltyReceiver,\n uint96 royaltyFeeNumerator,\n address implicitModeValidator,\n bytes32 implicitModeProjectId\n ) public virtual override {\n _grantRole(PACK_ADMIN_ROLE, owner);\n super.initialize(\n owner,\n tokenName,\n tokenBaseURI,\n tokenContractURI,\n royaltyReceiver,\n royaltyFeeNumerator,\n implicitModeValidator,\n implicitModeProjectId\n );\n }\n\n /// @inheritdoc IERC1155Pack\n function setPacksContent(bytes32 _merkleRoot, uint256 _supply, uint256 packId) external onlyRole(PACK_ADMIN_ROLE) {\n merkleRoot[packId] = _merkleRoot;\n supply[packId] = _supply;\n remainingSupply[packId] = _supply;\n }\n\n /// @inheritdoc IERC1155Pack\n function commit(\n uint256 packId\n ) external {\n if (_commitments[msg.sender][packId] != 0) {\n revert PendingReveal();\n }\n _burn(msg.sender, packId, 1);\n _commitments[msg.sender][packId] = block.number + 1;\n\n emit Commit(msg.sender, packId);\n }\n\n /// @inheritdoc IERC1155Pack\n function reveal(\n address user,\n PackContent calldata packContent,\n bytes32[] calldata proof,\n uint256 packId\n ) external {\n (uint256 randomIndex, uint256 revealIdx) = _getRevealIdx(user, packId);\n\n bytes32 leaf = keccak256(abi.encode(revealIdx, packContent));\n if (!MerkleProofLib.verify(proof, merkleRoot[packId], leaf)) {\n revert InvalidProof();\n }\n\n delete _commitments[user][packId];\n remainingSupply[packId]--;\n\n // Point this index to the last index's value\n _availableIndices[packId][randomIndex] = _getIndexOrDefault(remainingSupply[packId], packId);\n\n for (uint256 i; i < packContent.tokenAddresses.length;) {\n address tokenAddr = packContent.tokenAddresses[i];\n uint256[] memory tokenIds = packContent.tokenIds[i];\n if (packContent.isERC721[i]) {\n for (uint256 j; j < tokenIds.length;) {\n IERC721ItemsFunctions(tokenAddr).mint(user, tokenIds[j]);\n unchecked {\n ++j;\n }\n }\n } else {\n // Send via the holder fallback if available\n address to = user;\n if (erc1155Holder != address(0) && msg.sender != user) {\n to = erc1155Holder;\n }\n bytes memory packedData = abi.encode(user);\n IERC1155ItemsFunctions(tokenAddr).batchMint(to, tokenIds, packContent.amounts[i], packedData);\n }\n unchecked {\n ++i;\n }\n }\n\n emit Reveal(user, packId);\n }\n\n /// @inheritdoc IERC1155Pack\n function refundPack(address user, uint256 packId) external {\n uint256 commitment = _commitments[user][packId];\n if (commitment == 0) {\n revert NoCommit();\n }\n if (uint256(blockhash(commitment)) != 0 || block.number <= commitment) {\n revert PendingReveal();\n }\n delete _commitments[user][packId];\n _mint(user, packId, 1, \"\");\n }\n\n /// @inheritdoc IERC1155Pack\n function getRevealIdx(address user, uint256 packId) public view returns (uint256 revealIdx) {\n (, revealIdx) = _getRevealIdx(user, packId);\n return revealIdx;\n }\n\n function _getRevealIdx(address user, uint256 packId) internal view returns (uint256 randomIdx, uint256 revealIdx) {\n if (remainingSupply[packId] == 0) {\n revert AllPacksOpened();\n }\n\n uint256 commitment = _commitments[user][packId];\n if (commitment == 0) {\n revert NoCommit();\n }\n bytes32 blockHash = blockhash(commitment);\n if (uint256(blockHash) == 0) {\n revert InvalidCommit();\n }\n\n randomIdx = uint256(keccak256(abi.encode(blockHash, user))) % remainingSupply[packId];\n revealIdx = _getIndexOrDefault(randomIdx, packId);\n return (randomIdx, revealIdx);\n }\n\n function _getIndexOrDefault(uint256 index, uint256 packId) internal view returns (uint256) {\n uint256 value = _availableIndices[packId][index];\n return value == 0 ? index : value;\n }\n\n function supportsInterface(\n bytes4 interfaceId\n ) public view override returns (bool) {\n return interfaceId == type(IERC1155Pack).interfaceId || super.supportsInterface(interfaceId);\n }\n\n}\n" + }, + "src/tokens/ERC1155/presets/pack/IERC1155PackFactory.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.19;\n\ninterface IERC1155PackFactoryFunctions {\n\n /**\n * Creates an ERC-1155 Pack proxy.\n * @param proxyOwner The owner of the ERC-1155 Pack proxy\n * @param tokenOwner The owner of the ERC-1155 Pack implementation\n * @param name The name of the ERC-1155 Pack proxy\n * @param baseURI The base URI of the ERC-1155 Pack proxy\n * @param contractURI The contract URI of the ERC-1155 Pack proxy\n * @param royaltyReceiver Address of who should be sent the royalty payment\n * @param royaltyFeeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\n * @param implicitModeValidator The implicit mode validator address\n * @param implicitModeProjectId The implicit mode project id\n * @return proxyAddr The address of the ERC-1155 Pack Proxy\n */\n function deploy(\n address proxyOwner,\n address tokenOwner,\n string memory name,\n string memory baseURI,\n string memory contractURI,\n address royaltyReceiver,\n uint96 royaltyFeeNumerator,\n address implicitModeValidator,\n bytes32 implicitModeProjectId\n ) external returns (address proxyAddr);\n\n /**\n * Computes the address of a proxy instance.\n * @param proxyOwner The owner of the ERC-1155 Pack proxy\n * @param tokenOwner The owner of the ERC-1155 Pack implementation\n * @param name The name of the ERC-1155 Pack proxy\n * @param baseURI The base URI of the ERC-1155 Pack proxy\n * @param contractURI The contract URI of the ERC-1155 Pack proxy\n * @param royaltyReceiver Address of who should be sent the royalty payment\n * @param royaltyFeeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\n * @param implicitModeValidator The implicit mode validator address\n * @param implicitModeProjectId The implicit mode project id\n * @return proxyAddr The address of the ERC-1155 Pack Proxy\n */\n function determineAddress(\n address proxyOwner,\n address tokenOwner,\n string memory name,\n string memory baseURI,\n string memory contractURI,\n address royaltyReceiver,\n uint96 royaltyFeeNumerator,\n address implicitModeValidator,\n bytes32 implicitModeProjectId\n ) external returns (address proxyAddr);\n\n}\n\ninterface IERC1155PackFactorySignals {\n\n /**\n * Event emitted when a new ERC-1155 Pack proxy contract is deployed.\n * @param proxyAddr The address of the deployed proxy.\n */\n event ERC1155PackDeployed(address proxyAddr);\n\n}\n\ninterface IERC1155PackFactory is IERC1155PackFactoryFunctions, IERC1155PackFactorySignals { }\n" + }, + "src/proxies/TransparentUpgradeableBeaconProxy.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.19;\n\nimport { BeaconProxy, Proxy } from \"./openzeppelin/BeaconProxy.sol\";\nimport { ERC1967Proxy, TransparentUpgradeableProxy } from \"./openzeppelin/TransparentUpgradeableProxy.sol\";\n\ninterface ITransparentUpgradeableBeaconProxy {\n\n function initialize(address admin, address beacon, bytes memory data) external;\n\n}\n\nerror InvalidInitialization();\n\n/**\n * @dev As the underlying proxy implementation (TransparentUpgradeableProxy) allows the admin to call the implementation,\n * care must be taken to avoid proxy selector collisions. Implementation selectors must not conflict with the proxy selectors.\n * See https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector clashing].\n * The proxy selectors are:\n * - 0xcf7a1d77: initialize\n * - 0x3659cfe6: upgradeTo (from TransparentUpgradeableProxy)\n * - 0x4f1ef286: upgradeToAndCall (from TransparentUpgradeableProxy)\n * - 0x8f283970: changeAdmin (from TransparentUpgradeableProxy)\n * - 0xf851a440: admin (from TransparentUpgradeableProxy)\n * - 0x5c60da1b: implementation (from TransparentUpgradeableProxy)\n */\ncontract TransparentUpgradeableBeaconProxy is TransparentUpgradeableProxy, BeaconProxy {\n\n /**\n * Decode the initialization data from the msg.data and call the initialize function.\n */\n function _dispatchInitialize() private returns (bytes memory) {\n _requireZeroValue();\n\n (address admin, address beacon, bytes memory data) = abi.decode(msg.data[4:], (address, address, bytes));\n initialize(admin, beacon, data);\n\n return \"\";\n }\n\n function initialize(address admin, address beacon, bytes memory data) internal {\n if (_admin() != address(0)) {\n // Redundant call. This function can only be called when the admin is not set.\n revert InvalidInitialization();\n }\n _changeAdmin(admin);\n _upgradeBeaconToAndCall(beacon, data, false);\n }\n\n /**\n * @dev If the admin is not set, the fallback function is used to initialize the proxy.\n * @dev If the admin is set, the fallback function is used to delegatecall the implementation.\n */\n function _fallback() internal override(TransparentUpgradeableProxy, Proxy) {\n if (_getAdmin() == address(0)) {\n bytes memory ret;\n bytes4 selector = msg.sig;\n if (selector == ITransparentUpgradeableBeaconProxy.initialize.selector) {\n ret = _dispatchInitialize();\n // solhint-disable-next-line no-inline-assembly\n assembly {\n return(add(ret, 0x20), mload(ret))\n }\n }\n // When the admin is not set, the fallback function is used to initialize the proxy.\n revert InvalidInitialization();\n }\n TransparentUpgradeableProxy._fallback();\n }\n\n /**\n * Returns the current implementation address.\n * @dev This is the implementation address set by the admin, or the beacon implementation.\n */\n function _implementation() internal view override(ERC1967Proxy, BeaconProxy) returns (address) {\n address implementation = ERC1967Proxy._implementation();\n if (implementation != address(0)) {\n return implementation;\n }\n return BeaconProxy._implementation();\n }\n\n}\n" + }, + "lib/openzeppelin-contracts/contracts/access/Ownable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor() {\n _transferOwnership(_msgSender());\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby disabling any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/proxy/beacon/UpgradeableBeacon.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/UpgradeableBeacon.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IBeacon.sol\";\nimport \"../../access/Ownable.sol\";\nimport \"../../utils/Address.sol\";\n\n/**\n * @dev This contract is used in conjunction with one or more instances of {BeaconProxy} to determine their\n * implementation contract, which is where they will delegate all function calls.\n *\n * An owner is able to change the implementation the beacon points to, thus upgrading the proxies that use this beacon.\n */\ncontract UpgradeableBeacon is IBeacon, Ownable {\n address private _implementation;\n\n /**\n * @dev Emitted when the implementation returned by the beacon is changed.\n */\n event Upgraded(address indexed implementation);\n\n /**\n * @dev Sets the address of the initial implementation, and the deployer account as the owner who can upgrade the\n * beacon.\n */\n constructor(address implementation_) {\n _setImplementation(implementation_);\n }\n\n /**\n * @dev Returns the current implementation address.\n */\n function implementation() public view virtual override returns (address) {\n return _implementation;\n }\n\n /**\n * @dev Upgrades the beacon to a new implementation.\n *\n * Emits an {Upgraded} event.\n *\n * Requirements:\n *\n * - msg.sender must be the owner of the contract.\n * - `newImplementation` must be a contract.\n */\n function upgradeTo(address newImplementation) public virtual onlyOwner {\n _setImplementation(newImplementation);\n emit Upgraded(newImplementation);\n }\n\n /**\n * @dev Sets the implementation contract address for this beacon\n *\n * Requirements:\n *\n * - `newImplementation` must be a contract.\n */\n function _setImplementation(address newImplementation) private {\n require(Address.isContract(newImplementation), \"UpgradeableBeacon: implementation is not a contract\");\n _implementation = newImplementation;\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/Create2.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Create2.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\n * `CREATE2` can be used to compute in advance the address where a smart\n * contract will be deployed, which allows for interesting new mechanisms known\n * as 'counterfactual interactions'.\n *\n * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\n * information.\n */\nlibrary Create2 {\n /**\n * @dev Deploys a contract using `CREATE2`. The address where the contract\n * will be deployed can be known in advance via {computeAddress}.\n *\n * The bytecode for a contract can be obtained from Solidity with\n * `type(contractName).creationCode`.\n *\n * Requirements:\n *\n * - `bytecode` must not be empty.\n * - `salt` must have not been used for `bytecode` already.\n * - the factory must have a balance of at least `amount`.\n * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.\n */\n function deploy(uint256 amount, bytes32 salt, bytes memory bytecode) internal returns (address addr) {\n require(address(this).balance >= amount, \"Create2: insufficient balance\");\n require(bytecode.length != 0, \"Create2: bytecode length is zero\");\n /// @solidity memory-safe-assembly\n assembly {\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\n }\n require(addr != address(0), \"Create2: Failed on deploy\");\n }\n\n /**\n * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\n * `bytecodeHash` or `salt` will result in a new destination address.\n */\n function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {\n return computeAddress(salt, bytecodeHash, address(this));\n }\n\n /**\n * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\n * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.\n */\n function computeAddress(bytes32 salt, bytes32 bytecodeHash, address deployer) internal pure returns (address addr) {\n /// @solidity memory-safe-assembly\n assembly {\n let ptr := mload(0x40) // Get free memory pointer\n\n // | | ↓ ptr ... ↓ ptr + 0x0B (start) ... ↓ ptr + 0x20 ... ↓ ptr + 0x40 ... |\n // |-------------------|---------------------------------------------------------------------------|\n // | bytecodeHash | CCCCCCCCCCCCC...CC |\n // | salt | BBBBBBBBBBBBB...BB |\n // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |\n // | 0xFF | FF |\n // |-------------------|---------------------------------------------------------------------------|\n // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |\n // | keccak(start, 85) | ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ |\n\n mstore(add(ptr, 0x40), bytecodeHash)\n mstore(add(ptr, 0x20), salt)\n mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes\n let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff\n mstore8(start, 0xff)\n addr := keccak256(start, 85)\n }\n }\n}\n" + }, + "src/tokens/ERC721/presets/items/IERC721Items.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.19;\n\ninterface IERC721ItemsFunctions {\n\n /**\n * Mint tokens.\n * @param to Address to mint tokens to.\n * @param tokenId Token id to mint.\n */\n function mint(address to, uint256 tokenId) external;\n\n /**\n * Mint a sequential token.\n * @param to Address to mint token to.\n * @param amount Amount of tokens to mint.\n */\n function mintSequential(address to, uint256 amount) external;\n\n /**\n * Get the total supply of tokens.\n * @return totalSupply The total supply of tokens.\n */\n function totalSupply() external view returns (uint256 totalSupply);\n\n}\n\ninterface IERC721ItemsSignals {\n\n /**\n * Invalid initialization error.\n */\n error InvalidInitialization();\n\n}\n\ninterface IERC721Items is IERC721ItemsFunctions, IERC721ItemsSignals { }\n" + }, + "src/tokens/ERC1155/presets/items/ERC1155Items.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.19;\n\nimport { ERC1155BaseToken, ERC2981Controlled } from \"../../ERC1155BaseToken.sol\";\nimport { IERC1155Items, IERC1155ItemsFunctions } from \"./IERC1155Items.sol\";\n\n/**\n * An implementation of ERC-1155 capable of minting when role provided.\n */\ncontract ERC1155Items is ERC1155BaseToken, IERC1155Items {\n\n bytes32 internal constant MINTER_ROLE = keccak256(\"MINTER_ROLE\");\n\n /**\n * Initialize the contract.\n * @param owner Owner address\n * @param tokenName Token name\n * @param tokenBaseURI Base URI for token metadata\n * @param tokenContractURI Contract URI for token metadata\n * @param royaltyReceiver Address of who should be sent the royalty payment\n * @param royaltyFeeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\n * @param implicitModeValidator The implicit mode validator address\n * @param implicitModeProjectId The implicit mode project id\n * @dev This should be called immediately after deployment.\n */\n function initialize(\n address owner,\n string memory tokenName,\n string memory tokenBaseURI,\n string memory tokenContractURI,\n address royaltyReceiver,\n uint96 royaltyFeeNumerator,\n address implicitModeValidator,\n bytes32 implicitModeProjectId\n ) public virtual {\n ERC1155BaseToken._initialize(\n owner, tokenName, tokenBaseURI, tokenContractURI, implicitModeValidator, implicitModeProjectId\n );\n _setDefaultRoyalty(royaltyReceiver, royaltyFeeNumerator);\n\n _grantRole(MINTER_ROLE, owner);\n }\n\n //\n // Minting\n //\n\n /**\n * Mint tokens.\n * @param to Address to mint tokens to.\n * @param tokenId Token ID to mint.\n * @param amount Amount of tokens to mint.\n * @param data Data to pass if receiver is contract.\n */\n function mint(address to, uint256 tokenId, uint256 amount, bytes memory data) external onlyRole(MINTER_ROLE) {\n _mint(to, tokenId, amount, data);\n }\n\n /**\n * Mint tokens.\n * @param to Address to mint tokens to.\n * @param tokenIds Token IDs to mint.\n * @param amounts Amounts of tokens to mint.\n * @param data Data to pass if receiver is contract.\n */\n function batchMint(\n address to,\n uint256[] memory tokenIds,\n uint256[] memory amounts,\n bytes memory data\n ) external onlyRole(MINTER_ROLE) {\n _batchMint(to, tokenIds, amounts, data);\n }\n\n //\n // Views\n //\n\n /**\n * Check interface support.\n * @param interfaceId Interface id\n * @return True if supported\n */\n function supportsInterface(\n bytes4 interfaceId\n ) public view virtual override(ERC1155BaseToken) returns (bool) {\n return type(IERC1155ItemsFunctions).interfaceId == interfaceId\n || ERC1155BaseToken.supportsInterface(interfaceId) || super.supportsInterface(interfaceId);\n }\n\n}\n" + }, + "src/tokens/ERC1155/presets/items/IERC1155Items.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.19;\n\ninterface IERC1155ItemsFunctions {\n\n /**\n * Mint tokens.\n * @param to Address to mint tokens to.\n * @param tokenId Token ID to mint.\n * @param amount Amount of tokens to mint.\n * @param data Data to pass if receiver is contract.\n */\n function mint(address to, uint256 tokenId, uint256 amount, bytes memory data) external;\n\n /**\n * Mint tokens.\n * @param to Address to mint tokens to.\n * @param tokenIds Token IDs to mint.\n * @param amounts Amounts of tokens to mint.\n * @param data Data to pass if receiver is contract.\n */\n function batchMint(address to, uint256[] memory tokenIds, uint256[] memory amounts, bytes memory data) external;\n\n}\n\ninterface IERC1155ItemsSignals {\n\n /**\n * Invalid initialization error.\n */\n error InvalidInitialization();\n\n}\n\ninterface IERC1155Items is IERC1155ItemsFunctions, IERC1155ItemsSignals { }\n" + }, + "src/tokens/ERC1155/presets/pack/IERC1155Pack.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.19;\n\ninterface IERC1155Pack {\n\n struct PackContent {\n address[] tokenAddresses;\n bool[] isERC721;\n uint256[][] tokenIds;\n uint256[][] amounts;\n }\n\n /**\n * Commit expired or never made.\n */\n error InvalidCommit();\n\n /**\n * Reveal is pending.\n */\n error PendingReveal();\n\n /**\n * Commit never made.\n */\n error NoCommit();\n\n /**\n * Invalid proof.\n */\n error InvalidProof();\n\n /**\n * All packs opened.\n */\n error AllPacksOpened();\n\n /// @notice Emitted when a user make a commitment\n event Commit(address indexed user, uint256 packId);\n\n /// @notice Emitted when a reveal is successful\n event Reveal(address user, uint256 packId);\n\n /**\n * Set all possible pack contents.\n * @param _merkleRoot merkle root built from all possible pack contents.\n * @param _supply total amount of packs.\n * @param packId tokenId of pack.\n * @dev Updating these values before all the packs have been opened may lead to undesirable behavior.\n */\n function setPacksContent(bytes32 _merkleRoot, uint256 _supply, uint256 packId) external;\n\n /**\n * Get random reveal index.\n * @param user address of reward recipient.\n * @param packId tokenId of pack.\n */\n function getRevealIdx(address user, uint256 packId) external view returns (uint256);\n\n /**\n * Commit to reveal pack content.\n * @param packId tokenId of pack.\n * @notice this function burns user's pack.\n */\n function commit(\n uint256 packId\n ) external;\n\n /**\n * Reveal pack content.\n * @param user address of reward recipient.\n * @param packContent reward selected with random index.\n * @param proof Pack contents merkle proof.\n * @param packId tokenId of pack.\n */\n function reveal(\n address user,\n PackContent calldata packContent,\n bytes32[] calldata proof,\n uint256 packId\n ) external;\n\n /**\n * Ask for pack refund after commit expiration.\n * @param user address of pack owner.\n * @param packId tokenId of pack.\n * @notice this function mints a pack for the user when his commit is expired.\n */\n function refundPack(address user, uint256 packId) external;\n\n}\n" + }, + "lib/solady/src/utils/MerkleProofLib.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\n/// @notice Gas optimized verification of proof of inclusion for a leaf in a Merkle tree.\n/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/MerkleProofLib.sol)\n/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/MerkleProofLib.sol)\n/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/MerkleProof.sol)\nlibrary MerkleProofLib {\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* MERKLE PROOF VERIFICATION OPERATIONS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Returns whether `leaf` exists in the Merkle tree with `root`, given `proof`.\n function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf)\n internal\n pure\n returns (bool isValid)\n {\n /// @solidity memory-safe-assembly\n assembly {\n if mload(proof) {\n // Initialize `offset` to the offset of `proof` elements in memory.\n let offset := add(proof, 0x20)\n // Left shift by 5 is equivalent to multiplying by 0x20.\n let end := add(offset, shl(5, mload(proof)))\n // Iterate over proof elements to compute root hash.\n for {} 1 {} {\n // Slot of `leaf` in scratch space.\n // If the condition is true: 0x20, otherwise: 0x00.\n let scratch := shl(5, gt(leaf, mload(offset)))\n // Store elements to hash contiguously in scratch space.\n // Scratch space is 64 bytes (0x00 - 0x3f) and both elements are 32 bytes.\n mstore(scratch, leaf)\n mstore(xor(scratch, 0x20), mload(offset))\n // Reuse `leaf` to store the hash to reduce stack operations.\n leaf := keccak256(0x00, 0x40)\n offset := add(offset, 0x20)\n if iszero(lt(offset, end)) { break }\n }\n }\n isValid := eq(leaf, root)\n }\n }\n\n /// @dev Returns whether `leaf` exists in the Merkle tree with `root`, given `proof`.\n function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf)\n internal\n pure\n returns (bool isValid)\n {\n /// @solidity memory-safe-assembly\n assembly {\n if proof.length {\n // Left shift by 5 is equivalent to multiplying by 0x20.\n let end := add(proof.offset, shl(5, proof.length))\n // Initialize `offset` to the offset of `proof` in the calldata.\n let offset := proof.offset\n // Iterate over proof elements to compute root hash.\n for {} 1 {} {\n // Slot of `leaf` in scratch space.\n // If the condition is true: 0x20, otherwise: 0x00.\n let scratch := shl(5, gt(leaf, calldataload(offset)))\n // Store elements to hash contiguously in scratch space.\n // Scratch space is 64 bytes (0x00 - 0x3f) and both elements are 32 bytes.\n mstore(scratch, leaf)\n mstore(xor(scratch, 0x20), calldataload(offset))\n // Reuse `leaf` to store the hash to reduce stack operations.\n leaf := keccak256(0x00, 0x40)\n offset := add(offset, 0x20)\n if iszero(lt(offset, end)) { break }\n }\n }\n isValid := eq(leaf, root)\n }\n }\n\n /// @dev Returns whether all `leaves` exist in the Merkle tree with `root`,\n /// given `proof` and `flags`.\n ///\n /// Note:\n /// - Breaking the invariant `flags.length == (leaves.length - 1) + proof.length`\n /// will always return false.\n /// - The sum of the lengths of `proof` and `leaves` must never overflow.\n /// - Any non-zero word in the `flags` array is treated as true.\n /// - The memory offset of `proof` must be non-zero\n /// (i.e. `proof` is not pointing to the scratch space).\n function verifyMultiProof(\n bytes32[] memory proof,\n bytes32 root,\n bytes32[] memory leaves,\n bool[] memory flags\n ) internal pure returns (bool isValid) {\n // Rebuilds the root by consuming and producing values on a queue.\n // The queue starts with the `leaves` array, and goes into a `hashes` array.\n // After the process, the last element on the queue is verified\n // to be equal to the `root`.\n //\n // The `flags` array denotes whether the sibling\n // should be popped from the queue (`flag == true`), or\n // should be popped from the `proof` (`flag == false`).\n /// @solidity memory-safe-assembly\n assembly {\n // Cache the lengths of the arrays.\n let leavesLength := mload(leaves)\n let proofLength := mload(proof)\n let flagsLength := mload(flags)\n\n // Advance the pointers of the arrays to point to the data.\n leaves := add(0x20, leaves)\n proof := add(0x20, proof)\n flags := add(0x20, flags)\n\n // If the number of flags is correct.\n for {} eq(add(leavesLength, proofLength), add(flagsLength, 1)) {} {\n // For the case where `proof.length + leaves.length == 1`.\n if iszero(flagsLength) {\n // `isValid = (proof.length == 1 ? proof[0] : leaves[0]) == root`.\n isValid := eq(mload(xor(leaves, mul(xor(proof, leaves), proofLength))), root)\n break\n }\n\n // The required final proof offset if `flagsLength` is not zero, otherwise zero.\n let proofEnd := add(proof, shl(5, proofLength))\n // We can use the free memory space for the queue.\n // We don't need to allocate, since the queue is temporary.\n let hashesFront := mload(0x40)\n // Copy the leaves into the hashes.\n // Sometimes, a little memory expansion costs less than branching.\n // Should cost less, even with a high free memory offset of 0x7d00.\n leavesLength := shl(5, leavesLength)\n for { let i := 0 } iszero(eq(i, leavesLength)) { i := add(i, 0x20) } {\n mstore(add(hashesFront, i), mload(add(leaves, i)))\n }\n // Compute the back of the hashes.\n let hashesBack := add(hashesFront, leavesLength)\n // This is the end of the memory for the queue.\n // We recycle `flagsLength` to save on stack variables (sometimes save gas).\n flagsLength := add(hashesBack, shl(5, flagsLength))\n\n for {} 1 {} {\n // Pop from `hashes`.\n let a := mload(hashesFront)\n // Pop from `hashes`.\n let b := mload(add(hashesFront, 0x20))\n hashesFront := add(hashesFront, 0x40)\n\n // If the flag is false, load the next proof,\n // else, pops from the queue.\n if iszero(mload(flags)) {\n // Loads the next proof.\n b := mload(proof)\n proof := add(proof, 0x20)\n // Unpop from `hashes`.\n hashesFront := sub(hashesFront, 0x20)\n }\n\n // Advance to the next flag.\n flags := add(flags, 0x20)\n\n // Slot of `a` in scratch space.\n // If the condition is true: 0x20, otherwise: 0x00.\n let scratch := shl(5, gt(a, b))\n // Hash the scratch space and push the result onto the queue.\n mstore(scratch, a)\n mstore(xor(scratch, 0x20), b)\n mstore(hashesBack, keccak256(0x00, 0x40))\n hashesBack := add(hashesBack, 0x20)\n if iszero(lt(hashesBack, flagsLength)) { break }\n }\n isValid :=\n and(\n // Checks if the last value in the queue is same as the root.\n eq(mload(sub(hashesBack, 0x20)), root),\n // And whether all the proofs are used, if required.\n eq(proofEnd, proof)\n )\n break\n }\n }\n }\n\n /// @dev Returns whether all `leaves` exist in the Merkle tree with `root`,\n /// given `proof` and `flags`.\n ///\n /// Note:\n /// - Breaking the invariant `flags.length == (leaves.length - 1) + proof.length`\n /// will always return false.\n /// - Any non-zero word in the `flags` array is treated as true.\n /// - The calldata offset of `proof` must be non-zero\n /// (i.e. `proof` is from a regular Solidity function with a 4-byte selector).\n function verifyMultiProofCalldata(\n bytes32[] calldata proof,\n bytes32 root,\n bytes32[] calldata leaves,\n bool[] calldata flags\n ) internal pure returns (bool isValid) {\n // Rebuilds the root by consuming and producing values on a queue.\n // The queue starts with the `leaves` array, and goes into a `hashes` array.\n // After the process, the last element on the queue is verified\n // to be equal to the `root`.\n //\n // The `flags` array denotes whether the sibling\n // should be popped from the queue (`flag == true`), or\n // should be popped from the `proof` (`flag == false`).\n /// @solidity memory-safe-assembly\n assembly {\n // If the number of flags is correct.\n for {} eq(add(leaves.length, proof.length), add(flags.length, 1)) {} {\n // For the case where `proof.length + leaves.length == 1`.\n if iszero(flags.length) {\n // `isValid = (proof.length == 1 ? proof[0] : leaves[0]) == root`.\n // forgefmt: disable-next-item\n isValid := eq(\n calldataload(\n xor(leaves.offset, mul(xor(proof.offset, leaves.offset), proof.length))\n ),\n root\n )\n break\n }\n\n // The required final proof offset if `flagsLength` is not zero, otherwise zero.\n let proofEnd := add(proof.offset, shl(5, proof.length))\n // We can use the free memory space for the queue.\n // We don't need to allocate, since the queue is temporary.\n let hashesFront := mload(0x40)\n // Copy the leaves into the hashes.\n // Sometimes, a little memory expansion costs less than branching.\n // Should cost less, even with a high free memory offset of 0x7d00.\n calldatacopy(hashesFront, leaves.offset, shl(5, leaves.length))\n // Compute the back of the hashes.\n let hashesBack := add(hashesFront, shl(5, leaves.length))\n // This is the end of the memory for the queue.\n // We recycle `flagsLength` to save on stack variables (sometimes save gas).\n flags.length := add(hashesBack, shl(5, flags.length))\n\n // We don't need to make a copy of `proof.offset` or `flags.offset`,\n // as they are pass-by-value (this trick may not always save gas).\n\n for {} 1 {} {\n // Pop from `hashes`.\n let a := mload(hashesFront)\n // Pop from `hashes`.\n let b := mload(add(hashesFront, 0x20))\n hashesFront := add(hashesFront, 0x40)\n\n // If the flag is false, load the next proof,\n // else, pops from the queue.\n if iszero(calldataload(flags.offset)) {\n // Loads the next proof.\n b := calldataload(proof.offset)\n proof.offset := add(proof.offset, 0x20)\n // Unpop from `hashes`.\n hashesFront := sub(hashesFront, 0x20)\n }\n\n // Advance to the next flag offset.\n flags.offset := add(flags.offset, 0x20)\n\n // Slot of `a` in scratch space.\n // If the condition is true: 0x20, otherwise: 0x00.\n let scratch := shl(5, gt(a, b))\n // Hash the scratch space and push the result onto the queue.\n mstore(scratch, a)\n mstore(xor(scratch, 0x20), b)\n mstore(hashesBack, keccak256(0x00, 0x40))\n hashesBack := add(hashesBack, 0x20)\n if iszero(lt(hashesBack, flags.length)) { break }\n }\n isValid :=\n and(\n // Checks if the last value in the queue is same as the root.\n eq(mload(sub(hashesBack, 0x20)), root),\n // And whether all the proofs are used, if required.\n eq(proofEnd, proof.offset)\n )\n break\n }\n }\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* EMPTY CALLDATA HELPERS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Returns an empty calldata bytes32 array.\n function emptyProof() internal pure returns (bytes32[] calldata proof) {\n /// @solidity memory-safe-assembly\n assembly {\n proof.length := 0\n }\n }\n\n /// @dev Returns an empty calldata bytes32 array.\n function emptyLeaves() internal pure returns (bytes32[] calldata leaves) {\n /// @solidity memory-safe-assembly\n assembly {\n leaves.length := 0\n }\n }\n\n /// @dev Returns an empty calldata bool array.\n function emptyFlags() internal pure returns (bool[] calldata flags) {\n /// @solidity memory-safe-assembly\n assembly {\n flags.length := 0\n }\n }\n}\n" + }, + "src/proxies/openzeppelin/BeaconProxy.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (proxy/beacon/BeaconProxy.sol)\n\n// Note: This implementation is an exact copy with the constructor removed, and pragma and imports updated.\n\npragma solidity ^0.8.19;\n\nimport \"openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Upgrade.sol\";\nimport \"openzeppelin-contracts/contracts/proxy/Proxy.sol\";\nimport \"openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol\";\n\n/**\n * @dev This contract implements a proxy that gets the implementation address for each call from an {UpgradeableBeacon}.\n *\n * The beacon address is stored in storage slot `uint256(keccak256('eip1967.proxy.beacon')) - 1`, so that it doesn't\n * conflict with the storage layout of the implementation behind the proxy.\n *\n * _Available since v3.4._\n */\ncontract BeaconProxy is Proxy, ERC1967Upgrade {\n\n /**\n * @dev Returns the current beacon address.\n */\n function _beacon() internal view virtual returns (address) {\n return _getBeacon();\n }\n\n /**\n * @dev Returns the current implementation address of the associated beacon.\n */\n function _implementation() internal view virtual override returns (address) {\n return IBeacon(_getBeacon()).implementation();\n }\n\n /**\n * @dev Changes the proxy to use a new beacon. Deprecated: see {_upgradeBeaconToAndCall}.\n *\n * If `data` is nonempty, it's used as data in a delegate call to the implementation returned by the beacon.\n *\n * Requirements:\n *\n * - `beacon` must be a contract.\n * - The implementation returned by `beacon` must be a contract.\n */\n function _setBeacon(address beacon, bytes memory data) internal virtual {\n _upgradeBeaconToAndCall(beacon, data, false);\n }\n\n}\n" + }, + "src/proxies/openzeppelin/TransparentUpgradeableProxy.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/transparent/TransparentUpgradeableProxy.sol)\n\n/// @notice This implementation is a copy of OpenZeppelin's with the following changes:\n/// - Pragma updated\n/// - Imports updated\n/// - Constructor removed\n/// - Allows admin to call implementation\n\npragma solidity ^0.8.19;\n\nimport \"./ERC1967Proxy.sol\";\n\n/**\n * @dev Interface for {TransparentUpgradeableProxy}. In order to implement transparency, {TransparentUpgradeableProxy}\n * does not implement this interface directly, and some of its functions are implemented by an internal dispatch\n * mechanism. The compiler is unaware that these functions are implemented by {TransparentUpgradeableProxy} and will not\n * include them in the ABI so this interface must be used to interact with it.\n */\ninterface ITransparentUpgradeableProxy is IERC1967 {\n\n function admin() external view returns (address);\n\n function implementation() external view returns (address);\n\n function changeAdmin(\n address\n ) external;\n\n function upgradeTo(\n address\n ) external;\n\n function upgradeToAndCall(address, bytes memory) external payable;\n\n}\n\n/**\n * @dev This contract implements a proxy that is upgradeable by an admin.\n *\n * Unlike the original OpenZeppelin implementation, this contract does not prevent the admin from calling the implementation.\n * This potentially exposes the admin to a proxy selector attack. See\n * https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector clashing].\n * When using this contract, you must ensure that the implementation function selectors do not clash with the proxy selectors.\n * The proxy selectors are:\n * - 0x3659cfe6: upgradeTo\n * - 0x4f1ef286: upgradeToAndCall\n * - 0x8f283970: changeAdmin\n * - 0xf851a440: admin\n * - 0x5c60da1b: implementation\n *\n * NOTE: The real interface of this proxy is that defined in `ITransparentUpgradeableProxy`. This contract does not\n * inherit from that interface, and instead the admin functions are implicitly implemented using a custom dispatch\n * mechanism in `_fallback`. Consequently, the compiler will not produce an ABI for this contract. This is necessary to\n * fully implement transparency without decoding reverts caused by selector clashes between the proxy and the\n * implementation.\n *\n * WARNING: It is not recommended to extend this contract to add additional external functions. If you do so, the compiler\n * will not check that there are no selector conflicts, due to the note above. A selector clash between any new function\n * and the functions declared in {ITransparentUpgradeableProxy} will be resolved in favor of the new one. This could\n * render the admin operations inaccessible, which could prevent upgradeability. Transparency may also be compromised.\n */\ncontract TransparentUpgradeableProxy is ERC1967Proxy {\n\n /**\n * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.\n *\n * CAUTION: This modifier is deprecated, as it could cause issues if the modified function has arguments, and the\n * implementation provides a function with the same selector.\n */\n modifier ifAdmin() {\n if (msg.sender == _getAdmin()) {\n _;\n } else {\n _fallback();\n }\n }\n\n /**\n * @dev If caller is the admin process the call internally, otherwise transparently fallback to the proxy behavior\n */\n function _fallback() internal virtual override {\n if (msg.sender == _getAdmin()) {\n bytes memory ret;\n bytes4 selector = msg.sig;\n if (selector == ITransparentUpgradeableProxy.upgradeTo.selector) {\n ret = _dispatchUpgradeTo();\n } else if (selector == ITransparentUpgradeableProxy.upgradeToAndCall.selector) {\n ret = _dispatchUpgradeToAndCall();\n } else if (selector == ITransparentUpgradeableProxy.changeAdmin.selector) {\n ret = _dispatchChangeAdmin();\n } else if (selector == ITransparentUpgradeableProxy.admin.selector) {\n ret = _dispatchAdmin();\n } else if (selector == ITransparentUpgradeableProxy.implementation.selector) {\n ret = _dispatchImplementation();\n } else {\n // Call implementation\n return super._fallback();\n }\n assembly {\n return(add(ret, 0x20), mload(ret))\n }\n } else {\n super._fallback();\n }\n }\n\n /**\n * @dev Returns the current admin.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\n */\n function _dispatchAdmin() private returns (bytes memory) {\n _requireZeroValue();\n\n address admin = _getAdmin();\n return abi.encode(admin);\n }\n\n /**\n * @dev Returns the current implementation.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\n */\n function _dispatchImplementation() private returns (bytes memory) {\n _requireZeroValue();\n\n address implementation = _implementation();\n return abi.encode(implementation);\n }\n\n /**\n * @dev Changes the admin of the proxy.\n *\n * Emits an {AdminChanged} event.\n */\n function _dispatchChangeAdmin() private returns (bytes memory) {\n _requireZeroValue();\n\n address newAdmin = abi.decode(msg.data[4:], (address));\n _changeAdmin(newAdmin);\n\n return \"\";\n }\n\n /**\n * @dev Upgrade the implementation of the proxy.\n */\n function _dispatchUpgradeTo() private returns (bytes memory) {\n _requireZeroValue();\n\n address newImplementation = abi.decode(msg.data[4:], (address));\n _upgradeToAndCall(newImplementation, bytes(\"\"), false);\n\n return \"\";\n }\n\n /**\n * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified\n * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the\n * proxied contract.\n */\n function _dispatchUpgradeToAndCall() private returns (bytes memory) {\n (address newImplementation, bytes memory data) = abi.decode(msg.data[4:], (address, bytes));\n _upgradeToAndCall(newImplementation, data, true);\n\n return \"\";\n }\n\n /**\n * @dev Returns the current admin.\n *\n * CAUTION: This function is deprecated. Use {ERC1967Upgrade-_getAdmin} instead.\n */\n function _admin() internal view virtual returns (address) {\n return _getAdmin();\n }\n\n /**\n * @dev To keep this contract fully transparent, all `ifAdmin` functions must be payable. This helper is here to\n * emulate some proxy functions being non-payable while still allowing value to pass through.\n */\n function _requireZeroValue() internal {\n require(msg.value == 0);\n }\n\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\n */\ninterface IBeacon {\n /**\n * @dev Must return an address that can be used as a delegate call target.\n *\n * {BeaconProxy} will check that this address is a contract.\n */\n function implementation() external view returns (address);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/Address.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n *\n * Furthermore, `isContract` will also return true if the target contract within\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\n * which only has an effect at the end of a transaction.\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n *\n * _Available since v4.8._\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n if (success) {\n if (returndata.length == 0) {\n // only check isContract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n require(isContract(target), \"Address: call to non-contract\");\n }\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason or using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n /// @solidity memory-safe-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n}\n" + }, + "src/tokens/ERC1155/ERC1155BaseToken.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.19;\n\nimport { ERC2981Controlled } from \"../common/ERC2981Controlled.sol\";\nimport { SignalsImplicitModeControlled } from \"../common/SignalsImplicitModeControlled.sol\";\nimport { ERC1155, ERC1155Supply } from \"./extensions/supply/ERC1155Supply.sol\";\n\nimport { LibString } from \"solady/utils/LibString.sol\";\n\nerror InvalidInitialization();\n\n/**\n * A standard base implementation of ERC-1155 for use in Sequence library contracts.\n */\nabstract contract ERC1155BaseToken is ERC1155Supply, ERC2981Controlled, SignalsImplicitModeControlled {\n\n bytes32 internal constant METADATA_ADMIN_ROLE = keccak256(\"METADATA_ADMIN_ROLE\");\n\n string public name;\n string public baseURI;\n string public contractURI;\n\n bool private _initialized;\n\n /**\n * Initialize the contract.\n * @param owner Owner address.\n * @param tokenName Token name.\n * @param tokenBaseURI Base URI for token metadata.\n * @param tokenContractURI Contract URI for token metadata.\n * @param implicitModeValidator Implicit session validator address.\n * @param implicitModeProjectId Implicit session project id.\n * @dev This should be called immediately after deployment.\n */\n function _initialize(\n address owner,\n string memory tokenName,\n string memory tokenBaseURI,\n string memory tokenContractURI,\n address implicitModeValidator,\n bytes32 implicitModeProjectId\n ) internal {\n if (_initialized) {\n revert InvalidInitialization();\n }\n\n name = tokenName;\n baseURI = tokenBaseURI;\n contractURI = tokenContractURI;\n\n _grantRole(DEFAULT_ADMIN_ROLE, owner);\n _grantRole(ROYALTY_ADMIN_ROLE, owner);\n _grantRole(METADATA_ADMIN_ROLE, owner);\n\n _initializeImplicitMode(owner, implicitModeValidator, implicitModeProjectId);\n\n _initialized = true;\n }\n\n //\n // Metadata\n //\n\n /// @inheritdoc ERC1155\n function uri(\n uint256 _id\n ) public view virtual override returns (string memory) {\n return string(abi.encodePacked(baseURI, LibString.toString(_id), \".json\"));\n }\n\n /**\n * Update the base URI of token's URI.\n * @param tokenBaseURI New base URI of token's URI\n */\n function setBaseMetadataURI(\n string memory tokenBaseURI\n ) external onlyRole(METADATA_ADMIN_ROLE) {\n baseURI = tokenBaseURI;\n }\n\n /**\n * Update the name of the contract.\n * @param tokenName New contract name\n */\n function setContractName(\n string memory tokenName\n ) external onlyRole(METADATA_ADMIN_ROLE) {\n name = tokenName;\n }\n\n /**\n * Update the contract URI of token's URI.\n * @param tokenContractURI New contract URI of token's URI\n * @notice Refer to https://docs.opensea.io/docs/contract-level-metadata\n */\n function setContractURI(\n string memory tokenContractURI\n ) external onlyRole(METADATA_ADMIN_ROLE) {\n contractURI = tokenContractURI;\n }\n\n //\n // Burn\n //\n\n /**\n * Allows the owner of the token to burn their tokens.\n * @param tokenId Id of token to burn\n * @param amount Amount of tokens to burn\n */\n function burn(uint256 tokenId, uint256 amount) public virtual {\n _burn(msg.sender, tokenId, amount);\n }\n\n /**\n * Burn tokens of given token id for each (tokenIds[i], amounts[i]) pair.\n * @param tokenIds Array of token ids to burn\n * @param amounts Array of the amount to be burned\n */\n function batchBurn(uint256[] memory tokenIds, uint256[] memory amounts) public virtual {\n super._batchBurn(msg.sender, tokenIds, amounts);\n }\n\n //\n // Views\n //\n\n /**\n * Check interface support.\n * @param interfaceId Interface id\n * @return True if supported\n */\n function supportsInterface(\n bytes4 interfaceId\n ) public view virtual override(ERC1155Supply, ERC2981Controlled, SignalsImplicitModeControlled) returns (bool) {\n return ERC1155Supply.supportsInterface(interfaceId) || ERC2981Controlled.supportsInterface(interfaceId)\n || SignalsImplicitModeControlled.supportsInterface(interfaceId);\n }\n\n}\n" + }, + "lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Upgrade.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../beacon/IBeacon.sol\";\nimport \"../../interfaces/IERC1967.sol\";\nimport \"../../interfaces/draft-IERC1822.sol\";\nimport \"../../utils/Address.sol\";\nimport \"../../utils/StorageSlot.sol\";\n\n/**\n * @dev This abstract contract provides getters and event emitting update functions for\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\n *\n * _Available since v4.1._\n */\nabstract contract ERC1967Upgrade is IERC1967 {\n // This is the keccak-256 hash of \"eip1967.proxy.rollback\" subtracted by 1\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\n\n /**\n * @dev Storage slot with the address of the current implementation.\n * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1, and is\n * validated in the constructor.\n */\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n /**\n * @dev Returns the current implementation address.\n */\n function _getImplementation() internal view returns (address) {\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the EIP1967 implementation slot.\n */\n function _setImplementation(address newImplementation) private {\n require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n }\n\n /**\n * @dev Perform implementation upgrade\n *\n * Emits an {Upgraded} event.\n */\n function _upgradeTo(address newImplementation) internal {\n _setImplementation(newImplementation);\n emit Upgraded(newImplementation);\n }\n\n /**\n * @dev Perform implementation upgrade with additional setup call.\n *\n * Emits an {Upgraded} event.\n */\n function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal {\n _upgradeTo(newImplementation);\n if (data.length > 0 || forceCall) {\n Address.functionDelegateCall(newImplementation, data);\n }\n }\n\n /**\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\n *\n * Emits an {Upgraded} event.\n */\n function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal {\n // Upgrades from old implementations will perform a rollback test. This test requires the new\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\n // this special case will break upgrade paths from old UUPS implementation to new ones.\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\n _setImplementation(newImplementation);\n } else {\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\n require(slot == _IMPLEMENTATION_SLOT, \"ERC1967Upgrade: unsupported proxiableUUID\");\n } catch {\n revert(\"ERC1967Upgrade: new implementation is not UUPS\");\n }\n _upgradeToAndCall(newImplementation, data, forceCall);\n }\n }\n\n /**\n * @dev Storage slot with the admin of the contract.\n * This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1, and is\n * validated in the constructor.\n */\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n /**\n * @dev Returns the current admin.\n */\n function _getAdmin() internal view returns (address) {\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the EIP1967 admin slot.\n */\n function _setAdmin(address newAdmin) private {\n require(newAdmin != address(0), \"ERC1967: new admin is the zero address\");\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\n }\n\n /**\n * @dev Changes the admin of the proxy.\n *\n * Emits an {AdminChanged} event.\n */\n function _changeAdmin(address newAdmin) internal {\n emit AdminChanged(_getAdmin(), newAdmin);\n _setAdmin(newAdmin);\n }\n\n /**\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\n */\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\n\n /**\n * @dev Returns the current beacon.\n */\n function _getBeacon() internal view returns (address) {\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\n }\n\n /**\n * @dev Stores a new beacon in the EIP1967 beacon slot.\n */\n function _setBeacon(address newBeacon) private {\n require(Address.isContract(newBeacon), \"ERC1967: new beacon is not a contract\");\n require(\n Address.isContract(IBeacon(newBeacon).implementation()),\n \"ERC1967: beacon implementation is not a contract\"\n );\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\n }\n\n /**\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\n *\n * Emits a {BeaconUpgraded} event.\n */\n function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal {\n _setBeacon(newBeacon);\n emit BeaconUpgraded(newBeacon);\n if (data.length > 0 || forceCall) {\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\n }\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/proxy/Proxy.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\n * be specified by overriding the virtual {_implementation} function.\n *\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\n * different contract through the {_delegate} function.\n *\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\n */\nabstract contract Proxy {\n /**\n * @dev Delegates the current call to `implementation`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _delegate(address implementation) internal virtual {\n assembly {\n // Copy msg.data. We take full control of memory in this inline assembly\n // block because it will not return to Solidity code. We overwrite the\n // Solidity scratch pad at memory position 0.\n calldatacopy(0, 0, calldatasize())\n\n // Call the implementation.\n // out and outsize are 0 because we don't know the size yet.\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\n\n // Copy the returned data.\n returndatacopy(0, 0, returndatasize())\n\n switch result\n // delegatecall returns 0 on error.\n case 0 {\n revert(0, returndatasize())\n }\n default {\n return(0, returndatasize())\n }\n }\n }\n\n /**\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback function\n * and {_fallback} should delegate.\n */\n function _implementation() internal view virtual returns (address);\n\n /**\n * @dev Delegates the current call to the address returned by `_implementation()`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _fallback() internal virtual {\n _beforeFallback();\n _delegate(_implementation());\n }\n\n /**\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\n * function in the contract matches the call data.\n */\n fallback() external payable virtual {\n _fallback();\n }\n\n /**\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\n * is empty.\n */\n receive() external payable virtual {\n _fallback();\n }\n\n /**\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\n * call, or as part of the Solidity `fallback` or `receive` functions.\n *\n * If overridden should call `super._beforeFallback()`.\n */\n function _beforeFallback() internal virtual {}\n}\n" + }, + "src/proxies/openzeppelin/ERC1967Proxy.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (proxy/ERC1967/ERC1967Proxy.sol)\n\n// Note: This implementation is an exact copy with the constructor removed, and pragma and imports updated.\n\npragma solidity ^0.8.19;\n\nimport \"openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Upgrade.sol\";\nimport \"openzeppelin-contracts/contracts/proxy/Proxy.sol\";\n\n/**\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\n * implementation address that can be changed. This address is stored in storage in the location specified by\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\n * implementation behind the proxy.\n */\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\n\n /**\n * @dev Returns the current implementation address.\n */\n function _implementation() internal view virtual override returns (address impl) {\n return ERC1967Upgrade._getImplementation();\n }\n\n}\n" + }, + "src/tokens/common/ERC2981Controlled.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.19;\n\nimport { IERC2981Controlled } from \"./IERC2981Controlled.sol\";\n\nimport { AccessControlEnumerable } from \"openzeppelin-contracts/contracts/access/AccessControlEnumerable.sol\";\nimport { ERC2981 } from \"openzeppelin-contracts/contracts/token/common/ERC2981.sol\";\n\n/**\n * An implementation of ERC-2981 that allows updates by roles.\n */\nabstract contract ERC2981Controlled is ERC2981, AccessControlEnumerable, IERC2981Controlled {\n\n bytes32 internal constant ROYALTY_ADMIN_ROLE = keccak256(\"ROYALTY_ADMIN_ROLE\");\n\n //\n // Royalty\n //\n\n /**\n * Sets the royalty information that all ids in this contract will default to.\n * @param receiver Address of who should be sent the royalty payment\n * @param feeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\n */\n function setDefaultRoyalty(address receiver, uint96 feeNumerator) external onlyRole(ROYALTY_ADMIN_ROLE) {\n _setDefaultRoyalty(receiver, feeNumerator);\n }\n\n /**\n * Sets the royalty information that a given token id in this contract will use.\n * @param tokenId The token id to set the royalty information for\n * @param receiver Address of who should be sent the royalty payment\n * @param feeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\n * @notice This overrides the default royalty information for this token id\n */\n function setTokenRoyalty(\n uint256 tokenId,\n address receiver,\n uint96 feeNumerator\n ) external onlyRole(ROYALTY_ADMIN_ROLE) {\n _setTokenRoyalty(tokenId, receiver, feeNumerator);\n }\n\n //\n // Views\n //\n\n /**\n * Check interface support.\n * @param interfaceId Interface id\n * @return True if supported\n */\n function supportsInterface(\n bytes4 interfaceId\n ) public view virtual override(ERC2981, AccessControlEnumerable) returns (bool) {\n return ERC2981.supportsInterface(interfaceId) || AccessControlEnumerable.supportsInterface(interfaceId)\n || type(IERC2981Controlled).interfaceId == interfaceId || super.supportsInterface(interfaceId);\n }\n\n}\n" + }, + "src/tokens/common/SignalsImplicitModeControlled.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.19;\n\nimport { AccessControlEnumerable } from \"openzeppelin-contracts/contracts/access/AccessControlEnumerable.sol\";\nimport {\n IERC165,\n IImplicitProjectValidation,\n SignalsImplicitMode\n} from \"signals-implicit-mode/src/helper/SignalsImplicitMode.sol\";\n\n/**\n * An abstract contract that allows implicit session access for a given project.\n */\nabstract contract SignalsImplicitModeControlled is AccessControlEnumerable, SignalsImplicitMode {\n\n bytes32 internal constant _IMPLICIT_MODE_ADMIN_ROLE = keccak256(\"IMPLICIT_MODE_ADMIN_ROLE\");\n\n function _initializeImplicitMode(address owner, address validator, bytes32 projectId) internal {\n _grantRole(_IMPLICIT_MODE_ADMIN_ROLE, owner);\n _initializeSignalsImplicitMode(validator, projectId);\n }\n\n /**\n * Updates the validator for implicit mode validation.\n * @param validator The validator address.\n * @notice Only callable by an address with the project admin role.\n */\n function setImplicitModeValidator(\n address validator\n ) external onlyRole(_IMPLICIT_MODE_ADMIN_ROLE) {\n _validator = IImplicitProjectValidation(validator);\n }\n\n /**\n * Updates the settings for implicit mode validation.\n * @param projectId The project id.\n * @notice Only callable by an address with the project admin role.\n */\n function setImplicitModeProjectId(\n bytes32 projectId\n ) external onlyRole(_IMPLICIT_MODE_ADMIN_ROLE) {\n _projectId = projectId;\n }\n\n /// @inheritdoc IERC165\n function supportsInterface(\n bytes4 interfaceId\n ) public view virtual override(AccessControlEnumerable, SignalsImplicitMode) returns (bool) {\n return\n AccessControlEnumerable.supportsInterface(interfaceId) || SignalsImplicitMode.supportsInterface(interfaceId);\n }\n\n}\n" + }, + "src/tokens/ERC1155/extensions/supply/ERC1155Supply.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.19;\n\nimport { IERC1155Supply, IERC1155SupplyFunctions } from \"./IERC1155Supply.sol\";\n\nimport { ERC1155 } from \"solady/tokens/ERC1155.sol\";\n\n/**\n * An ERC-1155 extension that tracks token supply.\n */\nabstract contract ERC1155Supply is ERC1155, IERC1155Supply {\n\n // Current supply\n uint256 public totalSupply;\n mapping(uint256 => uint256) public tokenSupply;\n\n /**\n * Mint _amount of tokens of a given id\n * @param _to The address to mint tokens to\n * @param _id Token id to mint\n * @param _amount The amount to be minted\n * @param _data Data to pass if receiver is contract\n */\n function _mint(address _to, uint256 _id, uint256 _amount, bytes memory _data) internal virtual override {\n super._mint(_to, _id, _amount, _data);\n\n totalSupply += _amount;\n tokenSupply[_id] += _amount;\n }\n\n /**\n * Mint tokens for each ids in _ids\n * @param _to The address to mint tokens to\n * @param _ids Array of ids to mint\n * @param _amounts Array of amount of tokens to mint per id\n * @param _data Data to pass if receiver is contract\n */\n function _batchMint(\n address _to,\n uint256[] memory _ids,\n uint256[] memory _amounts,\n bytes memory _data\n ) internal virtual override {\n super._batchMint(_to, _ids, _amounts, _data);\n\n uint256 nMint = _ids.length;\n uint256 totalAmount = 0;\n for (uint256 i; i < nMint;) {\n uint256 amount = _amounts[i];\n totalAmount += amount;\n tokenSupply[_ids[i]] += amount;\n unchecked {\n // Already checked in super._batchMint\n ++i;\n }\n }\n totalSupply += totalAmount;\n }\n\n /**\n * Burn _amount of tokens of a given token id\n * @param _from The address to burn tokens from\n * @param _id Token id to burn\n * @param _amount The amount to be burned\n */\n function _burn(address _from, uint256 _id, uint256 _amount) internal virtual override {\n super._burn(_from, _id, _amount);\n\n totalSupply -= _amount;\n tokenSupply[_id] -= _amount;\n }\n\n /**\n * Burn tokens of given token id for each (_ids[i], _amounts[i]) pair\n * @param _from The address to burn tokens from\n * @param _ids Array of token ids to burn\n * @param _amounts Array of the amount to be burned\n */\n function _batchBurn(address _from, uint256[] memory _ids, uint256[] memory _amounts) internal virtual override {\n super._batchBurn(_from, _ids, _amounts);\n\n uint256 nBurn = _ids.length;\n uint256 totalAmount = 0;\n for (uint256 i; i < nBurn;) {\n uint256 amount = _amounts[i];\n tokenSupply[_ids[i]] -= amount;\n totalAmount += amount;\n unchecked {\n // Already checked in super._batchBurn\n ++i;\n }\n }\n totalSupply -= totalAmount;\n }\n\n //\n // Views\n //\n\n /**\n * Check interface support.\n * @param interfaceId Interface id\n * @return True if supported\n */\n function supportsInterface(\n bytes4 interfaceId\n ) public view virtual override(ERC1155) returns (bool) {\n return type(IERC1155SupplyFunctions).interfaceId == interfaceId || super.supportsInterface(interfaceId);\n }\n\n}\n" + }, + "lib/solady/src/utils/LibString.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\nimport {LibBytes} from \"./LibBytes.sol\";\n\n/// @notice Library for converting numbers into strings and other string operations.\n/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibString.sol)\n/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/LibString.sol)\n///\n/// @dev Note:\n/// For performance and bytecode compactness, most of the string operations are restricted to\n/// byte strings (7-bit ASCII), except where otherwise specified.\n/// Usage of byte string operations on charsets with runes spanning two or more bytes\n/// can lead to undefined behavior.\nlibrary LibString {\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* STRUCTS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Goated string storage struct that totally MOGs, no cap, fr.\n /// Uses less gas and bytecode than Solidity's native string storage. It's meta af.\n /// Packs length with the first 31 bytes if <255 bytes, so it’s mad tight.\n struct StringStorage {\n bytes32 _spacer;\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* CUSTOM ERRORS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev The length of the output is too small to contain all the hex digits.\n error HexLengthInsufficient();\n\n /// @dev The length of the string is more than 32 bytes.\n error TooBigForSmallString();\n\n /// @dev The input string must be a 7-bit ASCII.\n error StringNot7BitASCII();\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* CONSTANTS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev The constant returned when the `search` is not found in the string.\n uint256 internal constant NOT_FOUND = type(uint256).max;\n\n /// @dev Lookup for '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'.\n uint128 internal constant ALPHANUMERIC_7_BIT_ASCII = 0x7fffffe07fffffe03ff000000000000;\n\n /// @dev Lookup for 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'.\n uint128 internal constant LETTERS_7_BIT_ASCII = 0x7fffffe07fffffe0000000000000000;\n\n /// @dev Lookup for 'abcdefghijklmnopqrstuvwxyz'.\n uint128 internal constant LOWERCASE_7_BIT_ASCII = 0x7fffffe000000000000000000000000;\n\n /// @dev Lookup for 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.\n uint128 internal constant UPPERCASE_7_BIT_ASCII = 0x7fffffe0000000000000000;\n\n /// @dev Lookup for '0123456789'.\n uint128 internal constant DIGITS_7_BIT_ASCII = 0x3ff000000000000;\n\n /// @dev Lookup for '0123456789abcdefABCDEF'.\n uint128 internal constant HEXDIGITS_7_BIT_ASCII = 0x7e0000007e03ff000000000000;\n\n /// @dev Lookup for '01234567'.\n uint128 internal constant OCTDIGITS_7_BIT_ASCII = 0xff000000000000;\n\n /// @dev Lookup for '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!\"#$%&\\'()*+,-./:;<=>?@[\\\\]^_`{|}~ \\t\\n\\r\\x0b\\x0c'.\n uint128 internal constant PRINTABLE_7_BIT_ASCII = 0x7fffffffffffffffffffffff00003e00;\n\n /// @dev Lookup for '!\"#$%&\\'()*+,-./:;<=>?@[\\\\]^_`{|}~'.\n uint128 internal constant PUNCTUATION_7_BIT_ASCII = 0x78000001f8000001fc00fffe00000000;\n\n /// @dev Lookup for ' \\t\\n\\r\\x0b\\x0c'.\n uint128 internal constant WHITESPACE_7_BIT_ASCII = 0x100003e00;\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* STRING STORAGE OPERATIONS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Sets the value of the string storage `$` to `s`.\n function set(StringStorage storage $, string memory s) internal {\n LibBytes.set(bytesStorage($), bytes(s));\n }\n\n /// @dev Sets the value of the string storage `$` to `s`.\n function setCalldata(StringStorage storage $, string calldata s) internal {\n LibBytes.setCalldata(bytesStorage($), bytes(s));\n }\n\n /// @dev Sets the value of the string storage `$` to the empty string.\n function clear(StringStorage storage $) internal {\n delete $._spacer;\n }\n\n /// @dev Returns whether the value stored is `$` is the empty string \"\".\n function isEmpty(StringStorage storage $) internal view returns (bool) {\n return uint256($._spacer) & 0xff == uint256(0);\n }\n\n /// @dev Returns the length of the value stored in `$`.\n function length(StringStorage storage $) internal view returns (uint256) {\n return LibBytes.length(bytesStorage($));\n }\n\n /// @dev Returns the value stored in `$`.\n function get(StringStorage storage $) internal view returns (string memory) {\n return string(LibBytes.get(bytesStorage($)));\n }\n\n /// @dev Returns the uint8 at index `i`. If out-of-bounds, returns 0.\n function uint8At(StringStorage storage $, uint256 i) internal view returns (uint8) {\n return LibBytes.uint8At(bytesStorage($), i);\n }\n\n /// @dev Helper to cast `$` to a `BytesStorage`.\n function bytesStorage(StringStorage storage $)\n internal\n pure\n returns (LibBytes.BytesStorage storage casted)\n {\n /// @solidity memory-safe-assembly\n assembly {\n casted.slot := $.slot\n }\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* DECIMAL OPERATIONS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Returns the base 10 decimal representation of `value`.\n function toString(uint256 value) internal pure returns (string memory result) {\n /// @solidity memory-safe-assembly\n assembly {\n // The maximum value of a uint256 contains 78 digits (1 byte per digit), but\n // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.\n // We will need 1 word for the trailing zeros padding, 1 word for the length,\n // and 3 words for a maximum of 78 digits.\n result := add(mload(0x40), 0x80)\n mstore(0x40, add(result, 0x20)) // Allocate memory.\n mstore(result, 0) // Zeroize the slot after the string.\n\n let end := result // Cache the end of the memory to calculate the length later.\n let w := not(0) // Tsk.\n // We write the string from rightmost digit to leftmost digit.\n // The following is essentially a do-while loop that also handles the zero case.\n for { let temp := value } 1 {} {\n result := add(result, w) // `sub(result, 1)`.\n // Store the character to the pointer.\n // The ASCII index of the '0' character is 48.\n mstore8(result, add(48, mod(temp, 10)))\n temp := div(temp, 10) // Keep dividing `temp` until zero.\n if iszero(temp) { break }\n }\n let n := sub(end, result)\n result := sub(result, 0x20) // Move the pointer 32 bytes back to make room for the length.\n mstore(result, n) // Store the length.\n }\n }\n\n /// @dev Returns the base 10 decimal representation of `value`.\n function toString(int256 value) internal pure returns (string memory result) {\n if (value >= 0) return toString(uint256(value));\n unchecked {\n result = toString(~uint256(value) + 1);\n }\n /// @solidity memory-safe-assembly\n assembly {\n // We still have some spare memory space on the left,\n // as we have allocated 3 words (96 bytes) for up to 78 digits.\n let n := mload(result) // Load the string length.\n mstore(result, 0x2d) // Store the '-' character.\n result := sub(result, 1) // Move back the string pointer by a byte.\n mstore(result, add(n, 1)) // Update the string length.\n }\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* HEXADECIMAL OPERATIONS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Returns the hexadecimal representation of `value`,\n /// left-padded to an input length of `byteCount` bytes.\n /// The output is prefixed with \"0x\" encoded using 2 hexadecimal digits per byte,\n /// giving a total length of `byteCount * 2 + 2` bytes.\n /// Reverts if `byteCount` is too small for the output to contain all the digits.\n function toHexString(uint256 value, uint256 byteCount)\n internal\n pure\n returns (string memory result)\n {\n result = toHexStringNoPrefix(value, byteCount);\n /// @solidity memory-safe-assembly\n assembly {\n let n := add(mload(result), 2) // Compute the length.\n mstore(result, 0x3078) // Store the \"0x\" prefix.\n result := sub(result, 2) // Move the pointer.\n mstore(result, n) // Store the length.\n }\n }\n\n /// @dev Returns the hexadecimal representation of `value`,\n /// left-padded to an input length of `byteCount` bytes.\n /// The output is not prefixed with \"0x\" and is encoded using 2 hexadecimal digits per byte,\n /// giving a total length of `byteCount * 2` bytes.\n /// Reverts if `byteCount` is too small for the output to contain all the digits.\n function toHexStringNoPrefix(uint256 value, uint256 byteCount)\n internal\n pure\n returns (string memory result)\n {\n /// @solidity memory-safe-assembly\n assembly {\n // We need 0x20 bytes for the trailing zeros padding, `byteCount * 2` bytes\n // for the digits, 0x02 bytes for the prefix, and 0x20 bytes for the length.\n // We add 0x20 to the total and round down to a multiple of 0x20.\n // (0x20 + 0x20 + 0x02 + 0x20) = 0x62.\n result := add(mload(0x40), and(add(shl(1, byteCount), 0x42), not(0x1f)))\n mstore(0x40, add(result, 0x20)) // Allocate memory.\n mstore(result, 0) // Zeroize the slot after the string.\n\n let end := result // Cache the end to calculate the length later.\n // Store \"0123456789abcdef\" in scratch space.\n mstore(0x0f, 0x30313233343536373839616263646566)\n\n let start := sub(result, add(byteCount, byteCount))\n let w := not(1) // Tsk.\n let temp := value\n // We write the string from rightmost digit to leftmost digit.\n // The following is essentially a do-while loop that also handles the zero case.\n for {} 1 {} {\n result := add(result, w) // `sub(result, 2)`.\n mstore8(add(result, 1), mload(and(temp, 15)))\n mstore8(result, mload(and(shr(4, temp), 15)))\n temp := shr(8, temp)\n if iszero(xor(result, start)) { break }\n }\n if temp {\n mstore(0x00, 0x2194895a) // `HexLengthInsufficient()`.\n revert(0x1c, 0x04)\n }\n let n := sub(end, result)\n result := sub(result, 0x20)\n mstore(result, n) // Store the length.\n }\n }\n\n /// @dev Returns the hexadecimal representation of `value`.\n /// The output is prefixed with \"0x\" and encoded using 2 hexadecimal digits per byte.\n /// As address are 20 bytes long, the output will left-padded to have\n /// a length of `20 * 2 + 2` bytes.\n function toHexString(uint256 value) internal pure returns (string memory result) {\n result = toHexStringNoPrefix(value);\n /// @solidity memory-safe-assembly\n assembly {\n let n := add(mload(result), 2) // Compute the length.\n mstore(result, 0x3078) // Store the \"0x\" prefix.\n result := sub(result, 2) // Move the pointer.\n mstore(result, n) // Store the length.\n }\n }\n\n /// @dev Returns the hexadecimal representation of `value`.\n /// The output is prefixed with \"0x\".\n /// The output excludes leading \"0\" from the `toHexString` output.\n /// `0x00: \"0x0\", 0x01: \"0x1\", 0x12: \"0x12\", 0x123: \"0x123\"`.\n function toMinimalHexString(uint256 value) internal pure returns (string memory result) {\n result = toHexStringNoPrefix(value);\n /// @solidity memory-safe-assembly\n assembly {\n let o := eq(byte(0, mload(add(result, 0x20))), 0x30) // Whether leading zero is present.\n let n := add(mload(result), 2) // Compute the length.\n mstore(add(result, o), 0x3078) // Store the \"0x\" prefix, accounting for leading zero.\n result := sub(add(result, o), 2) // Move the pointer, accounting for leading zero.\n mstore(result, sub(n, o)) // Store the length, accounting for leading zero.\n }\n }\n\n /// @dev Returns the hexadecimal representation of `value`.\n /// The output excludes leading \"0\" from the `toHexStringNoPrefix` output.\n /// `0x00: \"0\", 0x01: \"1\", 0x12: \"12\", 0x123: \"123\"`.\n function toMinimalHexStringNoPrefix(uint256 value)\n internal\n pure\n returns (string memory result)\n {\n result = toHexStringNoPrefix(value);\n /// @solidity memory-safe-assembly\n assembly {\n let o := eq(byte(0, mload(add(result, 0x20))), 0x30) // Whether leading zero is present.\n let n := mload(result) // Get the length.\n result := add(result, o) // Move the pointer, accounting for leading zero.\n mstore(result, sub(n, o)) // Store the length, accounting for leading zero.\n }\n }\n\n /// @dev Returns the hexadecimal representation of `value`.\n /// The output is encoded using 2 hexadecimal digits per byte.\n /// As address are 20 bytes long, the output will left-padded to have\n /// a length of `20 * 2` bytes.\n function toHexStringNoPrefix(uint256 value) internal pure returns (string memory result) {\n /// @solidity memory-safe-assembly\n assembly {\n // We need 0x20 bytes for the trailing zeros padding, 0x20 bytes for the length,\n // 0x02 bytes for the prefix, and 0x40 bytes for the digits.\n // The next multiple of 0x20 above (0x20 + 0x20 + 0x02 + 0x40) is 0xa0.\n result := add(mload(0x40), 0x80)\n mstore(0x40, add(result, 0x20)) // Allocate memory.\n mstore(result, 0) // Zeroize the slot after the string.\n\n let end := result // Cache the end to calculate the length later.\n mstore(0x0f, 0x30313233343536373839616263646566) // Store the \"0123456789abcdef\" lookup.\n\n let w := not(1) // Tsk.\n // We write the string from rightmost digit to leftmost digit.\n // The following is essentially a do-while loop that also handles the zero case.\n for { let temp := value } 1 {} {\n result := add(result, w) // `sub(result, 2)`.\n mstore8(add(result, 1), mload(and(temp, 15)))\n mstore8(result, mload(and(shr(4, temp), 15)))\n temp := shr(8, temp)\n if iszero(temp) { break }\n }\n let n := sub(end, result)\n result := sub(result, 0x20)\n mstore(result, n) // Store the length.\n }\n }\n\n /// @dev Returns the hexadecimal representation of `value`.\n /// The output is prefixed with \"0x\", encoded using 2 hexadecimal digits per byte,\n /// and the alphabets are capitalized conditionally according to\n /// https://eips.ethereum.org/EIPS/eip-55\n function toHexStringChecksummed(address value) internal pure returns (string memory result) {\n result = toHexString(value);\n /// @solidity memory-safe-assembly\n assembly {\n let mask := shl(6, div(not(0), 255)) // `0b010000000100000000 ...`\n let o := add(result, 0x22)\n let hashed := and(keccak256(o, 40), mul(34, mask)) // `0b10001000 ... `\n let t := shl(240, 136) // `0b10001000 << 240`\n for { let i := 0 } 1 {} {\n mstore(add(i, i), mul(t, byte(i, hashed)))\n i := add(i, 1)\n if eq(i, 20) { break }\n }\n mstore(o, xor(mload(o), shr(1, and(mload(0x00), and(mload(o), mask)))))\n o := add(o, 0x20)\n mstore(o, xor(mload(o), shr(1, and(mload(0x20), and(mload(o), mask)))))\n }\n }\n\n /// @dev Returns the hexadecimal representation of `value`.\n /// The output is prefixed with \"0x\" and encoded using 2 hexadecimal digits per byte.\n function toHexString(address value) internal pure returns (string memory result) {\n result = toHexStringNoPrefix(value);\n /// @solidity memory-safe-assembly\n assembly {\n let n := add(mload(result), 2) // Compute the length.\n mstore(result, 0x3078) // Store the \"0x\" prefix.\n result := sub(result, 2) // Move the pointer.\n mstore(result, n) // Store the length.\n }\n }\n\n /// @dev Returns the hexadecimal representation of `value`.\n /// The output is encoded using 2 hexadecimal digits per byte.\n function toHexStringNoPrefix(address value) internal pure returns (string memory result) {\n /// @solidity memory-safe-assembly\n assembly {\n result := mload(0x40)\n // Allocate memory.\n // We need 0x20 bytes for the trailing zeros padding, 0x20 bytes for the length,\n // 0x02 bytes for the prefix, and 0x28 bytes for the digits.\n // The next multiple of 0x20 above (0x20 + 0x20 + 0x02 + 0x28) is 0x80.\n mstore(0x40, add(result, 0x80))\n mstore(0x0f, 0x30313233343536373839616263646566) // Store the \"0123456789abcdef\" lookup.\n\n result := add(result, 2)\n mstore(result, 40) // Store the length.\n let o := add(result, 0x20)\n mstore(add(o, 40), 0) // Zeroize the slot after the string.\n value := shl(96, value)\n // We write the string from rightmost digit to leftmost digit.\n // The following is essentially a do-while loop that also handles the zero case.\n for { let i := 0 } 1 {} {\n let p := add(o, add(i, i))\n let temp := byte(i, value)\n mstore8(add(p, 1), mload(and(temp, 15)))\n mstore8(p, mload(shr(4, temp)))\n i := add(i, 1)\n if eq(i, 20) { break }\n }\n }\n }\n\n /// @dev Returns the hex encoded string from the raw bytes.\n /// The output is encoded using 2 hexadecimal digits per byte.\n function toHexString(bytes memory raw) internal pure returns (string memory result) {\n result = toHexStringNoPrefix(raw);\n /// @solidity memory-safe-assembly\n assembly {\n let n := add(mload(result), 2) // Compute the length.\n mstore(result, 0x3078) // Store the \"0x\" prefix.\n result := sub(result, 2) // Move the pointer.\n mstore(result, n) // Store the length.\n }\n }\n\n /// @dev Returns the hex encoded string from the raw bytes.\n /// The output is encoded using 2 hexadecimal digits per byte.\n function toHexStringNoPrefix(bytes memory raw) internal pure returns (string memory result) {\n /// @solidity memory-safe-assembly\n assembly {\n let n := mload(raw)\n result := add(mload(0x40), 2) // Skip 2 bytes for the optional prefix.\n mstore(result, add(n, n)) // Store the length of the output.\n\n mstore(0x0f, 0x30313233343536373839616263646566) // Store the \"0123456789abcdef\" lookup.\n let o := add(result, 0x20)\n let end := add(raw, n)\n for {} iszero(eq(raw, end)) {} {\n raw := add(raw, 1)\n mstore8(add(o, 1), mload(and(mload(raw), 15)))\n mstore8(o, mload(and(shr(4, mload(raw)), 15)))\n o := add(o, 2)\n }\n mstore(o, 0) // Zeroize the slot after the string.\n mstore(0x40, add(o, 0x20)) // Allocate memory.\n }\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* RUNE STRING OPERATIONS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Returns the number of UTF characters in the string.\n function runeCount(string memory s) internal pure returns (uint256 result) {\n /// @solidity memory-safe-assembly\n assembly {\n if mload(s) {\n mstore(0x00, div(not(0), 255))\n mstore(0x20, 0x0202020202020202020202020202020202020202020202020303030304040506)\n let o := add(s, 0x20)\n let end := add(o, mload(s))\n for { result := 1 } 1 { result := add(result, 1) } {\n o := add(o, byte(0, mload(shr(250, mload(o)))))\n if iszero(lt(o, end)) { break }\n }\n }\n }\n }\n\n /// @dev Returns if this string is a 7-bit ASCII string.\n /// (i.e. all characters codes are in [0..127])\n function is7BitASCII(string memory s) internal pure returns (bool result) {\n /// @solidity memory-safe-assembly\n assembly {\n result := 1\n let mask := shl(7, div(not(0), 255))\n let n := mload(s)\n if n {\n let o := add(s, 0x20)\n let end := add(o, n)\n let last := mload(end)\n mstore(end, 0)\n for {} 1 {} {\n if and(mask, mload(o)) {\n result := 0\n break\n }\n o := add(o, 0x20)\n if iszero(lt(o, end)) { break }\n }\n mstore(end, last)\n }\n }\n }\n\n /// @dev Returns if this string is a 7-bit ASCII string,\n /// AND all characters are in the `allowed` lookup.\n /// Note: If `s` is empty, returns true regardless of `allowed`.\n function is7BitASCII(string memory s, uint128 allowed) internal pure returns (bool result) {\n /// @solidity memory-safe-assembly\n assembly {\n result := 1\n if mload(s) {\n let allowed_ := shr(128, shl(128, allowed))\n let o := add(s, 0x20)\n for { let end := add(o, mload(s)) } 1 {} {\n result := and(result, shr(byte(0, mload(o)), allowed_))\n o := add(o, 1)\n if iszero(and(result, lt(o, end))) { break }\n }\n }\n }\n }\n\n /// @dev Converts the bytes in the 7-bit ASCII string `s` to\n /// an allowed lookup for use in `is7BitASCII(s, allowed)`.\n /// To save runtime gas, you can cache the result in an immutable variable.\n function to7BitASCIIAllowedLookup(string memory s) internal pure returns (uint128 result) {\n /// @solidity memory-safe-assembly\n assembly {\n if mload(s) {\n let o := add(s, 0x20)\n for { let end := add(o, mload(s)) } 1 {} {\n result := or(result, shl(byte(0, mload(o)), 1))\n o := add(o, 1)\n if iszero(lt(o, end)) { break }\n }\n if shr(128, result) {\n mstore(0x00, 0xc9807e0d) // `StringNot7BitASCII()`.\n revert(0x1c, 0x04)\n }\n }\n }\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* BYTE STRING OPERATIONS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n // For performance and bytecode compactness, byte string operations are restricted\n // to 7-bit ASCII strings. All offsets are byte offsets, not UTF character offsets.\n // Usage of byte string operations on charsets with runes spanning two or more bytes\n // can lead to undefined behavior.\n\n /// @dev Returns `subject` all occurrences of `needle` replaced with `replacement`.\n function replace(string memory subject, string memory needle, string memory replacement)\n internal\n pure\n returns (string memory)\n {\n return string(LibBytes.replace(bytes(subject), bytes(needle), bytes(replacement)));\n }\n\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\n /// needleing from left to right, starting from `from`.\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\n function indexOf(string memory subject, string memory needle, uint256 from)\n internal\n pure\n returns (uint256)\n {\n return LibBytes.indexOf(bytes(subject), bytes(needle), from);\n }\n\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\n /// needleing from left to right.\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\n function indexOf(string memory subject, string memory needle) internal pure returns (uint256) {\n return LibBytes.indexOf(bytes(subject), bytes(needle), 0);\n }\n\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\n /// needleing from right to left, starting from `from`.\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\n function lastIndexOf(string memory subject, string memory needle, uint256 from)\n internal\n pure\n returns (uint256)\n {\n return LibBytes.lastIndexOf(bytes(subject), bytes(needle), from);\n }\n\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\n /// needleing from right to left.\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\n function lastIndexOf(string memory subject, string memory needle)\n internal\n pure\n returns (uint256)\n {\n return LibBytes.lastIndexOf(bytes(subject), bytes(needle), type(uint256).max);\n }\n\n /// @dev Returns true if `needle` is found in `subject`, false otherwise.\n function contains(string memory subject, string memory needle) internal pure returns (bool) {\n return LibBytes.contains(bytes(subject), bytes(needle));\n }\n\n /// @dev Returns whether `subject` starts with `needle`.\n function startsWith(string memory subject, string memory needle) internal pure returns (bool) {\n return LibBytes.startsWith(bytes(subject), bytes(needle));\n }\n\n /// @dev Returns whether `subject` ends with `needle`.\n function endsWith(string memory subject, string memory needle) internal pure returns (bool) {\n return LibBytes.endsWith(bytes(subject), bytes(needle));\n }\n\n /// @dev Returns `subject` repeated `times`.\n function repeat(string memory subject, uint256 times) internal pure returns (string memory) {\n return string(LibBytes.repeat(bytes(subject), times));\n }\n\n /// @dev Returns a copy of `subject` sliced from `start` to `end` (exclusive).\n /// `start` and `end` are byte offsets.\n function slice(string memory subject, uint256 start, uint256 end)\n internal\n pure\n returns (string memory)\n {\n return string(LibBytes.slice(bytes(subject), start, end));\n }\n\n /// @dev Returns a copy of `subject` sliced from `start` to the end of the string.\n /// `start` is a byte offset.\n function slice(string memory subject, uint256 start) internal pure returns (string memory) {\n return string(LibBytes.slice(bytes(subject), start, type(uint256).max));\n }\n\n /// @dev Returns all the indices of `needle` in `subject`.\n /// The indices are byte offsets.\n function indicesOf(string memory subject, string memory needle)\n internal\n pure\n returns (uint256[] memory)\n {\n return LibBytes.indicesOf(bytes(subject), bytes(needle));\n }\n\n /// @dev Returns an arrays of strings based on the `delimiter` inside of the `subject` string.\n function split(string memory subject, string memory delimiter)\n internal\n pure\n returns (string[] memory result)\n {\n bytes[] memory a = LibBytes.split(bytes(subject), bytes(delimiter));\n /// @solidity memory-safe-assembly\n assembly {\n result := a\n }\n }\n\n /// @dev Returns a concatenated string of `a` and `b`.\n /// Cheaper than `string.concat()` and does not de-align the free memory pointer.\n function concat(string memory a, string memory b) internal pure returns (string memory) {\n return string(LibBytes.concat(bytes(a), bytes(b)));\n }\n\n /// @dev Returns a copy of the string in either lowercase or UPPERCASE.\n /// WARNING! This function is only compatible with 7-bit ASCII strings.\n function toCase(string memory subject, bool toUpper)\n internal\n pure\n returns (string memory result)\n {\n /// @solidity memory-safe-assembly\n assembly {\n let n := mload(subject)\n if n {\n result := mload(0x40)\n let o := add(result, 0x20)\n let d := sub(subject, result)\n let flags := shl(add(70, shl(5, toUpper)), 0x3ffffff)\n for { let end := add(o, n) } 1 {} {\n let b := byte(0, mload(add(d, o)))\n mstore8(o, xor(and(shr(b, flags), 0x20), b))\n o := add(o, 1)\n if eq(o, end) { break }\n }\n mstore(result, n) // Store the length.\n mstore(o, 0) // Zeroize the slot after the string.\n mstore(0x40, add(o, 0x20)) // Allocate memory.\n }\n }\n }\n\n /// @dev Returns a string from a small bytes32 string.\n /// `s` must be null-terminated, or behavior will be undefined.\n function fromSmallString(bytes32 s) internal pure returns (string memory result) {\n /// @solidity memory-safe-assembly\n assembly {\n result := mload(0x40)\n let n := 0\n for {} byte(n, s) { n := add(n, 1) } {} // Scan for '\\0'.\n mstore(result, n) // Store the length.\n let o := add(result, 0x20)\n mstore(o, s) // Store the bytes of the string.\n mstore(add(o, n), 0) // Zeroize the slot after the string.\n mstore(0x40, add(result, 0x40)) // Allocate memory.\n }\n }\n\n /// @dev Returns the small string, with all bytes after the first null byte zeroized.\n function normalizeSmallString(bytes32 s) internal pure returns (bytes32 result) {\n /// @solidity memory-safe-assembly\n assembly {\n for {} byte(result, s) { result := add(result, 1) } {} // Scan for '\\0'.\n mstore(0x00, s)\n mstore(result, 0x00)\n result := mload(0x00)\n }\n }\n\n /// @dev Returns the string as a normalized null-terminated small string.\n function toSmallString(string memory s) internal pure returns (bytes32 result) {\n /// @solidity memory-safe-assembly\n assembly {\n result := mload(s)\n if iszero(lt(result, 33)) {\n mstore(0x00, 0xec92f9a3) // `TooBigForSmallString()`.\n revert(0x1c, 0x04)\n }\n result := shl(shl(3, sub(32, result)), mload(add(s, result)))\n }\n }\n\n /// @dev Returns a lowercased copy of the string.\n /// WARNING! This function is only compatible with 7-bit ASCII strings.\n function lower(string memory subject) internal pure returns (string memory result) {\n result = toCase(subject, false);\n }\n\n /// @dev Returns an UPPERCASED copy of the string.\n /// WARNING! This function is only compatible with 7-bit ASCII strings.\n function upper(string memory subject) internal pure returns (string memory result) {\n result = toCase(subject, true);\n }\n\n /// @dev Escapes the string to be used within HTML tags.\n function escapeHTML(string memory s) internal pure returns (string memory result) {\n /// @solidity memory-safe-assembly\n assembly {\n result := mload(0x40)\n let end := add(s, mload(s))\n let o := add(result, 0x20)\n // Store the bytes of the packed offsets and strides into the scratch space.\n // `packed = (stride << 5) | offset`. Max offset is 20. Max stride is 6.\n mstore(0x1f, 0x900094)\n mstore(0x08, 0xc0000000a6ab)\n // Store \""&'<>\" into the scratch space.\n mstore(0x00, shl(64, 0x2671756f743b26616d703b262333393b266c743b2667743b))\n for {} iszero(eq(s, end)) {} {\n s := add(s, 1)\n let c := and(mload(s), 0xff)\n // Not in `[\"\\\"\",\"'\",\"&\",\"<\",\">\"]`.\n if iszero(and(shl(c, 1), 0x500000c400000000)) {\n mstore8(o, c)\n o := add(o, 1)\n continue\n }\n let t := shr(248, mload(c))\n mstore(o, mload(and(t, 0x1f)))\n o := add(o, shr(5, t))\n }\n mstore(o, 0) // Zeroize the slot after the string.\n mstore(result, sub(o, add(result, 0x20))) // Store the length.\n mstore(0x40, add(o, 0x20)) // Allocate memory.\n }\n }\n\n /// @dev Escapes the string to be used within double-quotes in a JSON.\n /// If `addDoubleQuotes` is true, the result will be enclosed in double-quotes.\n function escapeJSON(string memory s, bool addDoubleQuotes)\n internal\n pure\n returns (string memory result)\n {\n /// @solidity memory-safe-assembly\n assembly {\n result := mload(0x40)\n let o := add(result, 0x20)\n if addDoubleQuotes {\n mstore8(o, 34)\n o := add(1, o)\n }\n // Store \"\\\\u0000\" in scratch space.\n // Store \"0123456789abcdef\" in scratch space.\n // Also, store `{0x08:\"b\", 0x09:\"t\", 0x0a:\"n\", 0x0c:\"f\", 0x0d:\"r\"}`.\n // into the scratch space.\n mstore(0x15, 0x5c75303030303031323334353637383961626364656662746e006672)\n // Bitmask for detecting `[\"\\\"\",\"\\\\\"]`.\n let e := or(shl(0x22, 1), shl(0x5c, 1))\n for { let end := add(s, mload(s)) } iszero(eq(s, end)) {} {\n s := add(s, 1)\n let c := and(mload(s), 0xff)\n if iszero(lt(c, 0x20)) {\n if iszero(and(shl(c, 1), e)) {\n // Not in `[\"\\\"\",\"\\\\\"]`.\n mstore8(o, c)\n o := add(o, 1)\n continue\n }\n mstore8(o, 0x5c) // \"\\\\\".\n mstore8(add(o, 1), c)\n o := add(o, 2)\n continue\n }\n if iszero(and(shl(c, 1), 0x3700)) {\n // Not in `[\"\\b\",\"\\t\",\"\\n\",\"\\f\",\"\\d\"]`.\n mstore8(0x1d, mload(shr(4, c))) // Hex value.\n mstore8(0x1e, mload(and(c, 15))) // Hex value.\n mstore(o, mload(0x19)) // \"\\\\u00XX\".\n o := add(o, 6)\n continue\n }\n mstore8(o, 0x5c) // \"\\\\\".\n mstore8(add(o, 1), mload(add(c, 8)))\n o := add(o, 2)\n }\n if addDoubleQuotes {\n mstore8(o, 34)\n o := add(1, o)\n }\n mstore(o, 0) // Zeroize the slot after the string.\n mstore(result, sub(o, add(result, 0x20))) // Store the length.\n mstore(0x40, add(o, 0x20)) // Allocate memory.\n }\n }\n\n /// @dev Escapes the string to be used within double-quotes in a JSON.\n function escapeJSON(string memory s) internal pure returns (string memory result) {\n result = escapeJSON(s, false);\n }\n\n /// @dev Encodes `s` so that it can be safely used in a URI,\n /// just like `encodeURIComponent` in JavaScript.\n /// See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent\n /// See: https://datatracker.ietf.org/doc/html/rfc2396\n /// See: https://datatracker.ietf.org/doc/html/rfc3986\n function encodeURIComponent(string memory s) internal pure returns (string memory result) {\n /// @solidity memory-safe-assembly\n assembly {\n result := mload(0x40)\n // Store \"0123456789ABCDEF\" in scratch space.\n // Uppercased to be consistent with JavaScript's implementation.\n mstore(0x0f, 0x30313233343536373839414243444546)\n let o := add(result, 0x20)\n for { let end := add(s, mload(s)) } iszero(eq(s, end)) {} {\n s := add(s, 1)\n let c := and(mload(s), 0xff)\n // If not in `[0-9A-Z-a-z-_.!~*'()]`.\n if iszero(and(1, shr(c, 0x47fffffe87fffffe03ff678200000000))) {\n mstore8(o, 0x25) // '%'.\n mstore8(add(o, 1), mload(and(shr(4, c), 15)))\n mstore8(add(o, 2), mload(and(c, 15)))\n o := add(o, 3)\n continue\n }\n mstore8(o, c)\n o := add(o, 1)\n }\n mstore(result, sub(o, add(result, 0x20))) // Store the length.\n mstore(o, 0) // Zeroize the slot after the string.\n mstore(0x40, add(o, 0x20)) // Allocate memory.\n }\n }\n\n /// @dev Returns whether `a` equals `b`.\n function eq(string memory a, string memory b) internal pure returns (bool result) {\n /// @solidity memory-safe-assembly\n assembly {\n result := eq(keccak256(add(a, 0x20), mload(a)), keccak256(add(b, 0x20), mload(b)))\n }\n }\n\n /// @dev Returns whether `a` equals `b`, where `b` is a null-terminated small string.\n function eqs(string memory a, bytes32 b) internal pure returns (bool result) {\n /// @solidity memory-safe-assembly\n assembly {\n // These should be evaluated on compile time, as far as possible.\n let m := not(shl(7, div(not(iszero(b)), 255))) // `0x7f7f ...`.\n let x := not(or(m, or(b, add(m, and(b, m)))))\n let r := shl(7, iszero(iszero(shr(128, x))))\n r := or(r, shl(6, iszero(iszero(shr(64, shr(r, x))))))\n r := or(r, shl(5, lt(0xffffffff, shr(r, x))))\n r := or(r, shl(4, lt(0xffff, shr(r, x))))\n r := or(r, shl(3, lt(0xff, shr(r, x))))\n // forgefmt: disable-next-item\n result := gt(eq(mload(a), add(iszero(x), xor(31, shr(3, r)))),\n xor(shr(add(8, r), b), shr(add(8, r), mload(add(a, 0x20)))))\n }\n }\n\n /// @dev Returns 0 if `a == b`, -1 if `a < b`, +1 if `a > b`.\n /// If `a` == b[:a.length]`, and `a.length < b.length`, returns -1.\n function cmp(string memory a, string memory b) internal pure returns (int256) {\n return LibBytes.cmp(bytes(a), bytes(b));\n }\n\n /// @dev Packs a single string with its length into a single word.\n /// Returns `bytes32(0)` if the length is zero or greater than 31.\n function packOne(string memory a) internal pure returns (bytes32 result) {\n /// @solidity memory-safe-assembly\n assembly {\n // We don't need to zero right pad the string,\n // since this is our own custom non-standard packing scheme.\n result :=\n mul(\n // Load the length and the bytes.\n mload(add(a, 0x1f)),\n // `length != 0 && length < 32`. Abuses underflow.\n // Assumes that the length is valid and within the block gas limit.\n lt(sub(mload(a), 1), 0x1f)\n )\n }\n }\n\n /// @dev Unpacks a string packed using {packOne}.\n /// Returns the empty string if `packed` is `bytes32(0)`.\n /// If `packed` is not an output of {packOne}, the output behavior is undefined.\n function unpackOne(bytes32 packed) internal pure returns (string memory result) {\n /// @solidity memory-safe-assembly\n assembly {\n result := mload(0x40) // Grab the free memory pointer.\n mstore(0x40, add(result, 0x40)) // Allocate 2 words (1 for the length, 1 for the bytes).\n mstore(result, 0) // Zeroize the length slot.\n mstore(add(result, 0x1f), packed) // Store the length and bytes.\n mstore(add(add(result, 0x20), mload(result)), 0) // Right pad with zeroes.\n }\n }\n\n /// @dev Packs two strings with their lengths into a single word.\n /// Returns `bytes32(0)` if combined length is zero or greater than 30.\n function packTwo(string memory a, string memory b) internal pure returns (bytes32 result) {\n /// @solidity memory-safe-assembly\n assembly {\n let aLen := mload(a)\n // We don't need to zero right pad the strings,\n // since this is our own custom non-standard packing scheme.\n result :=\n mul(\n or( // Load the length and the bytes of `a` and `b`.\n shl(shl(3, sub(0x1f, aLen)), mload(add(a, aLen))), mload(sub(add(b, 0x1e), aLen))),\n // `totalLen != 0 && totalLen < 31`. Abuses underflow.\n // Assumes that the lengths are valid and within the block gas limit.\n lt(sub(add(aLen, mload(b)), 1), 0x1e)\n )\n }\n }\n\n /// @dev Unpacks strings packed using {packTwo}.\n /// Returns the empty strings if `packed` is `bytes32(0)`.\n /// If `packed` is not an output of {packTwo}, the output behavior is undefined.\n function unpackTwo(bytes32 packed)\n internal\n pure\n returns (string memory resultA, string memory resultB)\n {\n /// @solidity memory-safe-assembly\n assembly {\n resultA := mload(0x40) // Grab the free memory pointer.\n resultB := add(resultA, 0x40)\n // Allocate 2 words for each string (1 for the length, 1 for the byte). Total 4 words.\n mstore(0x40, add(resultB, 0x40))\n // Zeroize the length slots.\n mstore(resultA, 0)\n mstore(resultB, 0)\n // Store the lengths and bytes.\n mstore(add(resultA, 0x1f), packed)\n mstore(add(resultB, 0x1f), mload(add(add(resultA, 0x20), mload(resultA))))\n // Right pad with zeroes.\n mstore(add(add(resultA, 0x20), mload(resultA)), 0)\n mstore(add(add(resultB, 0x20), mload(resultB)), 0)\n }\n }\n\n /// @dev Directly returns `a` without copying.\n function directReturn(string memory a) internal pure {\n /// @solidity memory-safe-assembly\n assembly {\n // Assumes that the string does not start from the scratch space.\n let retStart := sub(a, 0x20)\n let retUnpaddedSize := add(mload(a), 0x40)\n // Right pad with zeroes. Just in case the string is produced\n // by a method that doesn't zero right pad.\n mstore(add(retStart, retUnpaddedSize), 0)\n mstore(retStart, 0x20) // Store the return offset.\n // End the transaction, returning the string.\n return(retStart, and(not(0x1f), add(0x1f, retUnpaddedSize)))\n }\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/interfaces/IERC1967.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\n *\n * _Available since v4.8.3._\n */\ninterface IERC1967 {\n /**\n * @dev Emitted when the implementation is upgraded.\n */\n event Upgraded(address indexed implementation);\n\n /**\n * @dev Emitted when the admin account has changed.\n */\n event AdminChanged(address previousAdmin, address newAdmin);\n\n /**\n * @dev Emitted when the beacon is changed.\n */\n event BeaconUpgraded(address indexed beacon);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\n * proxy whose upgrades are fully controlled by the current implementation.\n */\ninterface IERC1822Proxiable {\n /**\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\n * address.\n *\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n * function revert if invoked through a proxy.\n */\n function proxiableUUID() external view returns (bytes32);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol)\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC1967 implementation slot:\n * ```solidity\n * contract ERC1967 {\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n * function _getImplementation() internal view returns (address) {\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n * }\n *\n * function _setImplementation(address newImplementation) internal {\n * require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n * }\n * }\n * ```\n *\n * _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._\n * _Available since v4.9 for `string`, `bytes`._\n */\nlibrary StorageSlot {\n struct AddressSlot {\n address value;\n }\n\n struct BooleanSlot {\n bool value;\n }\n\n struct Bytes32Slot {\n bytes32 value;\n }\n\n struct Uint256Slot {\n uint256 value;\n }\n\n struct StringSlot {\n string value;\n }\n\n struct BytesSlot {\n bytes value;\n }\n\n /**\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n */\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\n */\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\n */\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\n */\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `StringSlot` with member `value` located at `slot`.\n */\n function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\n */\n function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := store.slot\n }\n }\n\n /**\n * @dev Returns an `BytesSlot` with member `value` located at `slot`.\n */\n function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\n */\n function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := store.slot\n }\n }\n}\n" + }, + "src/tokens/common/IERC2981Controlled.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.19;\n\ninterface IERC2981ControlledFunctions {\n\n /**\n * Sets the royalty information that all ids in this contract will default to.\n * @param receiver Address of who should be sent the royalty payment\n * @param feeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\n */\n function setDefaultRoyalty(address receiver, uint96 feeNumerator) external;\n\n /**\n * Sets the royalty information that a given token id in this contract will use.\n * @param tokenId The token id to set the royalty information for\n * @param receiver Address of who should be sent the royalty payment\n * @param feeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\n * @notice This overrides the default royalty information for this token id\n */\n function setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) external;\n\n}\n\ninterface IERC2981Controlled is IERC2981ControlledFunctions { }\n" + }, + "lib/openzeppelin-contracts/contracts/access/AccessControlEnumerable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControlEnumerable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IAccessControlEnumerable.sol\";\nimport \"./AccessControl.sol\";\nimport \"../utils/structs/EnumerableSet.sol\";\n\n/**\n * @dev Extension of {AccessControl} that allows enumerating the members of each role.\n */\nabstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl {\n using EnumerableSet for EnumerableSet.AddressSet;\n\n mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers;\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Returns one of the accounts that have `role`. `index` must be a\n * value between 0 and {getRoleMemberCount}, non-inclusive.\n *\n * Role bearers are not sorted in any particular way, and their ordering may\n * change at any point.\n *\n * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure\n * you perform all queries on the same block. See the following\n * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]\n * for more information.\n */\n function getRoleMember(bytes32 role, uint256 index) public view virtual override returns (address) {\n return _roleMembers[role].at(index);\n }\n\n /**\n * @dev Returns the number of accounts that have `role`. Can be used\n * together with {getRoleMember} to enumerate all bearers of a role.\n */\n function getRoleMemberCount(bytes32 role) public view virtual override returns (uint256) {\n return _roleMembers[role].length();\n }\n\n /**\n * @dev Overload {_grantRole} to track enumerable memberships\n */\n function _grantRole(bytes32 role, address account) internal virtual override {\n super._grantRole(role, account);\n _roleMembers[role].add(account);\n }\n\n /**\n * @dev Overload {_revokeRole} to track enumerable memberships\n */\n function _revokeRole(bytes32 role, address account) internal virtual override {\n super._revokeRole(role, account);\n _roleMembers[role].remove(account);\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/token/common/ERC2981.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/common/ERC2981.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../interfaces/IERC2981.sol\";\nimport \"../../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.\n *\n * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for\n * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.\n *\n * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the\n * fee is specified in basis points by default.\n *\n * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See\n * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to\n * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.\n *\n * _Available since v4.5._\n */\nabstract contract ERC2981 is IERC2981, ERC165 {\n struct RoyaltyInfo {\n address receiver;\n uint96 royaltyFraction;\n }\n\n RoyaltyInfo private _defaultRoyaltyInfo;\n mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\n return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @inheritdoc IERC2981\n */\n function royaltyInfo(uint256 tokenId, uint256 salePrice) public view virtual override returns (address, uint256) {\n RoyaltyInfo memory royalty = _tokenRoyaltyInfo[tokenId];\n\n if (royalty.receiver == address(0)) {\n royalty = _defaultRoyaltyInfo;\n }\n\n uint256 royaltyAmount = (salePrice * royalty.royaltyFraction) / _feeDenominator();\n\n return (royalty.receiver, royaltyAmount);\n }\n\n /**\n * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a\n * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an\n * override.\n */\n function _feeDenominator() internal pure virtual returns (uint96) {\n return 10000;\n }\n\n /**\n * @dev Sets the royalty information that all ids in this contract will default to.\n *\n * Requirements:\n *\n * - `receiver` cannot be the zero address.\n * - `feeNumerator` cannot be greater than the fee denominator.\n */\n function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {\n require(feeNumerator <= _feeDenominator(), \"ERC2981: royalty fee will exceed salePrice\");\n require(receiver != address(0), \"ERC2981: invalid receiver\");\n\n _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);\n }\n\n /**\n * @dev Removes default royalty information.\n */\n function _deleteDefaultRoyalty() internal virtual {\n delete _defaultRoyaltyInfo;\n }\n\n /**\n * @dev Sets the royalty information for a specific token id, overriding the global default.\n *\n * Requirements:\n *\n * - `receiver` cannot be the zero address.\n * - `feeNumerator` cannot be greater than the fee denominator.\n */\n function _setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal virtual {\n require(feeNumerator <= _feeDenominator(), \"ERC2981: royalty fee will exceed salePrice\");\n require(receiver != address(0), \"ERC2981: Invalid parameters\");\n\n _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);\n }\n\n /**\n * @dev Resets royalty information for the token id back to the global default.\n */\n function _resetTokenRoyalty(uint256 tokenId) internal virtual {\n delete _tokenRoyaltyInfo[tokenId];\n }\n}\n" + }, + "lib/signals-implicit-mode/src/helper/SignalsImplicitMode.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.13;\n\nimport { IImplicitProjectValidation } from \"../registry/IImplicitProjectValidation.sol\";\n\nimport { ERC165, IERC165 } from \"openzeppelin-contracts/contracts/utils/introspection/ERC165.sol\";\nimport { Attestation } from \"sequence-v3/src/extensions/sessions/implicit/Attestation.sol\";\nimport { ISignalsImplicitMode } from \"sequence-v3/src/extensions/sessions/implicit/ISignalsImplicitMode.sol\";\nimport { Payload } from \"sequence-v3/src/modules/Payload.sol\";\n\n/// @title SignalsImplicitMode\n/// @author Michael Standen\n/// @notice Base contract for implicit mode validation by project\nabstract contract SignalsImplicitMode is ISignalsImplicitMode, ERC165 {\n\n IImplicitProjectValidation internal _validator;\n bytes32 internal _projectId;\n\n /// @notice Initialize implicit mode validation\n /// @param validator The IImplicitProjectValidation address\n /// @param projectId The project id\n function _initializeSignalsImplicitMode(address validator, bytes32 projectId) internal {\n _validator = IImplicitProjectValidation(validator);\n _projectId = projectId;\n }\n\n /// @inheritdoc ISignalsImplicitMode\n function acceptImplicitRequest(\n address wallet,\n Attestation calldata attestation,\n Payload.Call calldata call\n ) external view returns (bytes32) {\n _validateImplicitRequest(wallet, attestation, call);\n return _validator.validateAttestation(wallet, attestation, _projectId);\n }\n\n /// @notice Validates an implicit request\n /// @dev Optional hook for additional validation of the implicit requests\n /// @param wallet The wallet's address\n /// @param attestation The attestation data\n /// @param call The call to validate\n function _validateImplicitRequest(\n address wallet,\n Attestation calldata attestation,\n Payload.Call calldata call\n ) internal view virtual { }\n\n /// @inheritdoc IERC165\n function supportsInterface(\n bytes4 interfaceId\n ) public view virtual override returns (bool) {\n return interfaceId == type(ISignalsImplicitMode).interfaceId || super.supportsInterface(interfaceId);\n }\n\n}\n" + }, + "src/tokens/ERC1155/extensions/supply/IERC1155Supply.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.19;\n\ninterface IERC1155SupplyFunctions {\n\n /**\n * Returns the total supply of ERC1155 tokens.\n */\n function totalSupply() external returns (uint256);\n\n /**\n * Returns the total supply of a given ERC1155 token.\n * @param tokenId The ERC1155 token id.\n */\n function tokenSupply(\n uint256 tokenId\n ) external returns (uint256);\n\n}\n\ninterface IERC1155SupplySignals {\n\n /**\n * Invalid array input length.\n */\n error InvalidArrayLength();\n\n}\n\ninterface IERC1155Supply is IERC1155SupplySignals { }\n" + }, + "lib/solady/src/tokens/ERC1155.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\n/// @notice Simple ERC1155 implementation.\n/// @author Solady (https://github.com/vectorized/solady/blob/main/src/tokens/ERC1155.sol)\n/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC1155.sol)\n/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC1155/ERC1155.sol)\n///\n/// @dev Note:\n/// - The ERC1155 standard allows for self-approvals.\n/// For performance, this implementation WILL NOT revert for such actions.\n/// Please add any checks with overrides if desired.\n/// - The transfer functions use the identity precompile (0x4)\n/// to copy memory internally.\n///\n/// If you are overriding:\n/// - Make sure all variables written to storage are properly cleaned\n// (e.g. the bool value for `isApprovedForAll` MUST be either 1 or 0 under the hood).\n/// - Check that the overridden function is actually used in the function you want to\n/// change the behavior of. Much of the code has been manually inlined for performance.\nabstract contract ERC1155 {\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* CUSTOM ERRORS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev The lengths of the input arrays are not the same.\n error ArrayLengthsMismatch();\n\n /// @dev Cannot mint or transfer to the zero address.\n error TransferToZeroAddress();\n\n /// @dev The recipient's balance has overflowed.\n error AccountBalanceOverflow();\n\n /// @dev Insufficient balance.\n error InsufficientBalance();\n\n /// @dev Only the token owner or an approved account can manage the tokens.\n error NotOwnerNorApproved();\n\n /// @dev Cannot safely transfer to a contract that does not implement\n /// the ERC1155Receiver interface.\n error TransferToNonERC1155ReceiverImplementer();\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* EVENTS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Emitted when `amount` of token `id` is transferred\n /// from `from` to `to` by `operator`.\n event TransferSingle(\n address indexed operator,\n address indexed from,\n address indexed to,\n uint256 id,\n uint256 amount\n );\n\n /// @dev Emitted when `amounts` of token `ids` are transferred\n /// from `from` to `to` by `operator`.\n event TransferBatch(\n address indexed operator,\n address indexed from,\n address indexed to,\n uint256[] ids,\n uint256[] amounts\n );\n\n /// @dev Emitted when `owner` enables or disables `operator` to manage all of their tokens.\n event ApprovalForAll(address indexed owner, address indexed operator, bool isApproved);\n\n /// @dev Emitted when the Uniform Resource Identifier (URI) for token `id`\n /// is updated to `value`. This event is not used in the base contract.\n /// You may need to emit this event depending on your URI logic.\n ///\n /// See: https://eips.ethereum.org/EIPS/eip-1155#metadata\n event URI(string value, uint256 indexed id);\n\n /// @dev `keccak256(bytes(\"TransferSingle(address,address,address,uint256,uint256)\"))`.\n uint256 private constant _TRANSFER_SINGLE_EVENT_SIGNATURE =\n 0xc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62;\n\n /// @dev `keccak256(bytes(\"TransferBatch(address,address,address,uint256[],uint256[])\"))`.\n uint256 private constant _TRANSFER_BATCH_EVENT_SIGNATURE =\n 0x4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb;\n\n /// @dev `keccak256(bytes(\"ApprovalForAll(address,address,bool)\"))`.\n uint256 private constant _APPROVAL_FOR_ALL_EVENT_SIGNATURE =\n 0x17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31;\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* STORAGE */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev The `ownerSlotSeed` of a given owner is given by.\n /// ```\n /// let ownerSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, owner))\n /// ```\n ///\n /// The balance slot of `owner` is given by.\n /// ```\n /// mstore(0x20, ownerSlotSeed)\n /// mstore(0x00, id)\n /// let balanceSlot := keccak256(0x00, 0x40)\n /// ```\n ///\n /// The operator approval slot of `owner` is given by.\n /// ```\n /// mstore(0x20, ownerSlotSeed)\n /// mstore(0x00, operator)\n /// let operatorApprovalSlot := keccak256(0x0c, 0x34)\n /// ```\n uint256 private constant _ERC1155_MASTER_SLOT_SEED = 0x9a31110384e0b0c9;\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* ERC1155 METADATA */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Returns the URI for token `id`.\n ///\n /// You can either return the same templated URI for all token IDs,\n /// (e.g. \"https://example.com/api/{id}.json\"),\n /// or return a unique URI for each `id`.\n ///\n /// See: https://eips.ethereum.org/EIPS/eip-1155#metadata\n function uri(uint256 id) public view virtual returns (string memory);\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* ERC1155 */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Returns the amount of `id` owned by `owner`.\n function balanceOf(address owner, uint256 id) public view virtual returns (uint256 result) {\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x20, _ERC1155_MASTER_SLOT_SEED)\n mstore(0x14, owner)\n mstore(0x00, id)\n result := sload(keccak256(0x00, 0x40))\n }\n }\n\n /// @dev Returns whether `operator` is approved to manage the tokens of `owner`.\n function isApprovedForAll(address owner, address operator)\n public\n view\n virtual\n returns (bool result)\n {\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x20, _ERC1155_MASTER_SLOT_SEED)\n mstore(0x14, owner)\n mstore(0x00, operator)\n result := sload(keccak256(0x0c, 0x34))\n }\n }\n\n /// @dev Sets whether `operator` is approved to manage the tokens of the caller.\n ///\n /// Emits a {ApprovalForAll} event.\n function setApprovalForAll(address operator, bool isApproved) public virtual {\n /// @solidity memory-safe-assembly\n assembly {\n // Convert to 0 or 1.\n isApproved := iszero(iszero(isApproved))\n // Update the `isApproved` for (`msg.sender`, `operator`).\n mstore(0x20, _ERC1155_MASTER_SLOT_SEED)\n mstore(0x14, caller())\n mstore(0x00, operator)\n sstore(keccak256(0x0c, 0x34), isApproved)\n // Emit the {ApprovalForAll} event.\n mstore(0x00, isApproved)\n // forgefmt: disable-next-line\n log3(0x00, 0x20, _APPROVAL_FOR_ALL_EVENT_SIGNATURE, caller(), shr(96, shl(96, operator)))\n }\n }\n\n /// @dev Transfers `amount` of `id` from `from` to `to`.\n ///\n /// Requirements:\n /// - `to` cannot be the zero address.\n /// - `from` must have at least `amount` of `id`.\n /// - If the caller is not `from`,\n /// it must be approved to manage the tokens of `from`.\n /// - If `to` refers to a smart contract, it must implement\n /// {ERC1155-onERC1155Received}, which is called upon a batch transfer.\n ///\n /// Emits a {TransferSingle} event.\n function safeTransferFrom(\n address from,\n address to,\n uint256 id,\n uint256 amount,\n bytes calldata data\n ) public virtual {\n if (_useBeforeTokenTransfer()) {\n _beforeTokenTransfer(from, to, _single(id), _single(amount), data);\n }\n /// @solidity memory-safe-assembly\n assembly {\n let fromSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, from))\n let toSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, to))\n mstore(0x20, fromSlotSeed)\n // Clear the upper 96 bits.\n from := shr(96, fromSlotSeed)\n to := shr(96, toSlotSeed)\n // Revert if `to` is the zero address.\n if iszero(to) {\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\n revert(0x1c, 0x04)\n }\n // If the caller is not `from`, do the authorization check.\n if iszero(eq(caller(), from)) {\n mstore(0x00, caller())\n if iszero(sload(keccak256(0x0c, 0x34))) {\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\n revert(0x1c, 0x04)\n }\n }\n // Subtract and store the updated balance of `from`.\n {\n mstore(0x00, id)\n let fromBalanceSlot := keccak256(0x00, 0x40)\n let fromBalance := sload(fromBalanceSlot)\n if gt(amount, fromBalance) {\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\n revert(0x1c, 0x04)\n }\n sstore(fromBalanceSlot, sub(fromBalance, amount))\n }\n // Increase and store the updated balance of `to`.\n {\n mstore(0x20, toSlotSeed)\n let toBalanceSlot := keccak256(0x00, 0x40)\n let toBalanceBefore := sload(toBalanceSlot)\n let toBalanceAfter := add(toBalanceBefore, amount)\n if lt(toBalanceAfter, toBalanceBefore) {\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\n revert(0x1c, 0x04)\n }\n sstore(toBalanceSlot, toBalanceAfter)\n }\n // Emit a {TransferSingle} event.\n mstore(0x20, amount)\n log4(0x00, 0x40, _TRANSFER_SINGLE_EVENT_SIGNATURE, caller(), from, to)\n }\n if (_useAfterTokenTransfer()) {\n _afterTokenTransfer(from, to, _single(id), _single(amount), data);\n }\n /// @solidity memory-safe-assembly\n assembly {\n // Do the {onERC1155Received} check if `to` is a smart contract.\n if extcodesize(to) {\n // Prepare the calldata.\n let m := mload(0x40)\n // `onERC1155Received(address,address,uint256,uint256,bytes)`.\n mstore(m, 0xf23a6e61)\n mstore(add(m, 0x20), caller())\n mstore(add(m, 0x40), from)\n mstore(add(m, 0x60), id)\n mstore(add(m, 0x80), amount)\n mstore(add(m, 0xa0), 0xa0)\n mstore(add(m, 0xc0), data.length)\n calldatacopy(add(m, 0xe0), data.offset, data.length)\n // Revert if the call reverts.\n if iszero(call(gas(), to, 0, add(m, 0x1c), add(0xc4, data.length), m, 0x20)) {\n if returndatasize() {\n // Bubble up the revert if the call reverts.\n returndatacopy(m, 0x00, returndatasize())\n revert(m, returndatasize())\n }\n }\n // Load the returndata and compare it with the function selector.\n if iszero(eq(mload(m), shl(224, 0xf23a6e61))) {\n mstore(0x00, 0x9c05499b) // `TransferToNonERC1155ReceiverImplementer()`.\n revert(0x1c, 0x04)\n }\n }\n }\n }\n\n /// @dev Transfers `amounts` of `ids` from `from` to `to`.\n ///\n /// Requirements:\n /// - `to` cannot be the zero address.\n /// - `from` must have at least `amount` of `id`.\n /// - `ids` and `amounts` must have the same length.\n /// - If the caller is not `from`,\n /// it must be approved to manage the tokens of `from`.\n /// - If `to` refers to a smart contract, it must implement\n /// {ERC1155-onERC1155BatchReceived}, which is called upon a batch transfer.\n ///\n /// Emits a {TransferBatch} event.\n function safeBatchTransferFrom(\n address from,\n address to,\n uint256[] calldata ids,\n uint256[] calldata amounts,\n bytes calldata data\n ) public virtual {\n if (_useBeforeTokenTransfer()) {\n _beforeTokenTransfer(from, to, ids, amounts, data);\n }\n /// @solidity memory-safe-assembly\n assembly {\n if iszero(eq(ids.length, amounts.length)) {\n mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.\n revert(0x1c, 0x04)\n }\n let fromSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, from))\n let toSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, to))\n mstore(0x20, fromSlotSeed)\n // Clear the upper 96 bits.\n from := shr(96, fromSlotSeed)\n to := shr(96, toSlotSeed)\n // Revert if `to` is the zero address.\n if iszero(to) {\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\n revert(0x1c, 0x04)\n }\n // If the caller is not `from`, do the authorization check.\n if iszero(eq(caller(), from)) {\n mstore(0x00, caller())\n if iszero(sload(keccak256(0x0c, 0x34))) {\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\n revert(0x1c, 0x04)\n }\n }\n // Loop through all the `ids` and update the balances.\n {\n for { let i := shl(5, ids.length) } i {} {\n i := sub(i, 0x20)\n let amount := calldataload(add(amounts.offset, i))\n // Subtract and store the updated balance of `from`.\n {\n mstore(0x20, fromSlotSeed)\n mstore(0x00, calldataload(add(ids.offset, i)))\n let fromBalanceSlot := keccak256(0x00, 0x40)\n let fromBalance := sload(fromBalanceSlot)\n if gt(amount, fromBalance) {\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\n revert(0x1c, 0x04)\n }\n sstore(fromBalanceSlot, sub(fromBalance, amount))\n }\n // Increase and store the updated balance of `to`.\n {\n mstore(0x20, toSlotSeed)\n let toBalanceSlot := keccak256(0x00, 0x40)\n let toBalanceBefore := sload(toBalanceSlot)\n let toBalanceAfter := add(toBalanceBefore, amount)\n if lt(toBalanceAfter, toBalanceBefore) {\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\n revert(0x1c, 0x04)\n }\n sstore(toBalanceSlot, toBalanceAfter)\n }\n }\n }\n // Emit a {TransferBatch} event.\n {\n let m := mload(0x40)\n // Copy the `ids`.\n mstore(m, 0x40)\n let n := shl(5, ids.length)\n mstore(add(m, 0x40), ids.length)\n calldatacopy(add(m, 0x60), ids.offset, n)\n // Copy the `amounts`.\n mstore(add(m, 0x20), add(0x60, n))\n let o := add(add(m, n), 0x60)\n mstore(o, ids.length)\n calldatacopy(add(o, 0x20), amounts.offset, n)\n // Do the emit.\n log4(m, add(add(n, n), 0x80), _TRANSFER_BATCH_EVENT_SIGNATURE, caller(), from, to)\n }\n }\n if (_useAfterTokenTransfer()) {\n _afterTokenTransferCalldata(from, to, ids, amounts, data);\n }\n /// @solidity memory-safe-assembly\n assembly {\n // Do the {onERC1155BatchReceived} check if `to` is a smart contract.\n if extcodesize(to) {\n mstore(0x00, to) // Cache `to` to prevent stack too deep.\n let m := mload(0x40)\n // Prepare the calldata.\n // `onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)`.\n mstore(m, 0xbc197c81)\n mstore(add(m, 0x20), caller())\n mstore(add(m, 0x40), from)\n // Copy the `ids`.\n mstore(add(m, 0x60), 0xa0)\n let n := shl(5, ids.length)\n mstore(add(m, 0xc0), ids.length)\n calldatacopy(add(m, 0xe0), ids.offset, n)\n // Copy the `amounts`.\n mstore(add(m, 0x80), add(0xc0, n))\n let o := add(add(m, n), 0xe0)\n mstore(o, ids.length)\n calldatacopy(add(o, 0x20), amounts.offset, n)\n // Copy the `data`.\n mstore(add(m, 0xa0), add(add(0xe0, n), n))\n o := add(add(o, n), 0x20)\n mstore(o, data.length)\n calldatacopy(add(o, 0x20), data.offset, data.length)\n let nAll := add(0x104, add(data.length, add(n, n)))\n // Revert if the call reverts.\n if iszero(call(gas(), mload(0x00), 0, add(mload(0x40), 0x1c), nAll, m, 0x20)) {\n if returndatasize() {\n // Bubble up the revert if the call reverts.\n returndatacopy(m, 0x00, returndatasize())\n revert(m, returndatasize())\n }\n }\n // Load the returndata and compare it with the function selector.\n if iszero(eq(mload(m), shl(224, 0xbc197c81))) {\n mstore(0x00, 0x9c05499b) // `TransferToNonERC1155ReceiverImplementer()`.\n revert(0x1c, 0x04)\n }\n }\n }\n }\n\n /// @dev Returns the amounts of `ids` for `owners.\n ///\n /// Requirements:\n /// - `owners` and `ids` must have the same length.\n function balanceOfBatch(address[] calldata owners, uint256[] calldata ids)\n public\n view\n virtual\n returns (uint256[] memory balances)\n {\n /// @solidity memory-safe-assembly\n assembly {\n if iszero(eq(ids.length, owners.length)) {\n mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.\n revert(0x1c, 0x04)\n }\n balances := mload(0x40)\n mstore(balances, ids.length)\n let o := add(balances, 0x20)\n let i := shl(5, ids.length)\n mstore(0x40, add(i, o))\n // Loop through all the `ids` and load the balances.\n for {} i {} {\n i := sub(i, 0x20)\n let owner := calldataload(add(owners.offset, i))\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, shl(96, owner)))\n mstore(0x00, calldataload(add(ids.offset, i)))\n mstore(add(o, i), sload(keccak256(0x00, 0x40)))\n }\n }\n }\n\n /// @dev Returns true if this contract implements the interface defined by `interfaceId`.\n /// See: https://eips.ethereum.org/EIPS/eip-165\n /// This function call must use less than 30000 gas.\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool result) {\n /// @solidity memory-safe-assembly\n assembly {\n let s := shr(224, interfaceId)\n // ERC165: 0x01ffc9a7, ERC1155: 0xd9b67a26, ERC1155MetadataURI: 0x0e89341c.\n result := or(or(eq(s, 0x01ffc9a7), eq(s, 0xd9b67a26)), eq(s, 0x0e89341c))\n }\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* INTERNAL MINT FUNCTIONS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Mints `amount` of `id` to `to`.\n ///\n /// Requirements:\n /// - `to` cannot be the zero address.\n /// - If `to` refers to a smart contract, it must implement\n /// {ERC1155-onERC1155Received}, which is called upon a batch transfer.\n ///\n /// Emits a {TransferSingle} event.\n function _mint(address to, uint256 id, uint256 amount, bytes memory data) internal virtual {\n if (_useBeforeTokenTransfer()) {\n _beforeTokenTransfer(address(0), to, _single(id), _single(amount), data);\n }\n /// @solidity memory-safe-assembly\n assembly {\n let to_ := shl(96, to)\n // Revert if `to` is the zero address.\n if iszero(to_) {\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\n revert(0x1c, 0x04)\n }\n // Increase and store the updated balance of `to`.\n {\n mstore(0x20, _ERC1155_MASTER_SLOT_SEED)\n mstore(0x14, to)\n mstore(0x00, id)\n let toBalanceSlot := keccak256(0x00, 0x40)\n let toBalanceBefore := sload(toBalanceSlot)\n let toBalanceAfter := add(toBalanceBefore, amount)\n if lt(toBalanceAfter, toBalanceBefore) {\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\n revert(0x1c, 0x04)\n }\n sstore(toBalanceSlot, toBalanceAfter)\n }\n // Emit a {TransferSingle} event.\n mstore(0x20, amount)\n log4(0x00, 0x40, _TRANSFER_SINGLE_EVENT_SIGNATURE, caller(), 0, shr(96, to_))\n }\n if (_useAfterTokenTransfer()) {\n _afterTokenTransfer(address(0), to, _single(id), _single(amount), data);\n }\n if (_hasCode(to)) _checkOnERC1155Received(address(0), to, id, amount, data);\n }\n\n /// @dev Mints `amounts` of `ids` to `to`.\n ///\n /// Requirements:\n /// - `to` cannot be the zero address.\n /// - `ids` and `amounts` must have the same length.\n /// - If `to` refers to a smart contract, it must implement\n /// {ERC1155-onERC1155BatchReceived}, which is called upon a batch transfer.\n ///\n /// Emits a {TransferBatch} event.\n function _batchMint(\n address to,\n uint256[] memory ids,\n uint256[] memory amounts,\n bytes memory data\n ) internal virtual {\n if (_useBeforeTokenTransfer()) {\n _beforeTokenTransfer(address(0), to, ids, amounts, data);\n }\n /// @solidity memory-safe-assembly\n assembly {\n if iszero(eq(mload(ids), mload(amounts))) {\n mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.\n revert(0x1c, 0x04)\n }\n let to_ := shl(96, to)\n // Revert if `to` is the zero address.\n if iszero(to_) {\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\n revert(0x1c, 0x04)\n }\n // Loop through all the `ids` and update the balances.\n {\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, to_))\n for { let i := shl(5, mload(ids)) } i { i := sub(i, 0x20) } {\n let amount := mload(add(amounts, i))\n // Increase and store the updated balance of `to`.\n {\n mstore(0x00, mload(add(ids, i)))\n let toBalanceSlot := keccak256(0x00, 0x40)\n let toBalanceBefore := sload(toBalanceSlot)\n let toBalanceAfter := add(toBalanceBefore, amount)\n if lt(toBalanceAfter, toBalanceBefore) {\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\n revert(0x1c, 0x04)\n }\n sstore(toBalanceSlot, toBalanceAfter)\n }\n }\n }\n // Emit a {TransferBatch} event.\n {\n let m := mload(0x40)\n // Copy the `ids`.\n mstore(m, 0x40)\n let n := add(0x20, shl(5, mload(ids)))\n let o := add(m, 0x40)\n pop(staticcall(gas(), 4, ids, n, o, n))\n // Copy the `amounts`.\n mstore(add(m, 0x20), add(0x40, returndatasize()))\n o := add(o, returndatasize())\n n := add(0x20, shl(5, mload(amounts)))\n pop(staticcall(gas(), 4, amounts, n, o, n))\n n := sub(add(o, returndatasize()), m)\n // Do the emit.\n log4(m, n, _TRANSFER_BATCH_EVENT_SIGNATURE, caller(), 0, shr(96, to_))\n }\n }\n if (_useAfterTokenTransfer()) {\n _afterTokenTransfer(address(0), to, ids, amounts, data);\n }\n if (_hasCode(to)) _checkOnERC1155BatchReceived(address(0), to, ids, amounts, data);\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* INTERNAL BURN FUNCTIONS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Equivalent to `_burn(address(0), from, id, amount)`.\n function _burn(address from, uint256 id, uint256 amount) internal virtual {\n _burn(address(0), from, id, amount);\n }\n\n /// @dev Destroys `amount` of `id` from `from`.\n ///\n /// Requirements:\n /// - `from` must have at least `amount` of `id`.\n /// - If `by` is not the zero address, it must be either `from`,\n /// or approved to manage the tokens of `from`.\n ///\n /// Emits a {TransferSingle} event.\n function _burn(address by, address from, uint256 id, uint256 amount) internal virtual {\n if (_useBeforeTokenTransfer()) {\n _beforeTokenTransfer(from, address(0), _single(id), _single(amount), \"\");\n }\n /// @solidity memory-safe-assembly\n assembly {\n let from_ := shl(96, from)\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, from_))\n // If `by` is not the zero address, and not equal to `from`,\n // check if it is approved to manage all the tokens of `from`.\n if iszero(or(iszero(shl(96, by)), eq(shl(96, by), from_))) {\n mstore(0x00, by)\n if iszero(sload(keccak256(0x0c, 0x34))) {\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\n revert(0x1c, 0x04)\n }\n }\n // Decrease and store the updated balance of `from`.\n {\n mstore(0x00, id)\n let fromBalanceSlot := keccak256(0x00, 0x40)\n let fromBalance := sload(fromBalanceSlot)\n if gt(amount, fromBalance) {\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\n revert(0x1c, 0x04)\n }\n sstore(fromBalanceSlot, sub(fromBalance, amount))\n }\n // Emit a {TransferSingle} event.\n mstore(0x20, amount)\n log4(0x00, 0x40, _TRANSFER_SINGLE_EVENT_SIGNATURE, caller(), shr(96, from_), 0)\n }\n if (_useAfterTokenTransfer()) {\n _afterTokenTransfer(from, address(0), _single(id), _single(amount), \"\");\n }\n }\n\n /// @dev Equivalent to `_batchBurn(address(0), from, ids, amounts)`.\n function _batchBurn(address from, uint256[] memory ids, uint256[] memory amounts)\n internal\n virtual\n {\n _batchBurn(address(0), from, ids, amounts);\n }\n\n /// @dev Destroys `amounts` of `ids` from `from`.\n ///\n /// Requirements:\n /// - `ids` and `amounts` must have the same length.\n /// - `from` must have at least `amounts` of `ids`.\n /// - If `by` is not the zero address, it must be either `from`,\n /// or approved to manage the tokens of `from`.\n ///\n /// Emits a {TransferBatch} event.\n function _batchBurn(address by, address from, uint256[] memory ids, uint256[] memory amounts)\n internal\n virtual\n {\n if (_useBeforeTokenTransfer()) {\n _beforeTokenTransfer(from, address(0), ids, amounts, \"\");\n }\n /// @solidity memory-safe-assembly\n assembly {\n if iszero(eq(mload(ids), mload(amounts))) {\n mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.\n revert(0x1c, 0x04)\n }\n let from_ := shl(96, from)\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, from_))\n // If `by` is not the zero address, and not equal to `from`,\n // check if it is approved to manage all the tokens of `from`.\n let by_ := shl(96, by)\n if iszero(or(iszero(by_), eq(by_, from_))) {\n mstore(0x00, by)\n if iszero(sload(keccak256(0x0c, 0x34))) {\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\n revert(0x1c, 0x04)\n }\n }\n // Loop through all the `ids` and update the balances.\n {\n for { let i := shl(5, mload(ids)) } i { i := sub(i, 0x20) } {\n let amount := mload(add(amounts, i))\n // Decrease and store the updated balance of `from`.\n {\n mstore(0x00, mload(add(ids, i)))\n let fromBalanceSlot := keccak256(0x00, 0x40)\n let fromBalance := sload(fromBalanceSlot)\n if gt(amount, fromBalance) {\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\n revert(0x1c, 0x04)\n }\n sstore(fromBalanceSlot, sub(fromBalance, amount))\n }\n }\n }\n // Emit a {TransferBatch} event.\n {\n let m := mload(0x40)\n // Copy the `ids`.\n mstore(m, 0x40)\n let n := add(0x20, shl(5, mload(ids)))\n let o := add(m, 0x40)\n pop(staticcall(gas(), 4, ids, n, o, n))\n // Copy the `amounts`.\n mstore(add(m, 0x20), add(0x40, returndatasize()))\n o := add(o, returndatasize())\n n := add(0x20, shl(5, mload(amounts)))\n pop(staticcall(gas(), 4, amounts, n, o, n))\n n := sub(add(o, returndatasize()), m)\n // Do the emit.\n log4(m, n, _TRANSFER_BATCH_EVENT_SIGNATURE, caller(), shr(96, from_), 0)\n }\n }\n if (_useAfterTokenTransfer()) {\n _afterTokenTransfer(from, address(0), ids, amounts, \"\");\n }\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* INTERNAL APPROVAL FUNCTIONS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Approve or remove the `operator` as an operator for `by`,\n /// without authorization checks.\n ///\n /// Emits a {ApprovalForAll} event.\n function _setApprovalForAll(address by, address operator, bool isApproved) internal virtual {\n /// @solidity memory-safe-assembly\n assembly {\n // Convert to 0 or 1.\n isApproved := iszero(iszero(isApproved))\n // Update the `isApproved` for (`by`, `operator`).\n mstore(0x20, _ERC1155_MASTER_SLOT_SEED)\n mstore(0x14, by)\n mstore(0x00, operator)\n sstore(keccak256(0x0c, 0x34), isApproved)\n // Emit the {ApprovalForAll} event.\n mstore(0x00, isApproved)\n let m := shr(96, not(0))\n log3(0x00, 0x20, _APPROVAL_FOR_ALL_EVENT_SIGNATURE, and(m, by), and(m, operator))\n }\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* INTERNAL TRANSFER FUNCTIONS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Equivalent to `_safeTransfer(address(0), from, to, id, amount, data)`.\n function _safeTransfer(address from, address to, uint256 id, uint256 amount, bytes memory data)\n internal\n virtual\n {\n _safeTransfer(address(0), from, to, id, amount, data);\n }\n\n /// @dev Transfers `amount` of `id` from `from` to `to`.\n ///\n /// Requirements:\n /// - `to` cannot be the zero address.\n /// - `from` must have at least `amount` of `id`.\n /// - If `by` is not the zero address, it must be either `from`,\n /// or approved to manage the tokens of `from`.\n /// - If `to` refers to a smart contract, it must implement\n /// {ERC1155-onERC1155Received}, which is called upon a batch transfer.\n ///\n /// Emits a {TransferSingle} event.\n function _safeTransfer(\n address by,\n address from,\n address to,\n uint256 id,\n uint256 amount,\n bytes memory data\n ) internal virtual {\n if (_useBeforeTokenTransfer()) {\n _beforeTokenTransfer(from, to, _single(id), _single(amount), data);\n }\n /// @solidity memory-safe-assembly\n assembly {\n let from_ := shl(96, from)\n let to_ := shl(96, to)\n // Revert if `to` is the zero address.\n if iszero(to_) {\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\n revert(0x1c, 0x04)\n }\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, from_))\n // If `by` is not the zero address, and not equal to `from`,\n // check if it is approved to manage all the tokens of `from`.\n let by_ := shl(96, by)\n if iszero(or(iszero(by_), eq(by_, from_))) {\n mstore(0x00, by)\n if iszero(sload(keccak256(0x0c, 0x34))) {\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\n revert(0x1c, 0x04)\n }\n }\n // Subtract and store the updated balance of `from`.\n {\n mstore(0x00, id)\n let fromBalanceSlot := keccak256(0x00, 0x40)\n let fromBalance := sload(fromBalanceSlot)\n if gt(amount, fromBalance) {\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\n revert(0x1c, 0x04)\n }\n sstore(fromBalanceSlot, sub(fromBalance, amount))\n }\n // Increase and store the updated balance of `to`.\n {\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, to_))\n let toBalanceSlot := keccak256(0x00, 0x40)\n let toBalanceBefore := sload(toBalanceSlot)\n let toBalanceAfter := add(toBalanceBefore, amount)\n if lt(toBalanceAfter, toBalanceBefore) {\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\n revert(0x1c, 0x04)\n }\n sstore(toBalanceSlot, toBalanceAfter)\n }\n // Emit a {TransferSingle} event.\n mstore(0x20, amount)\n // forgefmt: disable-next-line\n log4(0x00, 0x40, _TRANSFER_SINGLE_EVENT_SIGNATURE, caller(), shr(96, from_), shr(96, to_))\n }\n if (_useAfterTokenTransfer()) {\n _afterTokenTransfer(from, to, _single(id), _single(amount), data);\n }\n if (_hasCode(to)) _checkOnERC1155Received(from, to, id, amount, data);\n }\n\n /// @dev Equivalent to `_safeBatchTransfer(address(0), from, to, ids, amounts, data)`.\n function _safeBatchTransfer(\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory amounts,\n bytes memory data\n ) internal virtual {\n _safeBatchTransfer(address(0), from, to, ids, amounts, data);\n }\n\n /// @dev Transfers `amounts` of `ids` from `from` to `to`.\n ///\n /// Requirements:\n /// - `to` cannot be the zero address.\n /// - `ids` and `amounts` must have the same length.\n /// - `from` must have at least `amounts` of `ids`.\n /// - If `by` is not the zero address, it must be either `from`,\n /// or approved to manage the tokens of `from`.\n /// - If `to` refers to a smart contract, it must implement\n /// {ERC1155-onERC1155BatchReceived}, which is called upon a batch transfer.\n ///\n /// Emits a {TransferBatch} event.\n function _safeBatchTransfer(\n address by,\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory amounts,\n bytes memory data\n ) internal virtual {\n if (_useBeforeTokenTransfer()) {\n _beforeTokenTransfer(from, to, ids, amounts, data);\n }\n /// @solidity memory-safe-assembly\n assembly {\n if iszero(eq(mload(ids), mload(amounts))) {\n mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.\n revert(0x1c, 0x04)\n }\n let from_ := shl(96, from)\n let to_ := shl(96, to)\n // Revert if `to` is the zero address.\n if iszero(to_) {\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\n revert(0x1c, 0x04)\n }\n let fromSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, from_)\n let toSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, to_)\n mstore(0x20, fromSlotSeed)\n // If `by` is not the zero address, and not equal to `from`,\n // check if it is approved to manage all the tokens of `from`.\n let by_ := shl(96, by)\n if iszero(or(iszero(by_), eq(by_, from_))) {\n mstore(0x00, by)\n if iszero(sload(keccak256(0x0c, 0x34))) {\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\n revert(0x1c, 0x04)\n }\n }\n // Loop through all the `ids` and update the balances.\n {\n for { let i := shl(5, mload(ids)) } i { i := sub(i, 0x20) } {\n let amount := mload(add(amounts, i))\n // Subtract and store the updated balance of `from`.\n {\n mstore(0x20, fromSlotSeed)\n mstore(0x00, mload(add(ids, i)))\n let fromBalanceSlot := keccak256(0x00, 0x40)\n let fromBalance := sload(fromBalanceSlot)\n if gt(amount, fromBalance) {\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\n revert(0x1c, 0x04)\n }\n sstore(fromBalanceSlot, sub(fromBalance, amount))\n }\n // Increase and store the updated balance of `to`.\n {\n mstore(0x20, toSlotSeed)\n let toBalanceSlot := keccak256(0x00, 0x40)\n let toBalanceBefore := sload(toBalanceSlot)\n let toBalanceAfter := add(toBalanceBefore, amount)\n if lt(toBalanceAfter, toBalanceBefore) {\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\n revert(0x1c, 0x04)\n }\n sstore(toBalanceSlot, toBalanceAfter)\n }\n }\n }\n // Emit a {TransferBatch} event.\n {\n let m := mload(0x40)\n // Copy the `ids`.\n mstore(m, 0x40)\n let n := add(0x20, shl(5, mload(ids)))\n let o := add(m, 0x40)\n pop(staticcall(gas(), 4, ids, n, o, n))\n // Copy the `amounts`.\n mstore(add(m, 0x20), add(0x40, returndatasize()))\n o := add(o, returndatasize())\n n := add(0x20, shl(5, mload(amounts)))\n pop(staticcall(gas(), 4, amounts, n, o, n))\n n := sub(add(o, returndatasize()), m)\n // Do the emit.\n log4(m, n, _TRANSFER_BATCH_EVENT_SIGNATURE, caller(), shr(96, from_), shr(96, to_))\n }\n }\n if (_useAfterTokenTransfer()) {\n _afterTokenTransfer(from, to, ids, amounts, data);\n }\n if (_hasCode(to)) _checkOnERC1155BatchReceived(from, to, ids, amounts, data);\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* HOOKS FOR OVERRIDING */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Override this function to return true if `_beforeTokenTransfer` is used.\n /// This is to help the compiler avoid producing dead bytecode.\n function _useBeforeTokenTransfer() internal view virtual returns (bool) {\n return false;\n }\n\n /// @dev Hook that is called before any token transfer.\n /// This includes minting and burning, as well as batched variants.\n ///\n /// The same hook is called on both single and batched variants.\n /// For single transfers, the length of the `id` and `amount` arrays are 1.\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory amounts,\n bytes memory data\n ) internal virtual {}\n\n /// @dev Override this function to return true if `_afterTokenTransfer` is used.\n /// This is to help the compiler avoid producing dead bytecode.\n function _useAfterTokenTransfer() internal view virtual returns (bool) {\n return false;\n }\n\n /// @dev Hook that is called after any token transfer.\n /// This includes minting and burning, as well as batched variants.\n ///\n /// The same hook is called on both single and batched variants.\n /// For single transfers, the length of the `id` and `amount` arrays are 1.\n function _afterTokenTransfer(\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory amounts,\n bytes memory data\n ) internal virtual {}\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* PRIVATE HELPERS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Helper for calling the `_afterTokenTransfer` hook.\n /// This is to help the compiler avoid producing dead bytecode.\n function _afterTokenTransferCalldata(\n address from,\n address to,\n uint256[] calldata ids,\n uint256[] calldata amounts,\n bytes calldata data\n ) private {\n if (_useAfterTokenTransfer()) {\n _afterTokenTransfer(from, to, ids, amounts, data);\n }\n }\n\n /// @dev Returns if `a` has bytecode of non-zero length.\n function _hasCode(address a) private view returns (bool result) {\n /// @solidity memory-safe-assembly\n assembly {\n result := extcodesize(a) // Can handle dirty upper bits.\n }\n }\n\n /// @dev Perform a call to invoke {IERC1155Receiver-onERC1155Received} on `to`.\n /// Reverts if the target does not support the function correctly.\n function _checkOnERC1155Received(\n address from,\n address to,\n uint256 id,\n uint256 amount,\n bytes memory data\n ) private {\n /// @solidity memory-safe-assembly\n assembly {\n // Prepare the calldata.\n let m := mload(0x40)\n // `onERC1155Received(address,address,uint256,uint256,bytes)`.\n mstore(m, 0xf23a6e61)\n mstore(add(m, 0x20), caller())\n mstore(add(m, 0x40), shr(96, shl(96, from)))\n mstore(add(m, 0x60), id)\n mstore(add(m, 0x80), amount)\n mstore(add(m, 0xa0), 0xa0)\n let n := mload(data)\n mstore(add(m, 0xc0), n)\n if n { pop(staticcall(gas(), 4, add(data, 0x20), n, add(m, 0xe0), n)) }\n // Revert if the call reverts.\n if iszero(call(gas(), to, 0, add(m, 0x1c), add(0xc4, n), m, 0x20)) {\n if returndatasize() {\n // Bubble up the revert if the call reverts.\n returndatacopy(m, 0x00, returndatasize())\n revert(m, returndatasize())\n }\n }\n // Load the returndata and compare it with the function selector.\n if iszero(eq(mload(m), shl(224, 0xf23a6e61))) {\n mstore(0x00, 0x9c05499b) // `TransferToNonERC1155ReceiverImplementer()`.\n revert(0x1c, 0x04)\n }\n }\n }\n\n /// @dev Perform a call to invoke {IERC1155Receiver-onERC1155BatchReceived} on `to`.\n /// Reverts if the target does not support the function correctly.\n function _checkOnERC1155BatchReceived(\n address from,\n address to,\n uint256[] memory ids,\n uint256[] memory amounts,\n bytes memory data\n ) private {\n /// @solidity memory-safe-assembly\n assembly {\n // Prepare the calldata.\n let m := mload(0x40)\n // `onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)`.\n mstore(m, 0xbc197c81)\n mstore(add(m, 0x20), caller())\n mstore(add(m, 0x40), shr(96, shl(96, from)))\n // Copy the `ids`.\n mstore(add(m, 0x60), 0xa0)\n let n := add(0x20, shl(5, mload(ids)))\n let o := add(m, 0xc0)\n pop(staticcall(gas(), 4, ids, n, o, n))\n // Copy the `amounts`.\n let s := add(0xa0, returndatasize())\n mstore(add(m, 0x80), s)\n o := add(o, returndatasize())\n n := add(0x20, shl(5, mload(amounts)))\n pop(staticcall(gas(), 4, amounts, n, o, n))\n // Copy the `data`.\n mstore(add(m, 0xa0), add(s, returndatasize()))\n o := add(o, returndatasize())\n n := add(0x20, mload(data))\n pop(staticcall(gas(), 4, data, n, o, n))\n n := sub(add(o, returndatasize()), add(m, 0x1c))\n // Revert if the call reverts.\n if iszero(call(gas(), to, 0, add(m, 0x1c), n, m, 0x20)) {\n if returndatasize() {\n // Bubble up the revert if the call reverts.\n returndatacopy(m, 0x00, returndatasize())\n revert(m, returndatasize())\n }\n }\n // Load the returndata and compare it with the function selector.\n if iszero(eq(mload(m), shl(224, 0xbc197c81))) {\n mstore(0x00, 0x9c05499b) // `TransferToNonERC1155ReceiverImplementer()`.\n revert(0x1c, 0x04)\n }\n }\n }\n\n /// @dev Returns `x` in an array with a single element.\n function _single(uint256 x) private pure returns (uint256[] memory result) {\n /// @solidity memory-safe-assembly\n assembly {\n result := mload(0x40)\n mstore(0x40, add(result, 0x40))\n mstore(result, 1)\n mstore(add(result, 0x20), x)\n }\n }\n}\n" + }, + "lib/solady/src/utils/LibBytes.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\n/// @notice Library for byte related operations.\n/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibBytes.sol)\nlibrary LibBytes {\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* STRUCTS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Goated bytes storage struct that totally MOGs, no cap, fr.\n /// Uses less gas and bytecode than Solidity's native bytes storage. It's meta af.\n /// Packs length with the first 31 bytes if <255 bytes, so it’s mad tight.\n struct BytesStorage {\n bytes32 _spacer;\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* CONSTANTS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev The constant returned when the `search` is not found in the bytes.\n uint256 internal constant NOT_FOUND = type(uint256).max;\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* BYTE STORAGE OPERATIONS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Sets the value of the bytes storage `$` to `s`.\n function set(BytesStorage storage $, bytes memory s) internal {\n /// @solidity memory-safe-assembly\n assembly {\n let n := mload(s)\n let packed := or(0xff, shl(8, n))\n for { let i := 0 } 1 {} {\n if iszero(gt(n, 0xfe)) {\n i := 0x1f\n packed := or(n, shl(8, mload(add(s, i))))\n if iszero(gt(n, i)) { break }\n }\n let o := add(s, 0x20)\n mstore(0x00, $.slot)\n for { let p := keccak256(0x00, 0x20) } 1 {} {\n sstore(add(p, shr(5, i)), mload(add(o, i)))\n i := add(i, 0x20)\n if iszero(lt(i, n)) { break }\n }\n break\n }\n sstore($.slot, packed)\n }\n }\n\n /// @dev Sets the value of the bytes storage `$` to `s`.\n function setCalldata(BytesStorage storage $, bytes calldata s) internal {\n /// @solidity memory-safe-assembly\n assembly {\n let packed := or(0xff, shl(8, s.length))\n for { let i := 0 } 1 {} {\n if iszero(gt(s.length, 0xfe)) {\n i := 0x1f\n packed := or(s.length, shl(8, shr(8, calldataload(s.offset))))\n if iszero(gt(s.length, i)) { break }\n }\n mstore(0x00, $.slot)\n for { let p := keccak256(0x00, 0x20) } 1 {} {\n sstore(add(p, shr(5, i)), calldataload(add(s.offset, i)))\n i := add(i, 0x20)\n if iszero(lt(i, s.length)) { break }\n }\n break\n }\n sstore($.slot, packed)\n }\n }\n\n /// @dev Sets the value of the bytes storage `$` to the empty bytes.\n function clear(BytesStorage storage $) internal {\n delete $._spacer;\n }\n\n /// @dev Returns whether the value stored is `$` is the empty bytes \"\".\n function isEmpty(BytesStorage storage $) internal view returns (bool) {\n return uint256($._spacer) & 0xff == uint256(0);\n }\n\n /// @dev Returns the length of the value stored in `$`.\n function length(BytesStorage storage $) internal view returns (uint256 result) {\n result = uint256($._spacer);\n /// @solidity memory-safe-assembly\n assembly {\n let n := and(0xff, result)\n result := or(mul(shr(8, result), eq(0xff, n)), mul(n, iszero(eq(0xff, n))))\n }\n }\n\n /// @dev Returns the value stored in `$`.\n function get(BytesStorage storage $) internal view returns (bytes memory result) {\n /// @solidity memory-safe-assembly\n assembly {\n result := mload(0x40)\n let o := add(result, 0x20)\n let packed := sload($.slot)\n let n := shr(8, packed)\n for { let i := 0 } 1 {} {\n if iszero(eq(or(packed, 0xff), packed)) {\n mstore(o, packed)\n n := and(0xff, packed)\n i := 0x1f\n if iszero(gt(n, i)) { break }\n }\n mstore(0x00, $.slot)\n for { let p := keccak256(0x00, 0x20) } 1 {} {\n mstore(add(o, i), sload(add(p, shr(5, i))))\n i := add(i, 0x20)\n if iszero(lt(i, n)) { break }\n }\n break\n }\n mstore(result, n) // Store the length of the memory.\n mstore(add(o, n), 0) // Zeroize the slot after the bytes.\n mstore(0x40, add(add(o, n), 0x20)) // Allocate memory.\n }\n }\n\n /// @dev Returns the uint8 at index `i`. If out-of-bounds, returns 0.\n function uint8At(BytesStorage storage $, uint256 i) internal view returns (uint8 result) {\n /// @solidity memory-safe-assembly\n assembly {\n for { let packed := sload($.slot) } 1 {} {\n if iszero(eq(or(packed, 0xff), packed)) {\n if iszero(gt(i, 0x1e)) {\n result := byte(i, packed)\n break\n }\n if iszero(gt(i, and(0xff, packed))) {\n mstore(0x00, $.slot)\n let j := sub(i, 0x1f)\n result := byte(and(j, 0x1f), sload(add(keccak256(0x00, 0x20), shr(5, j))))\n }\n break\n }\n if iszero(gt(i, shr(8, packed))) {\n mstore(0x00, $.slot)\n result := byte(and(i, 0x1f), sload(add(keccak256(0x00, 0x20), shr(5, i))))\n }\n break\n }\n }\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* BYTES OPERATIONS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Returns `subject` all occurrences of `needle` replaced with `replacement`.\n function replace(bytes memory subject, bytes memory needle, bytes memory replacement)\n internal\n pure\n returns (bytes memory result)\n {\n /// @solidity memory-safe-assembly\n assembly {\n result := mload(0x40)\n let needleLen := mload(needle)\n let replacementLen := mload(replacement)\n let d := sub(result, subject) // Memory difference.\n let i := add(subject, 0x20) // Subject bytes pointer.\n mstore(0x00, add(i, mload(subject))) // End of subject.\n if iszero(gt(needleLen, mload(subject))) {\n let subjectSearchEnd := add(sub(mload(0x00), needleLen), 1)\n let h := 0 // The hash of `needle`.\n if iszero(lt(needleLen, 0x20)) { h := keccak256(add(needle, 0x20), needleLen) }\n let s := mload(add(needle, 0x20))\n for { let m := shl(3, sub(0x20, and(needleLen, 0x1f))) } 1 {} {\n let t := mload(i)\n // Whether the first `needleLen % 32` bytes of `subject` and `needle` matches.\n if iszero(shr(m, xor(t, s))) {\n if h {\n if iszero(eq(keccak256(i, needleLen), h)) {\n mstore(add(i, d), t)\n i := add(i, 1)\n if iszero(lt(i, subjectSearchEnd)) { break }\n continue\n }\n }\n // Copy the `replacement` one word at a time.\n for { let j := 0 } 1 {} {\n mstore(add(add(i, d), j), mload(add(add(replacement, 0x20), j)))\n j := add(j, 0x20)\n if iszero(lt(j, replacementLen)) { break }\n }\n d := sub(add(d, replacementLen), needleLen)\n if needleLen {\n i := add(i, needleLen)\n if iszero(lt(i, subjectSearchEnd)) { break }\n continue\n }\n }\n mstore(add(i, d), t)\n i := add(i, 1)\n if iszero(lt(i, subjectSearchEnd)) { break }\n }\n }\n let end := mload(0x00)\n let n := add(sub(d, add(result, 0x20)), end)\n // Copy the rest of the bytes one word at a time.\n for {} lt(i, end) { i := add(i, 0x20) } { mstore(add(i, d), mload(i)) }\n let o := add(i, d)\n mstore(o, 0) // Zeroize the slot after the bytes.\n mstore(0x40, add(o, 0x20)) // Allocate memory.\n mstore(result, n) // Store the length.\n }\n }\n\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\n /// needleing from left to right, starting from `from`.\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\n function indexOf(bytes memory subject, bytes memory needle, uint256 from)\n internal\n pure\n returns (uint256 result)\n {\n /// @solidity memory-safe-assembly\n assembly {\n result := not(0) // Initialize to `NOT_FOUND`.\n for { let subjectLen := mload(subject) } 1 {} {\n if iszero(mload(needle)) {\n result := from\n if iszero(gt(from, subjectLen)) { break }\n result := subjectLen\n break\n }\n let needleLen := mload(needle)\n let subjectStart := add(subject, 0x20)\n\n subject := add(subjectStart, from)\n let end := add(sub(add(subjectStart, subjectLen), needleLen), 1)\n let m := shl(3, sub(0x20, and(needleLen, 0x1f)))\n let s := mload(add(needle, 0x20))\n\n if iszero(and(lt(subject, end), lt(from, subjectLen))) { break }\n\n if iszero(lt(needleLen, 0x20)) {\n for { let h := keccak256(add(needle, 0x20), needleLen) } 1 {} {\n if iszero(shr(m, xor(mload(subject), s))) {\n if eq(keccak256(subject, needleLen), h) {\n result := sub(subject, subjectStart)\n break\n }\n }\n subject := add(subject, 1)\n if iszero(lt(subject, end)) { break }\n }\n break\n }\n for {} 1 {} {\n if iszero(shr(m, xor(mload(subject), s))) {\n result := sub(subject, subjectStart)\n break\n }\n subject := add(subject, 1)\n if iszero(lt(subject, end)) { break }\n }\n break\n }\n }\n }\n\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\n /// needleing from left to right.\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\n function indexOf(bytes memory subject, bytes memory needle) internal pure returns (uint256) {\n return indexOf(subject, needle, 0);\n }\n\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\n /// needleing from right to left, starting from `from`.\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\n function lastIndexOf(bytes memory subject, bytes memory needle, uint256 from)\n internal\n pure\n returns (uint256 result)\n {\n /// @solidity memory-safe-assembly\n assembly {\n for {} 1 {} {\n result := not(0) // Initialize to `NOT_FOUND`.\n let needleLen := mload(needle)\n if gt(needleLen, mload(subject)) { break }\n let w := result\n\n let fromMax := sub(mload(subject), needleLen)\n if iszero(gt(fromMax, from)) { from := fromMax }\n\n let end := add(add(subject, 0x20), w)\n subject := add(add(subject, 0x20), from)\n if iszero(gt(subject, end)) { break }\n // As this function is not too often used,\n // we shall simply use keccak256 for smaller bytecode size.\n for { let h := keccak256(add(needle, 0x20), needleLen) } 1 {} {\n if eq(keccak256(subject, needleLen), h) {\n result := sub(subject, add(end, 1))\n break\n }\n subject := add(subject, w) // `sub(subject, 1)`.\n if iszero(gt(subject, end)) { break }\n }\n break\n }\n }\n }\n\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\n /// needleing from right to left.\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\n function lastIndexOf(bytes memory subject, bytes memory needle)\n internal\n pure\n returns (uint256)\n {\n return lastIndexOf(subject, needle, type(uint256).max);\n }\n\n /// @dev Returns true if `needle` is found in `subject`, false otherwise.\n function contains(bytes memory subject, bytes memory needle) internal pure returns (bool) {\n return indexOf(subject, needle) != NOT_FOUND;\n }\n\n /// @dev Returns whether `subject` starts with `needle`.\n function startsWith(bytes memory subject, bytes memory needle)\n internal\n pure\n returns (bool result)\n {\n /// @solidity memory-safe-assembly\n assembly {\n let n := mload(needle)\n // Just using keccak256 directly is actually cheaper.\n let t := eq(keccak256(add(subject, 0x20), n), keccak256(add(needle, 0x20), n))\n result := lt(gt(n, mload(subject)), t)\n }\n }\n\n /// @dev Returns whether `subject` ends with `needle`.\n function endsWith(bytes memory subject, bytes memory needle)\n internal\n pure\n returns (bool result)\n {\n /// @solidity memory-safe-assembly\n assembly {\n let n := mload(needle)\n let notInRange := gt(n, mload(subject))\n // `subject + 0x20 + max(subject.length - needle.length, 0)`.\n let t := add(add(subject, 0x20), mul(iszero(notInRange), sub(mload(subject), n)))\n // Just using keccak256 directly is actually cheaper.\n result := gt(eq(keccak256(t, n), keccak256(add(needle, 0x20), n)), notInRange)\n }\n }\n\n /// @dev Returns `subject` repeated `times`.\n function repeat(bytes memory subject, uint256 times)\n internal\n pure\n returns (bytes memory result)\n {\n /// @solidity memory-safe-assembly\n assembly {\n let l := mload(subject) // Subject length.\n if iszero(or(iszero(times), iszero(l))) {\n result := mload(0x40)\n subject := add(subject, 0x20)\n let o := add(result, 0x20)\n for {} 1 {} {\n // Copy the `subject` one word at a time.\n for { let j := 0 } 1 {} {\n mstore(add(o, j), mload(add(subject, j)))\n j := add(j, 0x20)\n if iszero(lt(j, l)) { break }\n }\n o := add(o, l)\n times := sub(times, 1)\n if iszero(times) { break }\n }\n mstore(o, 0) // Zeroize the slot after the bytes.\n mstore(0x40, add(o, 0x20)) // Allocate memory.\n mstore(result, sub(o, add(result, 0x20))) // Store the length.\n }\n }\n }\n\n /// @dev Returns a copy of `subject` sliced from `start` to `end` (exclusive).\n /// `start` and `end` are byte offsets.\n function slice(bytes memory subject, uint256 start, uint256 end)\n internal\n pure\n returns (bytes memory result)\n {\n /// @solidity memory-safe-assembly\n assembly {\n let l := mload(subject) // Subject length.\n if iszero(gt(l, end)) { end := l }\n if iszero(gt(l, start)) { start := l }\n if lt(start, end) {\n result := mload(0x40)\n let n := sub(end, start)\n let i := add(subject, start)\n let w := not(0x1f)\n // Copy the `subject` one word at a time, backwards.\n for { let j := and(add(n, 0x1f), w) } 1 {} {\n mstore(add(result, j), mload(add(i, j)))\n j := add(j, w) // `sub(j, 0x20)`.\n if iszero(j) { break }\n }\n let o := add(add(result, 0x20), n)\n mstore(o, 0) // Zeroize the slot after the bytes.\n mstore(0x40, add(o, 0x20)) // Allocate memory.\n mstore(result, n) // Store the length.\n }\n }\n }\n\n /// @dev Returns a copy of `subject` sliced from `start` to the end of the bytes.\n /// `start` is a byte offset.\n function slice(bytes memory subject, uint256 start)\n internal\n pure\n returns (bytes memory result)\n {\n result = slice(subject, start, type(uint256).max);\n }\n\n /// @dev Returns a copy of `subject` sliced from `start` to `end` (exclusive).\n /// `start` and `end` are byte offsets. Faster than Solidity's native slicing.\n function sliceCalldata(bytes calldata subject, uint256 start, uint256 end)\n internal\n pure\n returns (bytes calldata result)\n {\n /// @solidity memory-safe-assembly\n assembly {\n end := xor(end, mul(xor(end, subject.length), lt(subject.length, end)))\n start := xor(start, mul(xor(start, subject.length), lt(subject.length, start)))\n result.offset := add(subject.offset, start)\n result.length := mul(lt(start, end), sub(end, start))\n }\n }\n\n /// @dev Returns a copy of `subject` sliced from `start` to the end of the bytes.\n /// `start` is a byte offset. Faster than Solidity's native slicing.\n function sliceCalldata(bytes calldata subject, uint256 start)\n internal\n pure\n returns (bytes calldata result)\n {\n /// @solidity memory-safe-assembly\n assembly {\n start := xor(start, mul(xor(start, subject.length), lt(subject.length, start)))\n result.offset := add(subject.offset, start)\n result.length := mul(lt(start, subject.length), sub(subject.length, start))\n }\n }\n\n /// @dev Reduces the size of `subject` to `n`.\n /// If `n` is greater than the size of `subject`, this will be a no-op.\n function truncate(bytes memory subject, uint256 n)\n internal\n pure\n returns (bytes memory result)\n {\n /// @solidity memory-safe-assembly\n assembly {\n result := subject\n mstore(mul(lt(n, mload(result)), result), n)\n }\n }\n\n /// @dev Returns a copy of `subject`, with the length reduced to `n`.\n /// If `n` is greater than the size of `subject`, this will be a no-op.\n function truncatedCalldata(bytes calldata subject, uint256 n)\n internal\n pure\n returns (bytes calldata result)\n {\n /// @solidity memory-safe-assembly\n assembly {\n result.offset := subject.offset\n result.length := xor(n, mul(xor(n, subject.length), lt(subject.length, n)))\n }\n }\n\n /// @dev Returns all the indices of `needle` in `subject`.\n /// The indices are byte offsets.\n function indicesOf(bytes memory subject, bytes memory needle)\n internal\n pure\n returns (uint256[] memory result)\n {\n /// @solidity memory-safe-assembly\n assembly {\n let searchLen := mload(needle)\n if iszero(gt(searchLen, mload(subject))) {\n result := mload(0x40)\n let i := add(subject, 0x20)\n let o := add(result, 0x20)\n let subjectSearchEnd := add(sub(add(i, mload(subject)), searchLen), 1)\n let h := 0 // The hash of `needle`.\n if iszero(lt(searchLen, 0x20)) { h := keccak256(add(needle, 0x20), searchLen) }\n let s := mload(add(needle, 0x20))\n for { let m := shl(3, sub(0x20, and(searchLen, 0x1f))) } 1 {} {\n let t := mload(i)\n // Whether the first `searchLen % 32` bytes of `subject` and `needle` matches.\n if iszero(shr(m, xor(t, s))) {\n if h {\n if iszero(eq(keccak256(i, searchLen), h)) {\n i := add(i, 1)\n if iszero(lt(i, subjectSearchEnd)) { break }\n continue\n }\n }\n mstore(o, sub(i, add(subject, 0x20))) // Append to `result`.\n o := add(o, 0x20)\n i := add(i, searchLen) // Advance `i` by `searchLen`.\n if searchLen {\n if iszero(lt(i, subjectSearchEnd)) { break }\n continue\n }\n }\n i := add(i, 1)\n if iszero(lt(i, subjectSearchEnd)) { break }\n }\n mstore(result, shr(5, sub(o, add(result, 0x20)))) // Store the length of `result`.\n // Allocate memory for result.\n // We allocate one more word, so this array can be recycled for {split}.\n mstore(0x40, add(o, 0x20))\n }\n }\n }\n\n /// @dev Returns an arrays of bytess based on the `delimiter` inside of the `subject` bytes.\n function split(bytes memory subject, bytes memory delimiter)\n internal\n pure\n returns (bytes[] memory result)\n {\n uint256[] memory indices = indicesOf(subject, delimiter);\n /// @solidity memory-safe-assembly\n assembly {\n let w := not(0x1f)\n let indexPtr := add(indices, 0x20)\n let indicesEnd := add(indexPtr, shl(5, add(mload(indices), 1)))\n mstore(add(indicesEnd, w), mload(subject))\n mstore(indices, add(mload(indices), 1))\n for { let prevIndex := 0 } 1 {} {\n let index := mload(indexPtr)\n mstore(indexPtr, 0x60)\n if iszero(eq(index, prevIndex)) {\n let element := mload(0x40)\n let l := sub(index, prevIndex)\n mstore(element, l) // Store the length of the element.\n // Copy the `subject` one word at a time, backwards.\n for { let o := and(add(l, 0x1f), w) } 1 {} {\n mstore(add(element, o), mload(add(add(subject, prevIndex), o)))\n o := add(o, w) // `sub(o, 0x20)`.\n if iszero(o) { break }\n }\n mstore(add(add(element, 0x20), l), 0) // Zeroize the slot after the bytes.\n // Allocate memory for the length and the bytes, rounded up to a multiple of 32.\n mstore(0x40, add(element, and(add(l, 0x3f), w)))\n mstore(indexPtr, element) // Store the `element` into the array.\n }\n prevIndex := add(index, mload(delimiter))\n indexPtr := add(indexPtr, 0x20)\n if iszero(lt(indexPtr, indicesEnd)) { break }\n }\n result := indices\n if iszero(mload(delimiter)) {\n result := add(indices, 0x20)\n mstore(result, sub(mload(indices), 2))\n }\n }\n }\n\n /// @dev Returns a concatenated bytes of `a` and `b`.\n /// Cheaper than `bytes.concat()` and does not de-align the free memory pointer.\n function concat(bytes memory a, bytes memory b) internal pure returns (bytes memory result) {\n /// @solidity memory-safe-assembly\n assembly {\n result := mload(0x40)\n let w := not(0x1f)\n let aLen := mload(a)\n // Copy `a` one word at a time, backwards.\n for { let o := and(add(aLen, 0x20), w) } 1 {} {\n mstore(add(result, o), mload(add(a, o)))\n o := add(o, w) // `sub(o, 0x20)`.\n if iszero(o) { break }\n }\n let bLen := mload(b)\n let output := add(result, aLen)\n // Copy `b` one word at a time, backwards.\n for { let o := and(add(bLen, 0x20), w) } 1 {} {\n mstore(add(output, o), mload(add(b, o)))\n o := add(o, w) // `sub(o, 0x20)`.\n if iszero(o) { break }\n }\n let totalLen := add(aLen, bLen)\n let last := add(add(result, 0x20), totalLen)\n mstore(last, 0) // Zeroize the slot after the bytes.\n mstore(result, totalLen) // Store the length.\n mstore(0x40, add(last, 0x20)) // Allocate memory.\n }\n }\n\n /// @dev Returns whether `a` equals `b`.\n function eq(bytes memory a, bytes memory b) internal pure returns (bool result) {\n /// @solidity memory-safe-assembly\n assembly {\n result := eq(keccak256(add(a, 0x20), mload(a)), keccak256(add(b, 0x20), mload(b)))\n }\n }\n\n /// @dev Returns whether `a` equals `b`, where `b` is a null-terminated small bytes.\n function eqs(bytes memory a, bytes32 b) internal pure returns (bool result) {\n /// @solidity memory-safe-assembly\n assembly {\n // These should be evaluated on compile time, as far as possible.\n let m := not(shl(7, div(not(iszero(b)), 255))) // `0x7f7f ...`.\n let x := not(or(m, or(b, add(m, and(b, m)))))\n let r := shl(7, iszero(iszero(shr(128, x))))\n r := or(r, shl(6, iszero(iszero(shr(64, shr(r, x))))))\n r := or(r, shl(5, lt(0xffffffff, shr(r, x))))\n r := or(r, shl(4, lt(0xffff, shr(r, x))))\n r := or(r, shl(3, lt(0xff, shr(r, x))))\n // forgefmt: disable-next-item\n result := gt(eq(mload(a), add(iszero(x), xor(31, shr(3, r)))),\n xor(shr(add(8, r), b), shr(add(8, r), mload(add(a, 0x20)))))\n }\n }\n\n /// @dev Returns 0 if `a == b`, -1 if `a < b`, +1 if `a > b`.\n /// If `a` == b[:a.length]`, and `a.length < b.length`, returns -1.\n function cmp(bytes memory a, bytes memory b) internal pure returns (int256 result) {\n /// @solidity memory-safe-assembly\n assembly {\n let aLen := mload(a)\n let bLen := mload(b)\n let n := and(xor(aLen, mul(xor(aLen, bLen), lt(bLen, aLen))), not(0x1f))\n if n {\n for { let i := 0x20 } 1 {} {\n let x := mload(add(a, i))\n let y := mload(add(b, i))\n if iszero(or(xor(x, y), eq(i, n))) {\n i := add(i, 0x20)\n continue\n }\n result := sub(gt(x, y), lt(x, y))\n break\n }\n }\n // forgefmt: disable-next-item\n if iszero(result) {\n let l := 0x201f1e1d1c1b1a191817161514131211100f0e0d0c0b0a090807060504030201\n let x := and(mload(add(add(a, 0x20), n)), shl(shl(3, byte(sub(aLen, n), l)), not(0)))\n let y := and(mload(add(add(b, 0x20), n)), shl(shl(3, byte(sub(bLen, n), l)), not(0)))\n result := sub(gt(x, y), lt(x, y))\n if iszero(result) { result := sub(gt(aLen, bLen), lt(aLen, bLen)) }\n }\n }\n }\n\n /// @dev Directly returns `a` without copying.\n function directReturn(bytes memory a) internal pure {\n /// @solidity memory-safe-assembly\n assembly {\n // Assumes that the bytes does not start from the scratch space.\n let retStart := sub(a, 0x20)\n let retUnpaddedSize := add(mload(a), 0x40)\n // Right pad with zeroes. Just in case the bytes is produced\n // by a method that doesn't zero right pad.\n mstore(add(retStart, retUnpaddedSize), 0)\n mstore(retStart, 0x20) // Store the return offset.\n // End the transaction, returning the bytes.\n return(retStart, and(not(0x1f), add(0x1f, retUnpaddedSize)))\n }\n }\n\n /// @dev Directly returns `a` with minimal copying.\n function directReturn(bytes[] memory a) internal pure {\n /// @solidity memory-safe-assembly\n assembly {\n let n := mload(a) // `a.length`.\n let o := add(a, 0x20) // Start of elements in `a`.\n let u := a // Highest memory slot.\n let w := not(0x1f)\n for { let i := 0 } iszero(eq(i, n)) { i := add(i, 1) } {\n let c := add(o, shl(5, i)) // Location of pointer to `a[i]`.\n let s := mload(c) // `a[i]`.\n let l := mload(s) // `a[i].length`.\n let r := and(l, 0x1f) // `a[i].length % 32`.\n let z := add(0x20, and(l, w)) // Offset of last word in `a[i]` from `s`.\n // If `s` comes before `o`, or `s` is not zero right padded.\n if iszero(lt(lt(s, o), or(iszero(r), iszero(shl(shl(3, r), mload(add(s, z))))))) {\n let m := mload(0x40)\n mstore(m, l) // Copy `a[i].length`.\n for {} 1 {} {\n mstore(add(m, z), mload(add(s, z))) // Copy `a[i]`, backwards.\n z := add(z, w) // `sub(z, 0x20)`.\n if iszero(z) { break }\n }\n let e := add(add(m, 0x20), l)\n mstore(e, 0) // Zeroize the slot after the copied bytes.\n mstore(0x40, add(e, 0x20)) // Allocate memory.\n s := m\n }\n mstore(c, sub(s, o)) // Convert to calldata offset.\n let t := add(l, add(s, 0x20))\n if iszero(lt(t, u)) { u := t }\n }\n let retStart := add(a, w) // Assumes `a` doesn't start from scratch space.\n mstore(retStart, 0x20) // Store the return offset.\n return(retStart, add(0x40, sub(u, retStart))) // End the transaction.\n }\n }\n\n /// @dev Returns the word at `offset`, without any bounds checks.\n function load(bytes memory a, uint256 offset) internal pure returns (bytes32 result) {\n /// @solidity memory-safe-assembly\n assembly {\n result := mload(add(add(a, 0x20), offset))\n }\n }\n\n /// @dev Returns the word at `offset`, without any bounds checks.\n function loadCalldata(bytes calldata a, uint256 offset)\n internal\n pure\n returns (bytes32 result)\n {\n /// @solidity memory-safe-assembly\n assembly {\n result := calldataload(add(a.offset, offset))\n }\n }\n\n /// @dev Returns a slice representing a static struct in the calldata. Performs bounds checks.\n function staticStructInCalldata(bytes calldata a, uint256 offset)\n internal\n pure\n returns (bytes calldata result)\n {\n /// @solidity memory-safe-assembly\n assembly {\n let l := sub(a.length, 0x20)\n result.offset := add(a.offset, offset)\n result.length := sub(a.length, offset)\n if or(shr(64, or(l, a.offset)), gt(offset, l)) { revert(l, 0x00) }\n }\n }\n\n /// @dev Returns a slice representing a dynamic struct in the calldata. Performs bounds checks.\n function dynamicStructInCalldata(bytes calldata a, uint256 offset)\n internal\n pure\n returns (bytes calldata result)\n {\n /// @solidity memory-safe-assembly\n assembly {\n let l := sub(a.length, 0x20)\n let s := calldataload(add(a.offset, offset)) // Relative offset of `result` from `a.offset`.\n result.offset := add(a.offset, s)\n result.length := sub(a.length, s)\n if or(shr(64, or(s, or(l, a.offset))), gt(offset, l)) { revert(l, 0x00) }\n }\n }\n\n /// @dev Returns bytes in calldata. Performs bounds checks.\n function bytesInCalldata(bytes calldata a, uint256 offset)\n internal\n pure\n returns (bytes calldata result)\n {\n /// @solidity memory-safe-assembly\n assembly {\n let l := sub(a.length, 0x20)\n let s := calldataload(add(a.offset, offset)) // Relative offset of `result` from `a.offset`.\n result.offset := add(add(a.offset, s), 0x20)\n result.length := calldataload(add(a.offset, s))\n // forgefmt: disable-next-item\n if or(shr(64, or(result.length, or(s, or(l, a.offset)))),\n or(gt(add(s, result.length), l), gt(offset, l))) { revert(l, 0x00) }\n }\n }\n\n /// @dev Returns empty calldata bytes. For silencing the compiler.\n function emptyCalldata() internal pure returns (bytes calldata result) {\n /// @solidity memory-safe-assembly\n assembly {\n result.length := 0\n }\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/access/IAccessControlEnumerable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControlEnumerable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IAccessControl.sol\";\n\n/**\n * @dev External interface of AccessControlEnumerable declared to support ERC165 detection.\n */\ninterface IAccessControlEnumerable is IAccessControl {\n /**\n * @dev Returns one of the accounts that have `role`. `index` must be a\n * value between 0 and {getRoleMemberCount}, non-inclusive.\n *\n * Role bearers are not sorted in any particular way, and their ordering may\n * change at any point.\n *\n * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure\n * you perform all queries on the same block. See the following\n * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]\n * for more information.\n */\n function getRoleMember(bytes32 role, uint256 index) external view returns (address);\n\n /**\n * @dev Returns the number of accounts that have `role`. Can be used\n * together with {getRoleMember} to enumerate all bearers of a role.\n */\n function getRoleMemberCount(bytes32 role) external view returns (uint256);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/access/AccessControl.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControl.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IAccessControl.sol\";\nimport \"../utils/Context.sol\";\nimport \"../utils/Strings.sol\";\nimport \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Contract module that allows children to implement role-based access\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\n * members except through off-chain means by accessing the contract event logs. Some\n * applications may benefit from on-chain enumerability, for those cases see\n * {AccessControlEnumerable}.\n *\n * Roles are referred to by their `bytes32` identifier. These should be exposed\n * in the external API and be unique. The best way to achieve this is by\n * using `public constant` hash digests:\n *\n * ```solidity\n * bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\");\n * ```\n *\n * Roles can be used to represent a set of permissions. To restrict access to a\n * function call, use {hasRole}:\n *\n * ```solidity\n * function foo() public {\n * require(hasRole(MY_ROLE, msg.sender));\n * ...\n * }\n * ```\n *\n * Roles can be granted and revoked dynamically via the {grantRole} and\n * {revokeRole} functions. Each role has an associated admin role, and only\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\n *\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\n * that only accounts with this role will be able to grant or revoke other\n * roles. More complex role relationships can be created by using\n * {_setRoleAdmin}.\n *\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\n * grant and revoke this role. Extra precautions should be taken to secure\n * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}\n * to enforce additional security measures for this role.\n */\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\n struct RoleData {\n mapping(address => bool) members;\n bytes32 adminRole;\n }\n\n mapping(bytes32 => RoleData) private _roles;\n\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\n\n /**\n * @dev Modifier that checks that an account has a specific role. Reverts\n * with a standardized message including the required role.\n *\n * The format of the revert reason is given by the following regular expression:\n *\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\n *\n * _Available since v4.1._\n */\n modifier onlyRole(bytes32 role) {\n _checkRole(role);\n _;\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\n return _roles[role].members[account];\n }\n\n /**\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\n * Overriding this function changes the behavior of the {onlyRole} modifier.\n *\n * Format of the revert message is described in {_checkRole}.\n *\n * _Available since v4.6._\n */\n function _checkRole(bytes32 role) internal view virtual {\n _checkRole(role, _msgSender());\n }\n\n /**\n * @dev Revert with a standard message if `account` is missing `role`.\n *\n * The format of the revert reason is given by the following regular expression:\n *\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\n */\n function _checkRole(bytes32 role, address account) internal view virtual {\n if (!hasRole(role, account)) {\n revert(\n string(\n abi.encodePacked(\n \"AccessControl: account \",\n Strings.toHexString(account),\n \" is missing role \",\n Strings.toHexString(uint256(role), 32)\n )\n )\n );\n }\n }\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\n return _roles[role].adminRole;\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleGranted} event.\n */\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\n _grantRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n *\n * May emit a {RoleRevoked} event.\n */\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\n _revokeRole(role, account);\n }\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `account`.\n *\n * May emit a {RoleRevoked} event.\n */\n function renounceRole(bytes32 role, address account) public virtual override {\n require(account == _msgSender(), \"AccessControl: can only renounce roles for self\");\n\n _revokeRole(role, account);\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event. Note that unlike {grantRole}, this function doesn't perform any\n * checks on the calling account.\n *\n * May emit a {RoleGranted} event.\n *\n * [WARNING]\n * ====\n * This function should only be called from the constructor when setting\n * up the initial roles for the system.\n *\n * Using this function in any other way is effectively circumventing the admin\n * system imposed by {AccessControl}.\n * ====\n *\n * NOTE: This function is deprecated in favor of {_grantRole}.\n */\n function _setupRole(bytes32 role, address account) internal virtual {\n _grantRole(role, account);\n }\n\n /**\n * @dev Sets `adminRole` as ``role``'s admin role.\n *\n * Emits a {RoleAdminChanged} event.\n */\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\n bytes32 previousAdminRole = getRoleAdmin(role);\n _roles[role].adminRole = adminRole;\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\n }\n\n /**\n * @dev Grants `role` to `account`.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleGranted} event.\n */\n function _grantRole(bytes32 role, address account) internal virtual {\n if (!hasRole(role, account)) {\n _roles[role].members[account] = true;\n emit RoleGranted(role, account, _msgSender());\n }\n }\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * Internal function without access restriction.\n *\n * May emit a {RoleRevoked} event.\n */\n function _revokeRole(bytes32 role, address account) internal virtual {\n if (hasRole(role, account)) {\n _roles[role].members[account] = false;\n emit RoleRevoked(role, account, _msgSender());\n }\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/EnumerableSet.sol)\n// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Library for managing\n * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive\n * types.\n *\n * Sets have the following properties:\n *\n * - Elements are added, removed, and checked for existence in constant time\n * (O(1)).\n * - Elements are enumerated in O(n). No guarantees are made on the ordering.\n *\n * ```solidity\n * contract Example {\n * // Add the library methods\n * using EnumerableSet for EnumerableSet.AddressSet;\n *\n * // Declare a set state variable\n * EnumerableSet.AddressSet private mySet;\n * }\n * ```\n *\n * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)\n * and `uint256` (`UintSet`) are supported.\n *\n * [WARNING]\n * ====\n * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure\n * unusable.\n * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.\n *\n * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an\n * array of EnumerableSet.\n * ====\n */\nlibrary EnumerableSet {\n // To implement this library for multiple types with as little code\n // repetition as possible, we write it in terms of a generic Set type with\n // bytes32 values.\n // The Set implementation uses private functions, and user-facing\n // implementations (such as AddressSet) are just wrappers around the\n // underlying Set.\n // This means that we can only create new EnumerableSets for types that fit\n // in bytes32.\n\n struct Set {\n // Storage of set values\n bytes32[] _values;\n // Position of the value in the `values` array, plus 1 because index 0\n // means a value is not in the set.\n mapping(bytes32 => uint256) _indexes;\n }\n\n /**\n * @dev Add a value to a set. O(1).\n *\n * Returns true if the value was added to the set, that is if it was not\n * already present.\n */\n function _add(Set storage set, bytes32 value) private returns (bool) {\n if (!_contains(set, value)) {\n set._values.push(value);\n // The value is stored at length-1, but we add 1 to all indexes\n // and use 0 as a sentinel value\n set._indexes[value] = set._values.length;\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the value was removed from the set, that is if it was\n * present.\n */\n function _remove(Set storage set, bytes32 value) private returns (bool) {\n // We read and store the value's index to prevent multiple reads from the same storage slot\n uint256 valueIndex = set._indexes[value];\n\n if (valueIndex != 0) {\n // Equivalent to contains(set, value)\n // To delete an element from the _values array in O(1), we swap the element to delete with the last one in\n // the array, and then remove the last element (sometimes called as 'swap and pop').\n // This modifies the order of the array, as noted in {at}.\n\n uint256 toDeleteIndex = valueIndex - 1;\n uint256 lastIndex = set._values.length - 1;\n\n if (lastIndex != toDeleteIndex) {\n bytes32 lastValue = set._values[lastIndex];\n\n // Move the last value to the index where the value to delete is\n set._values[toDeleteIndex] = lastValue;\n // Update the index for the moved value\n set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex\n }\n\n // Delete the slot where the moved value was stored\n set._values.pop();\n\n // Delete the index for the deleted slot\n delete set._indexes[value];\n\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * @dev Returns true if the value is in the set. O(1).\n */\n function _contains(Set storage set, bytes32 value) private view returns (bool) {\n return set._indexes[value] != 0;\n }\n\n /**\n * @dev Returns the number of values on the set. O(1).\n */\n function _length(Set storage set) private view returns (uint256) {\n return set._values.length;\n }\n\n /**\n * @dev Returns the value stored at position `index` in the set. O(1).\n *\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function _at(Set storage set, uint256 index) private view returns (bytes32) {\n return set._values[index];\n }\n\n /**\n * @dev Return the entire set in an array\n *\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\n */\n function _values(Set storage set) private view returns (bytes32[] memory) {\n return set._values;\n }\n\n // Bytes32Set\n\n struct Bytes32Set {\n Set _inner;\n }\n\n /**\n * @dev Add a value to a set. O(1).\n *\n * Returns true if the value was added to the set, that is if it was not\n * already present.\n */\n function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {\n return _add(set._inner, value);\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the value was removed from the set, that is if it was\n * present.\n */\n function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {\n return _remove(set._inner, value);\n }\n\n /**\n * @dev Returns true if the value is in the set. O(1).\n */\n function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {\n return _contains(set._inner, value);\n }\n\n /**\n * @dev Returns the number of values in the set. O(1).\n */\n function length(Bytes32Set storage set) internal view returns (uint256) {\n return _length(set._inner);\n }\n\n /**\n * @dev Returns the value stored at position `index` in the set. O(1).\n *\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {\n return _at(set._inner, index);\n }\n\n /**\n * @dev Return the entire set in an array\n *\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\n */\n function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {\n bytes32[] memory store = _values(set._inner);\n bytes32[] memory result;\n\n /// @solidity memory-safe-assembly\n assembly {\n result := store\n }\n\n return result;\n }\n\n // AddressSet\n\n struct AddressSet {\n Set _inner;\n }\n\n /**\n * @dev Add a value to a set. O(1).\n *\n * Returns true if the value was added to the set, that is if it was not\n * already present.\n */\n function add(AddressSet storage set, address value) internal returns (bool) {\n return _add(set._inner, bytes32(uint256(uint160(value))));\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the value was removed from the set, that is if it was\n * present.\n */\n function remove(AddressSet storage set, address value) internal returns (bool) {\n return _remove(set._inner, bytes32(uint256(uint160(value))));\n }\n\n /**\n * @dev Returns true if the value is in the set. O(1).\n */\n function contains(AddressSet storage set, address value) internal view returns (bool) {\n return _contains(set._inner, bytes32(uint256(uint160(value))));\n }\n\n /**\n * @dev Returns the number of values in the set. O(1).\n */\n function length(AddressSet storage set) internal view returns (uint256) {\n return _length(set._inner);\n }\n\n /**\n * @dev Returns the value stored at position `index` in the set. O(1).\n *\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(AddressSet storage set, uint256 index) internal view returns (address) {\n return address(uint160(uint256(_at(set._inner, index))));\n }\n\n /**\n * @dev Return the entire set in an array\n *\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\n */\n function values(AddressSet storage set) internal view returns (address[] memory) {\n bytes32[] memory store = _values(set._inner);\n address[] memory result;\n\n /// @solidity memory-safe-assembly\n assembly {\n result := store\n }\n\n return result;\n }\n\n // UintSet\n\n struct UintSet {\n Set _inner;\n }\n\n /**\n * @dev Add a value to a set. O(1).\n *\n * Returns true if the value was added to the set, that is if it was not\n * already present.\n */\n function add(UintSet storage set, uint256 value) internal returns (bool) {\n return _add(set._inner, bytes32(value));\n }\n\n /**\n * @dev Removes a value from a set. O(1).\n *\n * Returns true if the value was removed from the set, that is if it was\n * present.\n */\n function remove(UintSet storage set, uint256 value) internal returns (bool) {\n return _remove(set._inner, bytes32(value));\n }\n\n /**\n * @dev Returns true if the value is in the set. O(1).\n */\n function contains(UintSet storage set, uint256 value) internal view returns (bool) {\n return _contains(set._inner, bytes32(value));\n }\n\n /**\n * @dev Returns the number of values in the set. O(1).\n */\n function length(UintSet storage set) internal view returns (uint256) {\n return _length(set._inner);\n }\n\n /**\n * @dev Returns the value stored at position `index` in the set. O(1).\n *\n * Note that there are no guarantees on the ordering of values inside the\n * array, and it may change when more values are added or removed.\n *\n * Requirements:\n *\n * - `index` must be strictly less than {length}.\n */\n function at(UintSet storage set, uint256 index) internal view returns (uint256) {\n return uint256(_at(set._inner, index));\n }\n\n /**\n * @dev Return the entire set in an array\n *\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\n */\n function values(UintSet storage set) internal view returns (uint256[] memory) {\n bytes32[] memory store = _values(set._inner);\n uint256[] memory result;\n\n /// @solidity memory-safe-assembly\n assembly {\n result := store\n }\n\n return result;\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/interfaces/IERC2981.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC2981.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/introspection/IERC165.sol\";\n\n/**\n * @dev Interface for the NFT Royalty Standard.\n *\n * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal\n * support for royalty payments across all NFT marketplaces and ecosystem participants.\n *\n * _Available since v4.5._\n */\ninterface IERC2981 is IERC165 {\n /**\n * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of\n * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.\n */\n function royaltyInfo(\n uint256 tokenId,\n uint256 salePrice\n ) external view returns (address receiver, uint256 royaltyAmount);\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n *\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" + }, + "lib/signals-implicit-mode/src/registry/IImplicitProjectValidation.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.13;\n\nimport { Attestation } from \"sequence-v3/src/extensions/sessions/implicit/Attestation.sol\";\n\n/// @title IImplicitProjectValidation\n/// @author Michael Standen\n/// @notice Interface for contracts supporting validation of implicit sessions for projects\ninterface IImplicitProjectValidation {\n\n /// @notice Invalid redirect url error\n error InvalidRedirectUrl();\n\n /// @notice Check if a project has a code\n /// @param wallet The wallet address\n /// @param attestation The attestation\n /// @param projectId The project id\n /// @return magic The attestation magic bytes for the wallet address\n function validateAttestation(\n address wallet,\n Attestation calldata attestation,\n bytes32 projectId\n ) external view returns (bytes32);\n\n}\n" + }, + "lib/signals-implicit-mode/lib/sequence-v3/src/extensions/sessions/implicit/Attestation.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.27;\n\nimport { LibBytes } from \"../../../utils/LibBytes.sol\";\nimport { ACCEPT_IMPLICIT_REQUEST_MAGIC_PREFIX } from \"./ISignalsImplicitMode.sol\";\n\nusing LibBytes for bytes;\n\n/// @notice Attestation for a specific session\n/// @param approvedSigner Address of the approved signer\n/// @param identityType Identity type\n/// @param issuerHash Hash of the issuer\n/// @param audienceHash Hash of the audience\n/// @param applicationData Unspecified application data\n/// @param authData Auth data\nstruct Attestation {\n address approvedSigner;\n bytes4 identityType;\n bytes32 issuerHash;\n bytes32 audienceHash;\n bytes applicationData;\n AuthData authData;\n}\n\n/// @notice Auth data for an attestation\n/// @param redirectUrl Authorization redirect URL\n/// @param issuedAt Timestamp of the attestation issuance\nstruct AuthData {\n string redirectUrl;\n uint64 issuedAt;\n}\n\n/// @title LibAttestation\n/// @author Michael Standen\n/// @notice Library for attestation management\nlibrary LibAttestation {\n\n /// @notice Hashes an attestation\n function toHash(\n Attestation memory attestation\n ) internal pure returns (bytes32) {\n return keccak256(toPacked(attestation));\n }\n\n /// @notice Decodes an attestation from a packed bytes array\n /// @param encoded The packed bytes array\n /// @param pointer The pointer to the start of the attestation\n /// @return attestation The decoded attestation\n /// @return newPointer The new pointer to the end of the attestation\n function fromPacked(\n bytes calldata encoded,\n uint256 pointer\n ) internal pure returns (Attestation memory attestation, uint256 newPointer) {\n newPointer = pointer;\n (attestation.approvedSigner, newPointer) = encoded.readAddress(newPointer);\n (attestation.identityType, newPointer) = encoded.readBytes4(newPointer);\n (attestation.issuerHash, newPointer) = encoded.readBytes32(newPointer);\n (attestation.audienceHash, newPointer) = encoded.readBytes32(newPointer);\n // Application data (arbitrary bytes)\n uint256 dataSize;\n (dataSize, newPointer) = encoded.readUint24(newPointer);\n attestation.applicationData = encoded[newPointer:newPointer + dataSize];\n newPointer += dataSize;\n // Auth data\n (attestation.authData, newPointer) = fromPackedAuthData(encoded, newPointer);\n return (attestation, newPointer);\n }\n\n /// @notice Decodes the auth data from a packed bytes\n /// @param encoded The packed bytes containing the auth data\n /// @param pointer The pointer to the start of the auth data within the encoded data\n /// @return authData The decoded auth data\n /// @return newPointer The pointer to the end of the auth data within the encoded data\n function fromPackedAuthData(\n bytes calldata encoded,\n uint256 pointer\n ) internal pure returns (AuthData memory authData, uint256 newPointer) {\n uint24 redirectUrlLength;\n (redirectUrlLength, pointer) = encoded.readUint24(pointer);\n authData.redirectUrl = string(encoded[pointer:pointer + redirectUrlLength]);\n pointer += redirectUrlLength;\n (authData.issuedAt, pointer) = encoded.readUint64(pointer);\n return (authData, pointer);\n }\n\n /// @notice Encodes an attestation into a packed bytes array\n /// @param attestation The attestation to encode\n /// @return encoded The packed bytes array\n function toPacked(\n Attestation memory attestation\n ) internal pure returns (bytes memory encoded) {\n return abi.encodePacked(\n attestation.approvedSigner,\n attestation.identityType,\n attestation.issuerHash,\n attestation.audienceHash,\n uint24(attestation.applicationData.length),\n attestation.applicationData,\n toPackAuthData(attestation.authData)\n );\n }\n\n /// @notice Encodes the auth data into a packed bytes array\n /// @param authData The auth data to encode\n /// @return encoded The packed bytes array\n function toPackAuthData(\n AuthData memory authData\n ) internal pure returns (bytes memory encoded) {\n return abi.encodePacked(uint24(bytes(authData.redirectUrl).length), bytes(authData.redirectUrl), authData.issuedAt);\n }\n\n /// @notice Generates the implicit request magic return value\n /// @param attestation The attestation\n /// @param wallet The wallet\n /// @return magic The expected implicit request magic\n function generateImplicitRequestMagic(Attestation memory attestation, address wallet) internal pure returns (bytes32) {\n return keccak256(\n abi.encodePacked(ACCEPT_IMPLICIT_REQUEST_MAGIC_PREFIX, wallet, attestation.audienceHash, attestation.issuerHash)\n );\n }\n\n}\n" + }, + "lib/signals-implicit-mode/lib/sequence-v3/src/extensions/sessions/implicit/ISignalsImplicitMode.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.27;\n\nimport { Payload } from \"../../../modules/Payload.sol\";\nimport { Attestation } from \"./Attestation.sol\";\n\n/// @dev Magic prefix for the implicit request\nbytes32 constant ACCEPT_IMPLICIT_REQUEST_MAGIC_PREFIX = keccak256(abi.encodePacked(\"acceptImplicitRequest\"));\n\n/// @title ISignalsImplicitMode\n/// @author Agustin Aguilar, Michael Standen\n/// @notice Interface for the contracts that support implicit mode validation\ninterface ISignalsImplicitMode {\n\n /// @notice Determines if an implicit request is valid\n /// @param wallet The wallet's address\n /// @param attestation The attestation data\n /// @param call The call to validate\n /// @return magic The hash of the implicit request if valid\n function acceptImplicitRequest(\n address wallet,\n Attestation calldata attestation,\n Payload.Call calldata call\n ) external view returns (bytes32 magic);\n\n}\n" + }, + "lib/signals-implicit-mode/lib/sequence-v3/src/modules/Payload.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.27;\n\nimport { LibBytes } from \"../utils/LibBytes.sol\";\n\nusing LibBytes for bytes;\n\n/// @title Payload\n/// @author Agustin Aguilar, Michael Standen, William Hua\n/// @notice Library for encoding and decoding payloads\nlibrary Payload {\n\n /// @notice Error thrown when the kind is invalid\n error InvalidKind(uint8 kind);\n\n /// @dev keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\")\n bytes32 private constant EIP712_DOMAIN_TYPEHASH = 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f;\n\n /// @dev keccak256(\"Sequence Wallet\")\n bytes32 private constant EIP712_DOMAIN_NAME_SEQUENCE =\n 0x4aa45ca7ad825ceb1bf35643f0a58c295239df563b1b565c2485f96477c56318;\n\n /// @dev keccak256(\"3\")\n bytes32 private constant EIP712_DOMAIN_VERSION_SEQUENCE =\n 0x2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de;\n\n function domainSeparator(bool _noChainId, address _wallet) internal view returns (bytes32 _domainSeparator) {\n return keccak256(\n abi.encode(\n EIP712_DOMAIN_TYPEHASH,\n EIP712_DOMAIN_NAME_SEQUENCE,\n EIP712_DOMAIN_VERSION_SEQUENCE,\n _noChainId ? uint256(0) : uint256(block.chainid),\n _wallet\n )\n );\n }\n\n /// @dev keccak256(\"Call(address to,uint256 value,bytes data,uint256 gasLimit,bool delegateCall,bool onlyFallback,uint256 behaviorOnError)\")\n bytes32 private constant CALL_TYPEHASH = 0x0603985259a953da1f65a522f589c17bd1d0117ec1d3abb7c0788aef251ef437;\n\n /// @dev keccak256(\"Calls(Call[] calls,uint256 space,uint256 nonce,address[] wallets)Call(address to,uint256 value,bytes data,uint256 gasLimit,bool delegateCall,bool onlyFallback,uint256 behaviorOnError)\")\n bytes32 private constant CALLS_TYPEHASH = 0x11e1e4079a79a66e4ade50033cfe2678cdd5341d2dfe5ef9513edb1a0be147a2;\n\n /// @dev keccak256(\"Message(bytes message,address[] wallets)\")\n bytes32 private constant MESSAGE_TYPEHASH = 0xe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d466;\n\n /// @dev keccak256(\"ConfigUpdate(bytes32 imageHash,address[] wallets)\")\n bytes32 private constant CONFIG_UPDATE_TYPEHASH = 0x11fdeb7e8373a1aa96bfac8d0ea91526b2c5d15e5cee20e0543e780258f3e8e4;\n\n /// @notice Kind of transaction\n uint8 public constant KIND_TRANSACTIONS = 0x00;\n /// @notice Kind of digest\n uint8 public constant KIND_MESSAGE = 0x01;\n /// @notice Kind of config update\n uint8 public constant KIND_CONFIG_UPDATE = 0x02;\n /// @notice Kind of message\n uint8 public constant KIND_DIGEST = 0x03;\n\n /// @notice Behavior on error: ignore error\n uint8 public constant BEHAVIOR_IGNORE_ERROR = 0x00;\n /// @notice Behavior on error: revert on error\n uint8 public constant BEHAVIOR_REVERT_ON_ERROR = 0x01;\n /// @notice Behavior on error: abort on error\n uint8 public constant BEHAVIOR_ABORT_ON_ERROR = 0x02;\n\n /// @notice Payload call information\n /// @param to Address of the target contract\n /// @param value Value to send with the call\n /// @param data Data to send with the call\n /// @param gasLimit Gas limit for the call\n /// @param delegateCall If the call is a delegate call\n /// @param onlyFallback If the call should only be executed in an error scenario\n /// @param behaviorOnError Behavior on error\n struct Call {\n address to;\n uint256 value;\n bytes data;\n uint256 gasLimit;\n bool delegateCall;\n bool onlyFallback;\n uint256 behaviorOnError;\n }\n\n /// @notice Decoded payload\n /// @param kind Kind of payload\n /// @param noChainId If the chain ID should be omitted\n /// @param calls Array of calls (transaction kind)\n /// @param space Nonce space for the calls (transaction kind)\n /// @param nonce Nonce value for the calls (transaction kind)\n /// @param message Message to validate (message kind)\n /// @param imageHash Image hash to update to (config update kind)\n /// @param digest Digest to validate (digest kind)\n /// @param parentWallets Parent wallets\n struct Decoded {\n uint8 kind;\n bool noChainId;\n // Transaction kind\n Call[] calls;\n uint256 space;\n uint256 nonce;\n // Message kind\n // TODO: Maybe native 721 ?\n bytes message;\n // Config update kind\n bytes32 imageHash;\n // Digest kind for 1271\n bytes32 digest;\n // Parent wallets\n address[] parentWallets;\n }\n\n function fromMessage(\n bytes memory message\n ) internal pure returns (Decoded memory _decoded) {\n _decoded.kind = KIND_MESSAGE;\n _decoded.message = message;\n }\n\n function fromConfigUpdate(\n bytes32 imageHash\n ) internal pure returns (Decoded memory _decoded) {\n _decoded.kind = KIND_CONFIG_UPDATE;\n _decoded.imageHash = imageHash;\n }\n\n function fromDigest(\n bytes32 digest\n ) internal pure returns (Decoded memory _decoded) {\n _decoded.kind = KIND_DIGEST;\n _decoded.digest = digest;\n }\n\n function fromPackedCalls(\n bytes calldata packed\n ) internal view returns (Decoded memory _decoded) {\n _decoded.kind = KIND_TRANSACTIONS;\n\n // Read the global flag\n (uint256 globalFlag, uint256 pointer) = packed.readFirstUint8();\n\n // First bit determines if space is zero or not\n if (globalFlag & 0x01 == 0x01) {\n _decoded.space = 0;\n } else {\n (_decoded.space, pointer) = packed.readUint160(pointer);\n }\n\n // Next 3 bits determine the size of the nonce\n uint256 nonceSize = (globalFlag >> 1) & 0x07;\n\n if (nonceSize > 0) {\n // Read the nonce\n (_decoded.nonce, pointer) = packed.readUintX(pointer, nonceSize);\n }\n\n uint256 numCalls;\n\n // Bit 5 determines if the batch contains a single call\n if (globalFlag & 0x10 == 0x10) {\n numCalls = 1;\n } else {\n // Bit 6 determines if the number of calls uses 1 byte or 2 bytes\n if (globalFlag & 0x20 == 0x20) {\n (numCalls, pointer) = packed.readUint16(pointer);\n } else {\n (numCalls, pointer) = packed.readUint8(pointer);\n }\n }\n\n // Read the calls\n _decoded.calls = new Call[](numCalls);\n\n for (uint256 i = 0; i < numCalls; i++) {\n uint8 flags;\n (flags, pointer) = packed.readUint8(pointer);\n\n // First bit determines if this is a call to self\n // or a call to another address\n if (flags & 0x01 == 0x01) {\n // Call to self\n _decoded.calls[i].to = address(this);\n } else {\n // Call to another address\n (_decoded.calls[i].to, pointer) = packed.readAddress(pointer);\n }\n\n // Second bit determines if the call has value or not\n if (flags & 0x02 == 0x02) {\n (_decoded.calls[i].value, pointer) = packed.readUint256(pointer);\n }\n\n // Third bit determines if the call has data or not\n if (flags & 0x04 == 0x04) {\n // 3 bytes determine the size of the calldata\n uint256 calldataSize;\n (calldataSize, pointer) = packed.readUint24(pointer);\n _decoded.calls[i].data = packed[pointer:pointer + calldataSize];\n pointer += calldataSize;\n }\n\n // Fourth bit determines if the call has a gas limit or not\n if (flags & 0x08 == 0x08) {\n (_decoded.calls[i].gasLimit, pointer) = packed.readUint256(pointer);\n }\n\n // Fifth bit determines if the call is a delegate call or not\n _decoded.calls[i].delegateCall = (flags & 0x10 == 0x10);\n\n // Sixth bit determines if the call is fallback only\n _decoded.calls[i].onlyFallback = (flags & 0x20 == 0x20);\n\n // Last 2 bits are directly mapped to the behavior on error\n _decoded.calls[i].behaviorOnError = (flags & 0xC0) >> 6;\n }\n }\n\n function hashCall(\n Call memory c\n ) internal pure returns (bytes32) {\n return keccak256(\n abi.encode(\n CALL_TYPEHASH, c.to, c.value, keccak256(c.data), c.gasLimit, c.delegateCall, c.onlyFallback, c.behaviorOnError\n )\n );\n }\n\n function hashCalls(\n Call[] memory calls\n ) internal pure returns (bytes32) {\n // In EIP712, an array is often hashed as the keccak256 of the concatenated\n // hashes of each item. So we hash each Call, pack them, and hash again.\n bytes32[] memory callHashes = new bytes32[](calls.length);\n for (uint256 i = 0; i < calls.length; i++) {\n callHashes[i] = hashCall(calls[i]);\n }\n return keccak256(abi.encodePacked(callHashes));\n }\n\n function toEIP712(\n Decoded memory _decoded\n ) internal pure returns (bytes32) {\n bytes32 walletsHash = keccak256(abi.encodePacked(_decoded.parentWallets));\n\n if (_decoded.kind == KIND_TRANSACTIONS) {\n bytes32 callsHash = hashCalls(_decoded.calls);\n // The top-level struct for Calls might be something like:\n // Calls(bytes32 callsHash,uint256 space,uint256 nonce,bytes32 walletsHash)\n return keccak256(abi.encode(CALLS_TYPEHASH, callsHash, _decoded.space, _decoded.nonce, walletsHash));\n } else if (_decoded.kind == KIND_MESSAGE) {\n // If you define your top-level as: Message(bytes32 messageHash,bytes32 walletsHash)\n return keccak256(abi.encode(MESSAGE_TYPEHASH, keccak256(_decoded.message), walletsHash));\n } else if (_decoded.kind == KIND_CONFIG_UPDATE) {\n // Top-level: ConfigUpdate(bytes32 imageHash,bytes32 walletsHash)\n return keccak256(abi.encode(CONFIG_UPDATE_TYPEHASH, _decoded.imageHash, walletsHash));\n } else if (_decoded.kind == KIND_DIGEST) {\n // Top-level: Use MESSAGE_TYPEHASH but assume the digest is already the hashed message\n return keccak256(abi.encode(MESSAGE_TYPEHASH, _decoded.digest, walletsHash));\n } else {\n // Unknown kind\n revert InvalidKind(_decoded.kind);\n }\n }\n\n function hash(\n Decoded memory _decoded\n ) internal view returns (bytes32) {\n bytes32 domain = domainSeparator(_decoded.noChainId, address(this));\n bytes32 structHash = toEIP712(_decoded);\n return keccak256(abi.encodePacked(\"\\x19\\x01\", domain, structHash));\n }\n\n function hashFor(Decoded memory _decoded, address _wallet) internal view returns (bytes32) {\n bytes32 domain = domainSeparator(_decoded.noChainId, _wallet);\n bytes32 structHash = toEIP712(_decoded);\n return keccak256(abi.encodePacked(\"\\x19\\x01\", domain, structHash));\n }\n\n}\n" + }, + "lib/openzeppelin-contracts/contracts/access/IAccessControl.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev External interface of AccessControl declared to support ERC165 detection.\n */\ninterface IAccessControl {\n /**\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\n *\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\n * {RoleAdminChanged} not being emitted signaling this.\n *\n * _Available since v3.1._\n */\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\n\n /**\n * @dev Emitted when `account` is granted `role`.\n *\n * `sender` is the account that originated the contract call, an admin role\n * bearer except when using {AccessControl-_setupRole}.\n */\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Emitted when `account` is revoked `role`.\n *\n * `sender` is the account that originated the contract call:\n * - if using `revokeRole`, it is the admin role bearer\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\n */\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n /**\n * @dev Returns `true` if `account` has been granted `role`.\n */\n function hasRole(bytes32 role, address account) external view returns (bool);\n\n /**\n * @dev Returns the admin role that controls `role`. See {grantRole} and\n * {revokeRole}.\n *\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\n */\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\n\n /**\n * @dev Grants `role` to `account`.\n *\n * If `account` had not been already granted `role`, emits a {RoleGranted}\n * event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function grantRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from `account`.\n *\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\n *\n * Requirements:\n *\n * - the caller must have ``role``'s admin role.\n */\n function revokeRole(bytes32 role, address account) external;\n\n /**\n * @dev Revokes `role` from the calling account.\n *\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\n * purpose is to provide a mechanism for accounts to lose their privileges\n * if they are compromised (such as when a trusted device is misplaced).\n *\n * If the calling account had been granted `role`, emits a {RoleRevoked}\n * event.\n *\n * Requirements:\n *\n * - the caller must be `account`.\n */\n function renounceRole(bytes32 role, address account) external;\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/Strings.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\nimport \"./math/SignedMath.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n uint8 private constant _ADDRESS_LENGTH = 20;\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\n */\n function toString(int256 value) internal pure returns (string memory) {\n return string(abi.encodePacked(value < 0 ? \"-\" : \"\", toString(SignedMath.abs(value))));\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n }\n\n /**\n * @dev Returns true if the two strings are equal.\n */\n function equal(string memory a, string memory b) internal pure returns (bool) {\n return keccak256(bytes(a)) == keccak256(bytes(b));\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" + }, + "lib/signals-implicit-mode/lib/sequence-v3/src/utils/LibBytes.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.18;\n\n/// @title Library for reading data from bytes arrays\n/// @author Agustin Aguilar (aa@horizon.io), Michael Standen (mstan@horizon.io)\n/// @notice This library contains functions for reading data from bytes arrays.\n/// @dev These functions do not check if the input index is within the bounds of the data array.\n/// @dev Reading out of bounds may return dirty values.\nlibrary LibBytes {\n\n function readFirstUint8(\n bytes calldata _data\n ) internal pure returns (uint8 a, uint256 newPointer) {\n assembly {\n let word := calldataload(_data.offset)\n a := shr(248, word)\n newPointer := 1\n }\n }\n\n function readUint8(bytes calldata _data, uint256 _index) internal pure returns (uint8 a, uint256 newPointer) {\n assembly {\n let word := calldataload(add(_index, _data.offset))\n a := shr(248, word)\n newPointer := add(_index, 1)\n }\n }\n\n function readUint16(bytes calldata _data, uint256 _index) internal pure returns (uint16 a, uint256 newPointer) {\n assembly {\n let word := calldataload(add(_index, _data.offset))\n a := shr(240, word)\n newPointer := add(_index, 2)\n }\n }\n\n function readUint24(bytes calldata _data, uint256 _index) internal pure returns (uint24 a, uint256 newPointer) {\n assembly {\n let word := calldataload(add(_index, _data.offset))\n a := shr(232, word)\n newPointer := add(_index, 3)\n }\n }\n\n function readUint64(bytes calldata _data, uint256 _index) internal pure returns (uint64 a, uint256 newPointer) {\n assembly {\n let word := calldataload(add(_index, _data.offset))\n a := shr(192, word)\n newPointer := add(_index, 8)\n }\n }\n\n function readUint160(bytes calldata _data, uint256 _index) internal pure returns (uint160 a, uint256 newPointer) {\n assembly {\n let word := calldataload(add(_index, _data.offset))\n a := shr(96, word)\n newPointer := add(_index, 20)\n }\n }\n\n function readUint256(bytes calldata _data, uint256 _index) internal pure returns (uint256 a, uint256 newPointer) {\n assembly {\n a := calldataload(add(_index, _data.offset))\n newPointer := add(_index, 32)\n }\n }\n\n function readUintX(\n bytes calldata _data,\n uint256 _index,\n uint256 _length\n ) internal pure returns (uint256 a, uint256 newPointer) {\n assembly {\n let word := calldataload(add(_index, _data.offset))\n let shift := sub(256, mul(_length, 8))\n a := and(shr(shift, word), sub(shl(mul(8, _length), 1), 1))\n newPointer := add(_index, _length)\n }\n }\n\n function readBytes4(bytes calldata _data, uint256 _pointer) internal pure returns (bytes4 a, uint256 newPointer) {\n assembly {\n let word := calldataload(add(_pointer, _data.offset))\n a := and(word, 0xffffffff00000000000000000000000000000000000000000000000000000000)\n newPointer := add(_pointer, 4)\n }\n }\n\n function readBytes32(bytes calldata _data, uint256 _pointer) internal pure returns (bytes32 a, uint256 newPointer) {\n assembly {\n a := calldataload(add(_pointer, _data.offset))\n newPointer := add(_pointer, 32)\n }\n }\n\n function readAddress(bytes calldata _data, uint256 _index) internal pure returns (address a, uint256 newPointer) {\n assembly {\n let word := calldataload(add(_index, _data.offset))\n a := and(shr(96, word), 0xffffffffffffffffffffffffffffffffffffffff)\n newPointer := add(_index, 20)\n }\n }\n\n /// @dev ERC-2098 Compact Signature\n function readRSVCompact(\n bytes calldata _data,\n uint256 _index\n ) internal pure returns (bytes32 r, bytes32 s, uint8 v, uint256 newPointer) {\n uint256 yParityAndS;\n assembly {\n r := calldataload(add(_index, _data.offset))\n yParityAndS := calldataload(add(_index, add(_data.offset, 32)))\n newPointer := add(_index, 64)\n }\n uint256 yParity = uint256(yParityAndS >> 255);\n s = bytes32(uint256(yParityAndS) & ((1 << 255) - 1));\n v = uint8(yParity) + 27;\n }\n\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/math/Math.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n // The surrounding unchecked block does not change this fact.\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1, \"Math: mulDiv overflow\");\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10 ** 64) {\n value /= 10 ** 64;\n result += 64;\n }\n if (value >= 10 ** 32) {\n value /= 10 ** 32;\n result += 32;\n }\n if (value >= 10 ** 16) {\n value /= 10 ** 16;\n result += 16;\n }\n if (value >= 10 ** 8) {\n value /= 10 ** 8;\n result += 8;\n }\n if (value >= 10 ** 4) {\n value /= 10 ** 4;\n result += 4;\n }\n if (value >= 10 ** 2) {\n value /= 10 ** 2;\n result += 2;\n }\n if (value >= 10 ** 1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256, rounded down, of a positive value.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\n }\n }\n}\n" + }, + "lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMath {\n /**\n * @dev Returns the largest of two signed numbers.\n */\n function max(int256 a, int256 b) internal pure returns (int256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two signed numbers.\n */\n function min(int256 a, int256 b) internal pure returns (int256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two signed numbers without overflow.\n * The result is rounded towards zero.\n */\n function average(int256 a, int256 b) internal pure returns (int256) {\n // Formula from the book \"Hacker's Delight\"\n int256 x = (a & b) + ((a ^ b) >> 1);\n return x + (int256(uint256(x) >> 255) & (a ^ b));\n }\n\n /**\n * @dev Returns the absolute unsigned value of a signed value.\n */\n function abs(int256 n) internal pure returns (uint256) {\n unchecked {\n // must be unchecked in order to support `n = type(int256).min`\n return uint256(n >= 0 ? n : -n);\n }\n }\n}\n" + } + }, + "settings": { + "remappings": [ + "@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/", + "ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/", + "erc2470-libs/=lib/erc2470-libs/", + "erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/", + "forge-std/=lib/forge-std/src/", + "halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/", + "murky/=lib/murky/", + "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/", + "openzeppelin-contracts/=lib/openzeppelin-contracts/", + "openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/", + "sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/", + "signals-implicit-mode/=lib/signals-implicit-mode/", + "solady/=lib/solady/src/" + ], + "optimizer": { + "enabled": false, + "runs": 200 + }, + "metadata": { + "useLiteralContent": true, + "bytecodeHash": "ipfs", + "appendCBOR": true + }, + "outputSelection": { + "*": { + "*": [ + "evm.bytecode", + "evm.deployedBytecode", + "devdoc", + "userdoc", + "metadata", + "abi", + "evm.methodIdentifiers" + ] + } + }, + "evmVersion": "paris", + "viaIR": true + }, + "evmVersion": "paris", + "viaIR": true, + "libraries": {} + }, + "allowPaths": [ + "/home/michael/Code/Horizon/live-contracts" + ], + "basePath": "/home/michael/Code/Horizon/live-contracts", + "includePaths": [ + "/home/michael/Code/Horizon/live-contracts" + ], + "output": { + "contracts": { + "lib/openzeppelin-contracts/contracts/access/AccessControl.sol": { + "AccessControl": { + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "details": "Contract module that allows children to implement role-based access control mechanisms. This is a lightweight version that doesn't allow enumerating role members except through off-chain means by accessing the contract event logs. Some applications may benefit from on-chain enumerability, for those cases see {AccessControlEnumerable}. Roles are referred to by their `bytes32` identifier. These should be exposed in the external API and be unique. The best way to achieve this is by using `public constant` hash digests: ```solidity bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\"); ``` Roles can be used to represent a set of permissions. To restrict access to a function call, use {hasRole}: ```solidity function foo() public { require(hasRole(MY_ROLE, msg.sender)); ... } ``` Roles can be granted and revoked dynamically via the {grantRole} and {revokeRole} functions. Each role has an associated admin role, and only accounts that have a role's admin role can call {grantRole} and {revokeRole}. By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means that only accounts with this role will be able to grant or revoke other roles. More complex role relationships can be created by using {_setRoleAdmin}. WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to grant and revoke this role. Extra precautions should be taken to secure accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules} to enforce additional security measures for this role.", + "events": { + "RoleAdminChanged(bytes32,bytes32,bytes32)": { + "details": "Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this. _Available since v3.1._" + }, + "RoleGranted(bytes32,address,address)": { + "details": "Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}." + }, + "RoleRevoked(bytes32,address,address)": { + "details": "Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)" + } + }, + "kind": "dev", + "methods": { + "getRoleAdmin(bytes32)": { + "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}." + }, + "grantRole(bytes32,address)": { + "details": "Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event." + }, + "hasRole(bytes32,address)": { + "details": "Returns `true` if `account` has been granted `role`." + }, + "renounceRole(bytes32,address)": { + "details": "Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event." + }, + "revokeRole(bytes32,address)": { + "details": "Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event." + }, + "supportsInterface(bytes4)": { + "details": "See {IERC165-supportsInterface}." + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "DEFAULT_ADMIN_ROLE()": "a217fddf", + "getRoleAdmin(bytes32)": "248a9ca3", + "grantRole(bytes32,address)": "2f2ff15d", + "hasRole(bytes32,address)": "91d14854", + "renounceRole(bytes32,address)": "36568abe", + "revokeRole(bytes32,address)": "d547741f", + "supportsInterface(bytes4)": "01ffc9a7" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Contract module that allows children to implement role-based access control mechanisms. This is a lightweight version that doesn't allow enumerating role members except through off-chain means by accessing the contract event logs. Some applications may benefit from on-chain enumerability, for those cases see {AccessControlEnumerable}. Roles are referred to by their `bytes32` identifier. These should be exposed in the external API and be unique. The best way to achieve this is by using `public constant` hash digests: ```solidity bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\"); ``` Roles can be used to represent a set of permissions. To restrict access to a function call, use {hasRole}: ```solidity function foo() public { require(hasRole(MY_ROLE, msg.sender)); ... } ``` Roles can be granted and revoked dynamically via the {grantRole} and {revokeRole} functions. Each role has an associated admin role, and only accounts that have a role's admin role can call {grantRole} and {revokeRole}. By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means that only accounts with this role will be able to grant or revoke other roles. More complex role relationships can be created by using {_setRoleAdmin}. WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to grant and revoke this role. Extra precautions should be taken to secure accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules} to enforce additional security measures for this role.\",\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this. _Available since v3.1._\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/access/AccessControl.sol\":\"AccessControl\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Strings.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```solidity\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```solidity\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}\\n * to enforce additional security measures for this role.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n * Overriding this function changes the behavior of the {onlyRole} modifier.\\n *\\n * Format of the revert message is described in {_checkRole}.\\n *\\n * _Available since v4.6._\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n Strings.toHexString(account),\\n \\\" is missing role \\\",\\n Strings.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * May emit a {RoleGranted} event.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n}\\n\",\"keccak256\":\"0x0dd6e52cb394d7f5abe5dca2d4908a6be40417914720932de757de34a99ab87f\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\nimport \\\"./math/SignedMath.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\\n */\\n function toString(int256 value) internal pure returns (string memory) {\\n return string(abi.encodePacked(value < 0 ? \\\"-\\\" : \\\"\\\", toString(SignedMath.abs(value))));\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n\\n /**\\n * @dev Returns true if the two strings are equal.\\n */\\n function equal(string memory a, string memory b) internal pure returns (bool) {\\n return keccak256(bytes(a)) == keccak256(bytes(b));\\n }\\n}\\n\",\"keccak256\":\"0x3088eb2868e8d13d89d16670b5f8612c4ab9ff8956272837d8e90106c59c14a0\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\\n // The surrounding unchecked block does not change this fact.\\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1, \\\"Math: mulDiv overflow\\\");\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10 ** 64) {\\n value /= 10 ** 64;\\n result += 64;\\n }\\n if (value >= 10 ** 32) {\\n value /= 10 ** 32;\\n result += 32;\\n }\\n if (value >= 10 ** 16) {\\n value /= 10 ** 16;\\n result += 16;\\n }\\n if (value >= 10 ** 8) {\\n value /= 10 ** 8;\\n result += 8;\\n }\\n if (value >= 10 ** 4) {\\n value /= 10 ** 4;\\n result += 4;\\n }\\n if (value >= 10 ** 2) {\\n value /= 10 ** 2;\\n result += 2;\\n }\\n if (value >= 10 ** 1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard signed math utilities missing in the Solidity language.\\n */\\nlibrary SignedMath {\\n /**\\n * @dev Returns the largest of two signed numbers.\\n */\\n function max(int256 a, int256 b) internal pure returns (int256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two signed numbers.\\n */\\n function min(int256 a, int256 b) internal pure returns (int256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two signed numbers without overflow.\\n * The result is rounded towards zero.\\n */\\n function average(int256 a, int256 b) internal pure returns (int256) {\\n // Formula from the book \\\"Hacker's Delight\\\"\\n int256 x = (a & b) + ((a ^ b) >> 1);\\n return x + (int256(uint256(x) >> 255) & (a ^ b));\\n }\\n\\n /**\\n * @dev Returns the absolute unsigned value of a signed value.\\n */\\n function abs(int256 n) internal pure returns (uint256) {\\n unchecked {\\n // must be unchecked in order to support `n = type(int256).min`\\n return uint256(n >= 0 ? n : -n);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc\",\"license\":\"MIT\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "lib/openzeppelin-contracts/contracts/access/AccessControlEnumerable.sol": { + "AccessControlEnumerable": { + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "details": "Extension of {AccessControl} that allows enumerating the members of each role.", + "events": { + "RoleAdminChanged(bytes32,bytes32,bytes32)": { + "details": "Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this. _Available since v3.1._" + }, + "RoleGranted(bytes32,address,address)": { + "details": "Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}." + }, + "RoleRevoked(bytes32,address,address)": { + "details": "Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)" + } + }, + "kind": "dev", + "methods": { + "getRoleAdmin(bytes32)": { + "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}." + }, + "getRoleMember(bytes32,uint256)": { + "details": "Returns one of the accounts that have `role`. `index` must be a value between 0 and {getRoleMemberCount}, non-inclusive. Role bearers are not sorted in any particular way, and their ordering may change at any point. WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure you perform all queries on the same block. See the following https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] for more information." + }, + "getRoleMemberCount(bytes32)": { + "details": "Returns the number of accounts that have `role`. Can be used together with {getRoleMember} to enumerate all bearers of a role." + }, + "grantRole(bytes32,address)": { + "details": "Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event." + }, + "hasRole(bytes32,address)": { + "details": "Returns `true` if `account` has been granted `role`." + }, + "renounceRole(bytes32,address)": { + "details": "Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event." + }, + "revokeRole(bytes32,address)": { + "details": "Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event." + }, + "supportsInterface(bytes4)": { + "details": "See {IERC165-supportsInterface}." + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "DEFAULT_ADMIN_ROLE()": "a217fddf", + "getRoleAdmin(bytes32)": "248a9ca3", + "getRoleMember(bytes32,uint256)": "9010d07c", + "getRoleMemberCount(bytes32)": "ca15c873", + "grantRole(bytes32,address)": "2f2ff15d", + "hasRole(bytes32,address)": "91d14854", + "renounceRole(bytes32,address)": "36568abe", + "revokeRole(bytes32,address)": "d547741f", + "supportsInterface(bytes4)": "01ffc9a7" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"getRoleMember\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleMemberCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Extension of {AccessControl} that allows enumerating the members of each role.\",\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this. _Available since v3.1._\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"getRoleMember(bytes32,uint256)\":{\"details\":\"Returns one of the accounts that have `role`. `index` must be a value between 0 and {getRoleMemberCount}, non-inclusive. Role bearers are not sorted in any particular way, and their ordering may change at any point. WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure you perform all queries on the same block. See the following https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] for more information.\"},\"getRoleMemberCount(bytes32)\":{\"details\":\"Returns the number of accounts that have `role`. Can be used together with {getRoleMember} to enumerate all bearers of a role.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/access/AccessControlEnumerable.sol\":\"AccessControlEnumerable\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Strings.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```solidity\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```solidity\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}\\n * to enforce additional security measures for this role.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n * Overriding this function changes the behavior of the {onlyRole} modifier.\\n *\\n * Format of the revert message is described in {_checkRole}.\\n *\\n * _Available since v4.6._\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n Strings.toHexString(account),\\n \\\" is missing role \\\",\\n Strings.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * May emit a {RoleGranted} event.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n}\\n\",\"keccak256\":\"0x0dd6e52cb394d7f5abe5dca2d4908a6be40417914720932de757de34a99ab87f\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/access/AccessControlEnumerable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControlEnumerable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControlEnumerable.sol\\\";\\nimport \\\"./AccessControl.sol\\\";\\nimport \\\"../utils/structs/EnumerableSet.sol\\\";\\n\\n/**\\n * @dev Extension of {AccessControl} that allows enumerating the members of each role.\\n */\\nabstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl {\\n using EnumerableSet for EnumerableSet.AddressSet;\\n\\n mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers;\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns one of the accounts that have `role`. `index` must be a\\n * value between 0 and {getRoleMemberCount}, non-inclusive.\\n *\\n * Role bearers are not sorted in any particular way, and their ordering may\\n * change at any point.\\n *\\n * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure\\n * you perform all queries on the same block. See the following\\n * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]\\n * for more information.\\n */\\n function getRoleMember(bytes32 role, uint256 index) public view virtual override returns (address) {\\n return _roleMembers[role].at(index);\\n }\\n\\n /**\\n * @dev Returns the number of accounts that have `role`. Can be used\\n * together with {getRoleMember} to enumerate all bearers of a role.\\n */\\n function getRoleMemberCount(bytes32 role) public view virtual override returns (uint256) {\\n return _roleMembers[role].length();\\n }\\n\\n /**\\n * @dev Overload {_grantRole} to track enumerable memberships\\n */\\n function _grantRole(bytes32 role, address account) internal virtual override {\\n super._grantRole(role, account);\\n _roleMembers[role].add(account);\\n }\\n\\n /**\\n * @dev Overload {_revokeRole} to track enumerable memberships\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual override {\\n super._revokeRole(role, account);\\n _roleMembers[role].remove(account);\\n }\\n}\\n\",\"keccak256\":\"0x13f5e15f2a0650c0b6aaee2ef19e89eaf4870d6e79662d572a393334c1397247\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/access/IAccessControlEnumerable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControlEnumerable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\n\\n/**\\n * @dev External interface of AccessControlEnumerable declared to support ERC165 detection.\\n */\\ninterface IAccessControlEnumerable is IAccessControl {\\n /**\\n * @dev Returns one of the accounts that have `role`. `index` must be a\\n * value between 0 and {getRoleMemberCount}, non-inclusive.\\n *\\n * Role bearers are not sorted in any particular way, and their ordering may\\n * change at any point.\\n *\\n * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure\\n * you perform all queries on the same block. See the following\\n * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]\\n * for more information.\\n */\\n function getRoleMember(bytes32 role, uint256 index) external view returns (address);\\n\\n /**\\n * @dev Returns the number of accounts that have `role`. Can be used\\n * together with {getRoleMember} to enumerate all bearers of a role.\\n */\\n function getRoleMemberCount(bytes32 role) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0xba4459ab871dfa300f5212c6c30178b63898c03533a1ede28436f11546626676\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\nimport \\\"./math/SignedMath.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\\n */\\n function toString(int256 value) internal pure returns (string memory) {\\n return string(abi.encodePacked(value < 0 ? \\\"-\\\" : \\\"\\\", toString(SignedMath.abs(value))));\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n\\n /**\\n * @dev Returns true if the two strings are equal.\\n */\\n function equal(string memory a, string memory b) internal pure returns (bool) {\\n return keccak256(bytes(a)) == keccak256(bytes(b));\\n }\\n}\\n\",\"keccak256\":\"0x3088eb2868e8d13d89d16670b5f8612c4ab9ff8956272837d8e90106c59c14a0\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\\n // The surrounding unchecked block does not change this fact.\\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1, \\\"Math: mulDiv overflow\\\");\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10 ** 64) {\\n value /= 10 ** 64;\\n result += 64;\\n }\\n if (value >= 10 ** 32) {\\n value /= 10 ** 32;\\n result += 32;\\n }\\n if (value >= 10 ** 16) {\\n value /= 10 ** 16;\\n result += 16;\\n }\\n if (value >= 10 ** 8) {\\n value /= 10 ** 8;\\n result += 8;\\n }\\n if (value >= 10 ** 4) {\\n value /= 10 ** 4;\\n result += 4;\\n }\\n if (value >= 10 ** 2) {\\n value /= 10 ** 2;\\n result += 2;\\n }\\n if (value >= 10 ** 1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard signed math utilities missing in the Solidity language.\\n */\\nlibrary SignedMath {\\n /**\\n * @dev Returns the largest of two signed numbers.\\n */\\n function max(int256 a, int256 b) internal pure returns (int256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two signed numbers.\\n */\\n function min(int256 a, int256 b) internal pure returns (int256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two signed numbers without overflow.\\n * The result is rounded towards zero.\\n */\\n function average(int256 a, int256 b) internal pure returns (int256) {\\n // Formula from the book \\\"Hacker's Delight\\\"\\n int256 x = (a & b) + ((a ^ b) >> 1);\\n return x + (int256(uint256(x) >> 255) & (a ^ b));\\n }\\n\\n /**\\n * @dev Returns the absolute unsigned value of a signed value.\\n */\\n function abs(int256 n) internal pure returns (uint256) {\\n unchecked {\\n // must be unchecked in order to support `n = type(int256).min`\\n return uint256(n >= 0 ? n : -n);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/EnumerableSet.sol)\\n// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for managing\\n * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive\\n * types.\\n *\\n * Sets have the following properties:\\n *\\n * - Elements are added, removed, and checked for existence in constant time\\n * (O(1)).\\n * - Elements are enumerated in O(n). No guarantees are made on the ordering.\\n *\\n * ```solidity\\n * contract Example {\\n * // Add the library methods\\n * using EnumerableSet for EnumerableSet.AddressSet;\\n *\\n * // Declare a set state variable\\n * EnumerableSet.AddressSet private mySet;\\n * }\\n * ```\\n *\\n * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)\\n * and `uint256` (`UintSet`) are supported.\\n *\\n * [WARNING]\\n * ====\\n * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure\\n * unusable.\\n * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.\\n *\\n * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an\\n * array of EnumerableSet.\\n * ====\\n */\\nlibrary EnumerableSet {\\n // To implement this library for multiple types with as little code\\n // repetition as possible, we write it in terms of a generic Set type with\\n // bytes32 values.\\n // The Set implementation uses private functions, and user-facing\\n // implementations (such as AddressSet) are just wrappers around the\\n // underlying Set.\\n // This means that we can only create new EnumerableSets for types that fit\\n // in bytes32.\\n\\n struct Set {\\n // Storage of set values\\n bytes32[] _values;\\n // Position of the value in the `values` array, plus 1 because index 0\\n // means a value is not in the set.\\n mapping(bytes32 => uint256) _indexes;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function _add(Set storage set, bytes32 value) private returns (bool) {\\n if (!_contains(set, value)) {\\n set._values.push(value);\\n // The value is stored at length-1, but we add 1 to all indexes\\n // and use 0 as a sentinel value\\n set._indexes[value] = set._values.length;\\n return true;\\n } else {\\n return false;\\n }\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function _remove(Set storage set, bytes32 value) private returns (bool) {\\n // We read and store the value's index to prevent multiple reads from the same storage slot\\n uint256 valueIndex = set._indexes[value];\\n\\n if (valueIndex != 0) {\\n // Equivalent to contains(set, value)\\n // To delete an element from the _values array in O(1), we swap the element to delete with the last one in\\n // the array, and then remove the last element (sometimes called as 'swap and pop').\\n // This modifies the order of the array, as noted in {at}.\\n\\n uint256 toDeleteIndex = valueIndex - 1;\\n uint256 lastIndex = set._values.length - 1;\\n\\n if (lastIndex != toDeleteIndex) {\\n bytes32 lastValue = set._values[lastIndex];\\n\\n // Move the last value to the index where the value to delete is\\n set._values[toDeleteIndex] = lastValue;\\n // Update the index for the moved value\\n set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex\\n }\\n\\n // Delete the slot where the moved value was stored\\n set._values.pop();\\n\\n // Delete the index for the deleted slot\\n delete set._indexes[value];\\n\\n return true;\\n } else {\\n return false;\\n }\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function _contains(Set storage set, bytes32 value) private view returns (bool) {\\n return set._indexes[value] != 0;\\n }\\n\\n /**\\n * @dev Returns the number of values on the set. O(1).\\n */\\n function _length(Set storage set) private view returns (uint256) {\\n return set._values.length;\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function _at(Set storage set, uint256 index) private view returns (bytes32) {\\n return set._values[index];\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function _values(Set storage set) private view returns (bytes32[] memory) {\\n return set._values;\\n }\\n\\n // Bytes32Set\\n\\n struct Bytes32Set {\\n Set _inner;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {\\n return _add(set._inner, value);\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {\\n return _remove(set._inner, value);\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {\\n return _contains(set._inner, value);\\n }\\n\\n /**\\n * @dev Returns the number of values in the set. O(1).\\n */\\n function length(Bytes32Set storage set) internal view returns (uint256) {\\n return _length(set._inner);\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {\\n return _at(set._inner, index);\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {\\n bytes32[] memory store = _values(set._inner);\\n bytes32[] memory result;\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := store\\n }\\n\\n return result;\\n }\\n\\n // AddressSet\\n\\n struct AddressSet {\\n Set _inner;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function add(AddressSet storage set, address value) internal returns (bool) {\\n return _add(set._inner, bytes32(uint256(uint160(value))));\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function remove(AddressSet storage set, address value) internal returns (bool) {\\n return _remove(set._inner, bytes32(uint256(uint160(value))));\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function contains(AddressSet storage set, address value) internal view returns (bool) {\\n return _contains(set._inner, bytes32(uint256(uint160(value))));\\n }\\n\\n /**\\n * @dev Returns the number of values in the set. O(1).\\n */\\n function length(AddressSet storage set) internal view returns (uint256) {\\n return _length(set._inner);\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function at(AddressSet storage set, uint256 index) internal view returns (address) {\\n return address(uint160(uint256(_at(set._inner, index))));\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function values(AddressSet storage set) internal view returns (address[] memory) {\\n bytes32[] memory store = _values(set._inner);\\n address[] memory result;\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := store\\n }\\n\\n return result;\\n }\\n\\n // UintSet\\n\\n struct UintSet {\\n Set _inner;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function add(UintSet storage set, uint256 value) internal returns (bool) {\\n return _add(set._inner, bytes32(value));\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function remove(UintSet storage set, uint256 value) internal returns (bool) {\\n return _remove(set._inner, bytes32(value));\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function contains(UintSet storage set, uint256 value) internal view returns (bool) {\\n return _contains(set._inner, bytes32(value));\\n }\\n\\n /**\\n * @dev Returns the number of values in the set. O(1).\\n */\\n function length(UintSet storage set) internal view returns (uint256) {\\n return _length(set._inner);\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function at(UintSet storage set, uint256 index) internal view returns (uint256) {\\n return uint256(_at(set._inner, index));\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function values(UintSet storage set) internal view returns (uint256[] memory) {\\n bytes32[] memory store = _values(set._inner);\\n uint256[] memory result;\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := store\\n }\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0x9f4357008a8f7d8c8bf5d48902e789637538d8c016be5766610901b4bba81514\",\"license\":\"MIT\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "lib/openzeppelin-contracts/contracts/access/IAccessControl.sol": { + "IAccessControl": { + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "devdoc": { + "details": "External interface of AccessControl declared to support ERC165 detection.", + "events": { + "RoleAdminChanged(bytes32,bytes32,bytes32)": { + "details": "Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this. _Available since v3.1._" + }, + "RoleGranted(bytes32,address,address)": { + "details": "Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}." + }, + "RoleRevoked(bytes32,address,address)": { + "details": "Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)" + } + }, + "kind": "dev", + "methods": { + "getRoleAdmin(bytes32)": { + "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {AccessControl-_setRoleAdmin}." + }, + "grantRole(bytes32,address)": { + "details": "Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role." + }, + "hasRole(bytes32,address)": { + "details": "Returns `true` if `account` has been granted `role`." + }, + "renounceRole(bytes32,address)": { + "details": "Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`." + }, + "revokeRole(bytes32,address)": { + "details": "Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role." + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "getRoleAdmin(bytes32)": "248a9ca3", + "grantRole(bytes32,address)": "2f2ff15d", + "hasRole(bytes32,address)": "91d14854", + "renounceRole(bytes32,address)": "36568abe", + "revokeRole(bytes32,address)": "d547741f" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"External interface of AccessControl declared to support ERC165 detection.\",\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this. _Available since v3.1._\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {AccessControl-_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/access/IAccessControl.sol\":\"IAccessControl\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "lib/openzeppelin-contracts/contracts/access/IAccessControlEnumerable.sol": { + "IAccessControlEnumerable": { + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "devdoc": { + "details": "External interface of AccessControlEnumerable declared to support ERC165 detection.", + "events": { + "RoleAdminChanged(bytes32,bytes32,bytes32)": { + "details": "Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this. _Available since v3.1._" + }, + "RoleGranted(bytes32,address,address)": { + "details": "Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}." + }, + "RoleRevoked(bytes32,address,address)": { + "details": "Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)" + } + }, + "kind": "dev", + "methods": { + "getRoleAdmin(bytes32)": { + "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {AccessControl-_setRoleAdmin}." + }, + "getRoleMember(bytes32,uint256)": { + "details": "Returns one of the accounts that have `role`. `index` must be a value between 0 and {getRoleMemberCount}, non-inclusive. Role bearers are not sorted in any particular way, and their ordering may change at any point. WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure you perform all queries on the same block. See the following https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] for more information." + }, + "getRoleMemberCount(bytes32)": { + "details": "Returns the number of accounts that have `role`. Can be used together with {getRoleMember} to enumerate all bearers of a role." + }, + "grantRole(bytes32,address)": { + "details": "Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role." + }, + "hasRole(bytes32,address)": { + "details": "Returns `true` if `account` has been granted `role`." + }, + "renounceRole(bytes32,address)": { + "details": "Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`." + }, + "revokeRole(bytes32,address)": { + "details": "Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role." + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "getRoleAdmin(bytes32)": "248a9ca3", + "getRoleMember(bytes32,uint256)": "9010d07c", + "getRoleMemberCount(bytes32)": "ca15c873", + "grantRole(bytes32,address)": "2f2ff15d", + "hasRole(bytes32,address)": "91d14854", + "renounceRole(bytes32,address)": "36568abe", + "revokeRole(bytes32,address)": "d547741f" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"getRoleMember\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleMemberCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"External interface of AccessControlEnumerable declared to support ERC165 detection.\",\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this. _Available since v3.1._\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {AccessControl-_setRoleAdmin}.\"},\"getRoleMember(bytes32,uint256)\":{\"details\":\"Returns one of the accounts that have `role`. `index` must be a value between 0 and {getRoleMemberCount}, non-inclusive. Role bearers are not sorted in any particular way, and their ordering may change at any point. WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure you perform all queries on the same block. See the following https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] for more information.\"},\"getRoleMemberCount(bytes32)\":{\"details\":\"Returns the number of accounts that have `role`. Can be used together with {getRoleMember} to enumerate all bearers of a role.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/access/IAccessControlEnumerable.sol\":\"IAccessControlEnumerable\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/access/IAccessControlEnumerable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControlEnumerable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\n\\n/**\\n * @dev External interface of AccessControlEnumerable declared to support ERC165 detection.\\n */\\ninterface IAccessControlEnumerable is IAccessControl {\\n /**\\n * @dev Returns one of the accounts that have `role`. `index` must be a\\n * value between 0 and {getRoleMemberCount}, non-inclusive.\\n *\\n * Role bearers are not sorted in any particular way, and their ordering may\\n * change at any point.\\n *\\n * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure\\n * you perform all queries on the same block. See the following\\n * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]\\n * for more information.\\n */\\n function getRoleMember(bytes32 role, uint256 index) external view returns (address);\\n\\n /**\\n * @dev Returns the number of accounts that have `role`. Can be used\\n * together with {getRoleMember} to enumerate all bearers of a role.\\n */\\n function getRoleMemberCount(bytes32 role) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0xba4459ab871dfa300f5212c6c30178b63898c03533a1ede28436f11546626676\",\"license\":\"MIT\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "lib/openzeppelin-contracts/contracts/access/Ownable.sol": { + "Ownable": { + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "devdoc": { + "details": "Contract module which provides a basic access control mechanism, where there is an account (an owner) that can be granted exclusive access to specific functions. By default, the owner account will be the one that deploys the contract. This can later be changed with {transferOwnership}. This module is used through inheritance. It will make available the modifier `onlyOwner`, which can be applied to your functions to restrict their use to the owner.", + "kind": "dev", + "methods": { + "constructor": { + "details": "Initializes the contract setting the deployer as the initial owner." + }, + "owner()": { + "details": "Returns the address of the current owner." + }, + "renounceOwnership()": { + "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner." + }, + "transferOwnership(address)": { + "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "owner()": "8da5cb5b", + "renounceOwnership()": "715018a6", + "transferOwnership(address)": "f2fde38b" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Contract module which provides a basic access control mechanism, where there is an account (an owner) that can be granted exclusive access to specific functions. By default, the owner account will be the one that deploys the contract. This can later be changed with {transferOwnership}. This module is used through inheritance. It will make available the modifier `onlyOwner`, which can be applied to your functions to restrict their use to the owner.\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"details\":\"Initializes the contract setting the deployer as the initial owner.\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/access/Ownable.sol\":\"Ownable\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby disabling any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "lib/openzeppelin-contracts/contracts/interfaces/IERC1967.sol": { + "IERC1967": { + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + } + ], + "devdoc": { + "details": "ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC. _Available since v4.8.3._", + "events": { + "AdminChanged(address,address)": { + "details": "Emitted when the admin account has changed." + }, + "BeaconUpgraded(address)": { + "details": "Emitted when the beacon is changed." + }, + "Upgraded(address)": { + "details": "Emitted when the implementation is upgraded." + } + }, + "kind": "dev", + "methods": {}, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"}],\"devdoc\":{\"details\":\"ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC. _Available since v4.8.3._\",\"events\":{\"AdminChanged(address,address)\":{\"details\":\"Emitted when the admin account has changed.\"},\"BeaconUpgraded(address)\":{\"details\":\"Emitted when the beacon is changed.\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/interfaces/IERC1967.sol\":\"IERC1967\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/interfaces/IERC1967.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\\n *\\n * _Available since v4.8.3._\\n */\\ninterface IERC1967 {\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Emitted when the beacon is changed.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n}\\n\",\"keccak256\":\"0x3cbef5ebc24b415252e2f8c0c9254555d30d9f085603b4b80d9b5ed20ab87e90\",\"license\":\"MIT\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "lib/openzeppelin-contracts/contracts/interfaces/IERC2981.sol": { + "IERC2981": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "salePrice", + "type": "uint256" + } + ], + "name": "royaltyInfo", + "outputs": [ + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "uint256", + "name": "royaltyAmount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "details": "Interface for the NFT Royalty Standard. A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal support for royalty payments across all NFT marketplaces and ecosystem participants. _Available since v4.5._", + "kind": "dev", + "methods": { + "royaltyInfo(uint256,uint256)": { + "details": "Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of exchange. The royalty amount is denominated and should be paid in that same unit of exchange." + }, + "supportsInterface(bytes4)": { + "details": "Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas." + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "royaltyInfo(uint256,uint256)": "2a55205a", + "supportsInterface(bytes4)": "01ffc9a7" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"salePrice\",\"type\":\"uint256\"}],\"name\":\"royaltyInfo\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"royaltyAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Interface for the NFT Royalty Standard. A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal support for royalty payments across all NFT marketplaces and ecosystem participants. _Available since v4.5._\",\"kind\":\"dev\",\"methods\":{\"royaltyInfo(uint256,uint256)\":{\"details\":\"Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of exchange. The royalty amount is denominated and should be paid in that same unit of exchange.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/interfaces/IERC2981.sol\":\"IERC2981\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/interfaces/IERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC2981.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Interface for the NFT Royalty Standard.\\n *\\n * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal\\n * support for royalty payments across all NFT marketplaces and ecosystem participants.\\n *\\n * _Available since v4.5._\\n */\\ninterface IERC2981 is IERC165 {\\n /**\\n * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of\\n * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.\\n */\\n function royaltyInfo(\\n uint256 tokenId,\\n uint256 salePrice\\n ) external view returns (address receiver, uint256 royaltyAmount);\\n}\\n\",\"keccak256\":\"0x3976825a61df20457730b79ad0ac9c8908e3c7978ed9bf090c67137c91256b5c\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol": { + "IERC1822Proxiable": { + "abi": [ + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "details": "ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified proxy whose upgrades are fully controlled by the current implementation.", + "kind": "dev", + "methods": { + "proxiableUUID()": { + "details": "Returns the storage slot that the proxiable contract assumes is being used to store the implementation address. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy." + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "proxiableUUID()": "52d1902d" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified proxy whose upgrades are fully controlled by the current implementation.\",\"kind\":\"dev\",\"methods\":{\"proxiableUUID()\":{\"details\":\"Returns the storage slot that the proxiable contract assumes is being used to store the implementation address. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol\":\"IERC1822Proxiable\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Upgrade.sol": { + "ERC1967Upgrade": { + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + } + ], + "devdoc": { + "details": "This abstract contract provides getters and event emitting update functions for https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. _Available since v4.1._", + "events": { + "AdminChanged(address,address)": { + "details": "Emitted when the admin account has changed." + }, + "BeaconUpgraded(address)": { + "details": "Emitted when the beacon is changed." + }, + "Upgraded(address)": { + "details": "Emitted when the implementation is upgraded." + } + }, + "kind": "dev", + "methods": {}, + "stateVariables": { + "_ADMIN_SLOT": { + "details": "Storage slot with the admin of the contract. This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1, and is validated in the constructor." + }, + "_BEACON_SLOT": { + "details": "The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor." + }, + "_IMPLEMENTATION_SLOT": { + "details": "Storage slot with the address of the current implementation. This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1, and is validated in the constructor." + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"}],\"devdoc\":{\"details\":\"This abstract contract provides getters and event emitting update functions for https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. _Available since v4.1._\",\"events\":{\"AdminChanged(address,address)\":{\"details\":\"Emitted when the admin account has changed.\"},\"BeaconUpgraded(address)\":{\"details\":\"Emitted when the beacon is changed.\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{},\"stateVariables\":{\"_ADMIN_SLOT\":{\"details\":\"Storage slot with the admin of the contract. This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is validated in the constructor.\"},\"_BEACON_SLOT\":{\"details\":\"The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\"},\"_IMPLEMENTATION_SLOT\":{\"details\":\"Storage slot with the address of the current implementation. This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is validated in the constructor.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":\"ERC1967Upgrade\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/interfaces/IERC1967.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\\n *\\n * _Available since v4.8.3._\\n */\\ninterface IERC1967 {\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Emitted when the beacon is changed.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n}\\n\",\"keccak256\":\"0x3cbef5ebc24b415252e2f8c0c9254555d30d9f085603b4b80d9b5ed20ab87e90\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/IERC1967.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract ERC1967Upgrade is IERC1967 {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n Address.isContract(IBeacon(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x3b21ae06bf5957f73fa16754b0669c77b7abd8ba6c072d35c3281d446fdb86c2\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n *\\n * Furthermore, `isContract` will also return true if the target contract within\\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\\n * which only has an effect at the end of a transaction.\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._\\n * _Available since v4.9 for `string`, `bytes`._\\n */\\nlibrary StorageSlot {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n struct StringSlot {\\n string value;\\n }\\n\\n struct BytesSlot {\\n bytes value;\\n }\\n\\n /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n */\\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n */\\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n */\\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `StringSlot` with member `value` located at `slot`.\\n */\\n function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\\n */\\n function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := store.slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BytesSlot` with member `value` located at `slot`.\\n */\\n function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\\n */\\n function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := store.slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf09e68aa0dc6722a25bc46490e8d48ed864466d17313b8a0b254c36b54e49899\",\"license\":\"MIT\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "lib/openzeppelin-contracts/contracts/proxy/Proxy.sol": { + "Proxy": { + "abi": [ + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "devdoc": { + "details": "This abstract contract provides a fallback function that delegates all calls to another contract using the EVM instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to be specified by overriding the virtual {_implementation} function. Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a different contract through the {_delegate} function. The success and return data of the delegated call will be returned back to the caller of the proxy.", + "kind": "dev", + "methods": {}, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"This abstract contract provides a fallback function that delegates all calls to another contract using the EVM instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to be specified by overriding the virtual {_implementation} function. Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a different contract through the {_delegate} function. The success and return data of the delegated call will be returned back to the caller of the proxy.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/proxy/Proxy.sol\":\"Proxy\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n /**\\n * @dev Delegates the current call to `implementation`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _delegate(address implementation) internal virtual {\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n /**\\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback function\\n * and {_fallback} should delegate.\\n */\\n function _implementation() internal view virtual returns (address);\\n\\n /**\\n * @dev Delegates the current call to the address returned by `_implementation()`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _fallback() internal virtual {\\n _beforeFallback();\\n _delegate(_implementation());\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n * function in the contract matches the call data.\\n */\\n fallback() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n * is empty.\\n */\\n receive() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n * call, or as part of the Solidity `fallback` or `receive` functions.\\n *\\n * If overridden should call `super._beforeFallback()`.\\n */\\n function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xc130fe33f1b2132158531a87734153293f6d07bc263ff4ac90e85da9c82c0e27\",\"license\":\"MIT\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol": { + "IBeacon": { + "abi": [ + { + "inputs": [], + "name": "implementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "details": "This is the interface that {BeaconProxy} expects of its beacon.", + "kind": "dev", + "methods": { + "implementation()": { + "details": "Must return an address that can be used as a delegate call target. {BeaconProxy} will check that this address is a contract." + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "implementation()": "5c60da1b" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"implementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This is the interface that {BeaconProxy} expects of its beacon.\",\"kind\":\"dev\",\"methods\":{\"implementation()\":{\"details\":\"Must return an address that can be used as a delegate call target. {BeaconProxy} will check that this address is a contract.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol\":\"IBeacon\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "lib/openzeppelin-contracts/contracts/proxy/beacon/UpgradeableBeacon.sol": { + "UpgradeableBeacon": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "implementation_", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "inputs": [], + "name": "implementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "devdoc": { + "details": "This contract is used in conjunction with one or more instances of {BeaconProxy} to determine their implementation contract, which is where they will delegate all function calls. An owner is able to change the implementation the beacon points to, thus upgrading the proxies that use this beacon.", + "events": { + "Upgraded(address)": { + "details": "Emitted when the implementation returned by the beacon is changed." + } + }, + "kind": "dev", + "methods": { + "constructor": { + "details": "Sets the address of the initial implementation, and the deployer account as the owner who can upgrade the beacon." + }, + "implementation()": { + "details": "Returns the current implementation address." + }, + "owner()": { + "details": "Returns the address of the current owner." + }, + "renounceOwnership()": { + "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner." + }, + "transferOwnership(address)": { + "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." + }, + "upgradeTo(address)": { + "details": "Upgrades the beacon to a new implementation. Emits an {Upgraded} event. Requirements: - msg.sender must be the owner of the contract. - `newImplementation` must be a contract." + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": { + "abi_decode_address_fromMemory": { + "entryPoint": 204, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_address_fromMemory": { + "entryPoint": 219, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_stringliteral_5ccc": { + "entryPoint": 407, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple": { + "entryPoint": 720, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple_stringliteral_5ccc": { + "entryPoint": 433, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "allocate_memory": { + "entryPoint": 134, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "allocate_unbounded": { + "entryPoint": 52, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "array_storeLengthForEncoding_string": { + "entryPoint": 320, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "cleanup_address": { + "entryPoint": 171, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_from_storage_address": { + "entryPoint": 676, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_rational_by": { + "entryPoint": 831, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_uint160": { + "entryPoint": 160, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_uint256": { + "entryPoint": 828, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "constructor_Ownable": { + "entryPoint": 302, + "id": 562, + "parameterSlots": 0, + "returnSlots": 0 + }, + "constructor_UpgradeableBeacon": { + "entryPoint": 283, + "id": 1095, + "parameterSlots": 1, + "returnSlots": 0 + }, + "convert_address_to_address": { + "entryPoint": 575, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_by_to_uint256": { + "entryPoint": 834, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint160_to_address": { + "entryPoint": 563, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint160_to_uint160": { + "entryPoint": 535, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "copy_arguments_for_constructor_object_UpgradeableBeacon": { + "entryPoint": 250, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "extract_from_storage_value_offsett_address": { + "entryPoint": 687, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "finalize_allocation": { + "entryPoint": 95, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun_isContract": { + "entryPoint": 862, + "id": 1358, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_msgSender": { + "entryPoint": 657, + "id": 1682, + "parameterSlots": 0, + "returnSlots": 1 + }, + "fun_setImplementation": { + "entryPoint": 622, + "id": 1141, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_transferOwnership": { + "entryPoint": 726, + "id": 650, + "parameterSlots": 1, + "returnSlots": 0 + }, + "identity": { + "entryPoint": 532, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "panic_error_0x41": { + "entryPoint": 73, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "prepare_store_address": { + "entryPoint": 587, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "read_from_storage_split_offset_address": { + "entryPoint": 707, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "require_helper_stringliteral_5ccc": { + "entryPoint": 458, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb": { + "entryPoint": 58, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b": { + "entryPoint": 155, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "round_up_to_mul_of": { + "entryPoint": 63, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_left": { + "entryPoint": 499, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_right_unsigned": { + "entryPoint": 670, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "store_literal_in_memory_5ccca6b0666a32006e874c0f8fc30910124098b6e8e91ea2ea1baa45ce41f1e6": { + "entryPoint": 329, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "update_byte_slice_shift": { + "entryPoint": 505, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "update_storage_value_offsett_address_to_address": { + "entryPoint": 590, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "validator_revert_address": { + "entryPoint": 183, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "zero_value_for_split_address": { + "entryPoint": 652, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "zero_value_for_split_bool": { + "entryPoint": 823, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + } + }, + "generatedSources": [], + "linkReferences": {}, + "object": "60806040523461002f576100196100146100fa565b61011b565b610021610034565b610722610380823961072290f35b61003a565b60405190565b600080fd5b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b906100699061003f565b810190811060018060401b0382111761008157604052565b610049565b90610099610092610034565b928361005f565b565b600080fd5b60018060a01b031690565b6100b4906100a0565b90565b6100c0816100ab565b036100c757565b600080fd5b905051906100d9826100b7565b565b906020828203126100f5576100f2916000016100cc565b90565b61009b565b610118610aa28038038061010d81610086565b9283398101906100db565b90565b61012c9061012761012e565b61026e565b565b61013e610139610291565b6102d6565b565b60209181520190565b60207f6e206973206e6f74206120636f6e747261637400000000000000000000000000917f5570677261646561626c65426561636f6e3a20696d706c656d656e746174696f60008201520152565b6101a46033604092610140565b6101ad81610149565b0190565b6101c79060208101906000818303910152610197565b90565b156101d157565b6101d9610034565b62461bcd60e51b8152806101ef600482016101b1565b0390fd5b60001b90565b9061020a60018060a01b03916101f3565b9181191691161790565b90565b61022b610226610230926100a0565b610214565b6100a0565b90565b61023c90610217565b90565b61024890610233565b90565b90565b9061026361025e61026a9261023f565b61024b565b82546101f9565b9055565b61028a9061028361027e8261035e565b6101ca565b600161024e565b565b600090565b61029961028c565b503390565b60001c90565b60018060a01b031690565b6102bb6102c09161029e565b6102a4565b90565b6102cd90546102af565b90565b60000190565b6102e060006102c3565b6102eb82600061024e565b9061031f6103197f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09361023f565b9161023f565b91610328610034565b80610332816102d0565b0390a3565b600090565b90565b90565b61035661035161035b9261033f565b610214565b61033c565b90565b610366610337565b503b61037b6103756000610342565b9161033c565b119056fe60806040526004361015610013575b610219565b61001e60003561006d565b80633659cfe6146100685780635c60da1b14610063578063715018a61461005e5780638da5cb5b146100595763f2fde38b0361000e576101e6565b6101b1565b61017e565b610149565b6100e3565b60e01c90565b60405190565b600080fd5b600080fd5b60018060a01b031690565b61009790610083565b90565b6100a38161008e565b036100aa57565b600080fd5b905035906100bc8261009a565b565b906020828203126100d8576100d5916000016100af565b90565b61007e565b60000190565b34610111576100fb6100f63660046100be565b6102b3565b610103610073565b8061010d816100dd565b0390f35b610079565b600091031261012157565b61007e565b61012f9061008e565b9052565b919061014790600060208501940190610126565b565b3461017957610159366004610116565b6101756101646102f5565b61016c610073565b91829182610133565b0390f35b610079565b346101ac5761018e366004610116565b61019661035c565b61019e610073565b806101a8816100dd565b0390f35b610079565b346101e1576101c1366004610116565b6101dd6101cc610366565b6101d4610073565b91829182610133565b0390f35b610079565b34610214576101fe6101f93660046100be565b610473565b610206610073565b80610210816100dd565b0390f35b610079565b600080fd5b61022f9061022a610501565b610268565b565b90565b61024861024361024d92610083565b610231565b610083565b90565b61025990610234565b90565b61026590610250565b90565b6102718161061b565b61029b7fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b9161025c565b906102a4610073565b806102ae816100dd565b0390a2565b6102bc9061021e565b565b600090565b60001c90565b60018060a01b031690565b6102e06102e5916102c3565b6102c9565b90565b6102f290546102d4565b90565b6102fd6102be565b5061030860016102e8565b90565b610313610501565b61031b610348565b565b90565b61033461032f6103399261031d565b610231565b610083565b90565b61034590610320565b90565b61035a610355600061033c565b610639565b565b61036461030b565b565b61036e6102be565b5061037960006102e8565b90565b61038d90610388610501565b610442565b565b60209181520190565b60207f6464726573730000000000000000000000000000000000000000000000000000917f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201520152565b6103f3602660409261038f565b6103fc81610398565b0190565b61041690602081019060008183039101526103e6565b90565b1561042057565b610428610073565b62461bcd60e51b81528061043e60048201610400565b0390fd5b6104719061046c8161046561045f61045a600061033c565b61008e565b9161008e565b1415610419565b610639565b565b61047c9061037c565b565b60007f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572910152565b6104b26020809261038f565b6104bb8161047e565b0190565b6104d590602081019060008183039101526104a6565b90565b156104df57565b6104e7610073565b62461bcd60e51b8152806104fd600482016104bf565b0390fd5b61052b61050c610366565b61052561051f61051a61069a565b61008e565b9161008e565b146104d8565b565b60207f6e206973206e6f74206120636f6e747261637400000000000000000000000000917f5570677261646561626c65426561636f6e3a20696d706c656d656e746174696f60008201520152565b610588603360409261038f565b6105918161052d565b0190565b6105ab906020810190600081830391015261057b565b90565b156105b557565b6105bd610073565b62461bcd60e51b8152806105d360048201610595565b0390fd5b60001b90565b906105ee60018060a01b03916105d7565b9181191691161790565b90565b9061061061060b6106179261025c565b6105f8565b82546105dd565b9055565b6106379061063061062b826106cb565b6105ae565b60016105fb565b565b61064360006102e8565b61064e8260006105fb565b9061068261067c7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09361025c565b9161025c565b9161068b610073565b80610695816100dd565b0390a3565b6106a26102be565b503390565b600090565b90565b6106c36106be6106c89261031d565b610231565b6106ac565b90565b6106d36106a7565b503b6106e86106e260006106af565b916106ac565b119056fea26469706673582212203fbf94b3aa182e7120f7ee578f52eecce106fbe2a323e7e4f1511d9f27768ead64736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE PUSH2 0x2F JUMPI PUSH2 0x19 PUSH2 0x14 PUSH2 0xFA JUMP JUMPDEST PUSH2 0x11B JUMP JUMPDEST PUSH2 0x21 PUSH2 0x34 JUMP JUMPDEST PUSH2 0x722 PUSH2 0x380 DUP3 CODECOPY PUSH2 0x722 SWAP1 RETURN JUMPDEST PUSH2 0x3A JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1F DUP1 NOT SWAP2 ADD AND SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH2 0x69 SWAP1 PUSH2 0x3F JUMP JUMPDEST DUP2 ADD SWAP1 DUP2 LT PUSH1 0x1 DUP1 PUSH1 0x40 SHL SUB DUP3 GT OR PUSH2 0x81 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH2 0x49 JUMP JUMPDEST SWAP1 PUSH2 0x99 PUSH2 0x92 PUSH2 0x34 JUMP JUMPDEST SWAP3 DUP4 PUSH2 0x5F JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0xB4 SWAP1 PUSH2 0xA0 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xC0 DUP2 PUSH2 0xAB JUMP JUMPDEST SUB PUSH2 0xC7 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP MLOAD SWAP1 PUSH2 0xD9 DUP3 PUSH2 0xB7 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0xF5 JUMPI PUSH2 0xF2 SWAP2 PUSH1 0x0 ADD PUSH2 0xCC JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x9B JUMP JUMPDEST PUSH2 0x118 PUSH2 0xAA2 DUP1 CODESIZE SUB DUP1 PUSH2 0x10D DUP2 PUSH2 0x86 JUMP JUMPDEST SWAP3 DUP4 CODECOPY DUP2 ADD SWAP1 PUSH2 0xDB JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x12C SWAP1 PUSH2 0x127 PUSH2 0x12E JUMP JUMPDEST PUSH2 0x26E JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x13E PUSH2 0x139 PUSH2 0x291 JUMP JUMPDEST PUSH2 0x2D6 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 PUSH32 0x6E206973206E6F74206120636F6E747261637400000000000000000000000000 SWAP2 PUSH32 0x5570677261646561626C65426561636F6E3A20696D706C656D656E746174696F PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x1A4 PUSH1 0x33 PUSH1 0x40 SWAP3 PUSH2 0x140 JUMP JUMPDEST PUSH2 0x1AD DUP2 PUSH2 0x149 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x1C7 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x197 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x1D1 JUMPI JUMP JUMPDEST PUSH2 0x1D9 PUSH2 0x34 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x1EF PUSH1 0x4 DUP3 ADD PUSH2 0x1B1 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SHL SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x20A PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB SWAP2 PUSH2 0x1F3 JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x22B PUSH2 0x226 PUSH2 0x230 SWAP3 PUSH2 0xA0 JUMP JUMPDEST PUSH2 0x214 JUMP JUMPDEST PUSH2 0xA0 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x23C SWAP1 PUSH2 0x217 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x248 SWAP1 PUSH2 0x233 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x263 PUSH2 0x25E PUSH2 0x26A SWAP3 PUSH2 0x23F JUMP JUMPDEST PUSH2 0x24B JUMP JUMPDEST DUP3 SLOAD PUSH2 0x1F9 JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x28A SWAP1 PUSH2 0x283 PUSH2 0x27E DUP3 PUSH2 0x35E JUMP JUMPDEST PUSH2 0x1CA JUMP JUMPDEST PUSH1 0x1 PUSH2 0x24E JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x299 PUSH2 0x28C JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 SHR SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x2BB PUSH2 0x2C0 SWAP2 PUSH2 0x29E JUMP JUMPDEST PUSH2 0x2A4 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2CD SWAP1 SLOAD PUSH2 0x2AF JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 ADD SWAP1 JUMP JUMPDEST PUSH2 0x2E0 PUSH1 0x0 PUSH2 0x2C3 JUMP JUMPDEST PUSH2 0x2EB DUP3 PUSH1 0x0 PUSH2 0x24E JUMP JUMPDEST SWAP1 PUSH2 0x31F PUSH2 0x319 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP4 PUSH2 0x23F JUMP JUMPDEST SWAP2 PUSH2 0x23F JUMP JUMPDEST SWAP2 PUSH2 0x328 PUSH2 0x34 JUMP JUMPDEST DUP1 PUSH2 0x332 DUP2 PUSH2 0x2D0 JUMP JUMPDEST SUB SWAP1 LOG3 JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x356 PUSH2 0x351 PUSH2 0x35B SWAP3 PUSH2 0x33F JUMP JUMPDEST PUSH2 0x214 JUMP JUMPDEST PUSH2 0x33C JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x366 PUSH2 0x337 JUMP JUMPDEST POP EXTCODESIZE PUSH2 0x37B PUSH2 0x375 PUSH1 0x0 PUSH2 0x342 JUMP JUMPDEST SWAP2 PUSH2 0x33C JUMP JUMPDEST GT SWAP1 JUMP INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x13 JUMPI JUMPDEST PUSH2 0x219 JUMP JUMPDEST PUSH2 0x1E PUSH1 0x0 CALLDATALOAD PUSH2 0x6D JUMP JUMPDEST DUP1 PUSH4 0x3659CFE6 EQ PUSH2 0x68 JUMPI DUP1 PUSH4 0x5C60DA1B EQ PUSH2 0x63 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x5E JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x59 JUMPI PUSH4 0xF2FDE38B SUB PUSH2 0xE JUMPI PUSH2 0x1E6 JUMP JUMPDEST PUSH2 0x1B1 JUMP JUMPDEST PUSH2 0x17E JUMP JUMPDEST PUSH2 0x149 JUMP JUMPDEST PUSH2 0xE3 JUMP JUMPDEST PUSH1 0xE0 SHR SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x97 SWAP1 PUSH2 0x83 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xA3 DUP2 PUSH2 0x8E JUMP JUMPDEST SUB PUSH2 0xAA JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0xBC DUP3 PUSH2 0x9A JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0xD8 JUMPI PUSH2 0xD5 SWAP2 PUSH1 0x0 ADD PUSH2 0xAF JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x7E JUMP JUMPDEST PUSH1 0x0 ADD SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x111 JUMPI PUSH2 0xFB PUSH2 0xF6 CALLDATASIZE PUSH1 0x4 PUSH2 0xBE JUMP JUMPDEST PUSH2 0x2B3 JUMP JUMPDEST PUSH2 0x103 PUSH2 0x73 JUMP JUMPDEST DUP1 PUSH2 0x10D DUP2 PUSH2 0xDD JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x79 JUMP JUMPDEST PUSH1 0x0 SWAP2 SUB SLT PUSH2 0x121 JUMPI JUMP JUMPDEST PUSH2 0x7E JUMP JUMPDEST PUSH2 0x12F SWAP1 PUSH2 0x8E JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x147 SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0x126 JUMP JUMPDEST JUMP JUMPDEST CALLVALUE PUSH2 0x179 JUMPI PUSH2 0x159 CALLDATASIZE PUSH1 0x4 PUSH2 0x116 JUMP JUMPDEST PUSH2 0x175 PUSH2 0x164 PUSH2 0x2F5 JUMP JUMPDEST PUSH2 0x16C PUSH2 0x73 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x133 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x79 JUMP JUMPDEST CALLVALUE PUSH2 0x1AC JUMPI PUSH2 0x18E CALLDATASIZE PUSH1 0x4 PUSH2 0x116 JUMP JUMPDEST PUSH2 0x196 PUSH2 0x35C JUMP JUMPDEST PUSH2 0x19E PUSH2 0x73 JUMP JUMPDEST DUP1 PUSH2 0x1A8 DUP2 PUSH2 0xDD JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x79 JUMP JUMPDEST CALLVALUE PUSH2 0x1E1 JUMPI PUSH2 0x1C1 CALLDATASIZE PUSH1 0x4 PUSH2 0x116 JUMP JUMPDEST PUSH2 0x1DD PUSH2 0x1CC PUSH2 0x366 JUMP JUMPDEST PUSH2 0x1D4 PUSH2 0x73 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x133 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x79 JUMP JUMPDEST CALLVALUE PUSH2 0x214 JUMPI PUSH2 0x1FE PUSH2 0x1F9 CALLDATASIZE PUSH1 0x4 PUSH2 0xBE JUMP JUMPDEST PUSH2 0x473 JUMP JUMPDEST PUSH2 0x206 PUSH2 0x73 JUMP JUMPDEST DUP1 PUSH2 0x210 DUP2 PUSH2 0xDD JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x79 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x22F SWAP1 PUSH2 0x22A PUSH2 0x501 JUMP JUMPDEST PUSH2 0x268 JUMP JUMPDEST JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x248 PUSH2 0x243 PUSH2 0x24D SWAP3 PUSH2 0x83 JUMP JUMPDEST PUSH2 0x231 JUMP JUMPDEST PUSH2 0x83 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x259 SWAP1 PUSH2 0x234 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x265 SWAP1 PUSH2 0x250 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x271 DUP2 PUSH2 0x61B JUMP JUMPDEST PUSH2 0x29B PUSH32 0xBC7CD75A20EE27FD9ADEBAB32041F755214DBC6BFFA90CC0225B39DA2E5C2D3B SWAP2 PUSH2 0x25C JUMP JUMPDEST SWAP1 PUSH2 0x2A4 PUSH2 0x73 JUMP JUMPDEST DUP1 PUSH2 0x2AE DUP2 PUSH2 0xDD JUMP JUMPDEST SUB SWAP1 LOG2 JUMP JUMPDEST PUSH2 0x2BC SWAP1 PUSH2 0x21E JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH1 0x0 SHR SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x2E0 PUSH2 0x2E5 SWAP2 PUSH2 0x2C3 JUMP JUMPDEST PUSH2 0x2C9 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2F2 SWAP1 SLOAD PUSH2 0x2D4 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2FD PUSH2 0x2BE JUMP JUMPDEST POP PUSH2 0x308 PUSH1 0x1 PUSH2 0x2E8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x313 PUSH2 0x501 JUMP JUMPDEST PUSH2 0x31B PUSH2 0x348 JUMP JUMPDEST JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x334 PUSH2 0x32F PUSH2 0x339 SWAP3 PUSH2 0x31D JUMP JUMPDEST PUSH2 0x231 JUMP JUMPDEST PUSH2 0x83 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x345 SWAP1 PUSH2 0x320 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x35A PUSH2 0x355 PUSH1 0x0 PUSH2 0x33C JUMP JUMPDEST PUSH2 0x639 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x364 PUSH2 0x30B JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x36E PUSH2 0x2BE JUMP JUMPDEST POP PUSH2 0x379 PUSH1 0x0 PUSH2 0x2E8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x38D SWAP1 PUSH2 0x388 PUSH2 0x501 JUMP JUMPDEST PUSH2 0x442 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x3F3 PUSH1 0x26 PUSH1 0x40 SWAP3 PUSH2 0x38F JUMP JUMPDEST PUSH2 0x3FC DUP2 PUSH2 0x398 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x416 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x3E6 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x420 JUMPI JUMP JUMPDEST PUSH2 0x428 PUSH2 0x73 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x43E PUSH1 0x4 DUP3 ADD PUSH2 0x400 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x471 SWAP1 PUSH2 0x46C DUP2 PUSH2 0x465 PUSH2 0x45F PUSH2 0x45A PUSH1 0x0 PUSH2 0x33C JUMP JUMPDEST PUSH2 0x8E JUMP JUMPDEST SWAP2 PUSH2 0x8E JUMP JUMPDEST EQ ISZERO PUSH2 0x419 JUMP JUMPDEST PUSH2 0x639 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x47C SWAP1 PUSH2 0x37C JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x4B2 PUSH1 0x20 DUP1 SWAP3 PUSH2 0x38F JUMP JUMPDEST PUSH2 0x4BB DUP2 PUSH2 0x47E JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x4D5 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x4A6 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x4DF JUMPI JUMP JUMPDEST PUSH2 0x4E7 PUSH2 0x73 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x4FD PUSH1 0x4 DUP3 ADD PUSH2 0x4BF JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x52B PUSH2 0x50C PUSH2 0x366 JUMP JUMPDEST PUSH2 0x525 PUSH2 0x51F PUSH2 0x51A PUSH2 0x69A JUMP JUMPDEST PUSH2 0x8E JUMP JUMPDEST SWAP2 PUSH2 0x8E JUMP JUMPDEST EQ PUSH2 0x4D8 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x20 PUSH32 0x6E206973206E6F74206120636F6E747261637400000000000000000000000000 SWAP2 PUSH32 0x5570677261646561626C65426561636F6E3A20696D706C656D656E746174696F PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x588 PUSH1 0x33 PUSH1 0x40 SWAP3 PUSH2 0x38F JUMP JUMPDEST PUSH2 0x591 DUP2 PUSH2 0x52D JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x5AB SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x57B JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x5B5 JUMPI JUMP JUMPDEST PUSH2 0x5BD PUSH2 0x73 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x5D3 PUSH1 0x4 DUP3 ADD PUSH2 0x595 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SHL SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x5EE PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB SWAP2 PUSH2 0x5D7 JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x610 PUSH2 0x60B PUSH2 0x617 SWAP3 PUSH2 0x25C JUMP JUMPDEST PUSH2 0x5F8 JUMP JUMPDEST DUP3 SLOAD PUSH2 0x5DD JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x637 SWAP1 PUSH2 0x630 PUSH2 0x62B DUP3 PUSH2 0x6CB JUMP JUMPDEST PUSH2 0x5AE JUMP JUMPDEST PUSH1 0x1 PUSH2 0x5FB JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x643 PUSH1 0x0 PUSH2 0x2E8 JUMP JUMPDEST PUSH2 0x64E DUP3 PUSH1 0x0 PUSH2 0x5FB JUMP JUMPDEST SWAP1 PUSH2 0x682 PUSH2 0x67C PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP4 PUSH2 0x25C JUMP JUMPDEST SWAP2 PUSH2 0x25C JUMP JUMPDEST SWAP2 PUSH2 0x68B PUSH2 0x73 JUMP JUMPDEST DUP1 PUSH2 0x695 DUP2 PUSH2 0xDD JUMP JUMPDEST SUB SWAP1 LOG3 JUMP JUMPDEST PUSH2 0x6A2 PUSH2 0x2BE JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x6C3 PUSH2 0x6BE PUSH2 0x6C8 SWAP3 PUSH2 0x31D JUMP JUMPDEST PUSH2 0x231 JUMP JUMPDEST PUSH2 0x6AC JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x6D3 PUSH2 0x6A7 JUMP JUMPDEST POP EXTCODESIZE PUSH2 0x6E8 PUSH2 0x6E2 PUSH1 0x0 PUSH2 0x6AF JUMP JUMPDEST SWAP2 PUSH2 0x6AC JUMP JUMPDEST GT SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 EXTCODEHASH 0xBF SWAP5 0xB3 0xAA XOR 0x2E PUSH18 0x20F7EE578F52EECCE106FBE2A323E7E4F151 SAR SWAP16 0x27 PUSH23 0x8EAD64736F6C634300081B003300000000000000000000 ", + "sourceMap": "543:1496:11:-:0;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;:::i;:::-;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;:::o;931:89::-;997:15;931:89;;;:::i;:::-;997:15;:::i;:::-;931:89::o;912:63:4:-;955:12;;;:::i;:::-;;:::i;:::-;912:63::o;543:1496:11:-;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;:::o;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;1811:226::-;1995:35;1811:226;1884:101;1892:37;1911:17;1892:37;:::i;:::-;1884:101;:::i;:::-;1995:35;;:::i;:::-;1811:226::o;543:1496::-;;;:::o;640:96:14:-;693:7;;:::i;:::-;719:10;;712:17;:::o;543:1496:11:-;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;;;;:::o;2426:187:4:-;2518:6;;;:::i;:::-;2534:17;2543:8;2534:17;;:::i;:::-;2597:8;2566:40;;;;;:::i;:::-;;;:::i;:::-;;;;:::i;:::-;;;;;:::i;:::-;;;;2426:187::o;543:1496:11:-;;;:::o;:::-;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;1412:320:13:-;1472:4;;:::i;:::-;1702:7;:19;:23;;1724:1;1702:23;:::i;:::-;;;:::i;:::-;;1695:30;:::o" + }, + "deployedBytecode": { + "functionDebugData": { + "abi_decode": { + "entryPoint": 278, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_decode_address": { + "entryPoint": 175, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_address": { + "entryPoint": 190, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_address": { + "entryPoint": 294, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_stringliteral": { + "entryPoint": 1215, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_stringliteral_245f": { + "entryPoint": 998, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_stringliteral_5ccc": { + "entryPoint": 1403, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_stringliteral_9924": { + "entryPoint": 1190, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple": { + "entryPoint": 221, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple_address": { + "entryPoint": 307, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_stringliteral_245f": { + "entryPoint": 1024, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple_stringliteral_5ccc": { + "entryPoint": 1429, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "allocate_unbounded": { + "entryPoint": 115, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "array_storeLengthForEncoding_string": { + "entryPoint": 911, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "cleanup_address": { + "entryPoint": 142, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_from_storage_address": { + "entryPoint": 713, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_rational_by": { + "entryPoint": 797, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_uint160": { + "entryPoint": 131, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_uint256": { + "entryPoint": 1708, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_address_to_address": { + "entryPoint": 604, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_by_to_address": { + "entryPoint": 828, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_by_to_uint160": { + "entryPoint": 800, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_by_to_uint256": { + "entryPoint": 1711, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint160_to_address": { + "entryPoint": 592, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint160_to_uint160": { + "entryPoint": 564, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "external_fun_implementation": { + "entryPoint": 329, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_owner": { + "entryPoint": 433, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_renounceOwnership": { + "entryPoint": 382, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_transferOwnership": { + "entryPoint": 486, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_upgradeTo": { + "entryPoint": 227, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "extract_from_storage_value_offsett_address": { + "entryPoint": 724, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun__transferOwnership": { + "entryPoint": 1593, + "id": 650, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_checkOwner": { + "entryPoint": 1281, + "id": 593, + "parameterSlots": 0, + "returnSlots": 0 + }, + "fun_implementation": { + "entryPoint": 757, + "id": 1105, + "parameterSlots": 0, + "returnSlots": 1 + }, + "fun_isContract": { + "entryPoint": 1739, + "id": 1358, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_msgSender": { + "entryPoint": 1690, + "id": 1682, + "parameterSlots": 0, + "returnSlots": 1 + }, + "fun_owner": { + "entryPoint": 870, + "id": 579, + "parameterSlots": 0, + "returnSlots": 1 + }, + "fun_renounceOwnership": { + "entryPoint": 860, + "id": 607, + "parameterSlots": 0, + "returnSlots": 0 + }, + "fun_renounceOwnership_inner": { + "entryPoint": 840, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "fun_setImplementation": { + "entryPoint": 1563, + "id": 1141, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_transferOwnership": { + "entryPoint": 1139, + "id": 630, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_transferOwnership_inner": { + "entryPoint": 1090, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_upgradeTo": { + "entryPoint": 691, + "id": 1122, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_upgradeTo_inner": { + "entryPoint": 616, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "identity": { + "entryPoint": 561, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "modifier_onlyOwner": { + "entryPoint": 779, + "id": 570, + "parameterSlots": 0, + "returnSlots": 0 + }, + "modifier_onlyOwner_1111": { + "entryPoint": 542, + "id": 570, + "parameterSlots": 1, + "returnSlots": 0 + }, + "modifier_onlyOwner_613": { + "entryPoint": 892, + "id": 570, + "parameterSlots": 1, + "returnSlots": 0 + }, + "prepare_store_address": { + "entryPoint": 1528, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "read_from_storage_split_offset_address": { + "entryPoint": 744, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "require_helper_stringliteral": { + "entryPoint": 1240, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "require_helper_stringliteral_245f": { + "entryPoint": 1049, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "require_helper_stringliteral_5ccc": { + "entryPoint": 1454, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74": { + "entryPoint": 537, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb": { + "entryPoint": 121, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b": { + "entryPoint": 126, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "shift_left": { + "entryPoint": 1495, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_right_0_unsigned": { + "entryPoint": 707, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_right_unsigned": { + "entryPoint": 109, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "store_literal_in_memory_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe": { + "entryPoint": 920, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "store_literal_in_memory_5ccca6b0666a32006e874c0f8fc30910124098b6e8e91ea2ea1baa45ce41f1e6": { + "entryPoint": 1325, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "store_literal_in_memory_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe": { + "entryPoint": 1150, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "update_byte_slice_shift": { + "entryPoint": 1501, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "update_storage_value_offsett_address_to_address": { + "entryPoint": 1531, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "validator_revert_address": { + "entryPoint": 154, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "zero_value_for_split_address": { + "entryPoint": 702, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "zero_value_for_split_bool": { + "entryPoint": 1703, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + } + }, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "60806040526004361015610013575b610219565b61001e60003561006d565b80633659cfe6146100685780635c60da1b14610063578063715018a61461005e5780638da5cb5b146100595763f2fde38b0361000e576101e6565b6101b1565b61017e565b610149565b6100e3565b60e01c90565b60405190565b600080fd5b600080fd5b60018060a01b031690565b61009790610083565b90565b6100a38161008e565b036100aa57565b600080fd5b905035906100bc8261009a565b565b906020828203126100d8576100d5916000016100af565b90565b61007e565b60000190565b34610111576100fb6100f63660046100be565b6102b3565b610103610073565b8061010d816100dd565b0390f35b610079565b600091031261012157565b61007e565b61012f9061008e565b9052565b919061014790600060208501940190610126565b565b3461017957610159366004610116565b6101756101646102f5565b61016c610073565b91829182610133565b0390f35b610079565b346101ac5761018e366004610116565b61019661035c565b61019e610073565b806101a8816100dd565b0390f35b610079565b346101e1576101c1366004610116565b6101dd6101cc610366565b6101d4610073565b91829182610133565b0390f35b610079565b34610214576101fe6101f93660046100be565b610473565b610206610073565b80610210816100dd565b0390f35b610079565b600080fd5b61022f9061022a610501565b610268565b565b90565b61024861024361024d92610083565b610231565b610083565b90565b61025990610234565b90565b61026590610250565b90565b6102718161061b565b61029b7fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b9161025c565b906102a4610073565b806102ae816100dd565b0390a2565b6102bc9061021e565b565b600090565b60001c90565b60018060a01b031690565b6102e06102e5916102c3565b6102c9565b90565b6102f290546102d4565b90565b6102fd6102be565b5061030860016102e8565b90565b610313610501565b61031b610348565b565b90565b61033461032f6103399261031d565b610231565b610083565b90565b61034590610320565b90565b61035a610355600061033c565b610639565b565b61036461030b565b565b61036e6102be565b5061037960006102e8565b90565b61038d90610388610501565b610442565b565b60209181520190565b60207f6464726573730000000000000000000000000000000000000000000000000000917f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201520152565b6103f3602660409261038f565b6103fc81610398565b0190565b61041690602081019060008183039101526103e6565b90565b1561042057565b610428610073565b62461bcd60e51b81528061043e60048201610400565b0390fd5b6104719061046c8161046561045f61045a600061033c565b61008e565b9161008e565b1415610419565b610639565b565b61047c9061037c565b565b60007f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572910152565b6104b26020809261038f565b6104bb8161047e565b0190565b6104d590602081019060008183039101526104a6565b90565b156104df57565b6104e7610073565b62461bcd60e51b8152806104fd600482016104bf565b0390fd5b61052b61050c610366565b61052561051f61051a61069a565b61008e565b9161008e565b146104d8565b565b60207f6e206973206e6f74206120636f6e747261637400000000000000000000000000917f5570677261646561626c65426561636f6e3a20696d706c656d656e746174696f60008201520152565b610588603360409261038f565b6105918161052d565b0190565b6105ab906020810190600081830391015261057b565b90565b156105b557565b6105bd610073565b62461bcd60e51b8152806105d360048201610595565b0390fd5b60001b90565b906105ee60018060a01b03916105d7565b9181191691161790565b90565b9061061061060b6106179261025c565b6105f8565b82546105dd565b9055565b6106379061063061062b826106cb565b6105ae565b60016105fb565b565b61064360006102e8565b61064e8260006105fb565b9061068261067c7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09361025c565b9161025c565b9161068b610073565b80610695816100dd565b0390a3565b6106a26102be565b503390565b600090565b90565b6106c36106be6106c89261031d565b610231565b6106ac565b90565b6106d36106a7565b503b6106e86106e260006106af565b916106ac565b119056fea26469706673582212203fbf94b3aa182e7120f7ee578f52eecce106fbe2a323e7e4f1511d9f27768ead64736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x13 JUMPI JUMPDEST PUSH2 0x219 JUMP JUMPDEST PUSH2 0x1E PUSH1 0x0 CALLDATALOAD PUSH2 0x6D JUMP JUMPDEST DUP1 PUSH4 0x3659CFE6 EQ PUSH2 0x68 JUMPI DUP1 PUSH4 0x5C60DA1B EQ PUSH2 0x63 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x5E JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x59 JUMPI PUSH4 0xF2FDE38B SUB PUSH2 0xE JUMPI PUSH2 0x1E6 JUMP JUMPDEST PUSH2 0x1B1 JUMP JUMPDEST PUSH2 0x17E JUMP JUMPDEST PUSH2 0x149 JUMP JUMPDEST PUSH2 0xE3 JUMP JUMPDEST PUSH1 0xE0 SHR SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x97 SWAP1 PUSH2 0x83 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xA3 DUP2 PUSH2 0x8E JUMP JUMPDEST SUB PUSH2 0xAA JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0xBC DUP3 PUSH2 0x9A JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0xD8 JUMPI PUSH2 0xD5 SWAP2 PUSH1 0x0 ADD PUSH2 0xAF JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x7E JUMP JUMPDEST PUSH1 0x0 ADD SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x111 JUMPI PUSH2 0xFB PUSH2 0xF6 CALLDATASIZE PUSH1 0x4 PUSH2 0xBE JUMP JUMPDEST PUSH2 0x2B3 JUMP JUMPDEST PUSH2 0x103 PUSH2 0x73 JUMP JUMPDEST DUP1 PUSH2 0x10D DUP2 PUSH2 0xDD JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x79 JUMP JUMPDEST PUSH1 0x0 SWAP2 SUB SLT PUSH2 0x121 JUMPI JUMP JUMPDEST PUSH2 0x7E JUMP JUMPDEST PUSH2 0x12F SWAP1 PUSH2 0x8E JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x147 SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0x126 JUMP JUMPDEST JUMP JUMPDEST CALLVALUE PUSH2 0x179 JUMPI PUSH2 0x159 CALLDATASIZE PUSH1 0x4 PUSH2 0x116 JUMP JUMPDEST PUSH2 0x175 PUSH2 0x164 PUSH2 0x2F5 JUMP JUMPDEST PUSH2 0x16C PUSH2 0x73 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x133 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x79 JUMP JUMPDEST CALLVALUE PUSH2 0x1AC JUMPI PUSH2 0x18E CALLDATASIZE PUSH1 0x4 PUSH2 0x116 JUMP JUMPDEST PUSH2 0x196 PUSH2 0x35C JUMP JUMPDEST PUSH2 0x19E PUSH2 0x73 JUMP JUMPDEST DUP1 PUSH2 0x1A8 DUP2 PUSH2 0xDD JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x79 JUMP JUMPDEST CALLVALUE PUSH2 0x1E1 JUMPI PUSH2 0x1C1 CALLDATASIZE PUSH1 0x4 PUSH2 0x116 JUMP JUMPDEST PUSH2 0x1DD PUSH2 0x1CC PUSH2 0x366 JUMP JUMPDEST PUSH2 0x1D4 PUSH2 0x73 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x133 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x79 JUMP JUMPDEST CALLVALUE PUSH2 0x214 JUMPI PUSH2 0x1FE PUSH2 0x1F9 CALLDATASIZE PUSH1 0x4 PUSH2 0xBE JUMP JUMPDEST PUSH2 0x473 JUMP JUMPDEST PUSH2 0x206 PUSH2 0x73 JUMP JUMPDEST DUP1 PUSH2 0x210 DUP2 PUSH2 0xDD JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x79 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x22F SWAP1 PUSH2 0x22A PUSH2 0x501 JUMP JUMPDEST PUSH2 0x268 JUMP JUMPDEST JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x248 PUSH2 0x243 PUSH2 0x24D SWAP3 PUSH2 0x83 JUMP JUMPDEST PUSH2 0x231 JUMP JUMPDEST PUSH2 0x83 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x259 SWAP1 PUSH2 0x234 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x265 SWAP1 PUSH2 0x250 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x271 DUP2 PUSH2 0x61B JUMP JUMPDEST PUSH2 0x29B PUSH32 0xBC7CD75A20EE27FD9ADEBAB32041F755214DBC6BFFA90CC0225B39DA2E5C2D3B SWAP2 PUSH2 0x25C JUMP JUMPDEST SWAP1 PUSH2 0x2A4 PUSH2 0x73 JUMP JUMPDEST DUP1 PUSH2 0x2AE DUP2 PUSH2 0xDD JUMP JUMPDEST SUB SWAP1 LOG2 JUMP JUMPDEST PUSH2 0x2BC SWAP1 PUSH2 0x21E JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH1 0x0 SHR SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x2E0 PUSH2 0x2E5 SWAP2 PUSH2 0x2C3 JUMP JUMPDEST PUSH2 0x2C9 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2F2 SWAP1 SLOAD PUSH2 0x2D4 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2FD PUSH2 0x2BE JUMP JUMPDEST POP PUSH2 0x308 PUSH1 0x1 PUSH2 0x2E8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x313 PUSH2 0x501 JUMP JUMPDEST PUSH2 0x31B PUSH2 0x348 JUMP JUMPDEST JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x334 PUSH2 0x32F PUSH2 0x339 SWAP3 PUSH2 0x31D JUMP JUMPDEST PUSH2 0x231 JUMP JUMPDEST PUSH2 0x83 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x345 SWAP1 PUSH2 0x320 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x35A PUSH2 0x355 PUSH1 0x0 PUSH2 0x33C JUMP JUMPDEST PUSH2 0x639 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x364 PUSH2 0x30B JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x36E PUSH2 0x2BE JUMP JUMPDEST POP PUSH2 0x379 PUSH1 0x0 PUSH2 0x2E8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x38D SWAP1 PUSH2 0x388 PUSH2 0x501 JUMP JUMPDEST PUSH2 0x442 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x3F3 PUSH1 0x26 PUSH1 0x40 SWAP3 PUSH2 0x38F JUMP JUMPDEST PUSH2 0x3FC DUP2 PUSH2 0x398 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x416 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x3E6 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x420 JUMPI JUMP JUMPDEST PUSH2 0x428 PUSH2 0x73 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x43E PUSH1 0x4 DUP3 ADD PUSH2 0x400 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x471 SWAP1 PUSH2 0x46C DUP2 PUSH2 0x465 PUSH2 0x45F PUSH2 0x45A PUSH1 0x0 PUSH2 0x33C JUMP JUMPDEST PUSH2 0x8E JUMP JUMPDEST SWAP2 PUSH2 0x8E JUMP JUMPDEST EQ ISZERO PUSH2 0x419 JUMP JUMPDEST PUSH2 0x639 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x47C SWAP1 PUSH2 0x37C JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x4B2 PUSH1 0x20 DUP1 SWAP3 PUSH2 0x38F JUMP JUMPDEST PUSH2 0x4BB DUP2 PUSH2 0x47E JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x4D5 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x4A6 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x4DF JUMPI JUMP JUMPDEST PUSH2 0x4E7 PUSH2 0x73 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x4FD PUSH1 0x4 DUP3 ADD PUSH2 0x4BF JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x52B PUSH2 0x50C PUSH2 0x366 JUMP JUMPDEST PUSH2 0x525 PUSH2 0x51F PUSH2 0x51A PUSH2 0x69A JUMP JUMPDEST PUSH2 0x8E JUMP JUMPDEST SWAP2 PUSH2 0x8E JUMP JUMPDEST EQ PUSH2 0x4D8 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x20 PUSH32 0x6E206973206E6F74206120636F6E747261637400000000000000000000000000 SWAP2 PUSH32 0x5570677261646561626C65426561636F6E3A20696D706C656D656E746174696F PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x588 PUSH1 0x33 PUSH1 0x40 SWAP3 PUSH2 0x38F JUMP JUMPDEST PUSH2 0x591 DUP2 PUSH2 0x52D JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x5AB SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x57B JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x5B5 JUMPI JUMP JUMPDEST PUSH2 0x5BD PUSH2 0x73 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x5D3 PUSH1 0x4 DUP3 ADD PUSH2 0x595 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SHL SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x5EE PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB SWAP2 PUSH2 0x5D7 JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x610 PUSH2 0x60B PUSH2 0x617 SWAP3 PUSH2 0x25C JUMP JUMPDEST PUSH2 0x5F8 JUMP JUMPDEST DUP3 SLOAD PUSH2 0x5DD JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x637 SWAP1 PUSH2 0x630 PUSH2 0x62B DUP3 PUSH2 0x6CB JUMP JUMPDEST PUSH2 0x5AE JUMP JUMPDEST PUSH1 0x1 PUSH2 0x5FB JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x643 PUSH1 0x0 PUSH2 0x2E8 JUMP JUMPDEST PUSH2 0x64E DUP3 PUSH1 0x0 PUSH2 0x5FB JUMP JUMPDEST SWAP1 PUSH2 0x682 PUSH2 0x67C PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP4 PUSH2 0x25C JUMP JUMPDEST SWAP2 PUSH2 0x25C JUMP JUMPDEST SWAP2 PUSH2 0x68B PUSH2 0x73 JUMP JUMPDEST DUP1 PUSH2 0x695 DUP2 PUSH2 0xDD JUMP JUMPDEST SUB SWAP1 LOG3 JUMP JUMPDEST PUSH2 0x6A2 PUSH2 0x2BE JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x6C3 PUSH2 0x6BE PUSH2 0x6C8 SWAP3 PUSH2 0x31D JUMP JUMPDEST PUSH2 0x231 JUMP JUMPDEST PUSH2 0x6AC JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x6D3 PUSH2 0x6A7 JUMP JUMPDEST POP EXTCODESIZE PUSH2 0x6E8 PUSH2 0x6E2 PUSH1 0x0 PUSH2 0x6AF JUMP JUMPDEST SWAP2 PUSH2 0x6AC JUMP JUMPDEST GT SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 EXTCODEHASH 0xBF SWAP5 0xB3 0xAA XOR 0x2E PUSH18 0x20F7EE578F52EECCE106FBE2A323E7E4F151 SAR SWAP16 0x27 PUSH23 0x8EAD64736F6C634300081B003300000000000000000000 ", + "sourceMap": "543:1496:11:-:0;;;;;;;;;-1:-1:-1;543:1496:11;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;:::o;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;:::o;:::-;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;:::o;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;1063:62:4;1117:1;1063:62;;;:::i;:::-;1117:1;:::i;:::-;1063:62::o;543:1496:11:-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;1469:167::-;1569:17;;;:::i;:::-;1602:27;;;;:::i;:::-;;;;:::i;:::-;;;;;:::i;:::-;;;;1469:167::o;:::-;;;;:::i;:::-;:::o;543:1496::-;;;:::o;:::-;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;1098:112::-;1162:7;;:::i;:::-;1188:15;;;;:::i;:::-;1181:22;:::o;1063:62:4:-;;;:::i;:::-;1117:1;;:::i;:::-;1063:62::o;543:1496:11:-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;1824:101:4:-;1907:10;;1915:1;1907:10;:::i;:::-;;:::i;:::-;1824:101::o;:::-;;;:::i;:::-;:::o;1201:85::-;1247:7;;:::i;:::-;1273:6;;;;:::i;:::-;1266:13;:::o;1063:62::-;1117:1;1063:62;;;:::i;:::-;1117:1;:::i;:::-;1063:62::o;543:1496:11:-;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;2074:198:4;2256:8;2074:198;2154:73;2162:8;:22;;2174:10;2182:1;2174:10;:::i;:::-;2162:22;:::i;:::-;;;:::i;:::-;;;2154:73;:::i;:::-;2256:8;:::i;:::-;2074:198::o;:::-;;;;:::i;:::-;:::o;543:1496:11:-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;1359:130:4;1414:68;1422:7;;:::i;:::-;:23;;1433:12;;:::i;:::-;1422:23;:::i;:::-;;;:::i;:::-;;1414:68;:::i;:::-;1359:130::o;543:1496:11:-;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;:::o;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;:::o;:::-;;;;;;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;1811:226::-;1995:35;1811:226;1884:101;1892:37;1911:17;1892:37;:::i;:::-;1884:101;:::i;:::-;1995:35;;:::i;:::-;1811:226::o;2426:187:4:-;2518:6;;;:::i;:::-;2534:17;2543:8;2534:17;;:::i;:::-;2597:8;2566:40;;;;;:::i;:::-;;;:::i;:::-;;;;:::i;:::-;;;;;:::i;:::-;;;;2426:187::o;640:96:14:-;693:7;;:::i;:::-;719:10;;712:17;:::o;543:1496:11:-;;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;1412:320:13:-;1472:4;;:::i;:::-;1702:7;:19;:23;;1724:1;1702:23;:::i;:::-;;;:::i;:::-;;1695:30;:::o" + }, + "methodIdentifiers": { + "implementation()": "5c60da1b", + "owner()": "8da5cb5b", + "renounceOwnership()": "715018a6", + "transferOwnership(address)": "f2fde38b", + "upgradeTo(address)": "3659cfe6" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementation_\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"implementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is used in conjunction with one or more instances of {BeaconProxy} to determine their implementation contract, which is where they will delegate all function calls. An owner is able to change the implementation the beacon points to, thus upgrading the proxies that use this beacon.\",\"events\":{\"Upgraded(address)\":{\"details\":\"Emitted when the implementation returned by the beacon is changed.\"}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"details\":\"Sets the address of the initial implementation, and the deployer account as the owner who can upgrade the beacon.\"},\"implementation()\":{\"details\":\"Returns the current implementation address.\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"upgradeTo(address)\":{\"details\":\"Upgrades the beacon to a new implementation. Emits an {Upgraded} event. Requirements: - msg.sender must be the owner of the contract. - `newImplementation` must be a contract.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/proxy/beacon/UpgradeableBeacon.sol\":\"UpgradeableBeacon\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby disabling any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/proxy/beacon/UpgradeableBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/UpgradeableBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IBeacon.sol\\\";\\nimport \\\"../../access/Ownable.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\n\\n/**\\n * @dev This contract is used in conjunction with one or more instances of {BeaconProxy} to determine their\\n * implementation contract, which is where they will delegate all function calls.\\n *\\n * An owner is able to change the implementation the beacon points to, thus upgrading the proxies that use this beacon.\\n */\\ncontract UpgradeableBeacon is IBeacon, Ownable {\\n address private _implementation;\\n\\n /**\\n * @dev Emitted when the implementation returned by the beacon is changed.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Sets the address of the initial implementation, and the deployer account as the owner who can upgrade the\\n * beacon.\\n */\\n constructor(address implementation_) {\\n _setImplementation(implementation_);\\n }\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function implementation() public view virtual override returns (address) {\\n return _implementation;\\n }\\n\\n /**\\n * @dev Upgrades the beacon to a new implementation.\\n *\\n * Emits an {Upgraded} event.\\n *\\n * Requirements:\\n *\\n * - msg.sender must be the owner of the contract.\\n * - `newImplementation` must be a contract.\\n */\\n function upgradeTo(address newImplementation) public virtual onlyOwner {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Sets the implementation contract address for this beacon\\n *\\n * Requirements:\\n *\\n * - `newImplementation` must be a contract.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"UpgradeableBeacon: implementation is not a contract\\\");\\n _implementation = newImplementation;\\n }\\n}\\n\",\"keccak256\":\"0x6ec71aef5659f3f74011169948d2fcda8c6599be5bb38f986380a8737f96cc0f\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n *\\n * Furthermore, `isContract` will also return true if the target contract within\\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\\n * which only has an effect at the end of a transaction.\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "lib/openzeppelin-contracts/contracts/token/common/ERC2981.sol": { + "ERC2981": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "salePrice", + "type": "uint256" + } + ], + "name": "royaltyInfo", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "details": "Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the fee is specified in basis points by default. IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. _Available since v4.5._", + "kind": "dev", + "methods": { + "royaltyInfo(uint256,uint256)": { + "details": "Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of exchange. The royalty amount is denominated and should be paid in that same unit of exchange." + }, + "supportsInterface(bytes4)": { + "details": "See {IERC165-supportsInterface}." + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "royaltyInfo(uint256,uint256)": "2a55205a", + "supportsInterface(bytes4)": "01ffc9a7" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"salePrice\",\"type\":\"uint256\"}],\"name\":\"royaltyInfo\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the fee is specified in basis points by default. IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. _Available since v4.5._\",\"kind\":\"dev\",\"methods\":{\"royaltyInfo(uint256,uint256)\":{\"details\":\"Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of exchange. The royalty amount is denominated and should be paid in that same unit of exchange.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/token/common/ERC2981.sol\":\"ERC2981\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/interfaces/IERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC2981.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Interface for the NFT Royalty Standard.\\n *\\n * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal\\n * support for royalty payments across all NFT marketplaces and ecosystem participants.\\n *\\n * _Available since v4.5._\\n */\\ninterface IERC2981 is IERC165 {\\n /**\\n * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of\\n * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.\\n */\\n function royaltyInfo(\\n uint256 tokenId,\\n uint256 salePrice\\n ) external view returns (address receiver, uint256 royaltyAmount);\\n}\\n\",\"keccak256\":\"0x3976825a61df20457730b79ad0ac9c8908e3c7978ed9bf090c67137c91256b5c\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/token/common/ERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/common/ERC2981.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/IERC2981.sol\\\";\\nimport \\\"../../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.\\n *\\n * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for\\n * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.\\n *\\n * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the\\n * fee is specified in basis points by default.\\n *\\n * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See\\n * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to\\n * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.\\n *\\n * _Available since v4.5._\\n */\\nabstract contract ERC2981 is IERC2981, ERC165 {\\n struct RoyaltyInfo {\\n address receiver;\\n uint96 royaltyFraction;\\n }\\n\\n RoyaltyInfo private _defaultRoyaltyInfo;\\n mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\\n return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @inheritdoc IERC2981\\n */\\n function royaltyInfo(uint256 tokenId, uint256 salePrice) public view virtual override returns (address, uint256) {\\n RoyaltyInfo memory royalty = _tokenRoyaltyInfo[tokenId];\\n\\n if (royalty.receiver == address(0)) {\\n royalty = _defaultRoyaltyInfo;\\n }\\n\\n uint256 royaltyAmount = (salePrice * royalty.royaltyFraction) / _feeDenominator();\\n\\n return (royalty.receiver, royaltyAmount);\\n }\\n\\n /**\\n * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a\\n * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an\\n * override.\\n */\\n function _feeDenominator() internal pure virtual returns (uint96) {\\n return 10000;\\n }\\n\\n /**\\n * @dev Sets the royalty information that all ids in this contract will default to.\\n *\\n * Requirements:\\n *\\n * - `receiver` cannot be the zero address.\\n * - `feeNumerator` cannot be greater than the fee denominator.\\n */\\n function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {\\n require(feeNumerator <= _feeDenominator(), \\\"ERC2981: royalty fee will exceed salePrice\\\");\\n require(receiver != address(0), \\\"ERC2981: invalid receiver\\\");\\n\\n _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);\\n }\\n\\n /**\\n * @dev Removes default royalty information.\\n */\\n function _deleteDefaultRoyalty() internal virtual {\\n delete _defaultRoyaltyInfo;\\n }\\n\\n /**\\n * @dev Sets the royalty information for a specific token id, overriding the global default.\\n *\\n * Requirements:\\n *\\n * - `receiver` cannot be the zero address.\\n * - `feeNumerator` cannot be greater than the fee denominator.\\n */\\n function _setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal virtual {\\n require(feeNumerator <= _feeDenominator(), \\\"ERC2981: royalty fee will exceed salePrice\\\");\\n require(receiver != address(0), \\\"ERC2981: Invalid parameters\\\");\\n\\n _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);\\n }\\n\\n /**\\n * @dev Resets royalty information for the token id back to the global default.\\n */\\n function _resetTokenRoyalty(uint256 tokenId) internal virtual {\\n delete _tokenRoyaltyInfo[tokenId];\\n }\\n}\\n\",\"keccak256\":\"0x990a4133f88b07f92724903f42bb25cdaeca0cf255fb48df26568c40e7c919c6\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "lib/openzeppelin-contracts/contracts/utils/Address.sol": { + "Address": { + "abi": [], + "devdoc": { + "details": "Collection of functions related to the address type", + "kind": "dev", + "methods": {}, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": { + "allocate_unbounded": { + "entryPoint": 33, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb": { + "entryPoint": 39, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + } + }, + "generatedSources": [], + "linkReferences": {}, + "object": "608060405234601d57600e6021565b603f602d823930815050603f90f35b6027565b60405190565b600080fdfe6080604052600080fdfea2646970667358221220d3abc0af33203caad0ad432e6222e8d6d0ceccd4e030fc68e3979c41224f1fb664736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x1D JUMPI PUSH1 0xE PUSH1 0x21 JUMP JUMPDEST PUSH1 0x3F PUSH1 0x2D DUP3 CODECOPY ADDRESS DUP2 POP POP PUSH1 0x3F SWAP1 RETURN JUMPDEST PUSH1 0x27 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xD3 0xAB 0xC0 0xAF CALLER KECCAK256 EXTCODECOPY 0xAA 0xD0 0xAD NUMBER 0x2E PUSH3 0x22E8D6 0xD0 0xCE 0xCC 0xD4 0xE0 ADDRESS 0xFC PUSH9 0xE3979C41224F1FB664 PUSH20 0x6F6C634300081B00330000000000000000000000 ", + "sourceMap": "194:9169:13:-:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + } + }, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "6080604052600080fdfea2646970667358221220d3abc0af33203caad0ad432e6222e8d6d0ceccd4e030fc68e3979c41224f1fb664736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xD3 0xAB 0xC0 0xAF CALLER KECCAK256 EXTCODECOPY 0xAA 0xD0 0xAD NUMBER 0x2E PUSH3 0x22E8D6 0xD0 0xCE 0xCC 0xD4 0xE0 ADDRESS 0xFC PUSH9 0xE3979C41224F1FB664 PUSH20 0x6F6C634300081B00330000000000000000000000 ", + "sourceMap": "194:9169:13:-:0;;;;;" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Collection of functions related to the address type\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":\"Address\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n *\\n * Furthermore, `isContract` will also return true if the target contract within\\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\\n * which only has an effect at the end of a transaction.\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa\",\"license\":\"MIT\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "lib/openzeppelin-contracts/contracts/utils/Context.sol": { + "Context": { + "abi": [], + "devdoc": { + "details": "Provides information about the current execution context, including the sender of the transaction and its data. While these are generally available via msg.sender and msg.data, they should not be accessed in such a direct manner, since when dealing with meta-transactions the account sending and paying for execution may not be the actual sender (as far as an application is concerned). This contract is only required for intermediate, library-like contracts.", + "kind": "dev", + "methods": {}, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Provides information about the current execution context, including the sender of the transaction and its data. While these are generally available via msg.sender and msg.data, they should not be accessed in such a direct manner, since when dealing with meta-transactions the account sending and paying for execution may not be the actual sender (as far as an application is concerned). This contract is only required for intermediate, library-like contracts.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":\"Context\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "lib/openzeppelin-contracts/contracts/utils/Create2.sol": { + "Create2": { + "abi": [], + "devdoc": { + "details": "Helper to make usage of the `CREATE2` EVM opcode easier and safer. `CREATE2` can be used to compute in advance the address where a smart contract will be deployed, which allows for interesting new mechanisms known as 'counterfactual interactions'. See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more information.", + "kind": "dev", + "methods": {}, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": { + "allocate_unbounded": { + "entryPoint": 33, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb": { + "entryPoint": 39, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + } + }, + "generatedSources": [], + "linkReferences": {}, + "object": "608060405234601d57600e6021565b603f602d823930815050603f90f35b6027565b60405190565b600080fdfe6080604052600080fdfea264697066735822122077e98127935e88f2846383618bee3670867107bbcac7fd9a50b5a7c0801ff5a864736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x1D JUMPI PUSH1 0xE PUSH1 0x21 JUMP JUMPDEST PUSH1 0x3F PUSH1 0x2D DUP3 CODECOPY ADDRESS DUP2 POP POP PUSH1 0x3F SWAP1 RETURN JUMPDEST PUSH1 0x27 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH24 0xE98127935E88F2846383618BEE3670867107BBCAC7FD9A50 0xB5 0xA7 0xC0 DUP1 0x1F CREATE2 0xA8 PUSH5 0x736F6C6343 STOP ADDMOD SHL STOP CALLER ", + "sourceMap": "494:3457:15:-:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + } + }, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "6080604052600080fdfea264697066735822122077e98127935e88f2846383618bee3670867107bbcac7fd9a50b5a7c0801ff5a864736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH24 0xE98127935E88F2846383618BEE3670867107BBCAC7FD9A50 0xB5 0xA7 0xC0 DUP1 0x1F CREATE2 0xA8 PUSH5 0x736F6C6343 STOP ADDMOD SHL STOP CALLER ", + "sourceMap": "494:3457:15:-:0;;;;;" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Helper to make usage of the `CREATE2` EVM opcode easier and safer. `CREATE2` can be used to compute in advance the address where a smart contract will be deployed, which allows for interesting new mechanisms known as 'counterfactual interactions'. See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more information.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/utils/Create2.sol\":\"Create2\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/utils/Create2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Create2.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\\n * `CREATE2` can be used to compute in advance the address where a smart\\n * contract will be deployed, which allows for interesting new mechanisms known\\n * as 'counterfactual interactions'.\\n *\\n * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\\n * information.\\n */\\nlibrary Create2 {\\n /**\\n * @dev Deploys a contract using `CREATE2`. The address where the contract\\n * will be deployed can be known in advance via {computeAddress}.\\n *\\n * The bytecode for a contract can be obtained from Solidity with\\n * `type(contractName).creationCode`.\\n *\\n * Requirements:\\n *\\n * - `bytecode` must not be empty.\\n * - `salt` must have not been used for `bytecode` already.\\n * - the factory must have a balance of at least `amount`.\\n * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.\\n */\\n function deploy(uint256 amount, bytes32 salt, bytes memory bytecode) internal returns (address addr) {\\n require(address(this).balance >= amount, \\\"Create2: insufficient balance\\\");\\n require(bytecode.length != 0, \\\"Create2: bytecode length is zero\\\");\\n /// @solidity memory-safe-assembly\\n assembly {\\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\\n }\\n require(addr != address(0), \\\"Create2: Failed on deploy\\\");\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\\n * `bytecodeHash` or `salt` will result in a new destination address.\\n */\\n function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {\\n return computeAddress(salt, bytecodeHash, address(this));\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\\n * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.\\n */\\n function computeAddress(bytes32 salt, bytes32 bytecodeHash, address deployer) internal pure returns (address addr) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let ptr := mload(0x40) // Get free memory pointer\\n\\n // | | \\u2193 ptr ... \\u2193 ptr + 0x0B (start) ... \\u2193 ptr + 0x20 ... \\u2193 ptr + 0x40 ... |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | bytecodeHash | CCCCCCCCCCCCC...CC |\\n // | salt | BBBBBBBBBBBBB...BB |\\n // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |\\n // | 0xFF | FF |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |\\n // | keccak(start, 85) | \\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191 |\\n\\n mstore(add(ptr, 0x40), bytecodeHash)\\n mstore(add(ptr, 0x20), salt)\\n mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes\\n let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff\\n mstore8(start, 0xff)\\n addr := keccak256(start, 85)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x6e00f269073ffc4350e56b7e8153c9092d5f70bfba423299990514183101ef89\",\"license\":\"MIT\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol": { + "StorageSlot": { + "abi": [], + "devdoc": { + "details": "Library for reading and writing primitive types to specific storage slots. Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. This library helps with reading and writing to such slots without the need for inline assembly. The functions in this library return Slot structs that contain a `value` member that can be used to read or write. Example usage to set ERC1967 implementation slot: ```solidity contract ERC1967 { bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; function _getImplementation() internal view returns (address) { return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; } function _setImplementation(address newImplementation) internal { require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\"); StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; } } ``` _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._ _Available since v4.9 for `string`, `bytes`._", + "kind": "dev", + "methods": {}, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": { + "allocate_unbounded": { + "entryPoint": 33, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb": { + "entryPoint": 39, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + } + }, + "generatedSources": [], + "linkReferences": {}, + "object": "608060405234601d57600e6021565b603f602d823930815050603f90f35b6027565b60405190565b600080fdfe6080604052600080fdfea2646970667358221220fea4d0016025f5b5539ed9ba7edda868730b01b468a9222627078c87c88fd27d64736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x1D JUMPI PUSH1 0xE PUSH1 0x21 JUMP JUMPDEST PUSH1 0x3F PUSH1 0x2D DUP3 CODECOPY ADDRESS DUP2 POP POP PUSH1 0x3F SWAP1 RETURN JUMPDEST PUSH1 0x27 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 INVALID LOG4 0xD0 ADD PUSH1 0x25 CREATE2 0xB5 MSTORE8 SWAP15 0xD9 0xBA PUSH31 0xDDA868730B01B468A9222627078C87C88FD27D64736F6C634300081B003300 ", + "sourceMap": "1420:2685:16:-:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + } + }, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "6080604052600080fdfea2646970667358221220fea4d0016025f5b5539ed9ba7edda868730b01b468a9222627078c87c88fd27d64736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 INVALID LOG4 0xD0 ADD PUSH1 0x25 CREATE2 0xB5 MSTORE8 SWAP15 0xD9 0xBA PUSH31 0xDDA868730B01B468A9222627078C87C88FD27D64736F6C634300081B003300 ", + "sourceMap": "1420:2685:16:-:0;;;;;" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Library for reading and writing primitive types to specific storage slots. Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. This library helps with reading and writing to such slots without the need for inline assembly. The functions in this library return Slot structs that contain a `value` member that can be used to read or write. Example usage to set ERC1967 implementation slot: ```solidity contract ERC1967 { bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; function _getImplementation() internal view returns (address) { return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; } function _setImplementation(address newImplementation) internal { require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\"); StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; } } ``` _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._ _Available since v4.9 for `string`, `bytes`._\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol\":\"StorageSlot\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._\\n * _Available since v4.9 for `string`, `bytes`._\\n */\\nlibrary StorageSlot {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n struct StringSlot {\\n string value;\\n }\\n\\n struct BytesSlot {\\n bytes value;\\n }\\n\\n /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n */\\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n */\\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n */\\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `StringSlot` with member `value` located at `slot`.\\n */\\n function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\\n */\\n function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := store.slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BytesSlot` with member `value` located at `slot`.\\n */\\n function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\\n */\\n function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := store.slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf09e68aa0dc6722a25bc46490e8d48ed864466d17313b8a0b254c36b54e49899\",\"license\":\"MIT\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "lib/openzeppelin-contracts/contracts/utils/Strings.sol": { + "Strings": { + "abi": [], + "devdoc": { + "details": "String operations.", + "kind": "dev", + "methods": {}, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": { + "allocate_unbounded": { + "entryPoint": 33, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb": { + "entryPoint": 39, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + } + }, + "generatedSources": [], + "linkReferences": {}, + "object": "608060405234601d57600e6021565b603f602d823930815050603f90f35b6027565b60405190565b600080fdfe6080604052600080fdfea2646970667358221220e16e8e97b4990e0095cd8ebb32493f3de436302fe791387e70d534f04d35056664736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x1D JUMPI PUSH1 0xE PUSH1 0x21 JUMP JUMPDEST PUSH1 0x3F PUSH1 0x2D DUP3 CODECOPY ADDRESS DUP2 POP POP PUSH1 0x3F SWAP1 RETURN JUMPDEST PUSH1 0x27 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xE1 PUSH15 0x8E97B4990E0095CD8EBB32493F3DE4 CALLDATASIZE ADDRESS 0x2F 0xE7 SWAP2 CODESIZE PUSH31 0x70D534F04D35056664736F6C634300081B0033000000000000000000000000 ", + "sourceMap": "220:2559:17:-:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + } + }, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "6080604052600080fdfea2646970667358221220e16e8e97b4990e0095cd8ebb32493f3de436302fe791387e70d534f04d35056664736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xE1 PUSH15 0x8E97B4990E0095CD8EBB32493F3DE4 CALLDATASIZE ADDRESS 0x2F 0xE7 SWAP2 CODESIZE PUSH31 0x70D534F04D35056664736F6C634300081B0033000000000000000000000000 ", + "sourceMap": "220:2559:17:-:0;;;;;" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"String operations.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/utils/Strings.sol\":\"Strings\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\nimport \\\"./math/SignedMath.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\\n */\\n function toString(int256 value) internal pure returns (string memory) {\\n return string(abi.encodePacked(value < 0 ? \\\"-\\\" : \\\"\\\", toString(SignedMath.abs(value))));\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n\\n /**\\n * @dev Returns true if the two strings are equal.\\n */\\n function equal(string memory a, string memory b) internal pure returns (bool) {\\n return keccak256(bytes(a)) == keccak256(bytes(b));\\n }\\n}\\n\",\"keccak256\":\"0x3088eb2868e8d13d89d16670b5f8612c4ab9ff8956272837d8e90106c59c14a0\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\\n // The surrounding unchecked block does not change this fact.\\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1, \\\"Math: mulDiv overflow\\\");\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10 ** 64) {\\n value /= 10 ** 64;\\n result += 64;\\n }\\n if (value >= 10 ** 32) {\\n value /= 10 ** 32;\\n result += 32;\\n }\\n if (value >= 10 ** 16) {\\n value /= 10 ** 16;\\n result += 16;\\n }\\n if (value >= 10 ** 8) {\\n value /= 10 ** 8;\\n result += 8;\\n }\\n if (value >= 10 ** 4) {\\n value /= 10 ** 4;\\n result += 4;\\n }\\n if (value >= 10 ** 2) {\\n value /= 10 ** 2;\\n result += 2;\\n }\\n if (value >= 10 ** 1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard signed math utilities missing in the Solidity language.\\n */\\nlibrary SignedMath {\\n /**\\n * @dev Returns the largest of two signed numbers.\\n */\\n function max(int256 a, int256 b) internal pure returns (int256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two signed numbers.\\n */\\n function min(int256 a, int256 b) internal pure returns (int256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two signed numbers without overflow.\\n * The result is rounded towards zero.\\n */\\n function average(int256 a, int256 b) internal pure returns (int256) {\\n // Formula from the book \\\"Hacker's Delight\\\"\\n int256 x = (a & b) + ((a ^ b) >> 1);\\n return x + (int256(uint256(x) >> 255) & (a ^ b));\\n }\\n\\n /**\\n * @dev Returns the absolute unsigned value of a signed value.\\n */\\n function abs(int256 n) internal pure returns (uint256) {\\n unchecked {\\n // must be unchecked in order to support `n = type(int256).min`\\n return uint256(n >= 0 ? n : -n);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc\",\"license\":\"MIT\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol": { + "ERC165": { + "abi": [ + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "details": "Implementation of the {IERC165} interface. Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check for the additional interface id that will be supported. For example: ```solidity function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); } ``` Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.", + "kind": "dev", + "methods": { + "supportsInterface(bytes4)": { + "details": "See {IERC165-supportsInterface}." + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "supportsInterface(bytes4)": "01ffc9a7" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Implementation of the {IERC165} interface. Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check for the additional interface id that will be supported. For example: ```solidity function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); } ``` Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\",\"kind\":\"dev\",\"methods\":{\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol\":\"ERC165\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol": { + "IERC165": { + "abi": [ + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "details": "Interface of the ERC165 standard, as defined in the https://eips.ethereum.org/EIPS/eip-165[EIP]. Implementers can declare support of contract interfaces, which can then be queried by others ({ERC165Checker}). For an implementation, see {ERC165}.", + "kind": "dev", + "methods": { + "supportsInterface(bytes4)": { + "details": "Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas." + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "supportsInterface(bytes4)": "01ffc9a7" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Interface of the ERC165 standard, as defined in the https://eips.ethereum.org/EIPS/eip-165[EIP]. Implementers can declare support of contract interfaces, which can then be queried by others ({ERC165Checker}). For an implementation, see {ERC165}.\",\"kind\":\"dev\",\"methods\":{\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":\"IERC165\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "lib/openzeppelin-contracts/contracts/utils/math/Math.sol": { + "Math": { + "abi": [], + "devdoc": { + "details": "Standard math utilities missing in the Solidity language.", + "kind": "dev", + "methods": {}, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": { + "allocate_unbounded": { + "entryPoint": 33, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb": { + "entryPoint": 39, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + } + }, + "generatedSources": [], + "linkReferences": {}, + "object": "608060405234601d57600e6021565b603f602d823930815050603f90f35b6027565b60405190565b600080fdfe6080604052600080fdfea2646970667358221220676481f5aa8789a1b0bf561f5296bfb25a92e9cad555d352e316bee4902555b764736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x1D JUMPI PUSH1 0xE PUSH1 0x21 JUMP JUMPDEST PUSH1 0x3F PUSH1 0x2D DUP3 CODECOPY ADDRESS DUP2 POP POP PUSH1 0x3F SWAP1 RETURN JUMPDEST PUSH1 0x27 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH8 0x6481F5AA8789A1B0 0xBF JUMP 0x1F MSTORE SWAP7 0xBF 0xB2 GAS SWAP3 0xE9 0xCA 0xD5 SSTORE 0xD3 MSTORE 0xE3 AND 0xBE 0xE4 SWAP1 0x25 SSTORE 0xB7 PUSH5 0x736F6C6343 STOP ADDMOD SHL STOP CALLER ", + "sourceMap": "202:12582:20:-:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + } + }, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "6080604052600080fdfea2646970667358221220676481f5aa8789a1b0bf561f5296bfb25a92e9cad555d352e316bee4902555b764736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH8 0x6481F5AA8789A1B0 0xBF JUMP 0x1F MSTORE SWAP7 0xBF 0xB2 GAS SWAP3 0xE9 0xCA 0xD5 SSTORE 0xD3 MSTORE 0xE3 AND 0xBE 0xE4 SWAP1 0x25 SSTORE 0xB7 PUSH5 0x736F6C6343 STOP ADDMOD SHL STOP CALLER ", + "sourceMap": "202:12582:20:-:0;;;;;" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Standard math utilities missing in the Solidity language.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":\"Math\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\\n // The surrounding unchecked block does not change this fact.\\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1, \\\"Math: mulDiv overflow\\\");\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10 ** 64) {\\n value /= 10 ** 64;\\n result += 64;\\n }\\n if (value >= 10 ** 32) {\\n value /= 10 ** 32;\\n result += 32;\\n }\\n if (value >= 10 ** 16) {\\n value /= 10 ** 16;\\n result += 16;\\n }\\n if (value >= 10 ** 8) {\\n value /= 10 ** 8;\\n result += 8;\\n }\\n if (value >= 10 ** 4) {\\n value /= 10 ** 4;\\n result += 4;\\n }\\n if (value >= 10 ** 2) {\\n value /= 10 ** 2;\\n result += 2;\\n }\\n if (value >= 10 ** 1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol": { + "SignedMath": { + "abi": [], + "devdoc": { + "details": "Standard signed math utilities missing in the Solidity language.", + "kind": "dev", + "methods": {}, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": { + "allocate_unbounded": { + "entryPoint": 33, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb": { + "entryPoint": 39, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + } + }, + "generatedSources": [], + "linkReferences": {}, + "object": "608060405234601d57600e6021565b603f602d823930815050603f90f35b6027565b60405190565b600080fdfe6080604052600080fdfea264697066735822122091e9af2458177a811dc5c7789df16dc4acd95f66f4cac72f86aafa46ede9435264736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x1D JUMPI PUSH1 0xE PUSH1 0x21 JUMP JUMPDEST PUSH1 0x3F PUSH1 0x2D DUP3 CODECOPY ADDRESS DUP2 POP POP PUSH1 0x3F SWAP1 RETURN JUMPDEST PUSH1 0x27 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP2 0xE9 0xAF 0x24 PC OR PUSH27 0x811DC5C7789DF16DC4ACD95F66F4CAC72F86AAFA46EDE943526473 PUSH16 0x6C634300081B00330000000000000000 ", + "sourceMap": "215:1047:21:-:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + } + }, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "6080604052600080fdfea264697066735822122091e9af2458177a811dc5c7789df16dc4acd95f66f4cac72f86aafa46ede9435264736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP2 0xE9 0xAF 0x24 PC OR PUSH27 0x811DC5C7789DF16DC4ACD95F66F4CAC72F86AAFA46EDE943526473 PUSH16 0x6C634300081B00330000000000000000 ", + "sourceMap": "215:1047:21:-:0;;;;;" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Standard signed math utilities missing in the Solidity language.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol\":\"SignedMath\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard signed math utilities missing in the Solidity language.\\n */\\nlibrary SignedMath {\\n /**\\n * @dev Returns the largest of two signed numbers.\\n */\\n function max(int256 a, int256 b) internal pure returns (int256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two signed numbers.\\n */\\n function min(int256 a, int256 b) internal pure returns (int256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two signed numbers without overflow.\\n * The result is rounded towards zero.\\n */\\n function average(int256 a, int256 b) internal pure returns (int256) {\\n // Formula from the book \\\"Hacker's Delight\\\"\\n int256 x = (a & b) + ((a ^ b) >> 1);\\n return x + (int256(uint256(x) >> 255) & (a ^ b));\\n }\\n\\n /**\\n * @dev Returns the absolute unsigned value of a signed value.\\n */\\n function abs(int256 n) internal pure returns (uint256) {\\n unchecked {\\n // must be unchecked in order to support `n = type(int256).min`\\n return uint256(n >= 0 ? n : -n);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc\",\"license\":\"MIT\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol": { + "EnumerableSet": { + "abi": [], + "devdoc": { + "details": "Library for managing https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive types. Sets have the following properties: - Elements are added, removed, and checked for existence in constant time (O(1)). - Elements are enumerated in O(n). No guarantees are made on the ordering. ```solidity contract Example { // Add the library methods using EnumerableSet for EnumerableSet.AddressSet; // Declare a set state variable EnumerableSet.AddressSet private mySet; } ``` As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) and `uint256` (`UintSet`) are supported. [WARNING] ==== Trying to delete such a structure from storage will likely result in data corruption, rendering the structure unusable. See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an array of EnumerableSet. ====", + "kind": "dev", + "methods": {}, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": { + "allocate_unbounded": { + "entryPoint": 33, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb": { + "entryPoint": 39, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + } + }, + "generatedSources": [], + "linkReferences": {}, + "object": "608060405234601d57600e6021565b603f602d823930815050603f90f35b6027565b60405190565b600080fdfe6080604052600080fdfea26469706673582212202b929ee990d5c52293f80d23bfb8e62ce8663222af518d55741c676314b72d1964736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x1D JUMPI PUSH1 0xE PUSH1 0x21 JUMP JUMPDEST PUSH1 0x3F PUSH1 0x2D DUP3 CODECOPY ADDRESS DUP2 POP POP PUSH1 0x3F SWAP1 RETURN JUMPDEST PUSH1 0x27 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x2B SWAP3 SWAP15 0xE9 SWAP1 0xD5 0xC5 0x22 SWAP4 0xF8 0xD 0x23 0xBF 0xB8 0xE6 0x2C 0xE8 PUSH7 0x3222AF518D5574 SHR PUSH8 0x6314B72D1964736F PUSH13 0x634300081B0033000000000000 ", + "sourceMap": "1329:11630:22:-:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + } + }, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "6080604052600080fdfea26469706673582212202b929ee990d5c52293f80d23bfb8e62ce8663222af518d55741c676314b72d1964736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x2B SWAP3 SWAP15 0xE9 SWAP1 0xD5 0xC5 0x22 SWAP4 0xF8 0xD 0x23 0xBF 0xB8 0xE6 0x2C 0xE8 PUSH7 0x3222AF518D5574 SHR PUSH8 0x6314B72D1964736F PUSH13 0x634300081B0033000000000000 ", + "sourceMap": "1329:11630:22:-:0;;;;;" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Library for managing https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive types. Sets have the following properties: - Elements are added, removed, and checked for existence in constant time (O(1)). - Elements are enumerated in O(n). No guarantees are made on the ordering. ```solidity contract Example { // Add the library methods using EnumerableSet for EnumerableSet.AddressSet; // Declare a set state variable EnumerableSet.AddressSet private mySet; } ``` As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) and `uint256` (`UintSet`) are supported. [WARNING] ==== Trying to delete such a structure from storage will likely result in data corruption, rendering the structure unusable. See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an array of EnumerableSet. ====\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol\":\"EnumerableSet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/EnumerableSet.sol)\\n// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for managing\\n * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive\\n * types.\\n *\\n * Sets have the following properties:\\n *\\n * - Elements are added, removed, and checked for existence in constant time\\n * (O(1)).\\n * - Elements are enumerated in O(n). No guarantees are made on the ordering.\\n *\\n * ```solidity\\n * contract Example {\\n * // Add the library methods\\n * using EnumerableSet for EnumerableSet.AddressSet;\\n *\\n * // Declare a set state variable\\n * EnumerableSet.AddressSet private mySet;\\n * }\\n * ```\\n *\\n * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)\\n * and `uint256` (`UintSet`) are supported.\\n *\\n * [WARNING]\\n * ====\\n * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure\\n * unusable.\\n * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.\\n *\\n * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an\\n * array of EnumerableSet.\\n * ====\\n */\\nlibrary EnumerableSet {\\n // To implement this library for multiple types with as little code\\n // repetition as possible, we write it in terms of a generic Set type with\\n // bytes32 values.\\n // The Set implementation uses private functions, and user-facing\\n // implementations (such as AddressSet) are just wrappers around the\\n // underlying Set.\\n // This means that we can only create new EnumerableSets for types that fit\\n // in bytes32.\\n\\n struct Set {\\n // Storage of set values\\n bytes32[] _values;\\n // Position of the value in the `values` array, plus 1 because index 0\\n // means a value is not in the set.\\n mapping(bytes32 => uint256) _indexes;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function _add(Set storage set, bytes32 value) private returns (bool) {\\n if (!_contains(set, value)) {\\n set._values.push(value);\\n // The value is stored at length-1, but we add 1 to all indexes\\n // and use 0 as a sentinel value\\n set._indexes[value] = set._values.length;\\n return true;\\n } else {\\n return false;\\n }\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function _remove(Set storage set, bytes32 value) private returns (bool) {\\n // We read and store the value's index to prevent multiple reads from the same storage slot\\n uint256 valueIndex = set._indexes[value];\\n\\n if (valueIndex != 0) {\\n // Equivalent to contains(set, value)\\n // To delete an element from the _values array in O(1), we swap the element to delete with the last one in\\n // the array, and then remove the last element (sometimes called as 'swap and pop').\\n // This modifies the order of the array, as noted in {at}.\\n\\n uint256 toDeleteIndex = valueIndex - 1;\\n uint256 lastIndex = set._values.length - 1;\\n\\n if (lastIndex != toDeleteIndex) {\\n bytes32 lastValue = set._values[lastIndex];\\n\\n // Move the last value to the index where the value to delete is\\n set._values[toDeleteIndex] = lastValue;\\n // Update the index for the moved value\\n set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex\\n }\\n\\n // Delete the slot where the moved value was stored\\n set._values.pop();\\n\\n // Delete the index for the deleted slot\\n delete set._indexes[value];\\n\\n return true;\\n } else {\\n return false;\\n }\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function _contains(Set storage set, bytes32 value) private view returns (bool) {\\n return set._indexes[value] != 0;\\n }\\n\\n /**\\n * @dev Returns the number of values on the set. O(1).\\n */\\n function _length(Set storage set) private view returns (uint256) {\\n return set._values.length;\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function _at(Set storage set, uint256 index) private view returns (bytes32) {\\n return set._values[index];\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function _values(Set storage set) private view returns (bytes32[] memory) {\\n return set._values;\\n }\\n\\n // Bytes32Set\\n\\n struct Bytes32Set {\\n Set _inner;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {\\n return _add(set._inner, value);\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {\\n return _remove(set._inner, value);\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {\\n return _contains(set._inner, value);\\n }\\n\\n /**\\n * @dev Returns the number of values in the set. O(1).\\n */\\n function length(Bytes32Set storage set) internal view returns (uint256) {\\n return _length(set._inner);\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {\\n return _at(set._inner, index);\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {\\n bytes32[] memory store = _values(set._inner);\\n bytes32[] memory result;\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := store\\n }\\n\\n return result;\\n }\\n\\n // AddressSet\\n\\n struct AddressSet {\\n Set _inner;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function add(AddressSet storage set, address value) internal returns (bool) {\\n return _add(set._inner, bytes32(uint256(uint160(value))));\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function remove(AddressSet storage set, address value) internal returns (bool) {\\n return _remove(set._inner, bytes32(uint256(uint160(value))));\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function contains(AddressSet storage set, address value) internal view returns (bool) {\\n return _contains(set._inner, bytes32(uint256(uint160(value))));\\n }\\n\\n /**\\n * @dev Returns the number of values in the set. O(1).\\n */\\n function length(AddressSet storage set) internal view returns (uint256) {\\n return _length(set._inner);\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function at(AddressSet storage set, uint256 index) internal view returns (address) {\\n return address(uint160(uint256(_at(set._inner, index))));\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function values(AddressSet storage set) internal view returns (address[] memory) {\\n bytes32[] memory store = _values(set._inner);\\n address[] memory result;\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := store\\n }\\n\\n return result;\\n }\\n\\n // UintSet\\n\\n struct UintSet {\\n Set _inner;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function add(UintSet storage set, uint256 value) internal returns (bool) {\\n return _add(set._inner, bytes32(value));\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function remove(UintSet storage set, uint256 value) internal returns (bool) {\\n return _remove(set._inner, bytes32(value));\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function contains(UintSet storage set, uint256 value) internal view returns (bool) {\\n return _contains(set._inner, bytes32(value));\\n }\\n\\n /**\\n * @dev Returns the number of values in the set. O(1).\\n */\\n function length(UintSet storage set) internal view returns (uint256) {\\n return _length(set._inner);\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function at(UintSet storage set, uint256 index) internal view returns (uint256) {\\n return uint256(_at(set._inner, index));\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function values(UintSet storage set) internal view returns (uint256[] memory) {\\n bytes32[] memory store = _values(set._inner);\\n uint256[] memory result;\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := store\\n }\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0x9f4357008a8f7d8c8bf5d48902e789637538d8c016be5766610901b4bba81514\",\"license\":\"MIT\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "lib/signals-implicit-mode/lib/sequence-v3/src/extensions/sessions/implicit/Attestation.sol": { + "LibAttestation": { + "abi": [], + "devdoc": { + "author": "Michael Standen", + "kind": "dev", + "methods": {}, + "title": "LibAttestation", + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": { + "allocate_unbounded": { + "entryPoint": 33, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb": { + "entryPoint": 39, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + } + }, + "generatedSources": [], + "linkReferences": {}, + "object": "608060405234601d57600e6021565b603f602d823930815050603f90f35b6027565b60405190565b600080fdfe6080604052600080fdfea2646970667358221220bd25df253d044562c56b7ce685e9cf01fd41e647520276a7146d198ffafe523e64736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x1D JUMPI PUSH1 0xE PUSH1 0x21 JUMP JUMPDEST PUSH1 0x3F PUSH1 0x2D DUP3 CODECOPY ADDRESS DUP2 POP POP PUSH1 0x3F SWAP1 RETURN JUMPDEST PUSH1 0x27 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xBD 0x25 0xDF 0x25 RETURNDATASIZE DIV GASLIMIT PUSH3 0xC56B7C 0xE6 DUP6 0xE9 0xCF ADD REVERT COINBASE 0xE6 SELFBALANCE MSTORE MUL PUSH23 0xA7146D198FFAFE523E64736F6C634300081B0033000000 ", + "sourceMap": "1023:3579:23:-:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + } + }, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "6080604052600080fdfea2646970667358221220bd25df253d044562c56b7ce685e9cf01fd41e647520276a7146d198ffafe523e64736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xBD 0x25 0xDF 0x25 RETURNDATASIZE DIV GASLIMIT PUSH3 0xC56B7C 0xE6 DUP6 0xE9 0xCF ADD REVERT COINBASE 0xE6 SELFBALANCE MSTORE MUL PUSH23 0xA7146D198FFAFE523E64736F6C634300081B0033000000 ", + "sourceMap": "1023:3579:23:-:0;;;;;" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"author\":\"Michael Standen\",\"kind\":\"dev\",\"methods\":{},\"title\":\"LibAttestation\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Library for attestation management\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/signals-implicit-mode/lib/sequence-v3/src/extensions/sessions/implicit/Attestation.sol\":\"LibAttestation\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/signals-implicit-mode/lib/sequence-v3/src/extensions/sessions/implicit/Attestation.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.27;\\n\\nimport { LibBytes } from \\\"../../../utils/LibBytes.sol\\\";\\nimport { ACCEPT_IMPLICIT_REQUEST_MAGIC_PREFIX } from \\\"./ISignalsImplicitMode.sol\\\";\\n\\nusing LibBytes for bytes;\\n\\n/// @notice Attestation for a specific session\\n/// @param approvedSigner Address of the approved signer\\n/// @param identityType Identity type\\n/// @param issuerHash Hash of the issuer\\n/// @param audienceHash Hash of the audience\\n/// @param applicationData Unspecified application data\\n/// @param authData Auth data\\nstruct Attestation {\\n address approvedSigner;\\n bytes4 identityType;\\n bytes32 issuerHash;\\n bytes32 audienceHash;\\n bytes applicationData;\\n AuthData authData;\\n}\\n\\n/// @notice Auth data for an attestation\\n/// @param redirectUrl Authorization redirect URL\\n/// @param issuedAt Timestamp of the attestation issuance\\nstruct AuthData {\\n string redirectUrl;\\n uint64 issuedAt;\\n}\\n\\n/// @title LibAttestation\\n/// @author Michael Standen\\n/// @notice Library for attestation management\\nlibrary LibAttestation {\\n\\n /// @notice Hashes an attestation\\n function toHash(\\n Attestation memory attestation\\n ) internal pure returns (bytes32) {\\n return keccak256(toPacked(attestation));\\n }\\n\\n /// @notice Decodes an attestation from a packed bytes array\\n /// @param encoded The packed bytes array\\n /// @param pointer The pointer to the start of the attestation\\n /// @return attestation The decoded attestation\\n /// @return newPointer The new pointer to the end of the attestation\\n function fromPacked(\\n bytes calldata encoded,\\n uint256 pointer\\n ) internal pure returns (Attestation memory attestation, uint256 newPointer) {\\n newPointer = pointer;\\n (attestation.approvedSigner, newPointer) = encoded.readAddress(newPointer);\\n (attestation.identityType, newPointer) = encoded.readBytes4(newPointer);\\n (attestation.issuerHash, newPointer) = encoded.readBytes32(newPointer);\\n (attestation.audienceHash, newPointer) = encoded.readBytes32(newPointer);\\n // Application data (arbitrary bytes)\\n uint256 dataSize;\\n (dataSize, newPointer) = encoded.readUint24(newPointer);\\n attestation.applicationData = encoded[newPointer:newPointer + dataSize];\\n newPointer += dataSize;\\n // Auth data\\n (attestation.authData, newPointer) = fromPackedAuthData(encoded, newPointer);\\n return (attestation, newPointer);\\n }\\n\\n /// @notice Decodes the auth data from a packed bytes\\n /// @param encoded The packed bytes containing the auth data\\n /// @param pointer The pointer to the start of the auth data within the encoded data\\n /// @return authData The decoded auth data\\n /// @return newPointer The pointer to the end of the auth data within the encoded data\\n function fromPackedAuthData(\\n bytes calldata encoded,\\n uint256 pointer\\n ) internal pure returns (AuthData memory authData, uint256 newPointer) {\\n uint24 redirectUrlLength;\\n (redirectUrlLength, pointer) = encoded.readUint24(pointer);\\n authData.redirectUrl = string(encoded[pointer:pointer + redirectUrlLength]);\\n pointer += redirectUrlLength;\\n (authData.issuedAt, pointer) = encoded.readUint64(pointer);\\n return (authData, pointer);\\n }\\n\\n /// @notice Encodes an attestation into a packed bytes array\\n /// @param attestation The attestation to encode\\n /// @return encoded The packed bytes array\\n function toPacked(\\n Attestation memory attestation\\n ) internal pure returns (bytes memory encoded) {\\n return abi.encodePacked(\\n attestation.approvedSigner,\\n attestation.identityType,\\n attestation.issuerHash,\\n attestation.audienceHash,\\n uint24(attestation.applicationData.length),\\n attestation.applicationData,\\n toPackAuthData(attestation.authData)\\n );\\n }\\n\\n /// @notice Encodes the auth data into a packed bytes array\\n /// @param authData The auth data to encode\\n /// @return encoded The packed bytes array\\n function toPackAuthData(\\n AuthData memory authData\\n ) internal pure returns (bytes memory encoded) {\\n return abi.encodePacked(uint24(bytes(authData.redirectUrl).length), bytes(authData.redirectUrl), authData.issuedAt);\\n }\\n\\n /// @notice Generates the implicit request magic return value\\n /// @param attestation The attestation\\n /// @param wallet The wallet\\n /// @return magic The expected implicit request magic\\n function generateImplicitRequestMagic(Attestation memory attestation, address wallet) internal pure returns (bytes32) {\\n return keccak256(\\n abi.encodePacked(ACCEPT_IMPLICIT_REQUEST_MAGIC_PREFIX, wallet, attestation.audienceHash, attestation.issuerHash)\\n );\\n }\\n\\n}\\n\",\"keccak256\":\"0xcaa44022b5eb4bc7ab487b3b1a0125da67e2e891cee983ef6cdb6814f045efc8\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/lib/sequence-v3/src/extensions/sessions/implicit/ISignalsImplicitMode.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.27;\\n\\nimport { Payload } from \\\"../../../modules/Payload.sol\\\";\\nimport { Attestation } from \\\"./Attestation.sol\\\";\\n\\n/// @dev Magic prefix for the implicit request\\nbytes32 constant ACCEPT_IMPLICIT_REQUEST_MAGIC_PREFIX = keccak256(abi.encodePacked(\\\"acceptImplicitRequest\\\"));\\n\\n/// @title ISignalsImplicitMode\\n/// @author Agustin Aguilar, Michael Standen\\n/// @notice Interface for the contracts that support implicit mode validation\\ninterface ISignalsImplicitMode {\\n\\n /// @notice Determines if an implicit request is valid\\n /// @param wallet The wallet's address\\n /// @param attestation The attestation data\\n /// @param call The call to validate\\n /// @return magic The hash of the implicit request if valid\\n function acceptImplicitRequest(\\n address wallet,\\n Attestation calldata attestation,\\n Payload.Call calldata call\\n ) external view returns (bytes32 magic);\\n\\n}\\n\",\"keccak256\":\"0x6cb48f50c49bcb3c7071306fe9fac6c102bc9eabf73d9909e19ab3b9a835d0a8\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/lib/sequence-v3/src/modules/Payload.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.27;\\n\\nimport { LibBytes } from \\\"../utils/LibBytes.sol\\\";\\n\\nusing LibBytes for bytes;\\n\\n/// @title Payload\\n/// @author Agustin Aguilar, Michael Standen, William Hua\\n/// @notice Library for encoding and decoding payloads\\nlibrary Payload {\\n\\n /// @notice Error thrown when the kind is invalid\\n error InvalidKind(uint8 kind);\\n\\n /// @dev keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\")\\n bytes32 private constant EIP712_DOMAIN_TYPEHASH = 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f;\\n\\n /// @dev keccak256(\\\"Sequence Wallet\\\")\\n bytes32 private constant EIP712_DOMAIN_NAME_SEQUENCE =\\n 0x4aa45ca7ad825ceb1bf35643f0a58c295239df563b1b565c2485f96477c56318;\\n\\n /// @dev keccak256(\\\"3\\\")\\n bytes32 private constant EIP712_DOMAIN_VERSION_SEQUENCE =\\n 0x2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de;\\n\\n function domainSeparator(bool _noChainId, address _wallet) internal view returns (bytes32 _domainSeparator) {\\n return keccak256(\\n abi.encode(\\n EIP712_DOMAIN_TYPEHASH,\\n EIP712_DOMAIN_NAME_SEQUENCE,\\n EIP712_DOMAIN_VERSION_SEQUENCE,\\n _noChainId ? uint256(0) : uint256(block.chainid),\\n _wallet\\n )\\n );\\n }\\n\\n /// @dev keccak256(\\\"Call(address to,uint256 value,bytes data,uint256 gasLimit,bool delegateCall,bool onlyFallback,uint256 behaviorOnError)\\\")\\n bytes32 private constant CALL_TYPEHASH = 0x0603985259a953da1f65a522f589c17bd1d0117ec1d3abb7c0788aef251ef437;\\n\\n /// @dev keccak256(\\\"Calls(Call[] calls,uint256 space,uint256 nonce,address[] wallets)Call(address to,uint256 value,bytes data,uint256 gasLimit,bool delegateCall,bool onlyFallback,uint256 behaviorOnError)\\\")\\n bytes32 private constant CALLS_TYPEHASH = 0x11e1e4079a79a66e4ade50033cfe2678cdd5341d2dfe5ef9513edb1a0be147a2;\\n\\n /// @dev keccak256(\\\"Message(bytes message,address[] wallets)\\\")\\n bytes32 private constant MESSAGE_TYPEHASH = 0xe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d466;\\n\\n /// @dev keccak256(\\\"ConfigUpdate(bytes32 imageHash,address[] wallets)\\\")\\n bytes32 private constant CONFIG_UPDATE_TYPEHASH = 0x11fdeb7e8373a1aa96bfac8d0ea91526b2c5d15e5cee20e0543e780258f3e8e4;\\n\\n /// @notice Kind of transaction\\n uint8 public constant KIND_TRANSACTIONS = 0x00;\\n /// @notice Kind of digest\\n uint8 public constant KIND_MESSAGE = 0x01;\\n /// @notice Kind of config update\\n uint8 public constant KIND_CONFIG_UPDATE = 0x02;\\n /// @notice Kind of message\\n uint8 public constant KIND_DIGEST = 0x03;\\n\\n /// @notice Behavior on error: ignore error\\n uint8 public constant BEHAVIOR_IGNORE_ERROR = 0x00;\\n /// @notice Behavior on error: revert on error\\n uint8 public constant BEHAVIOR_REVERT_ON_ERROR = 0x01;\\n /// @notice Behavior on error: abort on error\\n uint8 public constant BEHAVIOR_ABORT_ON_ERROR = 0x02;\\n\\n /// @notice Payload call information\\n /// @param to Address of the target contract\\n /// @param value Value to send with the call\\n /// @param data Data to send with the call\\n /// @param gasLimit Gas limit for the call\\n /// @param delegateCall If the call is a delegate call\\n /// @param onlyFallback If the call should only be executed in an error scenario\\n /// @param behaviorOnError Behavior on error\\n struct Call {\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 gasLimit;\\n bool delegateCall;\\n bool onlyFallback;\\n uint256 behaviorOnError;\\n }\\n\\n /// @notice Decoded payload\\n /// @param kind Kind of payload\\n /// @param noChainId If the chain ID should be omitted\\n /// @param calls Array of calls (transaction kind)\\n /// @param space Nonce space for the calls (transaction kind)\\n /// @param nonce Nonce value for the calls (transaction kind)\\n /// @param message Message to validate (message kind)\\n /// @param imageHash Image hash to update to (config update kind)\\n /// @param digest Digest to validate (digest kind)\\n /// @param parentWallets Parent wallets\\n struct Decoded {\\n uint8 kind;\\n bool noChainId;\\n // Transaction kind\\n Call[] calls;\\n uint256 space;\\n uint256 nonce;\\n // Message kind\\n // TODO: Maybe native 721 ?\\n bytes message;\\n // Config update kind\\n bytes32 imageHash;\\n // Digest kind for 1271\\n bytes32 digest;\\n // Parent wallets\\n address[] parentWallets;\\n }\\n\\n function fromMessage(\\n bytes memory message\\n ) internal pure returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_MESSAGE;\\n _decoded.message = message;\\n }\\n\\n function fromConfigUpdate(\\n bytes32 imageHash\\n ) internal pure returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_CONFIG_UPDATE;\\n _decoded.imageHash = imageHash;\\n }\\n\\n function fromDigest(\\n bytes32 digest\\n ) internal pure returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_DIGEST;\\n _decoded.digest = digest;\\n }\\n\\n function fromPackedCalls(\\n bytes calldata packed\\n ) internal view returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_TRANSACTIONS;\\n\\n // Read the global flag\\n (uint256 globalFlag, uint256 pointer) = packed.readFirstUint8();\\n\\n // First bit determines if space is zero or not\\n if (globalFlag & 0x01 == 0x01) {\\n _decoded.space = 0;\\n } else {\\n (_decoded.space, pointer) = packed.readUint160(pointer);\\n }\\n\\n // Next 3 bits determine the size of the nonce\\n uint256 nonceSize = (globalFlag >> 1) & 0x07;\\n\\n if (nonceSize > 0) {\\n // Read the nonce\\n (_decoded.nonce, pointer) = packed.readUintX(pointer, nonceSize);\\n }\\n\\n uint256 numCalls;\\n\\n // Bit 5 determines if the batch contains a single call\\n if (globalFlag & 0x10 == 0x10) {\\n numCalls = 1;\\n } else {\\n // Bit 6 determines if the number of calls uses 1 byte or 2 bytes\\n if (globalFlag & 0x20 == 0x20) {\\n (numCalls, pointer) = packed.readUint16(pointer);\\n } else {\\n (numCalls, pointer) = packed.readUint8(pointer);\\n }\\n }\\n\\n // Read the calls\\n _decoded.calls = new Call[](numCalls);\\n\\n for (uint256 i = 0; i < numCalls; i++) {\\n uint8 flags;\\n (flags, pointer) = packed.readUint8(pointer);\\n\\n // First bit determines if this is a call to self\\n // or a call to another address\\n if (flags & 0x01 == 0x01) {\\n // Call to self\\n _decoded.calls[i].to = address(this);\\n } else {\\n // Call to another address\\n (_decoded.calls[i].to, pointer) = packed.readAddress(pointer);\\n }\\n\\n // Second bit determines if the call has value or not\\n if (flags & 0x02 == 0x02) {\\n (_decoded.calls[i].value, pointer) = packed.readUint256(pointer);\\n }\\n\\n // Third bit determines if the call has data or not\\n if (flags & 0x04 == 0x04) {\\n // 3 bytes determine the size of the calldata\\n uint256 calldataSize;\\n (calldataSize, pointer) = packed.readUint24(pointer);\\n _decoded.calls[i].data = packed[pointer:pointer + calldataSize];\\n pointer += calldataSize;\\n }\\n\\n // Fourth bit determines if the call has a gas limit or not\\n if (flags & 0x08 == 0x08) {\\n (_decoded.calls[i].gasLimit, pointer) = packed.readUint256(pointer);\\n }\\n\\n // Fifth bit determines if the call is a delegate call or not\\n _decoded.calls[i].delegateCall = (flags & 0x10 == 0x10);\\n\\n // Sixth bit determines if the call is fallback only\\n _decoded.calls[i].onlyFallback = (flags & 0x20 == 0x20);\\n\\n // Last 2 bits are directly mapped to the behavior on error\\n _decoded.calls[i].behaviorOnError = (flags & 0xC0) >> 6;\\n }\\n }\\n\\n function hashCall(\\n Call memory c\\n ) internal pure returns (bytes32) {\\n return keccak256(\\n abi.encode(\\n CALL_TYPEHASH, c.to, c.value, keccak256(c.data), c.gasLimit, c.delegateCall, c.onlyFallback, c.behaviorOnError\\n )\\n );\\n }\\n\\n function hashCalls(\\n Call[] memory calls\\n ) internal pure returns (bytes32) {\\n // In EIP712, an array is often hashed as the keccak256 of the concatenated\\n // hashes of each item. So we hash each Call, pack them, and hash again.\\n bytes32[] memory callHashes = new bytes32[](calls.length);\\n for (uint256 i = 0; i < calls.length; i++) {\\n callHashes[i] = hashCall(calls[i]);\\n }\\n return keccak256(abi.encodePacked(callHashes));\\n }\\n\\n function toEIP712(\\n Decoded memory _decoded\\n ) internal pure returns (bytes32) {\\n bytes32 walletsHash = keccak256(abi.encodePacked(_decoded.parentWallets));\\n\\n if (_decoded.kind == KIND_TRANSACTIONS) {\\n bytes32 callsHash = hashCalls(_decoded.calls);\\n // The top-level struct for Calls might be something like:\\n // Calls(bytes32 callsHash,uint256 space,uint256 nonce,bytes32 walletsHash)\\n return keccak256(abi.encode(CALLS_TYPEHASH, callsHash, _decoded.space, _decoded.nonce, walletsHash));\\n } else if (_decoded.kind == KIND_MESSAGE) {\\n // If you define your top-level as: Message(bytes32 messageHash,bytes32 walletsHash)\\n return keccak256(abi.encode(MESSAGE_TYPEHASH, keccak256(_decoded.message), walletsHash));\\n } else if (_decoded.kind == KIND_CONFIG_UPDATE) {\\n // Top-level: ConfigUpdate(bytes32 imageHash,bytes32 walletsHash)\\n return keccak256(abi.encode(CONFIG_UPDATE_TYPEHASH, _decoded.imageHash, walletsHash));\\n } else if (_decoded.kind == KIND_DIGEST) {\\n // Top-level: Use MESSAGE_TYPEHASH but assume the digest is already the hashed message\\n return keccak256(abi.encode(MESSAGE_TYPEHASH, _decoded.digest, walletsHash));\\n } else {\\n // Unknown kind\\n revert InvalidKind(_decoded.kind);\\n }\\n }\\n\\n function hash(\\n Decoded memory _decoded\\n ) internal view returns (bytes32) {\\n bytes32 domain = domainSeparator(_decoded.noChainId, address(this));\\n bytes32 structHash = toEIP712(_decoded);\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domain, structHash));\\n }\\n\\n function hashFor(Decoded memory _decoded, address _wallet) internal view returns (bytes32) {\\n bytes32 domain = domainSeparator(_decoded.noChainId, _wallet);\\n bytes32 structHash = toEIP712(_decoded);\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domain, structHash));\\n }\\n\\n}\\n\",\"keccak256\":\"0x25066fa78d12d0d73d463b97b37528291f3d4d60ca642247441538b83d6597d6\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/lib/sequence-v3/src/utils/LibBytes.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.18;\\n\\n/// @title Library for reading data from bytes arrays\\n/// @author Agustin Aguilar (aa@horizon.io), Michael Standen (mstan@horizon.io)\\n/// @notice This library contains functions for reading data from bytes arrays.\\n/// @dev These functions do not check if the input index is within the bounds of the data array.\\n/// @dev Reading out of bounds may return dirty values.\\nlibrary LibBytes {\\n\\n function readFirstUint8(\\n bytes calldata _data\\n ) internal pure returns (uint8 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(_data.offset)\\n a := shr(248, word)\\n newPointer := 1\\n }\\n }\\n\\n function readUint8(bytes calldata _data, uint256 _index) internal pure returns (uint8 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(248, word)\\n newPointer := add(_index, 1)\\n }\\n }\\n\\n function readUint16(bytes calldata _data, uint256 _index) internal pure returns (uint16 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(240, word)\\n newPointer := add(_index, 2)\\n }\\n }\\n\\n function readUint24(bytes calldata _data, uint256 _index) internal pure returns (uint24 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(232, word)\\n newPointer := add(_index, 3)\\n }\\n }\\n\\n function readUint64(bytes calldata _data, uint256 _index) internal pure returns (uint64 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(192, word)\\n newPointer := add(_index, 8)\\n }\\n }\\n\\n function readUint160(bytes calldata _data, uint256 _index) internal pure returns (uint160 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(96, word)\\n newPointer := add(_index, 20)\\n }\\n }\\n\\n function readUint256(bytes calldata _data, uint256 _index) internal pure returns (uint256 a, uint256 newPointer) {\\n assembly {\\n a := calldataload(add(_index, _data.offset))\\n newPointer := add(_index, 32)\\n }\\n }\\n\\n function readUintX(\\n bytes calldata _data,\\n uint256 _index,\\n uint256 _length\\n ) internal pure returns (uint256 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n let shift := sub(256, mul(_length, 8))\\n a := and(shr(shift, word), sub(shl(mul(8, _length), 1), 1))\\n newPointer := add(_index, _length)\\n }\\n }\\n\\n function readBytes4(bytes calldata _data, uint256 _pointer) internal pure returns (bytes4 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_pointer, _data.offset))\\n a := and(word, 0xffffffff00000000000000000000000000000000000000000000000000000000)\\n newPointer := add(_pointer, 4)\\n }\\n }\\n\\n function readBytes32(bytes calldata _data, uint256 _pointer) internal pure returns (bytes32 a, uint256 newPointer) {\\n assembly {\\n a := calldataload(add(_pointer, _data.offset))\\n newPointer := add(_pointer, 32)\\n }\\n }\\n\\n function readAddress(bytes calldata _data, uint256 _index) internal pure returns (address a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := and(shr(96, word), 0xffffffffffffffffffffffffffffffffffffffff)\\n newPointer := add(_index, 20)\\n }\\n }\\n\\n /// @dev ERC-2098 Compact Signature\\n function readRSVCompact(\\n bytes calldata _data,\\n uint256 _index\\n ) internal pure returns (bytes32 r, bytes32 s, uint8 v, uint256 newPointer) {\\n uint256 yParityAndS;\\n assembly {\\n r := calldataload(add(_index, _data.offset))\\n yParityAndS := calldataload(add(_index, add(_data.offset, 32)))\\n newPointer := add(_index, 64)\\n }\\n uint256 yParity = uint256(yParityAndS >> 255);\\n s = bytes32(uint256(yParityAndS) & ((1 << 255) - 1));\\n v = uint8(yParity) + 27;\\n }\\n\\n}\\n\",\"keccak256\":\"0x4fe0b4786b2157e12384b90ae9daa1009b74b2547a8a24b800a8b998278c874b\",\"license\":\"Apache-2.0\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": {}, + "notice": "Library for attestation management", + "version": 1 + } + } + }, + "lib/signals-implicit-mode/lib/sequence-v3/src/extensions/sessions/implicit/ISignalsImplicitMode.sol": { + "ISignalsImplicitMode": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "wallet", + "type": "address" + }, + { + "components": [ + { + "internalType": "address", + "name": "approvedSigner", + "type": "address" + }, + { + "internalType": "bytes4", + "name": "identityType", + "type": "bytes4" + }, + { + "internalType": "bytes32", + "name": "issuerHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "audienceHash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "applicationData", + "type": "bytes" + }, + { + "components": [ + { + "internalType": "string", + "name": "redirectUrl", + "type": "string" + }, + { + "internalType": "uint64", + "name": "issuedAt", + "type": "uint64" + } + ], + "internalType": "struct AuthData", + "name": "authData", + "type": "tuple" + } + ], + "internalType": "struct Attestation", + "name": "attestation", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call", + "name": "call", + "type": "tuple" + } + ], + "name": "acceptImplicitRequest", + "outputs": [ + { + "internalType": "bytes32", + "name": "magic", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "author": "Agustin Aguilar, Michael Standen", + "kind": "dev", + "methods": { + "acceptImplicitRequest(address,(address,bytes4,bytes32,bytes32,bytes,(string,uint64)),(address,uint256,bytes,uint256,bool,bool,uint256))": { + "params": { + "attestation": "The attestation data", + "call": "The call to validate", + "wallet": "The wallet's address" + }, + "returns": { + "magic": "The hash of the implicit request if valid" + } + } + }, + "title": "ISignalsImplicitMode", + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "acceptImplicitRequest(address,(address,bytes4,bytes32,bytes32,bytes,(string,uint64)),(address,uint256,bytes,uint256,bool,bool,uint256))": "9d043a66" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wallet\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"approvedSigner\",\"type\":\"address\"},{\"internalType\":\"bytes4\",\"name\":\"identityType\",\"type\":\"bytes4\"},{\"internalType\":\"bytes32\",\"name\":\"issuerHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"audienceHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"applicationData\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"redirectUrl\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"issuedAt\",\"type\":\"uint64\"}],\"internalType\":\"struct AuthData\",\"name\":\"authData\",\"type\":\"tuple\"}],\"internalType\":\"struct Attestation\",\"name\":\"attestation\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"delegateCall\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"onlyFallback\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"behaviorOnError\",\"type\":\"uint256\"}],\"internalType\":\"struct Payload.Call\",\"name\":\"call\",\"type\":\"tuple\"}],\"name\":\"acceptImplicitRequest\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"magic\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Agustin Aguilar, Michael Standen\",\"kind\":\"dev\",\"methods\":{\"acceptImplicitRequest(address,(address,bytes4,bytes32,bytes32,bytes,(string,uint64)),(address,uint256,bytes,uint256,bool,bool,uint256))\":{\"params\":{\"attestation\":\"The attestation data\",\"call\":\"The call to validate\",\"wallet\":\"The wallet's address\"},\"returns\":{\"magic\":\"The hash of the implicit request if valid\"}}},\"title\":\"ISignalsImplicitMode\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"acceptImplicitRequest(address,(address,bytes4,bytes32,bytes32,bytes,(string,uint64)),(address,uint256,bytes,uint256,bool,bool,uint256))\":{\"notice\":\"Determines if an implicit request is valid\"}},\"notice\":\"Interface for the contracts that support implicit mode validation\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/signals-implicit-mode/lib/sequence-v3/src/extensions/sessions/implicit/ISignalsImplicitMode.sol\":\"ISignalsImplicitMode\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/signals-implicit-mode/lib/sequence-v3/src/extensions/sessions/implicit/Attestation.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.27;\\n\\nimport { LibBytes } from \\\"../../../utils/LibBytes.sol\\\";\\nimport { ACCEPT_IMPLICIT_REQUEST_MAGIC_PREFIX } from \\\"./ISignalsImplicitMode.sol\\\";\\n\\nusing LibBytes for bytes;\\n\\n/// @notice Attestation for a specific session\\n/// @param approvedSigner Address of the approved signer\\n/// @param identityType Identity type\\n/// @param issuerHash Hash of the issuer\\n/// @param audienceHash Hash of the audience\\n/// @param applicationData Unspecified application data\\n/// @param authData Auth data\\nstruct Attestation {\\n address approvedSigner;\\n bytes4 identityType;\\n bytes32 issuerHash;\\n bytes32 audienceHash;\\n bytes applicationData;\\n AuthData authData;\\n}\\n\\n/// @notice Auth data for an attestation\\n/// @param redirectUrl Authorization redirect URL\\n/// @param issuedAt Timestamp of the attestation issuance\\nstruct AuthData {\\n string redirectUrl;\\n uint64 issuedAt;\\n}\\n\\n/// @title LibAttestation\\n/// @author Michael Standen\\n/// @notice Library for attestation management\\nlibrary LibAttestation {\\n\\n /// @notice Hashes an attestation\\n function toHash(\\n Attestation memory attestation\\n ) internal pure returns (bytes32) {\\n return keccak256(toPacked(attestation));\\n }\\n\\n /// @notice Decodes an attestation from a packed bytes array\\n /// @param encoded The packed bytes array\\n /// @param pointer The pointer to the start of the attestation\\n /// @return attestation The decoded attestation\\n /// @return newPointer The new pointer to the end of the attestation\\n function fromPacked(\\n bytes calldata encoded,\\n uint256 pointer\\n ) internal pure returns (Attestation memory attestation, uint256 newPointer) {\\n newPointer = pointer;\\n (attestation.approvedSigner, newPointer) = encoded.readAddress(newPointer);\\n (attestation.identityType, newPointer) = encoded.readBytes4(newPointer);\\n (attestation.issuerHash, newPointer) = encoded.readBytes32(newPointer);\\n (attestation.audienceHash, newPointer) = encoded.readBytes32(newPointer);\\n // Application data (arbitrary bytes)\\n uint256 dataSize;\\n (dataSize, newPointer) = encoded.readUint24(newPointer);\\n attestation.applicationData = encoded[newPointer:newPointer + dataSize];\\n newPointer += dataSize;\\n // Auth data\\n (attestation.authData, newPointer) = fromPackedAuthData(encoded, newPointer);\\n return (attestation, newPointer);\\n }\\n\\n /// @notice Decodes the auth data from a packed bytes\\n /// @param encoded The packed bytes containing the auth data\\n /// @param pointer The pointer to the start of the auth data within the encoded data\\n /// @return authData The decoded auth data\\n /// @return newPointer The pointer to the end of the auth data within the encoded data\\n function fromPackedAuthData(\\n bytes calldata encoded,\\n uint256 pointer\\n ) internal pure returns (AuthData memory authData, uint256 newPointer) {\\n uint24 redirectUrlLength;\\n (redirectUrlLength, pointer) = encoded.readUint24(pointer);\\n authData.redirectUrl = string(encoded[pointer:pointer + redirectUrlLength]);\\n pointer += redirectUrlLength;\\n (authData.issuedAt, pointer) = encoded.readUint64(pointer);\\n return (authData, pointer);\\n }\\n\\n /// @notice Encodes an attestation into a packed bytes array\\n /// @param attestation The attestation to encode\\n /// @return encoded The packed bytes array\\n function toPacked(\\n Attestation memory attestation\\n ) internal pure returns (bytes memory encoded) {\\n return abi.encodePacked(\\n attestation.approvedSigner,\\n attestation.identityType,\\n attestation.issuerHash,\\n attestation.audienceHash,\\n uint24(attestation.applicationData.length),\\n attestation.applicationData,\\n toPackAuthData(attestation.authData)\\n );\\n }\\n\\n /// @notice Encodes the auth data into a packed bytes array\\n /// @param authData The auth data to encode\\n /// @return encoded The packed bytes array\\n function toPackAuthData(\\n AuthData memory authData\\n ) internal pure returns (bytes memory encoded) {\\n return abi.encodePacked(uint24(bytes(authData.redirectUrl).length), bytes(authData.redirectUrl), authData.issuedAt);\\n }\\n\\n /// @notice Generates the implicit request magic return value\\n /// @param attestation The attestation\\n /// @param wallet The wallet\\n /// @return magic The expected implicit request magic\\n function generateImplicitRequestMagic(Attestation memory attestation, address wallet) internal pure returns (bytes32) {\\n return keccak256(\\n abi.encodePacked(ACCEPT_IMPLICIT_REQUEST_MAGIC_PREFIX, wallet, attestation.audienceHash, attestation.issuerHash)\\n );\\n }\\n\\n}\\n\",\"keccak256\":\"0xcaa44022b5eb4bc7ab487b3b1a0125da67e2e891cee983ef6cdb6814f045efc8\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/lib/sequence-v3/src/extensions/sessions/implicit/ISignalsImplicitMode.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.27;\\n\\nimport { Payload } from \\\"../../../modules/Payload.sol\\\";\\nimport { Attestation } from \\\"./Attestation.sol\\\";\\n\\n/// @dev Magic prefix for the implicit request\\nbytes32 constant ACCEPT_IMPLICIT_REQUEST_MAGIC_PREFIX = keccak256(abi.encodePacked(\\\"acceptImplicitRequest\\\"));\\n\\n/// @title ISignalsImplicitMode\\n/// @author Agustin Aguilar, Michael Standen\\n/// @notice Interface for the contracts that support implicit mode validation\\ninterface ISignalsImplicitMode {\\n\\n /// @notice Determines if an implicit request is valid\\n /// @param wallet The wallet's address\\n /// @param attestation The attestation data\\n /// @param call The call to validate\\n /// @return magic The hash of the implicit request if valid\\n function acceptImplicitRequest(\\n address wallet,\\n Attestation calldata attestation,\\n Payload.Call calldata call\\n ) external view returns (bytes32 magic);\\n\\n}\\n\",\"keccak256\":\"0x6cb48f50c49bcb3c7071306fe9fac6c102bc9eabf73d9909e19ab3b9a835d0a8\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/lib/sequence-v3/src/modules/Payload.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.27;\\n\\nimport { LibBytes } from \\\"../utils/LibBytes.sol\\\";\\n\\nusing LibBytes for bytes;\\n\\n/// @title Payload\\n/// @author Agustin Aguilar, Michael Standen, William Hua\\n/// @notice Library for encoding and decoding payloads\\nlibrary Payload {\\n\\n /// @notice Error thrown when the kind is invalid\\n error InvalidKind(uint8 kind);\\n\\n /// @dev keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\")\\n bytes32 private constant EIP712_DOMAIN_TYPEHASH = 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f;\\n\\n /// @dev keccak256(\\\"Sequence Wallet\\\")\\n bytes32 private constant EIP712_DOMAIN_NAME_SEQUENCE =\\n 0x4aa45ca7ad825ceb1bf35643f0a58c295239df563b1b565c2485f96477c56318;\\n\\n /// @dev keccak256(\\\"3\\\")\\n bytes32 private constant EIP712_DOMAIN_VERSION_SEQUENCE =\\n 0x2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de;\\n\\n function domainSeparator(bool _noChainId, address _wallet) internal view returns (bytes32 _domainSeparator) {\\n return keccak256(\\n abi.encode(\\n EIP712_DOMAIN_TYPEHASH,\\n EIP712_DOMAIN_NAME_SEQUENCE,\\n EIP712_DOMAIN_VERSION_SEQUENCE,\\n _noChainId ? uint256(0) : uint256(block.chainid),\\n _wallet\\n )\\n );\\n }\\n\\n /// @dev keccak256(\\\"Call(address to,uint256 value,bytes data,uint256 gasLimit,bool delegateCall,bool onlyFallback,uint256 behaviorOnError)\\\")\\n bytes32 private constant CALL_TYPEHASH = 0x0603985259a953da1f65a522f589c17bd1d0117ec1d3abb7c0788aef251ef437;\\n\\n /// @dev keccak256(\\\"Calls(Call[] calls,uint256 space,uint256 nonce,address[] wallets)Call(address to,uint256 value,bytes data,uint256 gasLimit,bool delegateCall,bool onlyFallback,uint256 behaviorOnError)\\\")\\n bytes32 private constant CALLS_TYPEHASH = 0x11e1e4079a79a66e4ade50033cfe2678cdd5341d2dfe5ef9513edb1a0be147a2;\\n\\n /// @dev keccak256(\\\"Message(bytes message,address[] wallets)\\\")\\n bytes32 private constant MESSAGE_TYPEHASH = 0xe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d466;\\n\\n /// @dev keccak256(\\\"ConfigUpdate(bytes32 imageHash,address[] wallets)\\\")\\n bytes32 private constant CONFIG_UPDATE_TYPEHASH = 0x11fdeb7e8373a1aa96bfac8d0ea91526b2c5d15e5cee20e0543e780258f3e8e4;\\n\\n /// @notice Kind of transaction\\n uint8 public constant KIND_TRANSACTIONS = 0x00;\\n /// @notice Kind of digest\\n uint8 public constant KIND_MESSAGE = 0x01;\\n /// @notice Kind of config update\\n uint8 public constant KIND_CONFIG_UPDATE = 0x02;\\n /// @notice Kind of message\\n uint8 public constant KIND_DIGEST = 0x03;\\n\\n /// @notice Behavior on error: ignore error\\n uint8 public constant BEHAVIOR_IGNORE_ERROR = 0x00;\\n /// @notice Behavior on error: revert on error\\n uint8 public constant BEHAVIOR_REVERT_ON_ERROR = 0x01;\\n /// @notice Behavior on error: abort on error\\n uint8 public constant BEHAVIOR_ABORT_ON_ERROR = 0x02;\\n\\n /// @notice Payload call information\\n /// @param to Address of the target contract\\n /// @param value Value to send with the call\\n /// @param data Data to send with the call\\n /// @param gasLimit Gas limit for the call\\n /// @param delegateCall If the call is a delegate call\\n /// @param onlyFallback If the call should only be executed in an error scenario\\n /// @param behaviorOnError Behavior on error\\n struct Call {\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 gasLimit;\\n bool delegateCall;\\n bool onlyFallback;\\n uint256 behaviorOnError;\\n }\\n\\n /// @notice Decoded payload\\n /// @param kind Kind of payload\\n /// @param noChainId If the chain ID should be omitted\\n /// @param calls Array of calls (transaction kind)\\n /// @param space Nonce space for the calls (transaction kind)\\n /// @param nonce Nonce value for the calls (transaction kind)\\n /// @param message Message to validate (message kind)\\n /// @param imageHash Image hash to update to (config update kind)\\n /// @param digest Digest to validate (digest kind)\\n /// @param parentWallets Parent wallets\\n struct Decoded {\\n uint8 kind;\\n bool noChainId;\\n // Transaction kind\\n Call[] calls;\\n uint256 space;\\n uint256 nonce;\\n // Message kind\\n // TODO: Maybe native 721 ?\\n bytes message;\\n // Config update kind\\n bytes32 imageHash;\\n // Digest kind for 1271\\n bytes32 digest;\\n // Parent wallets\\n address[] parentWallets;\\n }\\n\\n function fromMessage(\\n bytes memory message\\n ) internal pure returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_MESSAGE;\\n _decoded.message = message;\\n }\\n\\n function fromConfigUpdate(\\n bytes32 imageHash\\n ) internal pure returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_CONFIG_UPDATE;\\n _decoded.imageHash = imageHash;\\n }\\n\\n function fromDigest(\\n bytes32 digest\\n ) internal pure returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_DIGEST;\\n _decoded.digest = digest;\\n }\\n\\n function fromPackedCalls(\\n bytes calldata packed\\n ) internal view returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_TRANSACTIONS;\\n\\n // Read the global flag\\n (uint256 globalFlag, uint256 pointer) = packed.readFirstUint8();\\n\\n // First bit determines if space is zero or not\\n if (globalFlag & 0x01 == 0x01) {\\n _decoded.space = 0;\\n } else {\\n (_decoded.space, pointer) = packed.readUint160(pointer);\\n }\\n\\n // Next 3 bits determine the size of the nonce\\n uint256 nonceSize = (globalFlag >> 1) & 0x07;\\n\\n if (nonceSize > 0) {\\n // Read the nonce\\n (_decoded.nonce, pointer) = packed.readUintX(pointer, nonceSize);\\n }\\n\\n uint256 numCalls;\\n\\n // Bit 5 determines if the batch contains a single call\\n if (globalFlag & 0x10 == 0x10) {\\n numCalls = 1;\\n } else {\\n // Bit 6 determines if the number of calls uses 1 byte or 2 bytes\\n if (globalFlag & 0x20 == 0x20) {\\n (numCalls, pointer) = packed.readUint16(pointer);\\n } else {\\n (numCalls, pointer) = packed.readUint8(pointer);\\n }\\n }\\n\\n // Read the calls\\n _decoded.calls = new Call[](numCalls);\\n\\n for (uint256 i = 0; i < numCalls; i++) {\\n uint8 flags;\\n (flags, pointer) = packed.readUint8(pointer);\\n\\n // First bit determines if this is a call to self\\n // or a call to another address\\n if (flags & 0x01 == 0x01) {\\n // Call to self\\n _decoded.calls[i].to = address(this);\\n } else {\\n // Call to another address\\n (_decoded.calls[i].to, pointer) = packed.readAddress(pointer);\\n }\\n\\n // Second bit determines if the call has value or not\\n if (flags & 0x02 == 0x02) {\\n (_decoded.calls[i].value, pointer) = packed.readUint256(pointer);\\n }\\n\\n // Third bit determines if the call has data or not\\n if (flags & 0x04 == 0x04) {\\n // 3 bytes determine the size of the calldata\\n uint256 calldataSize;\\n (calldataSize, pointer) = packed.readUint24(pointer);\\n _decoded.calls[i].data = packed[pointer:pointer + calldataSize];\\n pointer += calldataSize;\\n }\\n\\n // Fourth bit determines if the call has a gas limit or not\\n if (flags & 0x08 == 0x08) {\\n (_decoded.calls[i].gasLimit, pointer) = packed.readUint256(pointer);\\n }\\n\\n // Fifth bit determines if the call is a delegate call or not\\n _decoded.calls[i].delegateCall = (flags & 0x10 == 0x10);\\n\\n // Sixth bit determines if the call is fallback only\\n _decoded.calls[i].onlyFallback = (flags & 0x20 == 0x20);\\n\\n // Last 2 bits are directly mapped to the behavior on error\\n _decoded.calls[i].behaviorOnError = (flags & 0xC0) >> 6;\\n }\\n }\\n\\n function hashCall(\\n Call memory c\\n ) internal pure returns (bytes32) {\\n return keccak256(\\n abi.encode(\\n CALL_TYPEHASH, c.to, c.value, keccak256(c.data), c.gasLimit, c.delegateCall, c.onlyFallback, c.behaviorOnError\\n )\\n );\\n }\\n\\n function hashCalls(\\n Call[] memory calls\\n ) internal pure returns (bytes32) {\\n // In EIP712, an array is often hashed as the keccak256 of the concatenated\\n // hashes of each item. So we hash each Call, pack them, and hash again.\\n bytes32[] memory callHashes = new bytes32[](calls.length);\\n for (uint256 i = 0; i < calls.length; i++) {\\n callHashes[i] = hashCall(calls[i]);\\n }\\n return keccak256(abi.encodePacked(callHashes));\\n }\\n\\n function toEIP712(\\n Decoded memory _decoded\\n ) internal pure returns (bytes32) {\\n bytes32 walletsHash = keccak256(abi.encodePacked(_decoded.parentWallets));\\n\\n if (_decoded.kind == KIND_TRANSACTIONS) {\\n bytes32 callsHash = hashCalls(_decoded.calls);\\n // The top-level struct for Calls might be something like:\\n // Calls(bytes32 callsHash,uint256 space,uint256 nonce,bytes32 walletsHash)\\n return keccak256(abi.encode(CALLS_TYPEHASH, callsHash, _decoded.space, _decoded.nonce, walletsHash));\\n } else if (_decoded.kind == KIND_MESSAGE) {\\n // If you define your top-level as: Message(bytes32 messageHash,bytes32 walletsHash)\\n return keccak256(abi.encode(MESSAGE_TYPEHASH, keccak256(_decoded.message), walletsHash));\\n } else if (_decoded.kind == KIND_CONFIG_UPDATE) {\\n // Top-level: ConfigUpdate(bytes32 imageHash,bytes32 walletsHash)\\n return keccak256(abi.encode(CONFIG_UPDATE_TYPEHASH, _decoded.imageHash, walletsHash));\\n } else if (_decoded.kind == KIND_DIGEST) {\\n // Top-level: Use MESSAGE_TYPEHASH but assume the digest is already the hashed message\\n return keccak256(abi.encode(MESSAGE_TYPEHASH, _decoded.digest, walletsHash));\\n } else {\\n // Unknown kind\\n revert InvalidKind(_decoded.kind);\\n }\\n }\\n\\n function hash(\\n Decoded memory _decoded\\n ) internal view returns (bytes32) {\\n bytes32 domain = domainSeparator(_decoded.noChainId, address(this));\\n bytes32 structHash = toEIP712(_decoded);\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domain, structHash));\\n }\\n\\n function hashFor(Decoded memory _decoded, address _wallet) internal view returns (bytes32) {\\n bytes32 domain = domainSeparator(_decoded.noChainId, _wallet);\\n bytes32 structHash = toEIP712(_decoded);\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domain, structHash));\\n }\\n\\n}\\n\",\"keccak256\":\"0x25066fa78d12d0d73d463b97b37528291f3d4d60ca642247441538b83d6597d6\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/lib/sequence-v3/src/utils/LibBytes.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.18;\\n\\n/// @title Library for reading data from bytes arrays\\n/// @author Agustin Aguilar (aa@horizon.io), Michael Standen (mstan@horizon.io)\\n/// @notice This library contains functions for reading data from bytes arrays.\\n/// @dev These functions do not check if the input index is within the bounds of the data array.\\n/// @dev Reading out of bounds may return dirty values.\\nlibrary LibBytes {\\n\\n function readFirstUint8(\\n bytes calldata _data\\n ) internal pure returns (uint8 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(_data.offset)\\n a := shr(248, word)\\n newPointer := 1\\n }\\n }\\n\\n function readUint8(bytes calldata _data, uint256 _index) internal pure returns (uint8 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(248, word)\\n newPointer := add(_index, 1)\\n }\\n }\\n\\n function readUint16(bytes calldata _data, uint256 _index) internal pure returns (uint16 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(240, word)\\n newPointer := add(_index, 2)\\n }\\n }\\n\\n function readUint24(bytes calldata _data, uint256 _index) internal pure returns (uint24 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(232, word)\\n newPointer := add(_index, 3)\\n }\\n }\\n\\n function readUint64(bytes calldata _data, uint256 _index) internal pure returns (uint64 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(192, word)\\n newPointer := add(_index, 8)\\n }\\n }\\n\\n function readUint160(bytes calldata _data, uint256 _index) internal pure returns (uint160 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(96, word)\\n newPointer := add(_index, 20)\\n }\\n }\\n\\n function readUint256(bytes calldata _data, uint256 _index) internal pure returns (uint256 a, uint256 newPointer) {\\n assembly {\\n a := calldataload(add(_index, _data.offset))\\n newPointer := add(_index, 32)\\n }\\n }\\n\\n function readUintX(\\n bytes calldata _data,\\n uint256 _index,\\n uint256 _length\\n ) internal pure returns (uint256 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n let shift := sub(256, mul(_length, 8))\\n a := and(shr(shift, word), sub(shl(mul(8, _length), 1), 1))\\n newPointer := add(_index, _length)\\n }\\n }\\n\\n function readBytes4(bytes calldata _data, uint256 _pointer) internal pure returns (bytes4 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_pointer, _data.offset))\\n a := and(word, 0xffffffff00000000000000000000000000000000000000000000000000000000)\\n newPointer := add(_pointer, 4)\\n }\\n }\\n\\n function readBytes32(bytes calldata _data, uint256 _pointer) internal pure returns (bytes32 a, uint256 newPointer) {\\n assembly {\\n a := calldataload(add(_pointer, _data.offset))\\n newPointer := add(_pointer, 32)\\n }\\n }\\n\\n function readAddress(bytes calldata _data, uint256 _index) internal pure returns (address a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := and(shr(96, word), 0xffffffffffffffffffffffffffffffffffffffff)\\n newPointer := add(_index, 20)\\n }\\n }\\n\\n /// @dev ERC-2098 Compact Signature\\n function readRSVCompact(\\n bytes calldata _data,\\n uint256 _index\\n ) internal pure returns (bytes32 r, bytes32 s, uint8 v, uint256 newPointer) {\\n uint256 yParityAndS;\\n assembly {\\n r := calldataload(add(_index, _data.offset))\\n yParityAndS := calldataload(add(_index, add(_data.offset, 32)))\\n newPointer := add(_index, 64)\\n }\\n uint256 yParity = uint256(yParityAndS >> 255);\\n s = bytes32(uint256(yParityAndS) & ((1 << 255) - 1));\\n v = uint8(yParity) + 27;\\n }\\n\\n}\\n\",\"keccak256\":\"0x4fe0b4786b2157e12384b90ae9daa1009b74b2547a8a24b800a8b998278c874b\",\"license\":\"Apache-2.0\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": { + "acceptImplicitRequest(address,(address,bytes4,bytes32,bytes32,bytes,(string,uint64)),(address,uint256,bytes,uint256,bool,bool,uint256))": { + "notice": "Determines if an implicit request is valid" + } + }, + "notice": "Interface for the contracts that support implicit mode validation", + "version": 1 + } + } + }, + "lib/signals-implicit-mode/lib/sequence-v3/src/modules/Payload.sol": { + "Payload": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint8", + "name": "kind", + "type": "uint8" + } + ], + "name": "InvalidKind", + "type": "error" + }, + { + "inputs": [], + "name": "BEHAVIOR_ABORT_ON_ERROR", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "BEHAVIOR_IGNORE_ERROR", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "BEHAVIOR_REVERT_ON_ERROR", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "KIND_CONFIG_UPDATE", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "KIND_DIGEST", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "KIND_MESSAGE", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "KIND_TRANSACTIONS", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "author": "Agustin Aguilar, Michael Standen, William Hua", + "kind": "dev", + "methods": {}, + "stateVariables": { + "CALLS_TYPEHASH": { + "details": "keccak256(\"Calls(Call[] calls,uint256 space,uint256 nonce,address[] wallets)Call(address to,uint256 value,bytes data,uint256 gasLimit,bool delegateCall,bool onlyFallback,uint256 behaviorOnError)\")" + }, + "CALL_TYPEHASH": { + "details": "keccak256(\"Call(address to,uint256 value,bytes data,uint256 gasLimit,bool delegateCall,bool onlyFallback,uint256 behaviorOnError)\")" + }, + "CONFIG_UPDATE_TYPEHASH": { + "details": "keccak256(\"ConfigUpdate(bytes32 imageHash,address[] wallets)\")" + }, + "EIP712_DOMAIN_NAME_SEQUENCE": { + "details": "keccak256(\"Sequence Wallet\")" + }, + "EIP712_DOMAIN_TYPEHASH": { + "details": "keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\")" + }, + "EIP712_DOMAIN_VERSION_SEQUENCE": { + "details": "keccak256(\"3\")" + }, + "MESSAGE_TYPEHASH": { + "details": "keccak256(\"Message(bytes message,address[] wallets)\")" + } + }, + "title": "Payload", + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": { + "allocate_unbounded": { + "entryPoint": 36, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb": { + "entryPoint": 42, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + } + }, + "generatedSources": [], + "linkReferences": {}, + "object": "608060405234602057600e6024565b61036661003082393081505061036690f35b602a565b60405190565b600080fdfe60806040526004361015610013575b61032b565b61001e60003561008d565b80630739d59a14610088578063075a3d2d146100835780633d5c1f9b1461007e578063420b0c25146100795780634a7d2aa0146100745780634e5f57151461006f5763b570180a0361000e57610300565b61029e565b61025b565b610218565b6101d5565b610173565b610111565b60e01c90565b60405190565b600080fd5b60009103126100a957565b610099565b90565b60ff1690565b90565b6100ce6100c96100d3926100ae565b6100b7565b6100b1565b90565b6100e060026100ba565b90565b6100eb6100d6565b90565b6100f7906100b1565b9052565b919061010f906000602085019401906100ee565b565b61011c36600461009e565b6101386101276100e3565b61012f610093565b918291826100fb565b0390f35b90565b61015361014e6101589261013c565b6100b7565b6100b1565b90565b610165600061013f565b90565b61017061015b565b90565b61017e36600461009e565b61019a610189610168565b610191610093565b918291826100fb565b0390f35b90565b6101b56101b06101ba9261019e565b6100b7565b6100b1565b90565b6101c760016101a1565b90565b6101d26101bd565b90565b6101e036600461009e565b6101fc6101eb6101ca565b6101f3610093565b918291826100fb565b0390f35b61020a60026100ba565b90565b610215610200565b90565b61022336600461009e565b61023f61022e61020d565b610236610093565b918291826100fb565b0390f35b61024d600061013f565b90565b610258610243565b90565b61026636600461009e565b610282610271610250565b610279610093565b918291826100fb565b0390f35b61029060016101a1565b90565b61029b610286565b90565b6102a936600461009e565b6102c56102b4610293565b6102bc610093565b918291826100fb565b0390f35b90565b6102e06102db6102e5926102c9565b6100b7565b6100b1565b90565b6102f260036102cc565b90565b6102fd6102e8565b90565b61030b36600461009e565b6103276103166102f5565b61031e610093565b918291826100fb565b0390f35b600080fdfea2646970667358221220714f957bdbb5bed9ebb923b2f3ca9dcba81930f3a808fefe68fd60002a4b772364736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x20 JUMPI PUSH1 0xE PUSH1 0x24 JUMP JUMPDEST PUSH2 0x366 PUSH2 0x30 DUP3 CODECOPY ADDRESS DUP2 POP POP PUSH2 0x366 SWAP1 RETURN JUMPDEST PUSH1 0x2A JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x13 JUMPI JUMPDEST PUSH2 0x32B JUMP JUMPDEST PUSH2 0x1E PUSH1 0x0 CALLDATALOAD PUSH2 0x8D JUMP JUMPDEST DUP1 PUSH4 0x739D59A EQ PUSH2 0x88 JUMPI DUP1 PUSH4 0x75A3D2D EQ PUSH2 0x83 JUMPI DUP1 PUSH4 0x3D5C1F9B EQ PUSH2 0x7E JUMPI DUP1 PUSH4 0x420B0C25 EQ PUSH2 0x79 JUMPI DUP1 PUSH4 0x4A7D2AA0 EQ PUSH2 0x74 JUMPI DUP1 PUSH4 0x4E5F5715 EQ PUSH2 0x6F JUMPI PUSH4 0xB570180A SUB PUSH2 0xE JUMPI PUSH2 0x300 JUMP JUMPDEST PUSH2 0x29E JUMP JUMPDEST PUSH2 0x25B JUMP JUMPDEST PUSH2 0x218 JUMP JUMPDEST PUSH2 0x1D5 JUMP JUMPDEST PUSH2 0x173 JUMP JUMPDEST PUSH2 0x111 JUMP JUMPDEST PUSH1 0xE0 SHR SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP2 SUB SLT PUSH2 0xA9 JUMPI JUMP JUMPDEST PUSH2 0x99 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xCE PUSH2 0xC9 PUSH2 0xD3 SWAP3 PUSH2 0xAE JUMP JUMPDEST PUSH2 0xB7 JUMP JUMPDEST PUSH2 0xB1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xE0 PUSH1 0x2 PUSH2 0xBA JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xEB PUSH2 0xD6 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xF7 SWAP1 PUSH2 0xB1 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x10F SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0xEE JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x11C CALLDATASIZE PUSH1 0x4 PUSH2 0x9E JUMP JUMPDEST PUSH2 0x138 PUSH2 0x127 PUSH2 0xE3 JUMP JUMPDEST PUSH2 0x12F PUSH2 0x93 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xFB JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x153 PUSH2 0x14E PUSH2 0x158 SWAP3 PUSH2 0x13C JUMP JUMPDEST PUSH2 0xB7 JUMP JUMPDEST PUSH2 0xB1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x165 PUSH1 0x0 PUSH2 0x13F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x170 PUSH2 0x15B JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x17E CALLDATASIZE PUSH1 0x4 PUSH2 0x9E JUMP JUMPDEST PUSH2 0x19A PUSH2 0x189 PUSH2 0x168 JUMP JUMPDEST PUSH2 0x191 PUSH2 0x93 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xFB JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1B5 PUSH2 0x1B0 PUSH2 0x1BA SWAP3 PUSH2 0x19E JUMP JUMPDEST PUSH2 0xB7 JUMP JUMPDEST PUSH2 0xB1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1C7 PUSH1 0x1 PUSH2 0x1A1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1D2 PUSH2 0x1BD JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1E0 CALLDATASIZE PUSH1 0x4 PUSH2 0x9E JUMP JUMPDEST PUSH2 0x1FC PUSH2 0x1EB PUSH2 0x1CA JUMP JUMPDEST PUSH2 0x1F3 PUSH2 0x93 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xFB JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x20A PUSH1 0x2 PUSH2 0xBA JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x215 PUSH2 0x200 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x223 CALLDATASIZE PUSH1 0x4 PUSH2 0x9E JUMP JUMPDEST PUSH2 0x23F PUSH2 0x22E PUSH2 0x20D JUMP JUMPDEST PUSH2 0x236 PUSH2 0x93 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xFB JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x24D PUSH1 0x0 PUSH2 0x13F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x258 PUSH2 0x243 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x266 CALLDATASIZE PUSH1 0x4 PUSH2 0x9E JUMP JUMPDEST PUSH2 0x282 PUSH2 0x271 PUSH2 0x250 JUMP JUMPDEST PUSH2 0x279 PUSH2 0x93 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xFB JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x290 PUSH1 0x1 PUSH2 0x1A1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x29B PUSH2 0x286 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2A9 CALLDATASIZE PUSH1 0x4 PUSH2 0x9E JUMP JUMPDEST PUSH2 0x2C5 PUSH2 0x2B4 PUSH2 0x293 JUMP JUMPDEST PUSH2 0x2BC PUSH2 0x93 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xFB JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2E0 PUSH2 0x2DB PUSH2 0x2E5 SWAP3 PUSH2 0x2C9 JUMP JUMPDEST PUSH2 0xB7 JUMP JUMPDEST PUSH2 0xB1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2F2 PUSH1 0x3 PUSH2 0x2CC JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2FD PUSH2 0x2E8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x30B CALLDATASIZE PUSH1 0x4 PUSH2 0x9E JUMP JUMPDEST PUSH2 0x327 PUSH2 0x316 PUSH2 0x2F5 JUMP JUMPDEST PUSH2 0x31E PUSH2 0x93 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xFB JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH18 0x4F957BDBB5BED9EBB923B2F3CA9DCBA81930 RETURN 0xA8 ADDMOD INVALID INVALID PUSH9 0xFD60002A4B77236473 PUSH16 0x6C634300081B00330000000000000000 ", + "sourceMap": "275:9850:25:-:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "abi_decode": { + "entryPoint": 158, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_tuple_uint8": { + "entryPoint": 251, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_uint8": { + "entryPoint": 238, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "allocate_unbounded": { + "entryPoint": 147, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "cleanup_rational_by": { + "entryPoint": 414, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_rational_by_1": { + "entryPoint": 174, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_t_rational_by": { + "entryPoint": 316, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_t_rational_by_1": { + "entryPoint": 713, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_uint8": { + "entryPoint": 177, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "constant_BEHAVIOR_ABORT_ON_ERROR": { + "entryPoint": 512, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "constant_BEHAVIOR_IGNORE_ERROR": { + "entryPoint": 579, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "constant_BEHAVIOR_REVERT_ON_ERROR": { + "entryPoint": 646, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "constant_KIND_CONFIG_UPDATE": { + "entryPoint": 214, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "constant_KIND_DIGEST": { + "entryPoint": 744, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "constant_KIND_MESSAGE": { + "entryPoint": 445, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "constant_KIND_TRANSACTIONS": { + "entryPoint": 347, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "convert_rational_0_by_1_to_uint8": { + "entryPoint": 319, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_2_by_1_to_uint8": { + "entryPoint": 186, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_by_to_uint8": { + "entryPoint": 716, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_t_rational_by_to_t_uint8": { + "entryPoint": 417, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "external_fun_BEHAVIOR_ABORT_ON_ERROR": { + "entryPoint": 536, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_BEHAVIOR_IGNORE_ERROR": { + "entryPoint": 603, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_BEHAVIOR_REVERT_ON_ERROR": { + "entryPoint": 670, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_KIND_CONFIG_UPDATE": { + "entryPoint": 273, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_KIND_DIGEST": { + "entryPoint": 768, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_KIND_MESSAGE": { + "entryPoint": 469, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_KIND_TRANSACTIONS": { + "entryPoint": 371, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "getter_fun_BEHAVIOR_ABORT_ON_ERROR": { + "entryPoint": 525, + "id": 4162, + "parameterSlots": 0, + "returnSlots": 1 + }, + "getter_fun_BEHAVIOR_IGNORE_ERROR": { + "entryPoint": 592, + "id": 4154, + "parameterSlots": 0, + "returnSlots": 1 + }, + "getter_fun_BEHAVIOR_REVERT_ON_ERROR": { + "entryPoint": 659, + "id": 4158, + "parameterSlots": 0, + "returnSlots": 1 + }, + "getter_fun_KIND_CONFIG_UPDATE": { + "entryPoint": 227, + "id": 4146, + "parameterSlots": 0, + "returnSlots": 1 + }, + "getter_fun_KIND_DIGEST": { + "entryPoint": 757, + "id": 4150, + "parameterSlots": 0, + "returnSlots": 1 + }, + "getter_fun_KIND_MESSAGE": { + "entryPoint": 458, + "id": 4142, + "parameterSlots": 0, + "returnSlots": 1 + }, + "getter_fun_KIND_TRANSACTIONS": { + "entryPoint": 360, + "id": 4138, + "parameterSlots": 0, + "returnSlots": 1 + }, + "identity": { + "entryPoint": 183, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74": { + "entryPoint": 811, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b": { + "entryPoint": 153, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "shift_right_unsigned": { + "entryPoint": 141, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + } + }, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "60806040526004361015610013575b61032b565b61001e60003561008d565b80630739d59a14610088578063075a3d2d146100835780633d5c1f9b1461007e578063420b0c25146100795780634a7d2aa0146100745780634e5f57151461006f5763b570180a0361000e57610300565b61029e565b61025b565b610218565b6101d5565b610173565b610111565b60e01c90565b60405190565b600080fd5b60009103126100a957565b610099565b90565b60ff1690565b90565b6100ce6100c96100d3926100ae565b6100b7565b6100b1565b90565b6100e060026100ba565b90565b6100eb6100d6565b90565b6100f7906100b1565b9052565b919061010f906000602085019401906100ee565b565b61011c36600461009e565b6101386101276100e3565b61012f610093565b918291826100fb565b0390f35b90565b61015361014e6101589261013c565b6100b7565b6100b1565b90565b610165600061013f565b90565b61017061015b565b90565b61017e36600461009e565b61019a610189610168565b610191610093565b918291826100fb565b0390f35b90565b6101b56101b06101ba9261019e565b6100b7565b6100b1565b90565b6101c760016101a1565b90565b6101d26101bd565b90565b6101e036600461009e565b6101fc6101eb6101ca565b6101f3610093565b918291826100fb565b0390f35b61020a60026100ba565b90565b610215610200565b90565b61022336600461009e565b61023f61022e61020d565b610236610093565b918291826100fb565b0390f35b61024d600061013f565b90565b610258610243565b90565b61026636600461009e565b610282610271610250565b610279610093565b918291826100fb565b0390f35b61029060016101a1565b90565b61029b610286565b90565b6102a936600461009e565b6102c56102b4610293565b6102bc610093565b918291826100fb565b0390f35b90565b6102e06102db6102e5926102c9565b6100b7565b6100b1565b90565b6102f260036102cc565b90565b6102fd6102e8565b90565b61030b36600461009e565b6103276103166102f5565b61031e610093565b918291826100fb565b0390f35b600080fdfea2646970667358221220714f957bdbb5bed9ebb923b2f3ca9dcba81930f3a808fefe68fd60002a4b772364736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x13 JUMPI JUMPDEST PUSH2 0x32B JUMP JUMPDEST PUSH2 0x1E PUSH1 0x0 CALLDATALOAD PUSH2 0x8D JUMP JUMPDEST DUP1 PUSH4 0x739D59A EQ PUSH2 0x88 JUMPI DUP1 PUSH4 0x75A3D2D EQ PUSH2 0x83 JUMPI DUP1 PUSH4 0x3D5C1F9B EQ PUSH2 0x7E JUMPI DUP1 PUSH4 0x420B0C25 EQ PUSH2 0x79 JUMPI DUP1 PUSH4 0x4A7D2AA0 EQ PUSH2 0x74 JUMPI DUP1 PUSH4 0x4E5F5715 EQ PUSH2 0x6F JUMPI PUSH4 0xB570180A SUB PUSH2 0xE JUMPI PUSH2 0x300 JUMP JUMPDEST PUSH2 0x29E JUMP JUMPDEST PUSH2 0x25B JUMP JUMPDEST PUSH2 0x218 JUMP JUMPDEST PUSH2 0x1D5 JUMP JUMPDEST PUSH2 0x173 JUMP JUMPDEST PUSH2 0x111 JUMP JUMPDEST PUSH1 0xE0 SHR SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP2 SUB SLT PUSH2 0xA9 JUMPI JUMP JUMPDEST PUSH2 0x99 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xCE PUSH2 0xC9 PUSH2 0xD3 SWAP3 PUSH2 0xAE JUMP JUMPDEST PUSH2 0xB7 JUMP JUMPDEST PUSH2 0xB1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xE0 PUSH1 0x2 PUSH2 0xBA JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xEB PUSH2 0xD6 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xF7 SWAP1 PUSH2 0xB1 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x10F SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0xEE JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x11C CALLDATASIZE PUSH1 0x4 PUSH2 0x9E JUMP JUMPDEST PUSH2 0x138 PUSH2 0x127 PUSH2 0xE3 JUMP JUMPDEST PUSH2 0x12F PUSH2 0x93 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xFB JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x153 PUSH2 0x14E PUSH2 0x158 SWAP3 PUSH2 0x13C JUMP JUMPDEST PUSH2 0xB7 JUMP JUMPDEST PUSH2 0xB1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x165 PUSH1 0x0 PUSH2 0x13F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x170 PUSH2 0x15B JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x17E CALLDATASIZE PUSH1 0x4 PUSH2 0x9E JUMP JUMPDEST PUSH2 0x19A PUSH2 0x189 PUSH2 0x168 JUMP JUMPDEST PUSH2 0x191 PUSH2 0x93 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xFB JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1B5 PUSH2 0x1B0 PUSH2 0x1BA SWAP3 PUSH2 0x19E JUMP JUMPDEST PUSH2 0xB7 JUMP JUMPDEST PUSH2 0xB1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1C7 PUSH1 0x1 PUSH2 0x1A1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1D2 PUSH2 0x1BD JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1E0 CALLDATASIZE PUSH1 0x4 PUSH2 0x9E JUMP JUMPDEST PUSH2 0x1FC PUSH2 0x1EB PUSH2 0x1CA JUMP JUMPDEST PUSH2 0x1F3 PUSH2 0x93 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xFB JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x20A PUSH1 0x2 PUSH2 0xBA JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x215 PUSH2 0x200 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x223 CALLDATASIZE PUSH1 0x4 PUSH2 0x9E JUMP JUMPDEST PUSH2 0x23F PUSH2 0x22E PUSH2 0x20D JUMP JUMPDEST PUSH2 0x236 PUSH2 0x93 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xFB JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x24D PUSH1 0x0 PUSH2 0x13F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x258 PUSH2 0x243 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x266 CALLDATASIZE PUSH1 0x4 PUSH2 0x9E JUMP JUMPDEST PUSH2 0x282 PUSH2 0x271 PUSH2 0x250 JUMP JUMPDEST PUSH2 0x279 PUSH2 0x93 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xFB JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x290 PUSH1 0x1 PUSH2 0x1A1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x29B PUSH2 0x286 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2A9 CALLDATASIZE PUSH1 0x4 PUSH2 0x9E JUMP JUMPDEST PUSH2 0x2C5 PUSH2 0x2B4 PUSH2 0x293 JUMP JUMPDEST PUSH2 0x2BC PUSH2 0x93 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xFB JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2E0 PUSH2 0x2DB PUSH2 0x2E5 SWAP3 PUSH2 0x2C9 JUMP JUMPDEST PUSH2 0xB7 JUMP JUMPDEST PUSH2 0xB1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2F2 PUSH1 0x3 PUSH2 0x2CC JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2FD PUSH2 0x2E8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x30B CALLDATASIZE PUSH1 0x4 PUSH2 0x9E JUMP JUMPDEST PUSH2 0x327 PUSH2 0x316 PUSH2 0x2F5 JUMP JUMPDEST PUSH2 0x31E PUSH2 0x93 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xFB JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH18 0x4F957BDBB5BED9EBB923B2F3CA9DCBA81930 RETURN 0xA8 ADDMOD INVALID INVALID PUSH9 0xFD60002A4B77236473 PUSH16 0x6C634300081B00330000000000000000 ", + "sourceMap": "275:9850:25:-:0;;;;;;;;;-1:-1:-1;275:9850:25;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;:::o;:::-;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;2439:47::-;2482:4;;;:::i;:::-;2439:47;:::o;:::-;;;:::i;:::-;;:::o;275:9850::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;2279:46::-;2321:4;;;:::i;:::-;2279:46;:::o;:::-;;;:::i;:::-;;:::o;275:9850::-;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;2358:41::-;2395:4;;;:::i;:::-;2358:41;:::o;:::-;;;:::i;:::-;;:::o;275:9850::-;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;2819:52;2867:4;;;:::i;:::-;2819:52;:::o;:::-;;;:::i;:::-;;:::o;275:9850::-;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;2611:50;2657:4;;;:::i;:::-;2611:50;:::o;:::-;;;:::i;:::-;;:::o;275:9850::-;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;2714:53;2763:4;;;:::i;:::-;2714:53;:::o;:::-;;;:::i;:::-;;:::o;275:9850::-;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;2520:40::-;2556:4;;;:::i;:::-;2520:40;:::o;:::-;;;:::i;:::-;;:::o;275:9850::-;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;" + }, + "methodIdentifiers": { + "BEHAVIOR_ABORT_ON_ERROR()": "420b0c25", + "BEHAVIOR_IGNORE_ERROR()": "4a7d2aa0", + "BEHAVIOR_REVERT_ON_ERROR()": "4e5f5715", + "KIND_CONFIG_UPDATE()": "0739d59a", + "KIND_DIGEST()": "b570180a", + "KIND_MESSAGE()": "3d5c1f9b", + "KIND_TRANSACTIONS()": "075a3d2d" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"kind\",\"type\":\"uint8\"}],\"name\":\"InvalidKind\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BEHAVIOR_ABORT_ON_ERROR\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BEHAVIOR_IGNORE_ERROR\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BEHAVIOR_REVERT_ON_ERROR\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"KIND_CONFIG_UPDATE\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"KIND_DIGEST\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"KIND_MESSAGE\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"KIND_TRANSACTIONS\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Agustin Aguilar, Michael Standen, William Hua\",\"kind\":\"dev\",\"methods\":{},\"stateVariables\":{\"CALLS_TYPEHASH\":{\"details\":\"keccak256(\\\"Calls(Call[] calls,uint256 space,uint256 nonce,address[] wallets)Call(address to,uint256 value,bytes data,uint256 gasLimit,bool delegateCall,bool onlyFallback,uint256 behaviorOnError)\\\")\"},\"CALL_TYPEHASH\":{\"details\":\"keccak256(\\\"Call(address to,uint256 value,bytes data,uint256 gasLimit,bool delegateCall,bool onlyFallback,uint256 behaviorOnError)\\\")\"},\"CONFIG_UPDATE_TYPEHASH\":{\"details\":\"keccak256(\\\"ConfigUpdate(bytes32 imageHash,address[] wallets)\\\")\"},\"EIP712_DOMAIN_NAME_SEQUENCE\":{\"details\":\"keccak256(\\\"Sequence Wallet\\\")\"},\"EIP712_DOMAIN_TYPEHASH\":{\"details\":\"keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\")\"},\"EIP712_DOMAIN_VERSION_SEQUENCE\":{\"details\":\"keccak256(\\\"3\\\")\"},\"MESSAGE_TYPEHASH\":{\"details\":\"keccak256(\\\"Message(bytes message,address[] wallets)\\\")\"}},\"title\":\"Payload\",\"version\":1},\"userdoc\":{\"errors\":{\"InvalidKind(uint8)\":[{\"notice\":\"Error thrown when the kind is invalid\"}]},\"kind\":\"user\",\"methods\":{\"BEHAVIOR_ABORT_ON_ERROR()\":{\"notice\":\"Behavior on error: abort on error\"},\"BEHAVIOR_IGNORE_ERROR()\":{\"notice\":\"Behavior on error: ignore error\"},\"BEHAVIOR_REVERT_ON_ERROR()\":{\"notice\":\"Behavior on error: revert on error\"},\"KIND_CONFIG_UPDATE()\":{\"notice\":\"Kind of config update\"},\"KIND_DIGEST()\":{\"notice\":\"Kind of message\"},\"KIND_MESSAGE()\":{\"notice\":\"Kind of digest\"},\"KIND_TRANSACTIONS()\":{\"notice\":\"Kind of transaction\"}},\"notice\":\"Library for encoding and decoding payloads\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/signals-implicit-mode/lib/sequence-v3/src/modules/Payload.sol\":\"Payload\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/signals-implicit-mode/lib/sequence-v3/src/modules/Payload.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.27;\\n\\nimport { LibBytes } from \\\"../utils/LibBytes.sol\\\";\\n\\nusing LibBytes for bytes;\\n\\n/// @title Payload\\n/// @author Agustin Aguilar, Michael Standen, William Hua\\n/// @notice Library for encoding and decoding payloads\\nlibrary Payload {\\n\\n /// @notice Error thrown when the kind is invalid\\n error InvalidKind(uint8 kind);\\n\\n /// @dev keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\")\\n bytes32 private constant EIP712_DOMAIN_TYPEHASH = 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f;\\n\\n /// @dev keccak256(\\\"Sequence Wallet\\\")\\n bytes32 private constant EIP712_DOMAIN_NAME_SEQUENCE =\\n 0x4aa45ca7ad825ceb1bf35643f0a58c295239df563b1b565c2485f96477c56318;\\n\\n /// @dev keccak256(\\\"3\\\")\\n bytes32 private constant EIP712_DOMAIN_VERSION_SEQUENCE =\\n 0x2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de;\\n\\n function domainSeparator(bool _noChainId, address _wallet) internal view returns (bytes32 _domainSeparator) {\\n return keccak256(\\n abi.encode(\\n EIP712_DOMAIN_TYPEHASH,\\n EIP712_DOMAIN_NAME_SEQUENCE,\\n EIP712_DOMAIN_VERSION_SEQUENCE,\\n _noChainId ? uint256(0) : uint256(block.chainid),\\n _wallet\\n )\\n );\\n }\\n\\n /// @dev keccak256(\\\"Call(address to,uint256 value,bytes data,uint256 gasLimit,bool delegateCall,bool onlyFallback,uint256 behaviorOnError)\\\")\\n bytes32 private constant CALL_TYPEHASH = 0x0603985259a953da1f65a522f589c17bd1d0117ec1d3abb7c0788aef251ef437;\\n\\n /// @dev keccak256(\\\"Calls(Call[] calls,uint256 space,uint256 nonce,address[] wallets)Call(address to,uint256 value,bytes data,uint256 gasLimit,bool delegateCall,bool onlyFallback,uint256 behaviorOnError)\\\")\\n bytes32 private constant CALLS_TYPEHASH = 0x11e1e4079a79a66e4ade50033cfe2678cdd5341d2dfe5ef9513edb1a0be147a2;\\n\\n /// @dev keccak256(\\\"Message(bytes message,address[] wallets)\\\")\\n bytes32 private constant MESSAGE_TYPEHASH = 0xe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d466;\\n\\n /// @dev keccak256(\\\"ConfigUpdate(bytes32 imageHash,address[] wallets)\\\")\\n bytes32 private constant CONFIG_UPDATE_TYPEHASH = 0x11fdeb7e8373a1aa96bfac8d0ea91526b2c5d15e5cee20e0543e780258f3e8e4;\\n\\n /// @notice Kind of transaction\\n uint8 public constant KIND_TRANSACTIONS = 0x00;\\n /// @notice Kind of digest\\n uint8 public constant KIND_MESSAGE = 0x01;\\n /// @notice Kind of config update\\n uint8 public constant KIND_CONFIG_UPDATE = 0x02;\\n /// @notice Kind of message\\n uint8 public constant KIND_DIGEST = 0x03;\\n\\n /// @notice Behavior on error: ignore error\\n uint8 public constant BEHAVIOR_IGNORE_ERROR = 0x00;\\n /// @notice Behavior on error: revert on error\\n uint8 public constant BEHAVIOR_REVERT_ON_ERROR = 0x01;\\n /// @notice Behavior on error: abort on error\\n uint8 public constant BEHAVIOR_ABORT_ON_ERROR = 0x02;\\n\\n /// @notice Payload call information\\n /// @param to Address of the target contract\\n /// @param value Value to send with the call\\n /// @param data Data to send with the call\\n /// @param gasLimit Gas limit for the call\\n /// @param delegateCall If the call is a delegate call\\n /// @param onlyFallback If the call should only be executed in an error scenario\\n /// @param behaviorOnError Behavior on error\\n struct Call {\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 gasLimit;\\n bool delegateCall;\\n bool onlyFallback;\\n uint256 behaviorOnError;\\n }\\n\\n /// @notice Decoded payload\\n /// @param kind Kind of payload\\n /// @param noChainId If the chain ID should be omitted\\n /// @param calls Array of calls (transaction kind)\\n /// @param space Nonce space for the calls (transaction kind)\\n /// @param nonce Nonce value for the calls (transaction kind)\\n /// @param message Message to validate (message kind)\\n /// @param imageHash Image hash to update to (config update kind)\\n /// @param digest Digest to validate (digest kind)\\n /// @param parentWallets Parent wallets\\n struct Decoded {\\n uint8 kind;\\n bool noChainId;\\n // Transaction kind\\n Call[] calls;\\n uint256 space;\\n uint256 nonce;\\n // Message kind\\n // TODO: Maybe native 721 ?\\n bytes message;\\n // Config update kind\\n bytes32 imageHash;\\n // Digest kind for 1271\\n bytes32 digest;\\n // Parent wallets\\n address[] parentWallets;\\n }\\n\\n function fromMessage(\\n bytes memory message\\n ) internal pure returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_MESSAGE;\\n _decoded.message = message;\\n }\\n\\n function fromConfigUpdate(\\n bytes32 imageHash\\n ) internal pure returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_CONFIG_UPDATE;\\n _decoded.imageHash = imageHash;\\n }\\n\\n function fromDigest(\\n bytes32 digest\\n ) internal pure returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_DIGEST;\\n _decoded.digest = digest;\\n }\\n\\n function fromPackedCalls(\\n bytes calldata packed\\n ) internal view returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_TRANSACTIONS;\\n\\n // Read the global flag\\n (uint256 globalFlag, uint256 pointer) = packed.readFirstUint8();\\n\\n // First bit determines if space is zero or not\\n if (globalFlag & 0x01 == 0x01) {\\n _decoded.space = 0;\\n } else {\\n (_decoded.space, pointer) = packed.readUint160(pointer);\\n }\\n\\n // Next 3 bits determine the size of the nonce\\n uint256 nonceSize = (globalFlag >> 1) & 0x07;\\n\\n if (nonceSize > 0) {\\n // Read the nonce\\n (_decoded.nonce, pointer) = packed.readUintX(pointer, nonceSize);\\n }\\n\\n uint256 numCalls;\\n\\n // Bit 5 determines if the batch contains a single call\\n if (globalFlag & 0x10 == 0x10) {\\n numCalls = 1;\\n } else {\\n // Bit 6 determines if the number of calls uses 1 byte or 2 bytes\\n if (globalFlag & 0x20 == 0x20) {\\n (numCalls, pointer) = packed.readUint16(pointer);\\n } else {\\n (numCalls, pointer) = packed.readUint8(pointer);\\n }\\n }\\n\\n // Read the calls\\n _decoded.calls = new Call[](numCalls);\\n\\n for (uint256 i = 0; i < numCalls; i++) {\\n uint8 flags;\\n (flags, pointer) = packed.readUint8(pointer);\\n\\n // First bit determines if this is a call to self\\n // or a call to another address\\n if (flags & 0x01 == 0x01) {\\n // Call to self\\n _decoded.calls[i].to = address(this);\\n } else {\\n // Call to another address\\n (_decoded.calls[i].to, pointer) = packed.readAddress(pointer);\\n }\\n\\n // Second bit determines if the call has value or not\\n if (flags & 0x02 == 0x02) {\\n (_decoded.calls[i].value, pointer) = packed.readUint256(pointer);\\n }\\n\\n // Third bit determines if the call has data or not\\n if (flags & 0x04 == 0x04) {\\n // 3 bytes determine the size of the calldata\\n uint256 calldataSize;\\n (calldataSize, pointer) = packed.readUint24(pointer);\\n _decoded.calls[i].data = packed[pointer:pointer + calldataSize];\\n pointer += calldataSize;\\n }\\n\\n // Fourth bit determines if the call has a gas limit or not\\n if (flags & 0x08 == 0x08) {\\n (_decoded.calls[i].gasLimit, pointer) = packed.readUint256(pointer);\\n }\\n\\n // Fifth bit determines if the call is a delegate call or not\\n _decoded.calls[i].delegateCall = (flags & 0x10 == 0x10);\\n\\n // Sixth bit determines if the call is fallback only\\n _decoded.calls[i].onlyFallback = (flags & 0x20 == 0x20);\\n\\n // Last 2 bits are directly mapped to the behavior on error\\n _decoded.calls[i].behaviorOnError = (flags & 0xC0) >> 6;\\n }\\n }\\n\\n function hashCall(\\n Call memory c\\n ) internal pure returns (bytes32) {\\n return keccak256(\\n abi.encode(\\n CALL_TYPEHASH, c.to, c.value, keccak256(c.data), c.gasLimit, c.delegateCall, c.onlyFallback, c.behaviorOnError\\n )\\n );\\n }\\n\\n function hashCalls(\\n Call[] memory calls\\n ) internal pure returns (bytes32) {\\n // In EIP712, an array is often hashed as the keccak256 of the concatenated\\n // hashes of each item. So we hash each Call, pack them, and hash again.\\n bytes32[] memory callHashes = new bytes32[](calls.length);\\n for (uint256 i = 0; i < calls.length; i++) {\\n callHashes[i] = hashCall(calls[i]);\\n }\\n return keccak256(abi.encodePacked(callHashes));\\n }\\n\\n function toEIP712(\\n Decoded memory _decoded\\n ) internal pure returns (bytes32) {\\n bytes32 walletsHash = keccak256(abi.encodePacked(_decoded.parentWallets));\\n\\n if (_decoded.kind == KIND_TRANSACTIONS) {\\n bytes32 callsHash = hashCalls(_decoded.calls);\\n // The top-level struct for Calls might be something like:\\n // Calls(bytes32 callsHash,uint256 space,uint256 nonce,bytes32 walletsHash)\\n return keccak256(abi.encode(CALLS_TYPEHASH, callsHash, _decoded.space, _decoded.nonce, walletsHash));\\n } else if (_decoded.kind == KIND_MESSAGE) {\\n // If you define your top-level as: Message(bytes32 messageHash,bytes32 walletsHash)\\n return keccak256(abi.encode(MESSAGE_TYPEHASH, keccak256(_decoded.message), walletsHash));\\n } else if (_decoded.kind == KIND_CONFIG_UPDATE) {\\n // Top-level: ConfigUpdate(bytes32 imageHash,bytes32 walletsHash)\\n return keccak256(abi.encode(CONFIG_UPDATE_TYPEHASH, _decoded.imageHash, walletsHash));\\n } else if (_decoded.kind == KIND_DIGEST) {\\n // Top-level: Use MESSAGE_TYPEHASH but assume the digest is already the hashed message\\n return keccak256(abi.encode(MESSAGE_TYPEHASH, _decoded.digest, walletsHash));\\n } else {\\n // Unknown kind\\n revert InvalidKind(_decoded.kind);\\n }\\n }\\n\\n function hash(\\n Decoded memory _decoded\\n ) internal view returns (bytes32) {\\n bytes32 domain = domainSeparator(_decoded.noChainId, address(this));\\n bytes32 structHash = toEIP712(_decoded);\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domain, structHash));\\n }\\n\\n function hashFor(Decoded memory _decoded, address _wallet) internal view returns (bytes32) {\\n bytes32 domain = domainSeparator(_decoded.noChainId, _wallet);\\n bytes32 structHash = toEIP712(_decoded);\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domain, structHash));\\n }\\n\\n}\\n\",\"keccak256\":\"0x25066fa78d12d0d73d463b97b37528291f3d4d60ca642247441538b83d6597d6\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/lib/sequence-v3/src/utils/LibBytes.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.18;\\n\\n/// @title Library for reading data from bytes arrays\\n/// @author Agustin Aguilar (aa@horizon.io), Michael Standen (mstan@horizon.io)\\n/// @notice This library contains functions for reading data from bytes arrays.\\n/// @dev These functions do not check if the input index is within the bounds of the data array.\\n/// @dev Reading out of bounds may return dirty values.\\nlibrary LibBytes {\\n\\n function readFirstUint8(\\n bytes calldata _data\\n ) internal pure returns (uint8 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(_data.offset)\\n a := shr(248, word)\\n newPointer := 1\\n }\\n }\\n\\n function readUint8(bytes calldata _data, uint256 _index) internal pure returns (uint8 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(248, word)\\n newPointer := add(_index, 1)\\n }\\n }\\n\\n function readUint16(bytes calldata _data, uint256 _index) internal pure returns (uint16 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(240, word)\\n newPointer := add(_index, 2)\\n }\\n }\\n\\n function readUint24(bytes calldata _data, uint256 _index) internal pure returns (uint24 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(232, word)\\n newPointer := add(_index, 3)\\n }\\n }\\n\\n function readUint64(bytes calldata _data, uint256 _index) internal pure returns (uint64 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(192, word)\\n newPointer := add(_index, 8)\\n }\\n }\\n\\n function readUint160(bytes calldata _data, uint256 _index) internal pure returns (uint160 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(96, word)\\n newPointer := add(_index, 20)\\n }\\n }\\n\\n function readUint256(bytes calldata _data, uint256 _index) internal pure returns (uint256 a, uint256 newPointer) {\\n assembly {\\n a := calldataload(add(_index, _data.offset))\\n newPointer := add(_index, 32)\\n }\\n }\\n\\n function readUintX(\\n bytes calldata _data,\\n uint256 _index,\\n uint256 _length\\n ) internal pure returns (uint256 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n let shift := sub(256, mul(_length, 8))\\n a := and(shr(shift, word), sub(shl(mul(8, _length), 1), 1))\\n newPointer := add(_index, _length)\\n }\\n }\\n\\n function readBytes4(bytes calldata _data, uint256 _pointer) internal pure returns (bytes4 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_pointer, _data.offset))\\n a := and(word, 0xffffffff00000000000000000000000000000000000000000000000000000000)\\n newPointer := add(_pointer, 4)\\n }\\n }\\n\\n function readBytes32(bytes calldata _data, uint256 _pointer) internal pure returns (bytes32 a, uint256 newPointer) {\\n assembly {\\n a := calldataload(add(_pointer, _data.offset))\\n newPointer := add(_pointer, 32)\\n }\\n }\\n\\n function readAddress(bytes calldata _data, uint256 _index) internal pure returns (address a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := and(shr(96, word), 0xffffffffffffffffffffffffffffffffffffffff)\\n newPointer := add(_index, 20)\\n }\\n }\\n\\n /// @dev ERC-2098 Compact Signature\\n function readRSVCompact(\\n bytes calldata _data,\\n uint256 _index\\n ) internal pure returns (bytes32 r, bytes32 s, uint8 v, uint256 newPointer) {\\n uint256 yParityAndS;\\n assembly {\\n r := calldataload(add(_index, _data.offset))\\n yParityAndS := calldataload(add(_index, add(_data.offset, 32)))\\n newPointer := add(_index, 64)\\n }\\n uint256 yParity = uint256(yParityAndS >> 255);\\n s = bytes32(uint256(yParityAndS) & ((1 << 255) - 1));\\n v = uint8(yParity) + 27;\\n }\\n\\n}\\n\",\"keccak256\":\"0x4fe0b4786b2157e12384b90ae9daa1009b74b2547a8a24b800a8b998278c874b\",\"license\":\"Apache-2.0\"}},\"version\":1}", + "userdoc": { + "errors": { + "InvalidKind(uint8)": [ + { + "notice": "Error thrown when the kind is invalid" + } + ] + }, + "kind": "user", + "methods": { + "BEHAVIOR_ABORT_ON_ERROR()": { + "notice": "Behavior on error: abort on error" + }, + "BEHAVIOR_IGNORE_ERROR()": { + "notice": "Behavior on error: ignore error" + }, + "BEHAVIOR_REVERT_ON_ERROR()": { + "notice": "Behavior on error: revert on error" + }, + "KIND_CONFIG_UPDATE()": { + "notice": "Kind of config update" + }, + "KIND_DIGEST()": { + "notice": "Kind of message" + }, + "KIND_MESSAGE()": { + "notice": "Kind of digest" + }, + "KIND_TRANSACTIONS()": { + "notice": "Kind of transaction" + } + }, + "notice": "Library for encoding and decoding payloads", + "version": 1 + } + } + }, + "lib/signals-implicit-mode/lib/sequence-v3/src/utils/LibBytes.sol": { + "LibBytes": { + "abi": [], + "devdoc": { + "author": "Agustin Aguilar (aa@horizon.io), Michael Standen (mstan@horizon.io)", + "details": "These functions do not check if the input index is within the bounds of the data array.Reading out of bounds may return dirty values.", + "kind": "dev", + "methods": {}, + "title": "Library for reading data from bytes arrays", + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": { + "allocate_unbounded": { + "entryPoint": 33, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb": { + "entryPoint": 39, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + } + }, + "generatedSources": [], + "linkReferences": {}, + "object": "608060405234601d57600e6021565b603f602d823930815050603f90f35b6027565b60405190565b600080fdfe6080604052600080fdfea2646970667358221220b886fd9282ab0a0dfa5f7e2f338fde4d1c548db31d6419208930f13c4577fe5564736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x1D JUMPI PUSH1 0xE PUSH1 0x21 JUMP JUMPDEST PUSH1 0x3F PUSH1 0x2D DUP3 CODECOPY ADDRESS DUP2 POP POP PUSH1 0x3F SWAP1 RETURN JUMPDEST PUSH1 0x27 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB8 DUP7 REVERT SWAP3 DUP3 0xAB EXP 0xD STATICCALL PUSH0 PUSH31 0x2F338FDE4D1C548DB31D6419208930F13C4577FE5564736F6C634300081B00 CALLER ", + "sourceMap": "432:3576:26:-:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + } + }, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "6080604052600080fdfea2646970667358221220b886fd9282ab0a0dfa5f7e2f338fde4d1c548db31d6419208930f13c4577fe5564736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB8 DUP7 REVERT SWAP3 DUP3 0xAB EXP 0xD STATICCALL PUSH0 PUSH31 0x2F338FDE4D1C548DB31D6419208930F13C4577FE5564736F6C634300081B00 CALLER ", + "sourceMap": "432:3576:26:-:0;;;;;" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"author\":\"Agustin Aguilar (aa@horizon.io), Michael Standen (mstan@horizon.io)\",\"details\":\"These functions do not check if the input index is within the bounds of the data array.Reading out of bounds may return dirty values.\",\"kind\":\"dev\",\"methods\":{},\"title\":\"Library for reading data from bytes arrays\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"This library contains functions for reading data from bytes arrays.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/signals-implicit-mode/lib/sequence-v3/src/utils/LibBytes.sol\":\"LibBytes\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/signals-implicit-mode/lib/sequence-v3/src/utils/LibBytes.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.18;\\n\\n/// @title Library for reading data from bytes arrays\\n/// @author Agustin Aguilar (aa@horizon.io), Michael Standen (mstan@horizon.io)\\n/// @notice This library contains functions for reading data from bytes arrays.\\n/// @dev These functions do not check if the input index is within the bounds of the data array.\\n/// @dev Reading out of bounds may return dirty values.\\nlibrary LibBytes {\\n\\n function readFirstUint8(\\n bytes calldata _data\\n ) internal pure returns (uint8 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(_data.offset)\\n a := shr(248, word)\\n newPointer := 1\\n }\\n }\\n\\n function readUint8(bytes calldata _data, uint256 _index) internal pure returns (uint8 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(248, word)\\n newPointer := add(_index, 1)\\n }\\n }\\n\\n function readUint16(bytes calldata _data, uint256 _index) internal pure returns (uint16 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(240, word)\\n newPointer := add(_index, 2)\\n }\\n }\\n\\n function readUint24(bytes calldata _data, uint256 _index) internal pure returns (uint24 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(232, word)\\n newPointer := add(_index, 3)\\n }\\n }\\n\\n function readUint64(bytes calldata _data, uint256 _index) internal pure returns (uint64 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(192, word)\\n newPointer := add(_index, 8)\\n }\\n }\\n\\n function readUint160(bytes calldata _data, uint256 _index) internal pure returns (uint160 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(96, word)\\n newPointer := add(_index, 20)\\n }\\n }\\n\\n function readUint256(bytes calldata _data, uint256 _index) internal pure returns (uint256 a, uint256 newPointer) {\\n assembly {\\n a := calldataload(add(_index, _data.offset))\\n newPointer := add(_index, 32)\\n }\\n }\\n\\n function readUintX(\\n bytes calldata _data,\\n uint256 _index,\\n uint256 _length\\n ) internal pure returns (uint256 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n let shift := sub(256, mul(_length, 8))\\n a := and(shr(shift, word), sub(shl(mul(8, _length), 1), 1))\\n newPointer := add(_index, _length)\\n }\\n }\\n\\n function readBytes4(bytes calldata _data, uint256 _pointer) internal pure returns (bytes4 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_pointer, _data.offset))\\n a := and(word, 0xffffffff00000000000000000000000000000000000000000000000000000000)\\n newPointer := add(_pointer, 4)\\n }\\n }\\n\\n function readBytes32(bytes calldata _data, uint256 _pointer) internal pure returns (bytes32 a, uint256 newPointer) {\\n assembly {\\n a := calldataload(add(_pointer, _data.offset))\\n newPointer := add(_pointer, 32)\\n }\\n }\\n\\n function readAddress(bytes calldata _data, uint256 _index) internal pure returns (address a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := and(shr(96, word), 0xffffffffffffffffffffffffffffffffffffffff)\\n newPointer := add(_index, 20)\\n }\\n }\\n\\n /// @dev ERC-2098 Compact Signature\\n function readRSVCompact(\\n bytes calldata _data,\\n uint256 _index\\n ) internal pure returns (bytes32 r, bytes32 s, uint8 v, uint256 newPointer) {\\n uint256 yParityAndS;\\n assembly {\\n r := calldataload(add(_index, _data.offset))\\n yParityAndS := calldataload(add(_index, add(_data.offset, 32)))\\n newPointer := add(_index, 64)\\n }\\n uint256 yParity = uint256(yParityAndS >> 255);\\n s = bytes32(uint256(yParityAndS) & ((1 << 255) - 1));\\n v = uint8(yParity) + 27;\\n }\\n\\n}\\n\",\"keccak256\":\"0x4fe0b4786b2157e12384b90ae9daa1009b74b2547a8a24b800a8b998278c874b\",\"license\":\"Apache-2.0\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": {}, + "notice": "This library contains functions for reading data from bytes arrays.", + "version": 1 + } + } + }, + "lib/signals-implicit-mode/src/helper/SignalsImplicitMode.sol": { + "SignalsImplicitMode": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "wallet", + "type": "address" + }, + { + "components": [ + { + "internalType": "address", + "name": "approvedSigner", + "type": "address" + }, + { + "internalType": "bytes4", + "name": "identityType", + "type": "bytes4" + }, + { + "internalType": "bytes32", + "name": "issuerHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "audienceHash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "applicationData", + "type": "bytes" + }, + { + "components": [ + { + "internalType": "string", + "name": "redirectUrl", + "type": "string" + }, + { + "internalType": "uint64", + "name": "issuedAt", + "type": "uint64" + } + ], + "internalType": "struct AuthData", + "name": "authData", + "type": "tuple" + } + ], + "internalType": "struct Attestation", + "name": "attestation", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call", + "name": "call", + "type": "tuple" + } + ], + "name": "acceptImplicitRequest", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "author": "Michael Standen", + "kind": "dev", + "methods": { + "acceptImplicitRequest(address,(address,bytes4,bytes32,bytes32,bytes,(string,uint64)),(address,uint256,bytes,uint256,bool,bool,uint256))": { + "params": { + "attestation": "The attestation data", + "call": "The call to validate", + "wallet": "The wallet's address" + }, + "returns": { + "_0": "The hash of the implicit request if valid" + } + }, + "supportsInterface(bytes4)": { + "details": "Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas." + } + }, + "title": "SignalsImplicitMode", + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "acceptImplicitRequest(address,(address,bytes4,bytes32,bytes32,bytes,(string,uint64)),(address,uint256,bytes,uint256,bool,bool,uint256))": "9d043a66", + "supportsInterface(bytes4)": "01ffc9a7" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wallet\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"approvedSigner\",\"type\":\"address\"},{\"internalType\":\"bytes4\",\"name\":\"identityType\",\"type\":\"bytes4\"},{\"internalType\":\"bytes32\",\"name\":\"issuerHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"audienceHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"applicationData\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"redirectUrl\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"issuedAt\",\"type\":\"uint64\"}],\"internalType\":\"struct AuthData\",\"name\":\"authData\",\"type\":\"tuple\"}],\"internalType\":\"struct Attestation\",\"name\":\"attestation\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"delegateCall\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"onlyFallback\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"behaviorOnError\",\"type\":\"uint256\"}],\"internalType\":\"struct Payload.Call\",\"name\":\"call\",\"type\":\"tuple\"}],\"name\":\"acceptImplicitRequest\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Michael Standen\",\"kind\":\"dev\",\"methods\":{\"acceptImplicitRequest(address,(address,bytes4,bytes32,bytes32,bytes,(string,uint64)),(address,uint256,bytes,uint256,bool,bool,uint256))\":{\"params\":{\"attestation\":\"The attestation data\",\"call\":\"The call to validate\",\"wallet\":\"The wallet's address\"},\"returns\":{\"_0\":\"The hash of the implicit request if valid\"}},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"}},\"title\":\"SignalsImplicitMode\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"acceptImplicitRequest(address,(address,bytes4,bytes32,bytes32,bytes,(string,uint64)),(address,uint256,bytes,uint256,bool,bool,uint256))\":{\"notice\":\"Determines if an implicit request is valid\"}},\"notice\":\"Base contract for implicit mode validation by project\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/signals-implicit-mode/src/helper/SignalsImplicitMode.sol\":\"SignalsImplicitMode\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"lib/signals-implicit-mode/lib/sequence-v3/src/extensions/sessions/implicit/Attestation.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.27;\\n\\nimport { LibBytes } from \\\"../../../utils/LibBytes.sol\\\";\\nimport { ACCEPT_IMPLICIT_REQUEST_MAGIC_PREFIX } from \\\"./ISignalsImplicitMode.sol\\\";\\n\\nusing LibBytes for bytes;\\n\\n/// @notice Attestation for a specific session\\n/// @param approvedSigner Address of the approved signer\\n/// @param identityType Identity type\\n/// @param issuerHash Hash of the issuer\\n/// @param audienceHash Hash of the audience\\n/// @param applicationData Unspecified application data\\n/// @param authData Auth data\\nstruct Attestation {\\n address approvedSigner;\\n bytes4 identityType;\\n bytes32 issuerHash;\\n bytes32 audienceHash;\\n bytes applicationData;\\n AuthData authData;\\n}\\n\\n/// @notice Auth data for an attestation\\n/// @param redirectUrl Authorization redirect URL\\n/// @param issuedAt Timestamp of the attestation issuance\\nstruct AuthData {\\n string redirectUrl;\\n uint64 issuedAt;\\n}\\n\\n/// @title LibAttestation\\n/// @author Michael Standen\\n/// @notice Library for attestation management\\nlibrary LibAttestation {\\n\\n /// @notice Hashes an attestation\\n function toHash(\\n Attestation memory attestation\\n ) internal pure returns (bytes32) {\\n return keccak256(toPacked(attestation));\\n }\\n\\n /// @notice Decodes an attestation from a packed bytes array\\n /// @param encoded The packed bytes array\\n /// @param pointer The pointer to the start of the attestation\\n /// @return attestation The decoded attestation\\n /// @return newPointer The new pointer to the end of the attestation\\n function fromPacked(\\n bytes calldata encoded,\\n uint256 pointer\\n ) internal pure returns (Attestation memory attestation, uint256 newPointer) {\\n newPointer = pointer;\\n (attestation.approvedSigner, newPointer) = encoded.readAddress(newPointer);\\n (attestation.identityType, newPointer) = encoded.readBytes4(newPointer);\\n (attestation.issuerHash, newPointer) = encoded.readBytes32(newPointer);\\n (attestation.audienceHash, newPointer) = encoded.readBytes32(newPointer);\\n // Application data (arbitrary bytes)\\n uint256 dataSize;\\n (dataSize, newPointer) = encoded.readUint24(newPointer);\\n attestation.applicationData = encoded[newPointer:newPointer + dataSize];\\n newPointer += dataSize;\\n // Auth data\\n (attestation.authData, newPointer) = fromPackedAuthData(encoded, newPointer);\\n return (attestation, newPointer);\\n }\\n\\n /// @notice Decodes the auth data from a packed bytes\\n /// @param encoded The packed bytes containing the auth data\\n /// @param pointer The pointer to the start of the auth data within the encoded data\\n /// @return authData The decoded auth data\\n /// @return newPointer The pointer to the end of the auth data within the encoded data\\n function fromPackedAuthData(\\n bytes calldata encoded,\\n uint256 pointer\\n ) internal pure returns (AuthData memory authData, uint256 newPointer) {\\n uint24 redirectUrlLength;\\n (redirectUrlLength, pointer) = encoded.readUint24(pointer);\\n authData.redirectUrl = string(encoded[pointer:pointer + redirectUrlLength]);\\n pointer += redirectUrlLength;\\n (authData.issuedAt, pointer) = encoded.readUint64(pointer);\\n return (authData, pointer);\\n }\\n\\n /// @notice Encodes an attestation into a packed bytes array\\n /// @param attestation The attestation to encode\\n /// @return encoded The packed bytes array\\n function toPacked(\\n Attestation memory attestation\\n ) internal pure returns (bytes memory encoded) {\\n return abi.encodePacked(\\n attestation.approvedSigner,\\n attestation.identityType,\\n attestation.issuerHash,\\n attestation.audienceHash,\\n uint24(attestation.applicationData.length),\\n attestation.applicationData,\\n toPackAuthData(attestation.authData)\\n );\\n }\\n\\n /// @notice Encodes the auth data into a packed bytes array\\n /// @param authData The auth data to encode\\n /// @return encoded The packed bytes array\\n function toPackAuthData(\\n AuthData memory authData\\n ) internal pure returns (bytes memory encoded) {\\n return abi.encodePacked(uint24(bytes(authData.redirectUrl).length), bytes(authData.redirectUrl), authData.issuedAt);\\n }\\n\\n /// @notice Generates the implicit request magic return value\\n /// @param attestation The attestation\\n /// @param wallet The wallet\\n /// @return magic The expected implicit request magic\\n function generateImplicitRequestMagic(Attestation memory attestation, address wallet) internal pure returns (bytes32) {\\n return keccak256(\\n abi.encodePacked(ACCEPT_IMPLICIT_REQUEST_MAGIC_PREFIX, wallet, attestation.audienceHash, attestation.issuerHash)\\n );\\n }\\n\\n}\\n\",\"keccak256\":\"0xcaa44022b5eb4bc7ab487b3b1a0125da67e2e891cee983ef6cdb6814f045efc8\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/lib/sequence-v3/src/extensions/sessions/implicit/ISignalsImplicitMode.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.27;\\n\\nimport { Payload } from \\\"../../../modules/Payload.sol\\\";\\nimport { Attestation } from \\\"./Attestation.sol\\\";\\n\\n/// @dev Magic prefix for the implicit request\\nbytes32 constant ACCEPT_IMPLICIT_REQUEST_MAGIC_PREFIX = keccak256(abi.encodePacked(\\\"acceptImplicitRequest\\\"));\\n\\n/// @title ISignalsImplicitMode\\n/// @author Agustin Aguilar, Michael Standen\\n/// @notice Interface for the contracts that support implicit mode validation\\ninterface ISignalsImplicitMode {\\n\\n /// @notice Determines if an implicit request is valid\\n /// @param wallet The wallet's address\\n /// @param attestation The attestation data\\n /// @param call The call to validate\\n /// @return magic The hash of the implicit request if valid\\n function acceptImplicitRequest(\\n address wallet,\\n Attestation calldata attestation,\\n Payload.Call calldata call\\n ) external view returns (bytes32 magic);\\n\\n}\\n\",\"keccak256\":\"0x6cb48f50c49bcb3c7071306fe9fac6c102bc9eabf73d9909e19ab3b9a835d0a8\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/lib/sequence-v3/src/modules/Payload.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.27;\\n\\nimport { LibBytes } from \\\"../utils/LibBytes.sol\\\";\\n\\nusing LibBytes for bytes;\\n\\n/// @title Payload\\n/// @author Agustin Aguilar, Michael Standen, William Hua\\n/// @notice Library for encoding and decoding payloads\\nlibrary Payload {\\n\\n /// @notice Error thrown when the kind is invalid\\n error InvalidKind(uint8 kind);\\n\\n /// @dev keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\")\\n bytes32 private constant EIP712_DOMAIN_TYPEHASH = 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f;\\n\\n /// @dev keccak256(\\\"Sequence Wallet\\\")\\n bytes32 private constant EIP712_DOMAIN_NAME_SEQUENCE =\\n 0x4aa45ca7ad825ceb1bf35643f0a58c295239df563b1b565c2485f96477c56318;\\n\\n /// @dev keccak256(\\\"3\\\")\\n bytes32 private constant EIP712_DOMAIN_VERSION_SEQUENCE =\\n 0x2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de;\\n\\n function domainSeparator(bool _noChainId, address _wallet) internal view returns (bytes32 _domainSeparator) {\\n return keccak256(\\n abi.encode(\\n EIP712_DOMAIN_TYPEHASH,\\n EIP712_DOMAIN_NAME_SEQUENCE,\\n EIP712_DOMAIN_VERSION_SEQUENCE,\\n _noChainId ? uint256(0) : uint256(block.chainid),\\n _wallet\\n )\\n );\\n }\\n\\n /// @dev keccak256(\\\"Call(address to,uint256 value,bytes data,uint256 gasLimit,bool delegateCall,bool onlyFallback,uint256 behaviorOnError)\\\")\\n bytes32 private constant CALL_TYPEHASH = 0x0603985259a953da1f65a522f589c17bd1d0117ec1d3abb7c0788aef251ef437;\\n\\n /// @dev keccak256(\\\"Calls(Call[] calls,uint256 space,uint256 nonce,address[] wallets)Call(address to,uint256 value,bytes data,uint256 gasLimit,bool delegateCall,bool onlyFallback,uint256 behaviorOnError)\\\")\\n bytes32 private constant CALLS_TYPEHASH = 0x11e1e4079a79a66e4ade50033cfe2678cdd5341d2dfe5ef9513edb1a0be147a2;\\n\\n /// @dev keccak256(\\\"Message(bytes message,address[] wallets)\\\")\\n bytes32 private constant MESSAGE_TYPEHASH = 0xe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d466;\\n\\n /// @dev keccak256(\\\"ConfigUpdate(bytes32 imageHash,address[] wallets)\\\")\\n bytes32 private constant CONFIG_UPDATE_TYPEHASH = 0x11fdeb7e8373a1aa96bfac8d0ea91526b2c5d15e5cee20e0543e780258f3e8e4;\\n\\n /// @notice Kind of transaction\\n uint8 public constant KIND_TRANSACTIONS = 0x00;\\n /// @notice Kind of digest\\n uint8 public constant KIND_MESSAGE = 0x01;\\n /// @notice Kind of config update\\n uint8 public constant KIND_CONFIG_UPDATE = 0x02;\\n /// @notice Kind of message\\n uint8 public constant KIND_DIGEST = 0x03;\\n\\n /// @notice Behavior on error: ignore error\\n uint8 public constant BEHAVIOR_IGNORE_ERROR = 0x00;\\n /// @notice Behavior on error: revert on error\\n uint8 public constant BEHAVIOR_REVERT_ON_ERROR = 0x01;\\n /// @notice Behavior on error: abort on error\\n uint8 public constant BEHAVIOR_ABORT_ON_ERROR = 0x02;\\n\\n /// @notice Payload call information\\n /// @param to Address of the target contract\\n /// @param value Value to send with the call\\n /// @param data Data to send with the call\\n /// @param gasLimit Gas limit for the call\\n /// @param delegateCall If the call is a delegate call\\n /// @param onlyFallback If the call should only be executed in an error scenario\\n /// @param behaviorOnError Behavior on error\\n struct Call {\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 gasLimit;\\n bool delegateCall;\\n bool onlyFallback;\\n uint256 behaviorOnError;\\n }\\n\\n /// @notice Decoded payload\\n /// @param kind Kind of payload\\n /// @param noChainId If the chain ID should be omitted\\n /// @param calls Array of calls (transaction kind)\\n /// @param space Nonce space for the calls (transaction kind)\\n /// @param nonce Nonce value for the calls (transaction kind)\\n /// @param message Message to validate (message kind)\\n /// @param imageHash Image hash to update to (config update kind)\\n /// @param digest Digest to validate (digest kind)\\n /// @param parentWallets Parent wallets\\n struct Decoded {\\n uint8 kind;\\n bool noChainId;\\n // Transaction kind\\n Call[] calls;\\n uint256 space;\\n uint256 nonce;\\n // Message kind\\n // TODO: Maybe native 721 ?\\n bytes message;\\n // Config update kind\\n bytes32 imageHash;\\n // Digest kind for 1271\\n bytes32 digest;\\n // Parent wallets\\n address[] parentWallets;\\n }\\n\\n function fromMessage(\\n bytes memory message\\n ) internal pure returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_MESSAGE;\\n _decoded.message = message;\\n }\\n\\n function fromConfigUpdate(\\n bytes32 imageHash\\n ) internal pure returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_CONFIG_UPDATE;\\n _decoded.imageHash = imageHash;\\n }\\n\\n function fromDigest(\\n bytes32 digest\\n ) internal pure returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_DIGEST;\\n _decoded.digest = digest;\\n }\\n\\n function fromPackedCalls(\\n bytes calldata packed\\n ) internal view returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_TRANSACTIONS;\\n\\n // Read the global flag\\n (uint256 globalFlag, uint256 pointer) = packed.readFirstUint8();\\n\\n // First bit determines if space is zero or not\\n if (globalFlag & 0x01 == 0x01) {\\n _decoded.space = 0;\\n } else {\\n (_decoded.space, pointer) = packed.readUint160(pointer);\\n }\\n\\n // Next 3 bits determine the size of the nonce\\n uint256 nonceSize = (globalFlag >> 1) & 0x07;\\n\\n if (nonceSize > 0) {\\n // Read the nonce\\n (_decoded.nonce, pointer) = packed.readUintX(pointer, nonceSize);\\n }\\n\\n uint256 numCalls;\\n\\n // Bit 5 determines if the batch contains a single call\\n if (globalFlag & 0x10 == 0x10) {\\n numCalls = 1;\\n } else {\\n // Bit 6 determines if the number of calls uses 1 byte or 2 bytes\\n if (globalFlag & 0x20 == 0x20) {\\n (numCalls, pointer) = packed.readUint16(pointer);\\n } else {\\n (numCalls, pointer) = packed.readUint8(pointer);\\n }\\n }\\n\\n // Read the calls\\n _decoded.calls = new Call[](numCalls);\\n\\n for (uint256 i = 0; i < numCalls; i++) {\\n uint8 flags;\\n (flags, pointer) = packed.readUint8(pointer);\\n\\n // First bit determines if this is a call to self\\n // or a call to another address\\n if (flags & 0x01 == 0x01) {\\n // Call to self\\n _decoded.calls[i].to = address(this);\\n } else {\\n // Call to another address\\n (_decoded.calls[i].to, pointer) = packed.readAddress(pointer);\\n }\\n\\n // Second bit determines if the call has value or not\\n if (flags & 0x02 == 0x02) {\\n (_decoded.calls[i].value, pointer) = packed.readUint256(pointer);\\n }\\n\\n // Third bit determines if the call has data or not\\n if (flags & 0x04 == 0x04) {\\n // 3 bytes determine the size of the calldata\\n uint256 calldataSize;\\n (calldataSize, pointer) = packed.readUint24(pointer);\\n _decoded.calls[i].data = packed[pointer:pointer + calldataSize];\\n pointer += calldataSize;\\n }\\n\\n // Fourth bit determines if the call has a gas limit or not\\n if (flags & 0x08 == 0x08) {\\n (_decoded.calls[i].gasLimit, pointer) = packed.readUint256(pointer);\\n }\\n\\n // Fifth bit determines if the call is a delegate call or not\\n _decoded.calls[i].delegateCall = (flags & 0x10 == 0x10);\\n\\n // Sixth bit determines if the call is fallback only\\n _decoded.calls[i].onlyFallback = (flags & 0x20 == 0x20);\\n\\n // Last 2 bits are directly mapped to the behavior on error\\n _decoded.calls[i].behaviorOnError = (flags & 0xC0) >> 6;\\n }\\n }\\n\\n function hashCall(\\n Call memory c\\n ) internal pure returns (bytes32) {\\n return keccak256(\\n abi.encode(\\n CALL_TYPEHASH, c.to, c.value, keccak256(c.data), c.gasLimit, c.delegateCall, c.onlyFallback, c.behaviorOnError\\n )\\n );\\n }\\n\\n function hashCalls(\\n Call[] memory calls\\n ) internal pure returns (bytes32) {\\n // In EIP712, an array is often hashed as the keccak256 of the concatenated\\n // hashes of each item. So we hash each Call, pack them, and hash again.\\n bytes32[] memory callHashes = new bytes32[](calls.length);\\n for (uint256 i = 0; i < calls.length; i++) {\\n callHashes[i] = hashCall(calls[i]);\\n }\\n return keccak256(abi.encodePacked(callHashes));\\n }\\n\\n function toEIP712(\\n Decoded memory _decoded\\n ) internal pure returns (bytes32) {\\n bytes32 walletsHash = keccak256(abi.encodePacked(_decoded.parentWallets));\\n\\n if (_decoded.kind == KIND_TRANSACTIONS) {\\n bytes32 callsHash = hashCalls(_decoded.calls);\\n // The top-level struct for Calls might be something like:\\n // Calls(bytes32 callsHash,uint256 space,uint256 nonce,bytes32 walletsHash)\\n return keccak256(abi.encode(CALLS_TYPEHASH, callsHash, _decoded.space, _decoded.nonce, walletsHash));\\n } else if (_decoded.kind == KIND_MESSAGE) {\\n // If you define your top-level as: Message(bytes32 messageHash,bytes32 walletsHash)\\n return keccak256(abi.encode(MESSAGE_TYPEHASH, keccak256(_decoded.message), walletsHash));\\n } else if (_decoded.kind == KIND_CONFIG_UPDATE) {\\n // Top-level: ConfigUpdate(bytes32 imageHash,bytes32 walletsHash)\\n return keccak256(abi.encode(CONFIG_UPDATE_TYPEHASH, _decoded.imageHash, walletsHash));\\n } else if (_decoded.kind == KIND_DIGEST) {\\n // Top-level: Use MESSAGE_TYPEHASH but assume the digest is already the hashed message\\n return keccak256(abi.encode(MESSAGE_TYPEHASH, _decoded.digest, walletsHash));\\n } else {\\n // Unknown kind\\n revert InvalidKind(_decoded.kind);\\n }\\n }\\n\\n function hash(\\n Decoded memory _decoded\\n ) internal view returns (bytes32) {\\n bytes32 domain = domainSeparator(_decoded.noChainId, address(this));\\n bytes32 structHash = toEIP712(_decoded);\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domain, structHash));\\n }\\n\\n function hashFor(Decoded memory _decoded, address _wallet) internal view returns (bytes32) {\\n bytes32 domain = domainSeparator(_decoded.noChainId, _wallet);\\n bytes32 structHash = toEIP712(_decoded);\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domain, structHash));\\n }\\n\\n}\\n\",\"keccak256\":\"0x25066fa78d12d0d73d463b97b37528291f3d4d60ca642247441538b83d6597d6\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/lib/sequence-v3/src/utils/LibBytes.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.18;\\n\\n/// @title Library for reading data from bytes arrays\\n/// @author Agustin Aguilar (aa@horizon.io), Michael Standen (mstan@horizon.io)\\n/// @notice This library contains functions for reading data from bytes arrays.\\n/// @dev These functions do not check if the input index is within the bounds of the data array.\\n/// @dev Reading out of bounds may return dirty values.\\nlibrary LibBytes {\\n\\n function readFirstUint8(\\n bytes calldata _data\\n ) internal pure returns (uint8 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(_data.offset)\\n a := shr(248, word)\\n newPointer := 1\\n }\\n }\\n\\n function readUint8(bytes calldata _data, uint256 _index) internal pure returns (uint8 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(248, word)\\n newPointer := add(_index, 1)\\n }\\n }\\n\\n function readUint16(bytes calldata _data, uint256 _index) internal pure returns (uint16 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(240, word)\\n newPointer := add(_index, 2)\\n }\\n }\\n\\n function readUint24(bytes calldata _data, uint256 _index) internal pure returns (uint24 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(232, word)\\n newPointer := add(_index, 3)\\n }\\n }\\n\\n function readUint64(bytes calldata _data, uint256 _index) internal pure returns (uint64 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(192, word)\\n newPointer := add(_index, 8)\\n }\\n }\\n\\n function readUint160(bytes calldata _data, uint256 _index) internal pure returns (uint160 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(96, word)\\n newPointer := add(_index, 20)\\n }\\n }\\n\\n function readUint256(bytes calldata _data, uint256 _index) internal pure returns (uint256 a, uint256 newPointer) {\\n assembly {\\n a := calldataload(add(_index, _data.offset))\\n newPointer := add(_index, 32)\\n }\\n }\\n\\n function readUintX(\\n bytes calldata _data,\\n uint256 _index,\\n uint256 _length\\n ) internal pure returns (uint256 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n let shift := sub(256, mul(_length, 8))\\n a := and(shr(shift, word), sub(shl(mul(8, _length), 1), 1))\\n newPointer := add(_index, _length)\\n }\\n }\\n\\n function readBytes4(bytes calldata _data, uint256 _pointer) internal pure returns (bytes4 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_pointer, _data.offset))\\n a := and(word, 0xffffffff00000000000000000000000000000000000000000000000000000000)\\n newPointer := add(_pointer, 4)\\n }\\n }\\n\\n function readBytes32(bytes calldata _data, uint256 _pointer) internal pure returns (bytes32 a, uint256 newPointer) {\\n assembly {\\n a := calldataload(add(_pointer, _data.offset))\\n newPointer := add(_pointer, 32)\\n }\\n }\\n\\n function readAddress(bytes calldata _data, uint256 _index) internal pure returns (address a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := and(shr(96, word), 0xffffffffffffffffffffffffffffffffffffffff)\\n newPointer := add(_index, 20)\\n }\\n }\\n\\n /// @dev ERC-2098 Compact Signature\\n function readRSVCompact(\\n bytes calldata _data,\\n uint256 _index\\n ) internal pure returns (bytes32 r, bytes32 s, uint8 v, uint256 newPointer) {\\n uint256 yParityAndS;\\n assembly {\\n r := calldataload(add(_index, _data.offset))\\n yParityAndS := calldataload(add(_index, add(_data.offset, 32)))\\n newPointer := add(_index, 64)\\n }\\n uint256 yParity = uint256(yParityAndS >> 255);\\n s = bytes32(uint256(yParityAndS) & ((1 << 255) - 1));\\n v = uint8(yParity) + 27;\\n }\\n\\n}\\n\",\"keccak256\":\"0x4fe0b4786b2157e12384b90ae9daa1009b74b2547a8a24b800a8b998278c874b\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/src/helper/SignalsImplicitMode.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.13;\\n\\nimport { IImplicitProjectValidation } from \\\"../registry/IImplicitProjectValidation.sol\\\";\\n\\nimport { ERC165, IERC165 } from \\\"openzeppelin-contracts/contracts/utils/introspection/ERC165.sol\\\";\\nimport { Attestation } from \\\"sequence-v3/src/extensions/sessions/implicit/Attestation.sol\\\";\\nimport { ISignalsImplicitMode } from \\\"sequence-v3/src/extensions/sessions/implicit/ISignalsImplicitMode.sol\\\";\\nimport { Payload } from \\\"sequence-v3/src/modules/Payload.sol\\\";\\n\\n/// @title SignalsImplicitMode\\n/// @author Michael Standen\\n/// @notice Base contract for implicit mode validation by project\\nabstract contract SignalsImplicitMode is ISignalsImplicitMode, ERC165 {\\n\\n IImplicitProjectValidation internal _validator;\\n bytes32 internal _projectId;\\n\\n /// @notice Initialize implicit mode validation\\n /// @param validator The IImplicitProjectValidation address\\n /// @param projectId The project id\\n function _initializeSignalsImplicitMode(address validator, bytes32 projectId) internal {\\n _validator = IImplicitProjectValidation(validator);\\n _projectId = projectId;\\n }\\n\\n /// @inheritdoc ISignalsImplicitMode\\n function acceptImplicitRequest(\\n address wallet,\\n Attestation calldata attestation,\\n Payload.Call calldata call\\n ) external view returns (bytes32) {\\n _validateImplicitRequest(wallet, attestation, call);\\n return _validator.validateAttestation(wallet, attestation, _projectId);\\n }\\n\\n /// @notice Validates an implicit request\\n /// @dev Optional hook for additional validation of the implicit requests\\n /// @param wallet The wallet's address\\n /// @param attestation The attestation data\\n /// @param call The call to validate\\n function _validateImplicitRequest(\\n address wallet,\\n Attestation calldata attestation,\\n Payload.Call calldata call\\n ) internal view virtual { }\\n\\n /// @inheritdoc IERC165\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view virtual override returns (bool) {\\n return interfaceId == type(ISignalsImplicitMode).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n}\\n\",\"keccak256\":\"0xd9107be2460f7f7ec4bdfefc3d10c79aa92b9285e1b12a75cb2a8d17b150a2ec\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/src/registry/IImplicitProjectValidation.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.13;\\n\\nimport { Attestation } from \\\"sequence-v3/src/extensions/sessions/implicit/Attestation.sol\\\";\\n\\n/// @title IImplicitProjectValidation\\n/// @author Michael Standen\\n/// @notice Interface for contracts supporting validation of implicit sessions for projects\\ninterface IImplicitProjectValidation {\\n\\n /// @notice Invalid redirect url error\\n error InvalidRedirectUrl();\\n\\n /// @notice Check if a project has a code\\n /// @param wallet The wallet address\\n /// @param attestation The attestation\\n /// @param projectId The project id\\n /// @return magic The attestation magic bytes for the wallet address\\n function validateAttestation(\\n address wallet,\\n Attestation calldata attestation,\\n bytes32 projectId\\n ) external view returns (bytes32);\\n\\n}\\n\",\"keccak256\":\"0x1e8c305e011aa13d774e0ff3cfd9286af3d8174c4e33ba5ef8f724ea2dd6e5b2\",\"license\":\"Apache-2.0\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": { + "acceptImplicitRequest(address,(address,bytes4,bytes32,bytes32,bytes,(string,uint64)),(address,uint256,bytes,uint256,bool,bool,uint256))": { + "notice": "Determines if an implicit request is valid" + } + }, + "notice": "Base contract for implicit mode validation by project", + "version": 1 + } + } + }, + "lib/signals-implicit-mode/src/registry/IImplicitProjectValidation.sol": { + "IImplicitProjectValidation": { + "abi": [ + { + "inputs": [], + "name": "InvalidRedirectUrl", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "wallet", + "type": "address" + }, + { + "components": [ + { + "internalType": "address", + "name": "approvedSigner", + "type": "address" + }, + { + "internalType": "bytes4", + "name": "identityType", + "type": "bytes4" + }, + { + "internalType": "bytes32", + "name": "issuerHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "audienceHash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "applicationData", + "type": "bytes" + }, + { + "components": [ + { + "internalType": "string", + "name": "redirectUrl", + "type": "string" + }, + { + "internalType": "uint64", + "name": "issuedAt", + "type": "uint64" + } + ], + "internalType": "struct AuthData", + "name": "authData", + "type": "tuple" + } + ], + "internalType": "struct Attestation", + "name": "attestation", + "type": "tuple" + }, + { + "internalType": "bytes32", + "name": "projectId", + "type": "bytes32" + } + ], + "name": "validateAttestation", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "author": "Michael Standen", + "kind": "dev", + "methods": { + "validateAttestation(address,(address,bytes4,bytes32,bytes32,bytes,(string,uint64)),bytes32)": { + "params": { + "attestation": "The attestation", + "projectId": "The project id", + "wallet": "The wallet address" + }, + "returns": { + "_0": "magic The attestation magic bytes for the wallet address" + } + } + }, + "title": "IImplicitProjectValidation", + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "validateAttestation(address,(address,bytes4,bytes32,bytes32,bytes,(string,uint64)),bytes32)": "3808a90b" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidRedirectUrl\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wallet\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"approvedSigner\",\"type\":\"address\"},{\"internalType\":\"bytes4\",\"name\":\"identityType\",\"type\":\"bytes4\"},{\"internalType\":\"bytes32\",\"name\":\"issuerHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"audienceHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"applicationData\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"redirectUrl\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"issuedAt\",\"type\":\"uint64\"}],\"internalType\":\"struct AuthData\",\"name\":\"authData\",\"type\":\"tuple\"}],\"internalType\":\"struct Attestation\",\"name\":\"attestation\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"projectId\",\"type\":\"bytes32\"}],\"name\":\"validateAttestation\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Michael Standen\",\"kind\":\"dev\",\"methods\":{\"validateAttestation(address,(address,bytes4,bytes32,bytes32,bytes,(string,uint64)),bytes32)\":{\"params\":{\"attestation\":\"The attestation\",\"projectId\":\"The project id\",\"wallet\":\"The wallet address\"},\"returns\":{\"_0\":\"magic The attestation magic bytes for the wallet address\"}}},\"title\":\"IImplicitProjectValidation\",\"version\":1},\"userdoc\":{\"errors\":{\"InvalidRedirectUrl()\":[{\"notice\":\"Invalid redirect url error\"}]},\"kind\":\"user\",\"methods\":{\"validateAttestation(address,(address,bytes4,bytes32,bytes32,bytes,(string,uint64)),bytes32)\":{\"notice\":\"Check if a project has a code\"}},\"notice\":\"Interface for contracts supporting validation of implicit sessions for projects\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/signals-implicit-mode/src/registry/IImplicitProjectValidation.sol\":\"IImplicitProjectValidation\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/signals-implicit-mode/lib/sequence-v3/src/extensions/sessions/implicit/Attestation.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.27;\\n\\nimport { LibBytes } from \\\"../../../utils/LibBytes.sol\\\";\\nimport { ACCEPT_IMPLICIT_REQUEST_MAGIC_PREFIX } from \\\"./ISignalsImplicitMode.sol\\\";\\n\\nusing LibBytes for bytes;\\n\\n/// @notice Attestation for a specific session\\n/// @param approvedSigner Address of the approved signer\\n/// @param identityType Identity type\\n/// @param issuerHash Hash of the issuer\\n/// @param audienceHash Hash of the audience\\n/// @param applicationData Unspecified application data\\n/// @param authData Auth data\\nstruct Attestation {\\n address approvedSigner;\\n bytes4 identityType;\\n bytes32 issuerHash;\\n bytes32 audienceHash;\\n bytes applicationData;\\n AuthData authData;\\n}\\n\\n/// @notice Auth data for an attestation\\n/// @param redirectUrl Authorization redirect URL\\n/// @param issuedAt Timestamp of the attestation issuance\\nstruct AuthData {\\n string redirectUrl;\\n uint64 issuedAt;\\n}\\n\\n/// @title LibAttestation\\n/// @author Michael Standen\\n/// @notice Library for attestation management\\nlibrary LibAttestation {\\n\\n /// @notice Hashes an attestation\\n function toHash(\\n Attestation memory attestation\\n ) internal pure returns (bytes32) {\\n return keccak256(toPacked(attestation));\\n }\\n\\n /// @notice Decodes an attestation from a packed bytes array\\n /// @param encoded The packed bytes array\\n /// @param pointer The pointer to the start of the attestation\\n /// @return attestation The decoded attestation\\n /// @return newPointer The new pointer to the end of the attestation\\n function fromPacked(\\n bytes calldata encoded,\\n uint256 pointer\\n ) internal pure returns (Attestation memory attestation, uint256 newPointer) {\\n newPointer = pointer;\\n (attestation.approvedSigner, newPointer) = encoded.readAddress(newPointer);\\n (attestation.identityType, newPointer) = encoded.readBytes4(newPointer);\\n (attestation.issuerHash, newPointer) = encoded.readBytes32(newPointer);\\n (attestation.audienceHash, newPointer) = encoded.readBytes32(newPointer);\\n // Application data (arbitrary bytes)\\n uint256 dataSize;\\n (dataSize, newPointer) = encoded.readUint24(newPointer);\\n attestation.applicationData = encoded[newPointer:newPointer + dataSize];\\n newPointer += dataSize;\\n // Auth data\\n (attestation.authData, newPointer) = fromPackedAuthData(encoded, newPointer);\\n return (attestation, newPointer);\\n }\\n\\n /// @notice Decodes the auth data from a packed bytes\\n /// @param encoded The packed bytes containing the auth data\\n /// @param pointer The pointer to the start of the auth data within the encoded data\\n /// @return authData The decoded auth data\\n /// @return newPointer The pointer to the end of the auth data within the encoded data\\n function fromPackedAuthData(\\n bytes calldata encoded,\\n uint256 pointer\\n ) internal pure returns (AuthData memory authData, uint256 newPointer) {\\n uint24 redirectUrlLength;\\n (redirectUrlLength, pointer) = encoded.readUint24(pointer);\\n authData.redirectUrl = string(encoded[pointer:pointer + redirectUrlLength]);\\n pointer += redirectUrlLength;\\n (authData.issuedAt, pointer) = encoded.readUint64(pointer);\\n return (authData, pointer);\\n }\\n\\n /// @notice Encodes an attestation into a packed bytes array\\n /// @param attestation The attestation to encode\\n /// @return encoded The packed bytes array\\n function toPacked(\\n Attestation memory attestation\\n ) internal pure returns (bytes memory encoded) {\\n return abi.encodePacked(\\n attestation.approvedSigner,\\n attestation.identityType,\\n attestation.issuerHash,\\n attestation.audienceHash,\\n uint24(attestation.applicationData.length),\\n attestation.applicationData,\\n toPackAuthData(attestation.authData)\\n );\\n }\\n\\n /// @notice Encodes the auth data into a packed bytes array\\n /// @param authData The auth data to encode\\n /// @return encoded The packed bytes array\\n function toPackAuthData(\\n AuthData memory authData\\n ) internal pure returns (bytes memory encoded) {\\n return abi.encodePacked(uint24(bytes(authData.redirectUrl).length), bytes(authData.redirectUrl), authData.issuedAt);\\n }\\n\\n /// @notice Generates the implicit request magic return value\\n /// @param attestation The attestation\\n /// @param wallet The wallet\\n /// @return magic The expected implicit request magic\\n function generateImplicitRequestMagic(Attestation memory attestation, address wallet) internal pure returns (bytes32) {\\n return keccak256(\\n abi.encodePacked(ACCEPT_IMPLICIT_REQUEST_MAGIC_PREFIX, wallet, attestation.audienceHash, attestation.issuerHash)\\n );\\n }\\n\\n}\\n\",\"keccak256\":\"0xcaa44022b5eb4bc7ab487b3b1a0125da67e2e891cee983ef6cdb6814f045efc8\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/lib/sequence-v3/src/extensions/sessions/implicit/ISignalsImplicitMode.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.27;\\n\\nimport { Payload } from \\\"../../../modules/Payload.sol\\\";\\nimport { Attestation } from \\\"./Attestation.sol\\\";\\n\\n/// @dev Magic prefix for the implicit request\\nbytes32 constant ACCEPT_IMPLICIT_REQUEST_MAGIC_PREFIX = keccak256(abi.encodePacked(\\\"acceptImplicitRequest\\\"));\\n\\n/// @title ISignalsImplicitMode\\n/// @author Agustin Aguilar, Michael Standen\\n/// @notice Interface for the contracts that support implicit mode validation\\ninterface ISignalsImplicitMode {\\n\\n /// @notice Determines if an implicit request is valid\\n /// @param wallet The wallet's address\\n /// @param attestation The attestation data\\n /// @param call The call to validate\\n /// @return magic The hash of the implicit request if valid\\n function acceptImplicitRequest(\\n address wallet,\\n Attestation calldata attestation,\\n Payload.Call calldata call\\n ) external view returns (bytes32 magic);\\n\\n}\\n\",\"keccak256\":\"0x6cb48f50c49bcb3c7071306fe9fac6c102bc9eabf73d9909e19ab3b9a835d0a8\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/lib/sequence-v3/src/modules/Payload.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.27;\\n\\nimport { LibBytes } from \\\"../utils/LibBytes.sol\\\";\\n\\nusing LibBytes for bytes;\\n\\n/// @title Payload\\n/// @author Agustin Aguilar, Michael Standen, William Hua\\n/// @notice Library for encoding and decoding payloads\\nlibrary Payload {\\n\\n /// @notice Error thrown when the kind is invalid\\n error InvalidKind(uint8 kind);\\n\\n /// @dev keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\")\\n bytes32 private constant EIP712_DOMAIN_TYPEHASH = 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f;\\n\\n /// @dev keccak256(\\\"Sequence Wallet\\\")\\n bytes32 private constant EIP712_DOMAIN_NAME_SEQUENCE =\\n 0x4aa45ca7ad825ceb1bf35643f0a58c295239df563b1b565c2485f96477c56318;\\n\\n /// @dev keccak256(\\\"3\\\")\\n bytes32 private constant EIP712_DOMAIN_VERSION_SEQUENCE =\\n 0x2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de;\\n\\n function domainSeparator(bool _noChainId, address _wallet) internal view returns (bytes32 _domainSeparator) {\\n return keccak256(\\n abi.encode(\\n EIP712_DOMAIN_TYPEHASH,\\n EIP712_DOMAIN_NAME_SEQUENCE,\\n EIP712_DOMAIN_VERSION_SEQUENCE,\\n _noChainId ? uint256(0) : uint256(block.chainid),\\n _wallet\\n )\\n );\\n }\\n\\n /// @dev keccak256(\\\"Call(address to,uint256 value,bytes data,uint256 gasLimit,bool delegateCall,bool onlyFallback,uint256 behaviorOnError)\\\")\\n bytes32 private constant CALL_TYPEHASH = 0x0603985259a953da1f65a522f589c17bd1d0117ec1d3abb7c0788aef251ef437;\\n\\n /// @dev keccak256(\\\"Calls(Call[] calls,uint256 space,uint256 nonce,address[] wallets)Call(address to,uint256 value,bytes data,uint256 gasLimit,bool delegateCall,bool onlyFallback,uint256 behaviorOnError)\\\")\\n bytes32 private constant CALLS_TYPEHASH = 0x11e1e4079a79a66e4ade50033cfe2678cdd5341d2dfe5ef9513edb1a0be147a2;\\n\\n /// @dev keccak256(\\\"Message(bytes message,address[] wallets)\\\")\\n bytes32 private constant MESSAGE_TYPEHASH = 0xe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d466;\\n\\n /// @dev keccak256(\\\"ConfigUpdate(bytes32 imageHash,address[] wallets)\\\")\\n bytes32 private constant CONFIG_UPDATE_TYPEHASH = 0x11fdeb7e8373a1aa96bfac8d0ea91526b2c5d15e5cee20e0543e780258f3e8e4;\\n\\n /// @notice Kind of transaction\\n uint8 public constant KIND_TRANSACTIONS = 0x00;\\n /// @notice Kind of digest\\n uint8 public constant KIND_MESSAGE = 0x01;\\n /// @notice Kind of config update\\n uint8 public constant KIND_CONFIG_UPDATE = 0x02;\\n /// @notice Kind of message\\n uint8 public constant KIND_DIGEST = 0x03;\\n\\n /// @notice Behavior on error: ignore error\\n uint8 public constant BEHAVIOR_IGNORE_ERROR = 0x00;\\n /// @notice Behavior on error: revert on error\\n uint8 public constant BEHAVIOR_REVERT_ON_ERROR = 0x01;\\n /// @notice Behavior on error: abort on error\\n uint8 public constant BEHAVIOR_ABORT_ON_ERROR = 0x02;\\n\\n /// @notice Payload call information\\n /// @param to Address of the target contract\\n /// @param value Value to send with the call\\n /// @param data Data to send with the call\\n /// @param gasLimit Gas limit for the call\\n /// @param delegateCall If the call is a delegate call\\n /// @param onlyFallback If the call should only be executed in an error scenario\\n /// @param behaviorOnError Behavior on error\\n struct Call {\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 gasLimit;\\n bool delegateCall;\\n bool onlyFallback;\\n uint256 behaviorOnError;\\n }\\n\\n /// @notice Decoded payload\\n /// @param kind Kind of payload\\n /// @param noChainId If the chain ID should be omitted\\n /// @param calls Array of calls (transaction kind)\\n /// @param space Nonce space for the calls (transaction kind)\\n /// @param nonce Nonce value for the calls (transaction kind)\\n /// @param message Message to validate (message kind)\\n /// @param imageHash Image hash to update to (config update kind)\\n /// @param digest Digest to validate (digest kind)\\n /// @param parentWallets Parent wallets\\n struct Decoded {\\n uint8 kind;\\n bool noChainId;\\n // Transaction kind\\n Call[] calls;\\n uint256 space;\\n uint256 nonce;\\n // Message kind\\n // TODO: Maybe native 721 ?\\n bytes message;\\n // Config update kind\\n bytes32 imageHash;\\n // Digest kind for 1271\\n bytes32 digest;\\n // Parent wallets\\n address[] parentWallets;\\n }\\n\\n function fromMessage(\\n bytes memory message\\n ) internal pure returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_MESSAGE;\\n _decoded.message = message;\\n }\\n\\n function fromConfigUpdate(\\n bytes32 imageHash\\n ) internal pure returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_CONFIG_UPDATE;\\n _decoded.imageHash = imageHash;\\n }\\n\\n function fromDigest(\\n bytes32 digest\\n ) internal pure returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_DIGEST;\\n _decoded.digest = digest;\\n }\\n\\n function fromPackedCalls(\\n bytes calldata packed\\n ) internal view returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_TRANSACTIONS;\\n\\n // Read the global flag\\n (uint256 globalFlag, uint256 pointer) = packed.readFirstUint8();\\n\\n // First bit determines if space is zero or not\\n if (globalFlag & 0x01 == 0x01) {\\n _decoded.space = 0;\\n } else {\\n (_decoded.space, pointer) = packed.readUint160(pointer);\\n }\\n\\n // Next 3 bits determine the size of the nonce\\n uint256 nonceSize = (globalFlag >> 1) & 0x07;\\n\\n if (nonceSize > 0) {\\n // Read the nonce\\n (_decoded.nonce, pointer) = packed.readUintX(pointer, nonceSize);\\n }\\n\\n uint256 numCalls;\\n\\n // Bit 5 determines if the batch contains a single call\\n if (globalFlag & 0x10 == 0x10) {\\n numCalls = 1;\\n } else {\\n // Bit 6 determines if the number of calls uses 1 byte or 2 bytes\\n if (globalFlag & 0x20 == 0x20) {\\n (numCalls, pointer) = packed.readUint16(pointer);\\n } else {\\n (numCalls, pointer) = packed.readUint8(pointer);\\n }\\n }\\n\\n // Read the calls\\n _decoded.calls = new Call[](numCalls);\\n\\n for (uint256 i = 0; i < numCalls; i++) {\\n uint8 flags;\\n (flags, pointer) = packed.readUint8(pointer);\\n\\n // First bit determines if this is a call to self\\n // or a call to another address\\n if (flags & 0x01 == 0x01) {\\n // Call to self\\n _decoded.calls[i].to = address(this);\\n } else {\\n // Call to another address\\n (_decoded.calls[i].to, pointer) = packed.readAddress(pointer);\\n }\\n\\n // Second bit determines if the call has value or not\\n if (flags & 0x02 == 0x02) {\\n (_decoded.calls[i].value, pointer) = packed.readUint256(pointer);\\n }\\n\\n // Third bit determines if the call has data or not\\n if (flags & 0x04 == 0x04) {\\n // 3 bytes determine the size of the calldata\\n uint256 calldataSize;\\n (calldataSize, pointer) = packed.readUint24(pointer);\\n _decoded.calls[i].data = packed[pointer:pointer + calldataSize];\\n pointer += calldataSize;\\n }\\n\\n // Fourth bit determines if the call has a gas limit or not\\n if (flags & 0x08 == 0x08) {\\n (_decoded.calls[i].gasLimit, pointer) = packed.readUint256(pointer);\\n }\\n\\n // Fifth bit determines if the call is a delegate call or not\\n _decoded.calls[i].delegateCall = (flags & 0x10 == 0x10);\\n\\n // Sixth bit determines if the call is fallback only\\n _decoded.calls[i].onlyFallback = (flags & 0x20 == 0x20);\\n\\n // Last 2 bits are directly mapped to the behavior on error\\n _decoded.calls[i].behaviorOnError = (flags & 0xC0) >> 6;\\n }\\n }\\n\\n function hashCall(\\n Call memory c\\n ) internal pure returns (bytes32) {\\n return keccak256(\\n abi.encode(\\n CALL_TYPEHASH, c.to, c.value, keccak256(c.data), c.gasLimit, c.delegateCall, c.onlyFallback, c.behaviorOnError\\n )\\n );\\n }\\n\\n function hashCalls(\\n Call[] memory calls\\n ) internal pure returns (bytes32) {\\n // In EIP712, an array is often hashed as the keccak256 of the concatenated\\n // hashes of each item. So we hash each Call, pack them, and hash again.\\n bytes32[] memory callHashes = new bytes32[](calls.length);\\n for (uint256 i = 0; i < calls.length; i++) {\\n callHashes[i] = hashCall(calls[i]);\\n }\\n return keccak256(abi.encodePacked(callHashes));\\n }\\n\\n function toEIP712(\\n Decoded memory _decoded\\n ) internal pure returns (bytes32) {\\n bytes32 walletsHash = keccak256(abi.encodePacked(_decoded.parentWallets));\\n\\n if (_decoded.kind == KIND_TRANSACTIONS) {\\n bytes32 callsHash = hashCalls(_decoded.calls);\\n // The top-level struct for Calls might be something like:\\n // Calls(bytes32 callsHash,uint256 space,uint256 nonce,bytes32 walletsHash)\\n return keccak256(abi.encode(CALLS_TYPEHASH, callsHash, _decoded.space, _decoded.nonce, walletsHash));\\n } else if (_decoded.kind == KIND_MESSAGE) {\\n // If you define your top-level as: Message(bytes32 messageHash,bytes32 walletsHash)\\n return keccak256(abi.encode(MESSAGE_TYPEHASH, keccak256(_decoded.message), walletsHash));\\n } else if (_decoded.kind == KIND_CONFIG_UPDATE) {\\n // Top-level: ConfigUpdate(bytes32 imageHash,bytes32 walletsHash)\\n return keccak256(abi.encode(CONFIG_UPDATE_TYPEHASH, _decoded.imageHash, walletsHash));\\n } else if (_decoded.kind == KIND_DIGEST) {\\n // Top-level: Use MESSAGE_TYPEHASH but assume the digest is already the hashed message\\n return keccak256(abi.encode(MESSAGE_TYPEHASH, _decoded.digest, walletsHash));\\n } else {\\n // Unknown kind\\n revert InvalidKind(_decoded.kind);\\n }\\n }\\n\\n function hash(\\n Decoded memory _decoded\\n ) internal view returns (bytes32) {\\n bytes32 domain = domainSeparator(_decoded.noChainId, address(this));\\n bytes32 structHash = toEIP712(_decoded);\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domain, structHash));\\n }\\n\\n function hashFor(Decoded memory _decoded, address _wallet) internal view returns (bytes32) {\\n bytes32 domain = domainSeparator(_decoded.noChainId, _wallet);\\n bytes32 structHash = toEIP712(_decoded);\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domain, structHash));\\n }\\n\\n}\\n\",\"keccak256\":\"0x25066fa78d12d0d73d463b97b37528291f3d4d60ca642247441538b83d6597d6\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/lib/sequence-v3/src/utils/LibBytes.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.18;\\n\\n/// @title Library for reading data from bytes arrays\\n/// @author Agustin Aguilar (aa@horizon.io), Michael Standen (mstan@horizon.io)\\n/// @notice This library contains functions for reading data from bytes arrays.\\n/// @dev These functions do not check if the input index is within the bounds of the data array.\\n/// @dev Reading out of bounds may return dirty values.\\nlibrary LibBytes {\\n\\n function readFirstUint8(\\n bytes calldata _data\\n ) internal pure returns (uint8 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(_data.offset)\\n a := shr(248, word)\\n newPointer := 1\\n }\\n }\\n\\n function readUint8(bytes calldata _data, uint256 _index) internal pure returns (uint8 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(248, word)\\n newPointer := add(_index, 1)\\n }\\n }\\n\\n function readUint16(bytes calldata _data, uint256 _index) internal pure returns (uint16 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(240, word)\\n newPointer := add(_index, 2)\\n }\\n }\\n\\n function readUint24(bytes calldata _data, uint256 _index) internal pure returns (uint24 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(232, word)\\n newPointer := add(_index, 3)\\n }\\n }\\n\\n function readUint64(bytes calldata _data, uint256 _index) internal pure returns (uint64 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(192, word)\\n newPointer := add(_index, 8)\\n }\\n }\\n\\n function readUint160(bytes calldata _data, uint256 _index) internal pure returns (uint160 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(96, word)\\n newPointer := add(_index, 20)\\n }\\n }\\n\\n function readUint256(bytes calldata _data, uint256 _index) internal pure returns (uint256 a, uint256 newPointer) {\\n assembly {\\n a := calldataload(add(_index, _data.offset))\\n newPointer := add(_index, 32)\\n }\\n }\\n\\n function readUintX(\\n bytes calldata _data,\\n uint256 _index,\\n uint256 _length\\n ) internal pure returns (uint256 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n let shift := sub(256, mul(_length, 8))\\n a := and(shr(shift, word), sub(shl(mul(8, _length), 1), 1))\\n newPointer := add(_index, _length)\\n }\\n }\\n\\n function readBytes4(bytes calldata _data, uint256 _pointer) internal pure returns (bytes4 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_pointer, _data.offset))\\n a := and(word, 0xffffffff00000000000000000000000000000000000000000000000000000000)\\n newPointer := add(_pointer, 4)\\n }\\n }\\n\\n function readBytes32(bytes calldata _data, uint256 _pointer) internal pure returns (bytes32 a, uint256 newPointer) {\\n assembly {\\n a := calldataload(add(_pointer, _data.offset))\\n newPointer := add(_pointer, 32)\\n }\\n }\\n\\n function readAddress(bytes calldata _data, uint256 _index) internal pure returns (address a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := and(shr(96, word), 0xffffffffffffffffffffffffffffffffffffffff)\\n newPointer := add(_index, 20)\\n }\\n }\\n\\n /// @dev ERC-2098 Compact Signature\\n function readRSVCompact(\\n bytes calldata _data,\\n uint256 _index\\n ) internal pure returns (bytes32 r, bytes32 s, uint8 v, uint256 newPointer) {\\n uint256 yParityAndS;\\n assembly {\\n r := calldataload(add(_index, _data.offset))\\n yParityAndS := calldataload(add(_index, add(_data.offset, 32)))\\n newPointer := add(_index, 64)\\n }\\n uint256 yParity = uint256(yParityAndS >> 255);\\n s = bytes32(uint256(yParityAndS) & ((1 << 255) - 1));\\n v = uint8(yParity) + 27;\\n }\\n\\n}\\n\",\"keccak256\":\"0x4fe0b4786b2157e12384b90ae9daa1009b74b2547a8a24b800a8b998278c874b\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/src/registry/IImplicitProjectValidation.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.13;\\n\\nimport { Attestation } from \\\"sequence-v3/src/extensions/sessions/implicit/Attestation.sol\\\";\\n\\n/// @title IImplicitProjectValidation\\n/// @author Michael Standen\\n/// @notice Interface for contracts supporting validation of implicit sessions for projects\\ninterface IImplicitProjectValidation {\\n\\n /// @notice Invalid redirect url error\\n error InvalidRedirectUrl();\\n\\n /// @notice Check if a project has a code\\n /// @param wallet The wallet address\\n /// @param attestation The attestation\\n /// @param projectId The project id\\n /// @return magic The attestation magic bytes for the wallet address\\n function validateAttestation(\\n address wallet,\\n Attestation calldata attestation,\\n bytes32 projectId\\n ) external view returns (bytes32);\\n\\n}\\n\",\"keccak256\":\"0x1e8c305e011aa13d774e0ff3cfd9286af3d8174c4e33ba5ef8f724ea2dd6e5b2\",\"license\":\"Apache-2.0\"}},\"version\":1}", + "userdoc": { + "errors": { + "InvalidRedirectUrl()": [ + { + "notice": "Invalid redirect url error" + } + ] + }, + "kind": "user", + "methods": { + "validateAttestation(address,(address,bytes4,bytes32,bytes32,bytes,(string,uint64)),bytes32)": { + "notice": "Check if a project has a code" + } + }, + "notice": "Interface for contracts supporting validation of implicit sessions for projects", + "version": 1 + } + } + }, + "lib/solady/src/tokens/ERC1155.sol": { + "ERC1155": { + "abi": [ + { + "inputs": [], + "name": "AccountBalanceOverflow", + "type": "error" + }, + { + "inputs": [], + "name": "ArrayLengthsMismatch", + "type": "error" + }, + { + "inputs": [], + "name": "InsufficientBalance", + "type": "error" + }, + { + "inputs": [], + "name": "NotOwnerNorApproved", + "type": "error" + }, + { + "inputs": [], + "name": "TransferToNonERC1155ReceiverImplementer", + "type": "error" + }, + { + "inputs": [], + "name": "TransferToZeroAddress", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "isApproved", + "type": "bool" + } + ], + "name": "ApprovalForAll", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "ids", + "type": "uint256[]" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "name": "TransferBatch", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "TransferSingle", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "value", + "type": "string" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "URI", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "owners", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "ids", + "type": "uint256[]" + } + ], + "name": "balanceOfBatch", + "outputs": [ + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "result", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "ids", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "safeBatchTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "isApproved", + "type": "bool" + } + ], + "name": "setApprovalForAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "result", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "uri", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "errors": { + "AccountBalanceOverflow()": [ + { + "details": "The recipient's balance has overflowed." + } + ], + "ArrayLengthsMismatch()": [ + { + "details": "The lengths of the input arrays are not the same." + } + ], + "InsufficientBalance()": [ + { + "details": "Insufficient balance." + } + ], + "NotOwnerNorApproved()": [ + { + "details": "Only the token owner or an approved account can manage the tokens." + } + ], + "TransferToNonERC1155ReceiverImplementer()": [ + { + "details": "Cannot safely transfer to a contract that does not implement the ERC1155Receiver interface." + } + ], + "TransferToZeroAddress()": [ + { + "details": "Cannot mint or transfer to the zero address." + } + ] + }, + "events": { + "ApprovalForAll(address,address,bool)": { + "details": "Emitted when `owner` enables or disables `operator` to manage all of their tokens." + }, + "TransferBatch(address,address,address,uint256[],uint256[])": { + "details": "Emitted when `amounts` of token `ids` are transferred from `from` to `to` by `operator`." + }, + "TransferSingle(address,address,address,uint256,uint256)": { + "details": "Emitted when `amount` of token `id` is transferred from `from` to `to` by `operator`." + }, + "URI(string,uint256)": { + "details": "Emitted when the Uniform Resource Identifier (URI) for token `id` is updated to `value`. This event is not used in the base contract. You may need to emit this event depending on your URI logic. See: https://eips.ethereum.org/EIPS/eip-1155#metadata" + } + }, + "kind": "dev", + "methods": { + "balanceOf(address,uint256)": { + "details": "Returns the amount of `id` owned by `owner`." + }, + "balanceOfBatch(address[],uint256[])": { + "details": "Returns the amounts of `ids` for `owners. Requirements: - `owners` and `ids` must have the same length." + }, + "isApprovedForAll(address,address)": { + "details": "Returns whether `operator` is approved to manage the tokens of `owner`." + }, + "safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)": { + "details": "Transfers `amounts` of `ids` from `from` to `to`. Requirements: - `to` cannot be the zero address. - `from` must have at least `amount` of `id`. - `ids` and `amounts` must have the same length. - If the caller is not `from`, it must be approved to manage the tokens of `from`. - If `to` refers to a smart contract, it must implement {ERC1155-onERC1155BatchReceived}, which is called upon a batch transfer. Emits a {TransferBatch} event." + }, + "safeTransferFrom(address,address,uint256,uint256,bytes)": { + "details": "Transfers `amount` of `id` from `from` to `to`. Requirements: - `to` cannot be the zero address. - `from` must have at least `amount` of `id`. - If the caller is not `from`, it must be approved to manage the tokens of `from`. - If `to` refers to a smart contract, it must implement {ERC1155-onERC1155Received}, which is called upon a batch transfer. Emits a {TransferSingle} event." + }, + "setApprovalForAll(address,bool)": { + "details": "Sets whether `operator` is approved to manage the tokens of the caller. Emits a {ApprovalForAll} event." + }, + "supportsInterface(bytes4)": { + "details": "Returns true if this contract implements the interface defined by `interfaceId`. See: https://eips.ethereum.org/EIPS/eip-165 This function call must use less than 30000 gas." + }, + "uri(uint256)": { + "details": "Returns the URI for token `id`. You can either return the same templated URI for all token IDs, (e.g. \"https://example.com/api/{id}.json\"), or return a unique URI for each `id`. See: https://eips.ethereum.org/EIPS/eip-1155#metadata" + } + }, + "stateVariables": { + "_APPROVAL_FOR_ALL_EVENT_SIGNATURE": { + "details": "`keccak256(bytes(\"ApprovalForAll(address,address,bool)\"))`." + }, + "_ERC1155_MASTER_SLOT_SEED": { + "details": "The `ownerSlotSeed` of a given owner is given by. ``` let ownerSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, owner)) ``` The balance slot of `owner` is given by. ``` mstore(0x20, ownerSlotSeed) mstore(0x00, id) let balanceSlot := keccak256(0x00, 0x40) ``` The operator approval slot of `owner` is given by. ``` mstore(0x20, ownerSlotSeed) mstore(0x00, operator) let operatorApprovalSlot := keccak256(0x0c, 0x34) ```" + }, + "_TRANSFER_BATCH_EVENT_SIGNATURE": { + "details": "`keccak256(bytes(\"TransferBatch(address,address,address,uint256[],uint256[])\"))`." + }, + "_TRANSFER_SINGLE_EVENT_SIGNATURE": { + "details": "`keccak256(bytes(\"TransferSingle(address,address,address,uint256,uint256)\"))`." + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "balanceOf(address,uint256)": "00fdd58e", + "balanceOfBatch(address[],uint256[])": "4e1273f4", + "isApprovedForAll(address,address)": "e985e9c5", + "safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)": "2eb2c2d6", + "safeTransferFrom(address,address,uint256,uint256,bytes)": "f242432a", + "setApprovalForAll(address,bool)": "a22cb465", + "supportsInterface(bytes4)": "01ffc9a7", + "uri(uint256)": "0e89341c" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"AccountBalanceOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ArrayLengthsMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotOwnerNorApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToNonERC1155ReceiverImplementer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isApproved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"TransferBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TransferSingle\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"value\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"URI\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"result\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"owners\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"}],\"name\":\"balanceOfBatch\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"balances\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeBatchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isApproved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"uri\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AccountBalanceOverflow()\":[{\"details\":\"The recipient's balance has overflowed.\"}],\"ArrayLengthsMismatch()\":[{\"details\":\"The lengths of the input arrays are not the same.\"}],\"InsufficientBalance()\":[{\"details\":\"Insufficient balance.\"}],\"NotOwnerNorApproved()\":[{\"details\":\"Only the token owner or an approved account can manage the tokens.\"}],\"TransferToNonERC1155ReceiverImplementer()\":[{\"details\":\"Cannot safely transfer to a contract that does not implement the ERC1155Receiver interface.\"}],\"TransferToZeroAddress()\":[{\"details\":\"Cannot mint or transfer to the zero address.\"}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"details\":\"Emitted when `owner` enables or disables `operator` to manage all of their tokens.\"},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"details\":\"Emitted when `amounts` of token `ids` are transferred from `from` to `to` by `operator`.\"},\"TransferSingle(address,address,address,uint256,uint256)\":{\"details\":\"Emitted when `amount` of token `id` is transferred from `from` to `to` by `operator`.\"},\"URI(string,uint256)\":{\"details\":\"Emitted when the Uniform Resource Identifier (URI) for token `id` is updated to `value`. This event is not used in the base contract. You may need to emit this event depending on your URI logic. See: https://eips.ethereum.org/EIPS/eip-1155#metadata\"}},\"kind\":\"dev\",\"methods\":{\"balanceOf(address,uint256)\":{\"details\":\"Returns the amount of `id` owned by `owner`.\"},\"balanceOfBatch(address[],uint256[])\":{\"details\":\"Returns the amounts of `ids` for `owners. Requirements: - `owners` and `ids` must have the same length.\"},\"isApprovedForAll(address,address)\":{\"details\":\"Returns whether `operator` is approved to manage the tokens of `owner`.\"},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"details\":\"Transfers `amounts` of `ids` from `from` to `to`. Requirements: - `to` cannot be the zero address. - `from` must have at least `amount` of `id`. - `ids` and `amounts` must have the same length. - If the caller is not `from`, it must be approved to manage the tokens of `from`. - If `to` refers to a smart contract, it must implement {ERC1155-onERC1155BatchReceived}, which is called upon a batch transfer. Emits a {TransferBatch} event.\"},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"details\":\"Transfers `amount` of `id` from `from` to `to`. Requirements: - `to` cannot be the zero address. - `from` must have at least `amount` of `id`. - If the caller is not `from`, it must be approved to manage the tokens of `from`. - If `to` refers to a smart contract, it must implement {ERC1155-onERC1155Received}, which is called upon a batch transfer. Emits a {TransferSingle} event.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"Sets whether `operator` is approved to manage the tokens of the caller. Emits a {ApprovalForAll} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See: https://eips.ethereum.org/EIPS/eip-165 This function call must use less than 30000 gas.\"},\"uri(uint256)\":{\"details\":\"Returns the URI for token `id`. You can either return the same templated URI for all token IDs, (e.g. \\\"https://example.com/api/{id}.json\\\"), or return a unique URI for each `id`. See: https://eips.ethereum.org/EIPS/eip-1155#metadata\"}},\"stateVariables\":{\"_APPROVAL_FOR_ALL_EVENT_SIGNATURE\":{\"details\":\"`keccak256(bytes(\\\"ApprovalForAll(address,address,bool)\\\"))`.\"},\"_ERC1155_MASTER_SLOT_SEED\":{\"details\":\"The `ownerSlotSeed` of a given owner is given by. ``` let ownerSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, owner)) ``` The balance slot of `owner` is given by. ``` mstore(0x20, ownerSlotSeed) mstore(0x00, id) let balanceSlot := keccak256(0x00, 0x40) ``` The operator approval slot of `owner` is given by. ``` mstore(0x20, ownerSlotSeed) mstore(0x00, operator) let operatorApprovalSlot := keccak256(0x0c, 0x34) ```\"},\"_TRANSFER_BATCH_EVENT_SIGNATURE\":{\"details\":\"`keccak256(bytes(\\\"TransferBatch(address,address,address,uint256[],uint256[])\\\"))`.\"},\"_TRANSFER_SINGLE_EVENT_SIGNATURE\":{\"details\":\"`keccak256(bytes(\\\"TransferSingle(address,address,address,uint256,uint256)\\\"))`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"- Check that the overridden function is actually used in the function you want to change the behavior of. Much of the code has been manually inlined for performance.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/solady/src/tokens/ERC1155.sol\":\"ERC1155\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/solady/src/tokens/ERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\n/// @notice Simple ERC1155 implementation.\\n/// @author Solady (https://github.com/vectorized/solady/blob/main/src/tokens/ERC1155.sol)\\n/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC1155.sol)\\n/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC1155/ERC1155.sol)\\n///\\n/// @dev Note:\\n/// - The ERC1155 standard allows for self-approvals.\\n/// For performance, this implementation WILL NOT revert for such actions.\\n/// Please add any checks with overrides if desired.\\n/// - The transfer functions use the identity precompile (0x4)\\n/// to copy memory internally.\\n///\\n/// If you are overriding:\\n/// - Make sure all variables written to storage are properly cleaned\\n// (e.g. the bool value for `isApprovedForAll` MUST be either 1 or 0 under the hood).\\n/// - Check that the overridden function is actually used in the function you want to\\n/// change the behavior of. Much of the code has been manually inlined for performance.\\nabstract contract ERC1155 {\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* CUSTOM ERRORS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev The lengths of the input arrays are not the same.\\n error ArrayLengthsMismatch();\\n\\n /// @dev Cannot mint or transfer to the zero address.\\n error TransferToZeroAddress();\\n\\n /// @dev The recipient's balance has overflowed.\\n error AccountBalanceOverflow();\\n\\n /// @dev Insufficient balance.\\n error InsufficientBalance();\\n\\n /// @dev Only the token owner or an approved account can manage the tokens.\\n error NotOwnerNorApproved();\\n\\n /// @dev Cannot safely transfer to a contract that does not implement\\n /// the ERC1155Receiver interface.\\n error TransferToNonERC1155ReceiverImplementer();\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* EVENTS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Emitted when `amount` of token `id` is transferred\\n /// from `from` to `to` by `operator`.\\n event TransferSingle(\\n address indexed operator,\\n address indexed from,\\n address indexed to,\\n uint256 id,\\n uint256 amount\\n );\\n\\n /// @dev Emitted when `amounts` of token `ids` are transferred\\n /// from `from` to `to` by `operator`.\\n event TransferBatch(\\n address indexed operator,\\n address indexed from,\\n address indexed to,\\n uint256[] ids,\\n uint256[] amounts\\n );\\n\\n /// @dev Emitted when `owner` enables or disables `operator` to manage all of their tokens.\\n event ApprovalForAll(address indexed owner, address indexed operator, bool isApproved);\\n\\n /// @dev Emitted when the Uniform Resource Identifier (URI) for token `id`\\n /// is updated to `value`. This event is not used in the base contract.\\n /// You may need to emit this event depending on your URI logic.\\n ///\\n /// See: https://eips.ethereum.org/EIPS/eip-1155#metadata\\n event URI(string value, uint256 indexed id);\\n\\n /// @dev `keccak256(bytes(\\\"TransferSingle(address,address,address,uint256,uint256)\\\"))`.\\n uint256 private constant _TRANSFER_SINGLE_EVENT_SIGNATURE =\\n 0xc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62;\\n\\n /// @dev `keccak256(bytes(\\\"TransferBatch(address,address,address,uint256[],uint256[])\\\"))`.\\n uint256 private constant _TRANSFER_BATCH_EVENT_SIGNATURE =\\n 0x4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb;\\n\\n /// @dev `keccak256(bytes(\\\"ApprovalForAll(address,address,bool)\\\"))`.\\n uint256 private constant _APPROVAL_FOR_ALL_EVENT_SIGNATURE =\\n 0x17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31;\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* STORAGE */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev The `ownerSlotSeed` of a given owner is given by.\\n /// ```\\n /// let ownerSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, owner))\\n /// ```\\n ///\\n /// The balance slot of `owner` is given by.\\n /// ```\\n /// mstore(0x20, ownerSlotSeed)\\n /// mstore(0x00, id)\\n /// let balanceSlot := keccak256(0x00, 0x40)\\n /// ```\\n ///\\n /// The operator approval slot of `owner` is given by.\\n /// ```\\n /// mstore(0x20, ownerSlotSeed)\\n /// mstore(0x00, operator)\\n /// let operatorApprovalSlot := keccak256(0x0c, 0x34)\\n /// ```\\n uint256 private constant _ERC1155_MASTER_SLOT_SEED = 0x9a31110384e0b0c9;\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* ERC1155 METADATA */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns the URI for token `id`.\\n ///\\n /// You can either return the same templated URI for all token IDs,\\n /// (e.g. \\\"https://example.com/api/{id}.json\\\"),\\n /// or return a unique URI for each `id`.\\n ///\\n /// See: https://eips.ethereum.org/EIPS/eip-1155#metadata\\n function uri(uint256 id) public view virtual returns (string memory);\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* ERC1155 */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns the amount of `id` owned by `owner`.\\n function balanceOf(address owner, uint256 id) public view virtual returns (uint256 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x20, _ERC1155_MASTER_SLOT_SEED)\\n mstore(0x14, owner)\\n mstore(0x00, id)\\n result := sload(keccak256(0x00, 0x40))\\n }\\n }\\n\\n /// @dev Returns whether `operator` is approved to manage the tokens of `owner`.\\n function isApprovedForAll(address owner, address operator)\\n public\\n view\\n virtual\\n returns (bool result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x20, _ERC1155_MASTER_SLOT_SEED)\\n mstore(0x14, owner)\\n mstore(0x00, operator)\\n result := sload(keccak256(0x0c, 0x34))\\n }\\n }\\n\\n /// @dev Sets whether `operator` is approved to manage the tokens of the caller.\\n ///\\n /// Emits a {ApprovalForAll} event.\\n function setApprovalForAll(address operator, bool isApproved) public virtual {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Convert to 0 or 1.\\n isApproved := iszero(iszero(isApproved))\\n // Update the `isApproved` for (`msg.sender`, `operator`).\\n mstore(0x20, _ERC1155_MASTER_SLOT_SEED)\\n mstore(0x14, caller())\\n mstore(0x00, operator)\\n sstore(keccak256(0x0c, 0x34), isApproved)\\n // Emit the {ApprovalForAll} event.\\n mstore(0x00, isApproved)\\n // forgefmt: disable-next-line\\n log3(0x00, 0x20, _APPROVAL_FOR_ALL_EVENT_SIGNATURE, caller(), shr(96, shl(96, operator)))\\n }\\n }\\n\\n /// @dev Transfers `amount` of `id` from `from` to `to`.\\n ///\\n /// Requirements:\\n /// - `to` cannot be the zero address.\\n /// - `from` must have at least `amount` of `id`.\\n /// - If the caller is not `from`,\\n /// it must be approved to manage the tokens of `from`.\\n /// - If `to` refers to a smart contract, it must implement\\n /// {ERC1155-onERC1155Received}, which is called upon a batch transfer.\\n ///\\n /// Emits a {TransferSingle} event.\\n function safeTransferFrom(\\n address from,\\n address to,\\n uint256 id,\\n uint256 amount,\\n bytes calldata data\\n ) public virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(from, to, _single(id), _single(amount), data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n let fromSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, from))\\n let toSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, to))\\n mstore(0x20, fromSlotSeed)\\n // Clear the upper 96 bits.\\n from := shr(96, fromSlotSeed)\\n to := shr(96, toSlotSeed)\\n // Revert if `to` is the zero address.\\n if iszero(to) {\\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\\n revert(0x1c, 0x04)\\n }\\n // If the caller is not `from`, do the authorization check.\\n if iszero(eq(caller(), from)) {\\n mstore(0x00, caller())\\n if iszero(sload(keccak256(0x0c, 0x34))) {\\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n // Subtract and store the updated balance of `from`.\\n {\\n mstore(0x00, id)\\n let fromBalanceSlot := keccak256(0x00, 0x40)\\n let fromBalance := sload(fromBalanceSlot)\\n if gt(amount, fromBalance) {\\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(fromBalanceSlot, sub(fromBalance, amount))\\n }\\n // Increase and store the updated balance of `to`.\\n {\\n mstore(0x20, toSlotSeed)\\n let toBalanceSlot := keccak256(0x00, 0x40)\\n let toBalanceBefore := sload(toBalanceSlot)\\n let toBalanceAfter := add(toBalanceBefore, amount)\\n if lt(toBalanceAfter, toBalanceBefore) {\\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(toBalanceSlot, toBalanceAfter)\\n }\\n // Emit a {TransferSingle} event.\\n mstore(0x20, amount)\\n log4(0x00, 0x40, _TRANSFER_SINGLE_EVENT_SIGNATURE, caller(), from, to)\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(from, to, _single(id), _single(amount), data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Do the {onERC1155Received} check if `to` is a smart contract.\\n if extcodesize(to) {\\n // Prepare the calldata.\\n let m := mload(0x40)\\n // `onERC1155Received(address,address,uint256,uint256,bytes)`.\\n mstore(m, 0xf23a6e61)\\n mstore(add(m, 0x20), caller())\\n mstore(add(m, 0x40), from)\\n mstore(add(m, 0x60), id)\\n mstore(add(m, 0x80), amount)\\n mstore(add(m, 0xa0), 0xa0)\\n mstore(add(m, 0xc0), data.length)\\n calldatacopy(add(m, 0xe0), data.offset, data.length)\\n // Revert if the call reverts.\\n if iszero(call(gas(), to, 0, add(m, 0x1c), add(0xc4, data.length), m, 0x20)) {\\n if returndatasize() {\\n // Bubble up the revert if the call reverts.\\n returndatacopy(m, 0x00, returndatasize())\\n revert(m, returndatasize())\\n }\\n }\\n // Load the returndata and compare it with the function selector.\\n if iszero(eq(mload(m), shl(224, 0xf23a6e61))) {\\n mstore(0x00, 0x9c05499b) // `TransferToNonERC1155ReceiverImplementer()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n }\\n }\\n\\n /// @dev Transfers `amounts` of `ids` from `from` to `to`.\\n ///\\n /// Requirements:\\n /// - `to` cannot be the zero address.\\n /// - `from` must have at least `amount` of `id`.\\n /// - `ids` and `amounts` must have the same length.\\n /// - If the caller is not `from`,\\n /// it must be approved to manage the tokens of `from`.\\n /// - If `to` refers to a smart contract, it must implement\\n /// {ERC1155-onERC1155BatchReceived}, which is called upon a batch transfer.\\n ///\\n /// Emits a {TransferBatch} event.\\n function safeBatchTransferFrom(\\n address from,\\n address to,\\n uint256[] calldata ids,\\n uint256[] calldata amounts,\\n bytes calldata data\\n ) public virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(from, to, ids, amounts, data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n if iszero(eq(ids.length, amounts.length)) {\\n mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.\\n revert(0x1c, 0x04)\\n }\\n let fromSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, from))\\n let toSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, to))\\n mstore(0x20, fromSlotSeed)\\n // Clear the upper 96 bits.\\n from := shr(96, fromSlotSeed)\\n to := shr(96, toSlotSeed)\\n // Revert if `to` is the zero address.\\n if iszero(to) {\\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\\n revert(0x1c, 0x04)\\n }\\n // If the caller is not `from`, do the authorization check.\\n if iszero(eq(caller(), from)) {\\n mstore(0x00, caller())\\n if iszero(sload(keccak256(0x0c, 0x34))) {\\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n // Loop through all the `ids` and update the balances.\\n {\\n for { let i := shl(5, ids.length) } i {} {\\n i := sub(i, 0x20)\\n let amount := calldataload(add(amounts.offset, i))\\n // Subtract and store the updated balance of `from`.\\n {\\n mstore(0x20, fromSlotSeed)\\n mstore(0x00, calldataload(add(ids.offset, i)))\\n let fromBalanceSlot := keccak256(0x00, 0x40)\\n let fromBalance := sload(fromBalanceSlot)\\n if gt(amount, fromBalance) {\\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(fromBalanceSlot, sub(fromBalance, amount))\\n }\\n // Increase and store the updated balance of `to`.\\n {\\n mstore(0x20, toSlotSeed)\\n let toBalanceSlot := keccak256(0x00, 0x40)\\n let toBalanceBefore := sload(toBalanceSlot)\\n let toBalanceAfter := add(toBalanceBefore, amount)\\n if lt(toBalanceAfter, toBalanceBefore) {\\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(toBalanceSlot, toBalanceAfter)\\n }\\n }\\n }\\n // Emit a {TransferBatch} event.\\n {\\n let m := mload(0x40)\\n // Copy the `ids`.\\n mstore(m, 0x40)\\n let n := shl(5, ids.length)\\n mstore(add(m, 0x40), ids.length)\\n calldatacopy(add(m, 0x60), ids.offset, n)\\n // Copy the `amounts`.\\n mstore(add(m, 0x20), add(0x60, n))\\n let o := add(add(m, n), 0x60)\\n mstore(o, ids.length)\\n calldatacopy(add(o, 0x20), amounts.offset, n)\\n // Do the emit.\\n log4(m, add(add(n, n), 0x80), _TRANSFER_BATCH_EVENT_SIGNATURE, caller(), from, to)\\n }\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransferCalldata(from, to, ids, amounts, data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Do the {onERC1155BatchReceived} check if `to` is a smart contract.\\n if extcodesize(to) {\\n mstore(0x00, to) // Cache `to` to prevent stack too deep.\\n let m := mload(0x40)\\n // Prepare the calldata.\\n // `onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)`.\\n mstore(m, 0xbc197c81)\\n mstore(add(m, 0x20), caller())\\n mstore(add(m, 0x40), from)\\n // Copy the `ids`.\\n mstore(add(m, 0x60), 0xa0)\\n let n := shl(5, ids.length)\\n mstore(add(m, 0xc0), ids.length)\\n calldatacopy(add(m, 0xe0), ids.offset, n)\\n // Copy the `amounts`.\\n mstore(add(m, 0x80), add(0xc0, n))\\n let o := add(add(m, n), 0xe0)\\n mstore(o, ids.length)\\n calldatacopy(add(o, 0x20), amounts.offset, n)\\n // Copy the `data`.\\n mstore(add(m, 0xa0), add(add(0xe0, n), n))\\n o := add(add(o, n), 0x20)\\n mstore(o, data.length)\\n calldatacopy(add(o, 0x20), data.offset, data.length)\\n let nAll := add(0x104, add(data.length, add(n, n)))\\n // Revert if the call reverts.\\n if iszero(call(gas(), mload(0x00), 0, add(mload(0x40), 0x1c), nAll, m, 0x20)) {\\n if returndatasize() {\\n // Bubble up the revert if the call reverts.\\n returndatacopy(m, 0x00, returndatasize())\\n revert(m, returndatasize())\\n }\\n }\\n // Load the returndata and compare it with the function selector.\\n if iszero(eq(mload(m), shl(224, 0xbc197c81))) {\\n mstore(0x00, 0x9c05499b) // `TransferToNonERC1155ReceiverImplementer()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n }\\n }\\n\\n /// @dev Returns the amounts of `ids` for `owners.\\n ///\\n /// Requirements:\\n /// - `owners` and `ids` must have the same length.\\n function balanceOfBatch(address[] calldata owners, uint256[] calldata ids)\\n public\\n view\\n virtual\\n returns (uint256[] memory balances)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n if iszero(eq(ids.length, owners.length)) {\\n mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.\\n revert(0x1c, 0x04)\\n }\\n balances := mload(0x40)\\n mstore(balances, ids.length)\\n let o := add(balances, 0x20)\\n let i := shl(5, ids.length)\\n mstore(0x40, add(i, o))\\n // Loop through all the `ids` and load the balances.\\n for {} i {} {\\n i := sub(i, 0x20)\\n let owner := calldataload(add(owners.offset, i))\\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, shl(96, owner)))\\n mstore(0x00, calldataload(add(ids.offset, i)))\\n mstore(add(o, i), sload(keccak256(0x00, 0x40)))\\n }\\n }\\n }\\n\\n /// @dev Returns true if this contract implements the interface defined by `interfaceId`.\\n /// See: https://eips.ethereum.org/EIPS/eip-165\\n /// This function call must use less than 30000 gas.\\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let s := shr(224, interfaceId)\\n // ERC165: 0x01ffc9a7, ERC1155: 0xd9b67a26, ERC1155MetadataURI: 0x0e89341c.\\n result := or(or(eq(s, 0x01ffc9a7), eq(s, 0xd9b67a26)), eq(s, 0x0e89341c))\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* INTERNAL MINT FUNCTIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Mints `amount` of `id` to `to`.\\n ///\\n /// Requirements:\\n /// - `to` cannot be the zero address.\\n /// - If `to` refers to a smart contract, it must implement\\n /// {ERC1155-onERC1155Received}, which is called upon a batch transfer.\\n ///\\n /// Emits a {TransferSingle} event.\\n function _mint(address to, uint256 id, uint256 amount, bytes memory data) internal virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(address(0), to, _single(id), _single(amount), data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n let to_ := shl(96, to)\\n // Revert if `to` is the zero address.\\n if iszero(to_) {\\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\\n revert(0x1c, 0x04)\\n }\\n // Increase and store the updated balance of `to`.\\n {\\n mstore(0x20, _ERC1155_MASTER_SLOT_SEED)\\n mstore(0x14, to)\\n mstore(0x00, id)\\n let toBalanceSlot := keccak256(0x00, 0x40)\\n let toBalanceBefore := sload(toBalanceSlot)\\n let toBalanceAfter := add(toBalanceBefore, amount)\\n if lt(toBalanceAfter, toBalanceBefore) {\\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(toBalanceSlot, toBalanceAfter)\\n }\\n // Emit a {TransferSingle} event.\\n mstore(0x20, amount)\\n log4(0x00, 0x40, _TRANSFER_SINGLE_EVENT_SIGNATURE, caller(), 0, shr(96, to_))\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(address(0), to, _single(id), _single(amount), data);\\n }\\n if (_hasCode(to)) _checkOnERC1155Received(address(0), to, id, amount, data);\\n }\\n\\n /// @dev Mints `amounts` of `ids` to `to`.\\n ///\\n /// Requirements:\\n /// - `to` cannot be the zero address.\\n /// - `ids` and `amounts` must have the same length.\\n /// - If `to` refers to a smart contract, it must implement\\n /// {ERC1155-onERC1155BatchReceived}, which is called upon a batch transfer.\\n ///\\n /// Emits a {TransferBatch} event.\\n function _batchMint(\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) internal virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(address(0), to, ids, amounts, data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n if iszero(eq(mload(ids), mload(amounts))) {\\n mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.\\n revert(0x1c, 0x04)\\n }\\n let to_ := shl(96, to)\\n // Revert if `to` is the zero address.\\n if iszero(to_) {\\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\\n revert(0x1c, 0x04)\\n }\\n // Loop through all the `ids` and update the balances.\\n {\\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, to_))\\n for { let i := shl(5, mload(ids)) } i { i := sub(i, 0x20) } {\\n let amount := mload(add(amounts, i))\\n // Increase and store the updated balance of `to`.\\n {\\n mstore(0x00, mload(add(ids, i)))\\n let toBalanceSlot := keccak256(0x00, 0x40)\\n let toBalanceBefore := sload(toBalanceSlot)\\n let toBalanceAfter := add(toBalanceBefore, amount)\\n if lt(toBalanceAfter, toBalanceBefore) {\\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(toBalanceSlot, toBalanceAfter)\\n }\\n }\\n }\\n // Emit a {TransferBatch} event.\\n {\\n let m := mload(0x40)\\n // Copy the `ids`.\\n mstore(m, 0x40)\\n let n := add(0x20, shl(5, mload(ids)))\\n let o := add(m, 0x40)\\n pop(staticcall(gas(), 4, ids, n, o, n))\\n // Copy the `amounts`.\\n mstore(add(m, 0x20), add(0x40, returndatasize()))\\n o := add(o, returndatasize())\\n n := add(0x20, shl(5, mload(amounts)))\\n pop(staticcall(gas(), 4, amounts, n, o, n))\\n n := sub(add(o, returndatasize()), m)\\n // Do the emit.\\n log4(m, n, _TRANSFER_BATCH_EVENT_SIGNATURE, caller(), 0, shr(96, to_))\\n }\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(address(0), to, ids, amounts, data);\\n }\\n if (_hasCode(to)) _checkOnERC1155BatchReceived(address(0), to, ids, amounts, data);\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* INTERNAL BURN FUNCTIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Equivalent to `_burn(address(0), from, id, amount)`.\\n function _burn(address from, uint256 id, uint256 amount) internal virtual {\\n _burn(address(0), from, id, amount);\\n }\\n\\n /// @dev Destroys `amount` of `id` from `from`.\\n ///\\n /// Requirements:\\n /// - `from` must have at least `amount` of `id`.\\n /// - If `by` is not the zero address, it must be either `from`,\\n /// or approved to manage the tokens of `from`.\\n ///\\n /// Emits a {TransferSingle} event.\\n function _burn(address by, address from, uint256 id, uint256 amount) internal virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(from, address(0), _single(id), _single(amount), \\\"\\\");\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n let from_ := shl(96, from)\\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, from_))\\n // If `by` is not the zero address, and not equal to `from`,\\n // check if it is approved to manage all the tokens of `from`.\\n if iszero(or(iszero(shl(96, by)), eq(shl(96, by), from_))) {\\n mstore(0x00, by)\\n if iszero(sload(keccak256(0x0c, 0x34))) {\\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n // Decrease and store the updated balance of `from`.\\n {\\n mstore(0x00, id)\\n let fromBalanceSlot := keccak256(0x00, 0x40)\\n let fromBalance := sload(fromBalanceSlot)\\n if gt(amount, fromBalance) {\\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(fromBalanceSlot, sub(fromBalance, amount))\\n }\\n // Emit a {TransferSingle} event.\\n mstore(0x20, amount)\\n log4(0x00, 0x40, _TRANSFER_SINGLE_EVENT_SIGNATURE, caller(), shr(96, from_), 0)\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(from, address(0), _single(id), _single(amount), \\\"\\\");\\n }\\n }\\n\\n /// @dev Equivalent to `_batchBurn(address(0), from, ids, amounts)`.\\n function _batchBurn(address from, uint256[] memory ids, uint256[] memory amounts)\\n internal\\n virtual\\n {\\n _batchBurn(address(0), from, ids, amounts);\\n }\\n\\n /// @dev Destroys `amounts` of `ids` from `from`.\\n ///\\n /// Requirements:\\n /// - `ids` and `amounts` must have the same length.\\n /// - `from` must have at least `amounts` of `ids`.\\n /// - If `by` is not the zero address, it must be either `from`,\\n /// or approved to manage the tokens of `from`.\\n ///\\n /// Emits a {TransferBatch} event.\\n function _batchBurn(address by, address from, uint256[] memory ids, uint256[] memory amounts)\\n internal\\n virtual\\n {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(from, address(0), ids, amounts, \\\"\\\");\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n if iszero(eq(mload(ids), mload(amounts))) {\\n mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.\\n revert(0x1c, 0x04)\\n }\\n let from_ := shl(96, from)\\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, from_))\\n // If `by` is not the zero address, and not equal to `from`,\\n // check if it is approved to manage all the tokens of `from`.\\n let by_ := shl(96, by)\\n if iszero(or(iszero(by_), eq(by_, from_))) {\\n mstore(0x00, by)\\n if iszero(sload(keccak256(0x0c, 0x34))) {\\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n // Loop through all the `ids` and update the balances.\\n {\\n for { let i := shl(5, mload(ids)) } i { i := sub(i, 0x20) } {\\n let amount := mload(add(amounts, i))\\n // Decrease and store the updated balance of `from`.\\n {\\n mstore(0x00, mload(add(ids, i)))\\n let fromBalanceSlot := keccak256(0x00, 0x40)\\n let fromBalance := sload(fromBalanceSlot)\\n if gt(amount, fromBalance) {\\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(fromBalanceSlot, sub(fromBalance, amount))\\n }\\n }\\n }\\n // Emit a {TransferBatch} event.\\n {\\n let m := mload(0x40)\\n // Copy the `ids`.\\n mstore(m, 0x40)\\n let n := add(0x20, shl(5, mload(ids)))\\n let o := add(m, 0x40)\\n pop(staticcall(gas(), 4, ids, n, o, n))\\n // Copy the `amounts`.\\n mstore(add(m, 0x20), add(0x40, returndatasize()))\\n o := add(o, returndatasize())\\n n := add(0x20, shl(5, mload(amounts)))\\n pop(staticcall(gas(), 4, amounts, n, o, n))\\n n := sub(add(o, returndatasize()), m)\\n // Do the emit.\\n log4(m, n, _TRANSFER_BATCH_EVENT_SIGNATURE, caller(), shr(96, from_), 0)\\n }\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(from, address(0), ids, amounts, \\\"\\\");\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* INTERNAL APPROVAL FUNCTIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Approve or remove the `operator` as an operator for `by`,\\n /// without authorization checks.\\n ///\\n /// Emits a {ApprovalForAll} event.\\n function _setApprovalForAll(address by, address operator, bool isApproved) internal virtual {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Convert to 0 or 1.\\n isApproved := iszero(iszero(isApproved))\\n // Update the `isApproved` for (`by`, `operator`).\\n mstore(0x20, _ERC1155_MASTER_SLOT_SEED)\\n mstore(0x14, by)\\n mstore(0x00, operator)\\n sstore(keccak256(0x0c, 0x34), isApproved)\\n // Emit the {ApprovalForAll} event.\\n mstore(0x00, isApproved)\\n let m := shr(96, not(0))\\n log3(0x00, 0x20, _APPROVAL_FOR_ALL_EVENT_SIGNATURE, and(m, by), and(m, operator))\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* INTERNAL TRANSFER FUNCTIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Equivalent to `_safeTransfer(address(0), from, to, id, amount, data)`.\\n function _safeTransfer(address from, address to, uint256 id, uint256 amount, bytes memory data)\\n internal\\n virtual\\n {\\n _safeTransfer(address(0), from, to, id, amount, data);\\n }\\n\\n /// @dev Transfers `amount` of `id` from `from` to `to`.\\n ///\\n /// Requirements:\\n /// - `to` cannot be the zero address.\\n /// - `from` must have at least `amount` of `id`.\\n /// - If `by` is not the zero address, it must be either `from`,\\n /// or approved to manage the tokens of `from`.\\n /// - If `to` refers to a smart contract, it must implement\\n /// {ERC1155-onERC1155Received}, which is called upon a batch transfer.\\n ///\\n /// Emits a {TransferSingle} event.\\n function _safeTransfer(\\n address by,\\n address from,\\n address to,\\n uint256 id,\\n uint256 amount,\\n bytes memory data\\n ) internal virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(from, to, _single(id), _single(amount), data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n let from_ := shl(96, from)\\n let to_ := shl(96, to)\\n // Revert if `to` is the zero address.\\n if iszero(to_) {\\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\\n revert(0x1c, 0x04)\\n }\\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, from_))\\n // If `by` is not the zero address, and not equal to `from`,\\n // check if it is approved to manage all the tokens of `from`.\\n let by_ := shl(96, by)\\n if iszero(or(iszero(by_), eq(by_, from_))) {\\n mstore(0x00, by)\\n if iszero(sload(keccak256(0x0c, 0x34))) {\\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n // Subtract and store the updated balance of `from`.\\n {\\n mstore(0x00, id)\\n let fromBalanceSlot := keccak256(0x00, 0x40)\\n let fromBalance := sload(fromBalanceSlot)\\n if gt(amount, fromBalance) {\\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(fromBalanceSlot, sub(fromBalance, amount))\\n }\\n // Increase and store the updated balance of `to`.\\n {\\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, to_))\\n let toBalanceSlot := keccak256(0x00, 0x40)\\n let toBalanceBefore := sload(toBalanceSlot)\\n let toBalanceAfter := add(toBalanceBefore, amount)\\n if lt(toBalanceAfter, toBalanceBefore) {\\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(toBalanceSlot, toBalanceAfter)\\n }\\n // Emit a {TransferSingle} event.\\n mstore(0x20, amount)\\n // forgefmt: disable-next-line\\n log4(0x00, 0x40, _TRANSFER_SINGLE_EVENT_SIGNATURE, caller(), shr(96, from_), shr(96, to_))\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(from, to, _single(id), _single(amount), data);\\n }\\n if (_hasCode(to)) _checkOnERC1155Received(from, to, id, amount, data);\\n }\\n\\n /// @dev Equivalent to `_safeBatchTransfer(address(0), from, to, ids, amounts, data)`.\\n function _safeBatchTransfer(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) internal virtual {\\n _safeBatchTransfer(address(0), from, to, ids, amounts, data);\\n }\\n\\n /// @dev Transfers `amounts` of `ids` from `from` to `to`.\\n ///\\n /// Requirements:\\n /// - `to` cannot be the zero address.\\n /// - `ids` and `amounts` must have the same length.\\n /// - `from` must have at least `amounts` of `ids`.\\n /// - If `by` is not the zero address, it must be either `from`,\\n /// or approved to manage the tokens of `from`.\\n /// - If `to` refers to a smart contract, it must implement\\n /// {ERC1155-onERC1155BatchReceived}, which is called upon a batch transfer.\\n ///\\n /// Emits a {TransferBatch} event.\\n function _safeBatchTransfer(\\n address by,\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) internal virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(from, to, ids, amounts, data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n if iszero(eq(mload(ids), mload(amounts))) {\\n mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.\\n revert(0x1c, 0x04)\\n }\\n let from_ := shl(96, from)\\n let to_ := shl(96, to)\\n // Revert if `to` is the zero address.\\n if iszero(to_) {\\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\\n revert(0x1c, 0x04)\\n }\\n let fromSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, from_)\\n let toSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, to_)\\n mstore(0x20, fromSlotSeed)\\n // If `by` is not the zero address, and not equal to `from`,\\n // check if it is approved to manage all the tokens of `from`.\\n let by_ := shl(96, by)\\n if iszero(or(iszero(by_), eq(by_, from_))) {\\n mstore(0x00, by)\\n if iszero(sload(keccak256(0x0c, 0x34))) {\\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n // Loop through all the `ids` and update the balances.\\n {\\n for { let i := shl(5, mload(ids)) } i { i := sub(i, 0x20) } {\\n let amount := mload(add(amounts, i))\\n // Subtract and store the updated balance of `from`.\\n {\\n mstore(0x20, fromSlotSeed)\\n mstore(0x00, mload(add(ids, i)))\\n let fromBalanceSlot := keccak256(0x00, 0x40)\\n let fromBalance := sload(fromBalanceSlot)\\n if gt(amount, fromBalance) {\\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(fromBalanceSlot, sub(fromBalance, amount))\\n }\\n // Increase and store the updated balance of `to`.\\n {\\n mstore(0x20, toSlotSeed)\\n let toBalanceSlot := keccak256(0x00, 0x40)\\n let toBalanceBefore := sload(toBalanceSlot)\\n let toBalanceAfter := add(toBalanceBefore, amount)\\n if lt(toBalanceAfter, toBalanceBefore) {\\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(toBalanceSlot, toBalanceAfter)\\n }\\n }\\n }\\n // Emit a {TransferBatch} event.\\n {\\n let m := mload(0x40)\\n // Copy the `ids`.\\n mstore(m, 0x40)\\n let n := add(0x20, shl(5, mload(ids)))\\n let o := add(m, 0x40)\\n pop(staticcall(gas(), 4, ids, n, o, n))\\n // Copy the `amounts`.\\n mstore(add(m, 0x20), add(0x40, returndatasize()))\\n o := add(o, returndatasize())\\n n := add(0x20, shl(5, mload(amounts)))\\n pop(staticcall(gas(), 4, amounts, n, o, n))\\n n := sub(add(o, returndatasize()), m)\\n // Do the emit.\\n log4(m, n, _TRANSFER_BATCH_EVENT_SIGNATURE, caller(), shr(96, from_), shr(96, to_))\\n }\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(from, to, ids, amounts, data);\\n }\\n if (_hasCode(to)) _checkOnERC1155BatchReceived(from, to, ids, amounts, data);\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* HOOKS FOR OVERRIDING */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Override this function to return true if `_beforeTokenTransfer` is used.\\n /// This is to help the compiler avoid producing dead bytecode.\\n function _useBeforeTokenTransfer() internal view virtual returns (bool) {\\n return false;\\n }\\n\\n /// @dev Hook that is called before any token transfer.\\n /// This includes minting and burning, as well as batched variants.\\n ///\\n /// The same hook is called on both single and batched variants.\\n /// For single transfers, the length of the `id` and `amount` arrays are 1.\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) internal virtual {}\\n\\n /// @dev Override this function to return true if `_afterTokenTransfer` is used.\\n /// This is to help the compiler avoid producing dead bytecode.\\n function _useAfterTokenTransfer() internal view virtual returns (bool) {\\n return false;\\n }\\n\\n /// @dev Hook that is called after any token transfer.\\n /// This includes minting and burning, as well as batched variants.\\n ///\\n /// The same hook is called on both single and batched variants.\\n /// For single transfers, the length of the `id` and `amount` arrays are 1.\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) internal virtual {}\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* PRIVATE HELPERS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Helper for calling the `_afterTokenTransfer` hook.\\n /// This is to help the compiler avoid producing dead bytecode.\\n function _afterTokenTransferCalldata(\\n address from,\\n address to,\\n uint256[] calldata ids,\\n uint256[] calldata amounts,\\n bytes calldata data\\n ) private {\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(from, to, ids, amounts, data);\\n }\\n }\\n\\n /// @dev Returns if `a` has bytecode of non-zero length.\\n function _hasCode(address a) private view returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := extcodesize(a) // Can handle dirty upper bits.\\n }\\n }\\n\\n /// @dev Perform a call to invoke {IERC1155Receiver-onERC1155Received} on `to`.\\n /// Reverts if the target does not support the function correctly.\\n function _checkOnERC1155Received(\\n address from,\\n address to,\\n uint256 id,\\n uint256 amount,\\n bytes memory data\\n ) private {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Prepare the calldata.\\n let m := mload(0x40)\\n // `onERC1155Received(address,address,uint256,uint256,bytes)`.\\n mstore(m, 0xf23a6e61)\\n mstore(add(m, 0x20), caller())\\n mstore(add(m, 0x40), shr(96, shl(96, from)))\\n mstore(add(m, 0x60), id)\\n mstore(add(m, 0x80), amount)\\n mstore(add(m, 0xa0), 0xa0)\\n let n := mload(data)\\n mstore(add(m, 0xc0), n)\\n if n { pop(staticcall(gas(), 4, add(data, 0x20), n, add(m, 0xe0), n)) }\\n // Revert if the call reverts.\\n if iszero(call(gas(), to, 0, add(m, 0x1c), add(0xc4, n), m, 0x20)) {\\n if returndatasize() {\\n // Bubble up the revert if the call reverts.\\n returndatacopy(m, 0x00, returndatasize())\\n revert(m, returndatasize())\\n }\\n }\\n // Load the returndata and compare it with the function selector.\\n if iszero(eq(mload(m), shl(224, 0xf23a6e61))) {\\n mstore(0x00, 0x9c05499b) // `TransferToNonERC1155ReceiverImplementer()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n }\\n\\n /// @dev Perform a call to invoke {IERC1155Receiver-onERC1155BatchReceived} on `to`.\\n /// Reverts if the target does not support the function correctly.\\n function _checkOnERC1155BatchReceived(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) private {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Prepare the calldata.\\n let m := mload(0x40)\\n // `onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)`.\\n mstore(m, 0xbc197c81)\\n mstore(add(m, 0x20), caller())\\n mstore(add(m, 0x40), shr(96, shl(96, from)))\\n // Copy the `ids`.\\n mstore(add(m, 0x60), 0xa0)\\n let n := add(0x20, shl(5, mload(ids)))\\n let o := add(m, 0xc0)\\n pop(staticcall(gas(), 4, ids, n, o, n))\\n // Copy the `amounts`.\\n let s := add(0xa0, returndatasize())\\n mstore(add(m, 0x80), s)\\n o := add(o, returndatasize())\\n n := add(0x20, shl(5, mload(amounts)))\\n pop(staticcall(gas(), 4, amounts, n, o, n))\\n // Copy the `data`.\\n mstore(add(m, 0xa0), add(s, returndatasize()))\\n o := add(o, returndatasize())\\n n := add(0x20, mload(data))\\n pop(staticcall(gas(), 4, data, n, o, n))\\n n := sub(add(o, returndatasize()), add(m, 0x1c))\\n // Revert if the call reverts.\\n if iszero(call(gas(), to, 0, add(m, 0x1c), n, m, 0x20)) {\\n if returndatasize() {\\n // Bubble up the revert if the call reverts.\\n returndatacopy(m, 0x00, returndatasize())\\n revert(m, returndatasize())\\n }\\n }\\n // Load the returndata and compare it with the function selector.\\n if iszero(eq(mload(m), shl(224, 0xbc197c81))) {\\n mstore(0x00, 0x9c05499b) // `TransferToNonERC1155ReceiverImplementer()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n }\\n\\n /// @dev Returns `x` in an array with a single element.\\n function _single(uint256 x) private pure returns (uint256[] memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n mstore(0x40, add(result, 0x40))\\n mstore(result, 1)\\n mstore(add(result, 0x20), x)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x306249cc3611727ffa9e15ec816282a60fd9629e5ea03ab1c780d638d1537c68\",\"license\":\"MIT\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": {}, + "notice": "- Check that the overridden function is actually used in the function you want to change the behavior of. Much of the code has been manually inlined for performance.", + "version": 1 + } + } + }, + "lib/solady/src/utils/LibBytes.sol": { + "LibBytes": { + "abi": [], + "devdoc": { + "author": "Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibBytes.sol)", + "kind": "dev", + "methods": {}, + "stateVariables": { + "NOT_FOUND": { + "details": "The constant returned when the `search` is not found in the bytes." + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": { + "allocate_unbounded": { + "entryPoint": 33, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb": { + "entryPoint": 39, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + } + }, + "generatedSources": [], + "linkReferences": {}, + "object": "608060405234601d57600e6021565b603f602d823930815050603f90f35b6027565b60405190565b600080fdfe6080604052600080fdfea26469706673582212202333ed565e73699ecd67ee453c4d35b10817b7875cd0ca836c6ddecc89795dae64736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x1D JUMPI PUSH1 0xE PUSH1 0x21 JUMP JUMPDEST PUSH1 0x3F PUSH1 0x2D DUP3 CODECOPY ADDRESS DUP2 POP POP PUSH1 0x3F SWAP1 RETURN JUMPDEST PUSH1 0x27 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x23 CALLER 0xED JUMP MCOPY PUSH20 0x699ECD67EE453C4D35B10817B7875CD0CA836C6D 0xDE 0xCC DUP10 PUSH26 0x5DAE64736F6C634300081B003300000000000000000000000000 ", + "sourceMap": "197:34035:30:-:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + } + }, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "6080604052600080fdfea26469706673582212202333ed565e73699ecd67ee453c4d35b10817b7875cd0ca836c6ddecc89795dae64736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x23 CALLER 0xED JUMP MCOPY PUSH20 0x699ECD67EE453C4D35B10817B7875CD0CA836C6D 0xDE 0xCC DUP10 PUSH26 0x5DAE64736F6C634300081B003300000000000000000000000000 ", + "sourceMap": "197:34035:30:-:0;;;;;" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"author\":\"Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibBytes.sol)\",\"kind\":\"dev\",\"methods\":{},\"stateVariables\":{\"NOT_FOUND\":{\"details\":\"The constant returned when the `search` is not found in the bytes.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Library for byte related operations.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/solady/src/utils/LibBytes.sol\":\"LibBytes\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/solady/src/utils/LibBytes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\n/// @notice Library for byte related operations.\\n/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibBytes.sol)\\nlibrary LibBytes {\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* STRUCTS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Goated bytes storage struct that totally MOGs, no cap, fr.\\n /// Uses less gas and bytecode than Solidity's native bytes storage. It's meta af.\\n /// Packs length with the first 31 bytes if <255 bytes, so it\\u2019s mad tight.\\n struct BytesStorage {\\n bytes32 _spacer;\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* CONSTANTS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev The constant returned when the `search` is not found in the bytes.\\n uint256 internal constant NOT_FOUND = type(uint256).max;\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* BYTE STORAGE OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Sets the value of the bytes storage `$` to `s`.\\n function set(BytesStorage storage $, bytes memory s) internal {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := mload(s)\\n let packed := or(0xff, shl(8, n))\\n for { let i := 0 } 1 {} {\\n if iszero(gt(n, 0xfe)) {\\n i := 0x1f\\n packed := or(n, shl(8, mload(add(s, i))))\\n if iszero(gt(n, i)) { break }\\n }\\n let o := add(s, 0x20)\\n mstore(0x00, $.slot)\\n for { let p := keccak256(0x00, 0x20) } 1 {} {\\n sstore(add(p, shr(5, i)), mload(add(o, i)))\\n i := add(i, 0x20)\\n if iszero(lt(i, n)) { break }\\n }\\n break\\n }\\n sstore($.slot, packed)\\n }\\n }\\n\\n /// @dev Sets the value of the bytes storage `$` to `s`.\\n function setCalldata(BytesStorage storage $, bytes calldata s) internal {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let packed := or(0xff, shl(8, s.length))\\n for { let i := 0 } 1 {} {\\n if iszero(gt(s.length, 0xfe)) {\\n i := 0x1f\\n packed := or(s.length, shl(8, shr(8, calldataload(s.offset))))\\n if iszero(gt(s.length, i)) { break }\\n }\\n mstore(0x00, $.slot)\\n for { let p := keccak256(0x00, 0x20) } 1 {} {\\n sstore(add(p, shr(5, i)), calldataload(add(s.offset, i)))\\n i := add(i, 0x20)\\n if iszero(lt(i, s.length)) { break }\\n }\\n break\\n }\\n sstore($.slot, packed)\\n }\\n }\\n\\n /// @dev Sets the value of the bytes storage `$` to the empty bytes.\\n function clear(BytesStorage storage $) internal {\\n delete $._spacer;\\n }\\n\\n /// @dev Returns whether the value stored is `$` is the empty bytes \\\"\\\".\\n function isEmpty(BytesStorage storage $) internal view returns (bool) {\\n return uint256($._spacer) & 0xff == uint256(0);\\n }\\n\\n /// @dev Returns the length of the value stored in `$`.\\n function length(BytesStorage storage $) internal view returns (uint256 result) {\\n result = uint256($._spacer);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := and(0xff, result)\\n result := or(mul(shr(8, result), eq(0xff, n)), mul(n, iszero(eq(0xff, n))))\\n }\\n }\\n\\n /// @dev Returns the value stored in `$`.\\n function get(BytesStorage storage $) internal view returns (bytes memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n let o := add(result, 0x20)\\n let packed := sload($.slot)\\n let n := shr(8, packed)\\n for { let i := 0 } 1 {} {\\n if iszero(eq(or(packed, 0xff), packed)) {\\n mstore(o, packed)\\n n := and(0xff, packed)\\n i := 0x1f\\n if iszero(gt(n, i)) { break }\\n }\\n mstore(0x00, $.slot)\\n for { let p := keccak256(0x00, 0x20) } 1 {} {\\n mstore(add(o, i), sload(add(p, shr(5, i))))\\n i := add(i, 0x20)\\n if iszero(lt(i, n)) { break }\\n }\\n break\\n }\\n mstore(result, n) // Store the length of the memory.\\n mstore(add(o, n), 0) // Zeroize the slot after the bytes.\\n mstore(0x40, add(add(o, n), 0x20)) // Allocate memory.\\n }\\n }\\n\\n /// @dev Returns the uint8 at index `i`. If out-of-bounds, returns 0.\\n function uint8At(BytesStorage storage $, uint256 i) internal view returns (uint8 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n for { let packed := sload($.slot) } 1 {} {\\n if iszero(eq(or(packed, 0xff), packed)) {\\n if iszero(gt(i, 0x1e)) {\\n result := byte(i, packed)\\n break\\n }\\n if iszero(gt(i, and(0xff, packed))) {\\n mstore(0x00, $.slot)\\n let j := sub(i, 0x1f)\\n result := byte(and(j, 0x1f), sload(add(keccak256(0x00, 0x20), shr(5, j))))\\n }\\n break\\n }\\n if iszero(gt(i, shr(8, packed))) {\\n mstore(0x00, $.slot)\\n result := byte(and(i, 0x1f), sload(add(keccak256(0x00, 0x20), shr(5, i))))\\n }\\n break\\n }\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* BYTES OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns `subject` all occurrences of `needle` replaced with `replacement`.\\n function replace(bytes memory subject, bytes memory needle, bytes memory replacement)\\n internal\\n pure\\n returns (bytes memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n let needleLen := mload(needle)\\n let replacementLen := mload(replacement)\\n let d := sub(result, subject) // Memory difference.\\n let i := add(subject, 0x20) // Subject bytes pointer.\\n mstore(0x00, add(i, mload(subject))) // End of subject.\\n if iszero(gt(needleLen, mload(subject))) {\\n let subjectSearchEnd := add(sub(mload(0x00), needleLen), 1)\\n let h := 0 // The hash of `needle`.\\n if iszero(lt(needleLen, 0x20)) { h := keccak256(add(needle, 0x20), needleLen) }\\n let s := mload(add(needle, 0x20))\\n for { let m := shl(3, sub(0x20, and(needleLen, 0x1f))) } 1 {} {\\n let t := mload(i)\\n // Whether the first `needleLen % 32` bytes of `subject` and `needle` matches.\\n if iszero(shr(m, xor(t, s))) {\\n if h {\\n if iszero(eq(keccak256(i, needleLen), h)) {\\n mstore(add(i, d), t)\\n i := add(i, 1)\\n if iszero(lt(i, subjectSearchEnd)) { break }\\n continue\\n }\\n }\\n // Copy the `replacement` one word at a time.\\n for { let j := 0 } 1 {} {\\n mstore(add(add(i, d), j), mload(add(add(replacement, 0x20), j)))\\n j := add(j, 0x20)\\n if iszero(lt(j, replacementLen)) { break }\\n }\\n d := sub(add(d, replacementLen), needleLen)\\n if needleLen {\\n i := add(i, needleLen)\\n if iszero(lt(i, subjectSearchEnd)) { break }\\n continue\\n }\\n }\\n mstore(add(i, d), t)\\n i := add(i, 1)\\n if iszero(lt(i, subjectSearchEnd)) { break }\\n }\\n }\\n let end := mload(0x00)\\n let n := add(sub(d, add(result, 0x20)), end)\\n // Copy the rest of the bytes one word at a time.\\n for {} lt(i, end) { i := add(i, 0x20) } { mstore(add(i, d), mload(i)) }\\n let o := add(i, d)\\n mstore(o, 0) // Zeroize the slot after the bytes.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from left to right, starting from `from`.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function indexOf(bytes memory subject, bytes memory needle, uint256 from)\\n internal\\n pure\\n returns (uint256 result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := not(0) // Initialize to `NOT_FOUND`.\\n for { let subjectLen := mload(subject) } 1 {} {\\n if iszero(mload(needle)) {\\n result := from\\n if iszero(gt(from, subjectLen)) { break }\\n result := subjectLen\\n break\\n }\\n let needleLen := mload(needle)\\n let subjectStart := add(subject, 0x20)\\n\\n subject := add(subjectStart, from)\\n let end := add(sub(add(subjectStart, subjectLen), needleLen), 1)\\n let m := shl(3, sub(0x20, and(needleLen, 0x1f)))\\n let s := mload(add(needle, 0x20))\\n\\n if iszero(and(lt(subject, end), lt(from, subjectLen))) { break }\\n\\n if iszero(lt(needleLen, 0x20)) {\\n for { let h := keccak256(add(needle, 0x20), needleLen) } 1 {} {\\n if iszero(shr(m, xor(mload(subject), s))) {\\n if eq(keccak256(subject, needleLen), h) {\\n result := sub(subject, subjectStart)\\n break\\n }\\n }\\n subject := add(subject, 1)\\n if iszero(lt(subject, end)) { break }\\n }\\n break\\n }\\n for {} 1 {} {\\n if iszero(shr(m, xor(mload(subject), s))) {\\n result := sub(subject, subjectStart)\\n break\\n }\\n subject := add(subject, 1)\\n if iszero(lt(subject, end)) { break }\\n }\\n break\\n }\\n }\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from left to right.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function indexOf(bytes memory subject, bytes memory needle) internal pure returns (uint256) {\\n return indexOf(subject, needle, 0);\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from right to left, starting from `from`.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function lastIndexOf(bytes memory subject, bytes memory needle, uint256 from)\\n internal\\n pure\\n returns (uint256 result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n for {} 1 {} {\\n result := not(0) // Initialize to `NOT_FOUND`.\\n let needleLen := mload(needle)\\n if gt(needleLen, mload(subject)) { break }\\n let w := result\\n\\n let fromMax := sub(mload(subject), needleLen)\\n if iszero(gt(fromMax, from)) { from := fromMax }\\n\\n let end := add(add(subject, 0x20), w)\\n subject := add(add(subject, 0x20), from)\\n if iszero(gt(subject, end)) { break }\\n // As this function is not too often used,\\n // we shall simply use keccak256 for smaller bytecode size.\\n for { let h := keccak256(add(needle, 0x20), needleLen) } 1 {} {\\n if eq(keccak256(subject, needleLen), h) {\\n result := sub(subject, add(end, 1))\\n break\\n }\\n subject := add(subject, w) // `sub(subject, 1)`.\\n if iszero(gt(subject, end)) { break }\\n }\\n break\\n }\\n }\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from right to left.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function lastIndexOf(bytes memory subject, bytes memory needle)\\n internal\\n pure\\n returns (uint256)\\n {\\n return lastIndexOf(subject, needle, type(uint256).max);\\n }\\n\\n /// @dev Returns true if `needle` is found in `subject`, false otherwise.\\n function contains(bytes memory subject, bytes memory needle) internal pure returns (bool) {\\n return indexOf(subject, needle) != NOT_FOUND;\\n }\\n\\n /// @dev Returns whether `subject` starts with `needle`.\\n function startsWith(bytes memory subject, bytes memory needle)\\n internal\\n pure\\n returns (bool result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := mload(needle)\\n // Just using keccak256 directly is actually cheaper.\\n let t := eq(keccak256(add(subject, 0x20), n), keccak256(add(needle, 0x20), n))\\n result := lt(gt(n, mload(subject)), t)\\n }\\n }\\n\\n /// @dev Returns whether `subject` ends with `needle`.\\n function endsWith(bytes memory subject, bytes memory needle)\\n internal\\n pure\\n returns (bool result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := mload(needle)\\n let notInRange := gt(n, mload(subject))\\n // `subject + 0x20 + max(subject.length - needle.length, 0)`.\\n let t := add(add(subject, 0x20), mul(iszero(notInRange), sub(mload(subject), n)))\\n // Just using keccak256 directly is actually cheaper.\\n result := gt(eq(keccak256(t, n), keccak256(add(needle, 0x20), n)), notInRange)\\n }\\n }\\n\\n /// @dev Returns `subject` repeated `times`.\\n function repeat(bytes memory subject, uint256 times)\\n internal\\n pure\\n returns (bytes memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let l := mload(subject) // Subject length.\\n if iszero(or(iszero(times), iszero(l))) {\\n result := mload(0x40)\\n subject := add(subject, 0x20)\\n let o := add(result, 0x20)\\n for {} 1 {} {\\n // Copy the `subject` one word at a time.\\n for { let j := 0 } 1 {} {\\n mstore(add(o, j), mload(add(subject, j)))\\n j := add(j, 0x20)\\n if iszero(lt(j, l)) { break }\\n }\\n o := add(o, l)\\n times := sub(times, 1)\\n if iszero(times) { break }\\n }\\n mstore(o, 0) // Zeroize the slot after the bytes.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n mstore(result, sub(o, add(result, 0x20))) // Store the length.\\n }\\n }\\n }\\n\\n /// @dev Returns a copy of `subject` sliced from `start` to `end` (exclusive).\\n /// `start` and `end` are byte offsets.\\n function slice(bytes memory subject, uint256 start, uint256 end)\\n internal\\n pure\\n returns (bytes memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let l := mload(subject) // Subject length.\\n if iszero(gt(l, end)) { end := l }\\n if iszero(gt(l, start)) { start := l }\\n if lt(start, end) {\\n result := mload(0x40)\\n let n := sub(end, start)\\n let i := add(subject, start)\\n let w := not(0x1f)\\n // Copy the `subject` one word at a time, backwards.\\n for { let j := and(add(n, 0x1f), w) } 1 {} {\\n mstore(add(result, j), mload(add(i, j)))\\n j := add(j, w) // `sub(j, 0x20)`.\\n if iszero(j) { break }\\n }\\n let o := add(add(result, 0x20), n)\\n mstore(o, 0) // Zeroize the slot after the bytes.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n mstore(result, n) // Store the length.\\n }\\n }\\n }\\n\\n /// @dev Returns a copy of `subject` sliced from `start` to the end of the bytes.\\n /// `start` is a byte offset.\\n function slice(bytes memory subject, uint256 start)\\n internal\\n pure\\n returns (bytes memory result)\\n {\\n result = slice(subject, start, type(uint256).max);\\n }\\n\\n /// @dev Returns a copy of `subject` sliced from `start` to `end` (exclusive).\\n /// `start` and `end` are byte offsets. Faster than Solidity's native slicing.\\n function sliceCalldata(bytes calldata subject, uint256 start, uint256 end)\\n internal\\n pure\\n returns (bytes calldata result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n end := xor(end, mul(xor(end, subject.length), lt(subject.length, end)))\\n start := xor(start, mul(xor(start, subject.length), lt(subject.length, start)))\\n result.offset := add(subject.offset, start)\\n result.length := mul(lt(start, end), sub(end, start))\\n }\\n }\\n\\n /// @dev Returns a copy of `subject` sliced from `start` to the end of the bytes.\\n /// `start` is a byte offset. Faster than Solidity's native slicing.\\n function sliceCalldata(bytes calldata subject, uint256 start)\\n internal\\n pure\\n returns (bytes calldata result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n start := xor(start, mul(xor(start, subject.length), lt(subject.length, start)))\\n result.offset := add(subject.offset, start)\\n result.length := mul(lt(start, subject.length), sub(subject.length, start))\\n }\\n }\\n\\n /// @dev Reduces the size of `subject` to `n`.\\n /// If `n` is greater than the size of `subject`, this will be a no-op.\\n function truncate(bytes memory subject, uint256 n)\\n internal\\n pure\\n returns (bytes memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := subject\\n mstore(mul(lt(n, mload(result)), result), n)\\n }\\n }\\n\\n /// @dev Returns a copy of `subject`, with the length reduced to `n`.\\n /// If `n` is greater than the size of `subject`, this will be a no-op.\\n function truncatedCalldata(bytes calldata subject, uint256 n)\\n internal\\n pure\\n returns (bytes calldata result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result.offset := subject.offset\\n result.length := xor(n, mul(xor(n, subject.length), lt(subject.length, n)))\\n }\\n }\\n\\n /// @dev Returns all the indices of `needle` in `subject`.\\n /// The indices are byte offsets.\\n function indicesOf(bytes memory subject, bytes memory needle)\\n internal\\n pure\\n returns (uint256[] memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let searchLen := mload(needle)\\n if iszero(gt(searchLen, mload(subject))) {\\n result := mload(0x40)\\n let i := add(subject, 0x20)\\n let o := add(result, 0x20)\\n let subjectSearchEnd := add(sub(add(i, mload(subject)), searchLen), 1)\\n let h := 0 // The hash of `needle`.\\n if iszero(lt(searchLen, 0x20)) { h := keccak256(add(needle, 0x20), searchLen) }\\n let s := mload(add(needle, 0x20))\\n for { let m := shl(3, sub(0x20, and(searchLen, 0x1f))) } 1 {} {\\n let t := mload(i)\\n // Whether the first `searchLen % 32` bytes of `subject` and `needle` matches.\\n if iszero(shr(m, xor(t, s))) {\\n if h {\\n if iszero(eq(keccak256(i, searchLen), h)) {\\n i := add(i, 1)\\n if iszero(lt(i, subjectSearchEnd)) { break }\\n continue\\n }\\n }\\n mstore(o, sub(i, add(subject, 0x20))) // Append to `result`.\\n o := add(o, 0x20)\\n i := add(i, searchLen) // Advance `i` by `searchLen`.\\n if searchLen {\\n if iszero(lt(i, subjectSearchEnd)) { break }\\n continue\\n }\\n }\\n i := add(i, 1)\\n if iszero(lt(i, subjectSearchEnd)) { break }\\n }\\n mstore(result, shr(5, sub(o, add(result, 0x20)))) // Store the length of `result`.\\n // Allocate memory for result.\\n // We allocate one more word, so this array can be recycled for {split}.\\n mstore(0x40, add(o, 0x20))\\n }\\n }\\n }\\n\\n /// @dev Returns an arrays of bytess based on the `delimiter` inside of the `subject` bytes.\\n function split(bytes memory subject, bytes memory delimiter)\\n internal\\n pure\\n returns (bytes[] memory result)\\n {\\n uint256[] memory indices = indicesOf(subject, delimiter);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let w := not(0x1f)\\n let indexPtr := add(indices, 0x20)\\n let indicesEnd := add(indexPtr, shl(5, add(mload(indices), 1)))\\n mstore(add(indicesEnd, w), mload(subject))\\n mstore(indices, add(mload(indices), 1))\\n for { let prevIndex := 0 } 1 {} {\\n let index := mload(indexPtr)\\n mstore(indexPtr, 0x60)\\n if iszero(eq(index, prevIndex)) {\\n let element := mload(0x40)\\n let l := sub(index, prevIndex)\\n mstore(element, l) // Store the length of the element.\\n // Copy the `subject` one word at a time, backwards.\\n for { let o := and(add(l, 0x1f), w) } 1 {} {\\n mstore(add(element, o), mload(add(add(subject, prevIndex), o)))\\n o := add(o, w) // `sub(o, 0x20)`.\\n if iszero(o) { break }\\n }\\n mstore(add(add(element, 0x20), l), 0) // Zeroize the slot after the bytes.\\n // Allocate memory for the length and the bytes, rounded up to a multiple of 32.\\n mstore(0x40, add(element, and(add(l, 0x3f), w)))\\n mstore(indexPtr, element) // Store the `element` into the array.\\n }\\n prevIndex := add(index, mload(delimiter))\\n indexPtr := add(indexPtr, 0x20)\\n if iszero(lt(indexPtr, indicesEnd)) { break }\\n }\\n result := indices\\n if iszero(mload(delimiter)) {\\n result := add(indices, 0x20)\\n mstore(result, sub(mload(indices), 2))\\n }\\n }\\n }\\n\\n /// @dev Returns a concatenated bytes of `a` and `b`.\\n /// Cheaper than `bytes.concat()` and does not de-align the free memory pointer.\\n function concat(bytes memory a, bytes memory b) internal pure returns (bytes memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n let w := not(0x1f)\\n let aLen := mload(a)\\n // Copy `a` one word at a time, backwards.\\n for { let o := and(add(aLen, 0x20), w) } 1 {} {\\n mstore(add(result, o), mload(add(a, o)))\\n o := add(o, w) // `sub(o, 0x20)`.\\n if iszero(o) { break }\\n }\\n let bLen := mload(b)\\n let output := add(result, aLen)\\n // Copy `b` one word at a time, backwards.\\n for { let o := and(add(bLen, 0x20), w) } 1 {} {\\n mstore(add(output, o), mload(add(b, o)))\\n o := add(o, w) // `sub(o, 0x20)`.\\n if iszero(o) { break }\\n }\\n let totalLen := add(aLen, bLen)\\n let last := add(add(result, 0x20), totalLen)\\n mstore(last, 0) // Zeroize the slot after the bytes.\\n mstore(result, totalLen) // Store the length.\\n mstore(0x40, add(last, 0x20)) // Allocate memory.\\n }\\n }\\n\\n /// @dev Returns whether `a` equals `b`.\\n function eq(bytes memory a, bytes memory b) internal pure returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := eq(keccak256(add(a, 0x20), mload(a)), keccak256(add(b, 0x20), mload(b)))\\n }\\n }\\n\\n /// @dev Returns whether `a` equals `b`, where `b` is a null-terminated small bytes.\\n function eqs(bytes memory a, bytes32 b) internal pure returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // These should be evaluated on compile time, as far as possible.\\n let m := not(shl(7, div(not(iszero(b)), 255))) // `0x7f7f ...`.\\n let x := not(or(m, or(b, add(m, and(b, m)))))\\n let r := shl(7, iszero(iszero(shr(128, x))))\\n r := or(r, shl(6, iszero(iszero(shr(64, shr(r, x))))))\\n r := or(r, shl(5, lt(0xffffffff, shr(r, x))))\\n r := or(r, shl(4, lt(0xffff, shr(r, x))))\\n r := or(r, shl(3, lt(0xff, shr(r, x))))\\n // forgefmt: disable-next-item\\n result := gt(eq(mload(a), add(iszero(x), xor(31, shr(3, r)))),\\n xor(shr(add(8, r), b), shr(add(8, r), mload(add(a, 0x20)))))\\n }\\n }\\n\\n /// @dev Returns 0 if `a == b`, -1 if `a < b`, +1 if `a > b`.\\n /// If `a` == b[:a.length]`, and `a.length < b.length`, returns -1.\\n function cmp(bytes memory a, bytes memory b) internal pure returns (int256 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let aLen := mload(a)\\n let bLen := mload(b)\\n let n := and(xor(aLen, mul(xor(aLen, bLen), lt(bLen, aLen))), not(0x1f))\\n if n {\\n for { let i := 0x20 } 1 {} {\\n let x := mload(add(a, i))\\n let y := mload(add(b, i))\\n if iszero(or(xor(x, y), eq(i, n))) {\\n i := add(i, 0x20)\\n continue\\n }\\n result := sub(gt(x, y), lt(x, y))\\n break\\n }\\n }\\n // forgefmt: disable-next-item\\n if iszero(result) {\\n let l := 0x201f1e1d1c1b1a191817161514131211100f0e0d0c0b0a090807060504030201\\n let x := and(mload(add(add(a, 0x20), n)), shl(shl(3, byte(sub(aLen, n), l)), not(0)))\\n let y := and(mload(add(add(b, 0x20), n)), shl(shl(3, byte(sub(bLen, n), l)), not(0)))\\n result := sub(gt(x, y), lt(x, y))\\n if iszero(result) { result := sub(gt(aLen, bLen), lt(aLen, bLen)) }\\n }\\n }\\n }\\n\\n /// @dev Directly returns `a` without copying.\\n function directReturn(bytes memory a) internal pure {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Assumes that the bytes does not start from the scratch space.\\n let retStart := sub(a, 0x20)\\n let retUnpaddedSize := add(mload(a), 0x40)\\n // Right pad with zeroes. Just in case the bytes is produced\\n // by a method that doesn't zero right pad.\\n mstore(add(retStart, retUnpaddedSize), 0)\\n mstore(retStart, 0x20) // Store the return offset.\\n // End the transaction, returning the bytes.\\n return(retStart, and(not(0x1f), add(0x1f, retUnpaddedSize)))\\n }\\n }\\n\\n /// @dev Directly returns `a` with minimal copying.\\n function directReturn(bytes[] memory a) internal pure {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := mload(a) // `a.length`.\\n let o := add(a, 0x20) // Start of elements in `a`.\\n let u := a // Highest memory slot.\\n let w := not(0x1f)\\n for { let i := 0 } iszero(eq(i, n)) { i := add(i, 1) } {\\n let c := add(o, shl(5, i)) // Location of pointer to `a[i]`.\\n let s := mload(c) // `a[i]`.\\n let l := mload(s) // `a[i].length`.\\n let r := and(l, 0x1f) // `a[i].length % 32`.\\n let z := add(0x20, and(l, w)) // Offset of last word in `a[i]` from `s`.\\n // If `s` comes before `o`, or `s` is not zero right padded.\\n if iszero(lt(lt(s, o), or(iszero(r), iszero(shl(shl(3, r), mload(add(s, z))))))) {\\n let m := mload(0x40)\\n mstore(m, l) // Copy `a[i].length`.\\n for {} 1 {} {\\n mstore(add(m, z), mload(add(s, z))) // Copy `a[i]`, backwards.\\n z := add(z, w) // `sub(z, 0x20)`.\\n if iszero(z) { break }\\n }\\n let e := add(add(m, 0x20), l)\\n mstore(e, 0) // Zeroize the slot after the copied bytes.\\n mstore(0x40, add(e, 0x20)) // Allocate memory.\\n s := m\\n }\\n mstore(c, sub(s, o)) // Convert to calldata offset.\\n let t := add(l, add(s, 0x20))\\n if iszero(lt(t, u)) { u := t }\\n }\\n let retStart := add(a, w) // Assumes `a` doesn't start from scratch space.\\n mstore(retStart, 0x20) // Store the return offset.\\n return(retStart, add(0x40, sub(u, retStart))) // End the transaction.\\n }\\n }\\n\\n /// @dev Returns the word at `offset`, without any bounds checks.\\n function load(bytes memory a, uint256 offset) internal pure returns (bytes32 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(add(add(a, 0x20), offset))\\n }\\n }\\n\\n /// @dev Returns the word at `offset`, without any bounds checks.\\n function loadCalldata(bytes calldata a, uint256 offset)\\n internal\\n pure\\n returns (bytes32 result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := calldataload(add(a.offset, offset))\\n }\\n }\\n\\n /// @dev Returns a slice representing a static struct in the calldata. Performs bounds checks.\\n function staticStructInCalldata(bytes calldata a, uint256 offset)\\n internal\\n pure\\n returns (bytes calldata result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let l := sub(a.length, 0x20)\\n result.offset := add(a.offset, offset)\\n result.length := sub(a.length, offset)\\n if or(shr(64, or(l, a.offset)), gt(offset, l)) { revert(l, 0x00) }\\n }\\n }\\n\\n /// @dev Returns a slice representing a dynamic struct in the calldata. Performs bounds checks.\\n function dynamicStructInCalldata(bytes calldata a, uint256 offset)\\n internal\\n pure\\n returns (bytes calldata result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let l := sub(a.length, 0x20)\\n let s := calldataload(add(a.offset, offset)) // Relative offset of `result` from `a.offset`.\\n result.offset := add(a.offset, s)\\n result.length := sub(a.length, s)\\n if or(shr(64, or(s, or(l, a.offset))), gt(offset, l)) { revert(l, 0x00) }\\n }\\n }\\n\\n /// @dev Returns bytes in calldata. Performs bounds checks.\\n function bytesInCalldata(bytes calldata a, uint256 offset)\\n internal\\n pure\\n returns (bytes calldata result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let l := sub(a.length, 0x20)\\n let s := calldataload(add(a.offset, offset)) // Relative offset of `result` from `a.offset`.\\n result.offset := add(add(a.offset, s), 0x20)\\n result.length := calldataload(add(a.offset, s))\\n // forgefmt: disable-next-item\\n if or(shr(64, or(result.length, or(s, or(l, a.offset)))),\\n or(gt(add(s, result.length), l), gt(offset, l))) { revert(l, 0x00) }\\n }\\n }\\n\\n /// @dev Returns empty calldata bytes. For silencing the compiler.\\n function emptyCalldata() internal pure returns (bytes calldata result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result.length := 0\\n }\\n }\\n}\\n\",\"keccak256\":\"0x320c3c933df51e8fd6f1fc96de721c8cc6f1be1d4c586c11f1c472a23b86eba5\",\"license\":\"MIT\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": {}, + "notice": "Library for byte related operations.", + "version": 1 + } + } + }, + "lib/solady/src/utils/LibString.sol": { + "LibString": { + "abi": [ + { + "inputs": [], + "name": "HexLengthInsufficient", + "type": "error" + }, + { + "inputs": [], + "name": "StringNot7BitASCII", + "type": "error" + }, + { + "inputs": [], + "name": "TooBigForSmallString", + "type": "error" + } + ], + "devdoc": { + "author": "Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibString.sol)Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/LibString.sol)", + "details": "Note: For performance and bytecode compactness, most of the string operations are restricted to byte strings (7-bit ASCII), except where otherwise specified. Usage of byte string operations on charsets with runes spanning two or more bytes can lead to undefined behavior.", + "errors": { + "HexLengthInsufficient()": [ + { + "details": "The length of the output is too small to contain all the hex digits." + } + ], + "StringNot7BitASCII()": [ + { + "details": "The input string must be a 7-bit ASCII." + } + ], + "TooBigForSmallString()": [ + { + "details": "The length of the string is more than 32 bytes." + } + ] + }, + "kind": "dev", + "methods": {}, + "stateVariables": { + "ALPHANUMERIC_7_BIT_ASCII": { + "details": "Lookup for '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'." + }, + "DIGITS_7_BIT_ASCII": { + "details": "Lookup for '0123456789'." + }, + "HEXDIGITS_7_BIT_ASCII": { + "details": "Lookup for '0123456789abcdefABCDEF'." + }, + "LETTERS_7_BIT_ASCII": { + "details": "Lookup for 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'." + }, + "LOWERCASE_7_BIT_ASCII": { + "details": "Lookup for 'abcdefghijklmnopqrstuvwxyz'." + }, + "NOT_FOUND": { + "details": "The constant returned when the `search` is not found in the string." + }, + "OCTDIGITS_7_BIT_ASCII": { + "details": "Lookup for '01234567'." + }, + "PRINTABLE_7_BIT_ASCII": { + "details": "Lookup for '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!\"#$%&\\'()*+,-./:;<=>?@[\\\\]^_`{|}~ \\t\\n\\r\\x0b\\x0c'." + }, + "PUNCTUATION_7_BIT_ASCII": { + "details": "Lookup for '!\"#$%&\\'()*+,-./:;<=>?@[\\\\]^_`{|}~'." + }, + "UPPERCASE_7_BIT_ASCII": { + "details": "Lookup for 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'." + }, + "WHITESPACE_7_BIT_ASCII": { + "details": "Lookup for ' \\t\\n\\r\\x0b\\x0c'." + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": { + "allocate_unbounded": { + "entryPoint": 33, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb": { + "entryPoint": 39, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + } + }, + "generatedSources": [], + "linkReferences": {}, + "object": "608060405234601d57600e6021565b603f602d823930815050603f90f35b6027565b60405190565b600080fdfe6080604052600080fdfea264697066735822122044d64d04dd0a352de493c946f66d2bfa5efcbfe4a0d84a5ebd4caf0aafc397e164736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x1D JUMPI PUSH1 0xE PUSH1 0x21 JUMP JUMPDEST PUSH1 0x3F PUSH1 0x2D DUP3 CODECOPY ADDRESS DUP2 POP POP PUSH1 0x3F SWAP1 RETURN JUMPDEST PUSH1 0x27 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PREVRANDAO 0xD6 0x4D DIV 0xDD EXP CALLDATALOAD 0x2D 0xE4 SWAP4 0xC9 CHAINID 0xF6 PUSH14 0x2BFA5EFCBFE4A0D84A5EBD4CAF0A 0xAF 0xC3 SWAP8 0xE1 PUSH5 0x736F6C6343 STOP ADDMOD SHL STOP CALLER ", + "sourceMap": "690:43561:31:-:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + } + }, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "6080604052600080fdfea264697066735822122044d64d04dd0a352de493c946f66d2bfa5efcbfe4a0d84a5ebd4caf0aafc397e164736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PREVRANDAO 0xD6 0x4D DIV 0xDD EXP CALLDATALOAD 0x2D 0xE4 SWAP4 0xC9 CHAINID 0xF6 PUSH14 0x2BFA5EFCBFE4A0D84A5EBD4CAF0A 0xAF 0xC3 SWAP8 0xE1 PUSH5 0x736F6C6343 STOP ADDMOD SHL STOP CALLER ", + "sourceMap": "690:43561:31:-:0;;;;;" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"HexLengthInsufficient\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"StringNot7BitASCII\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooBigForSmallString\",\"type\":\"error\"}],\"devdoc\":{\"author\":\"Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibString.sol)Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/LibString.sol)\",\"details\":\"Note: For performance and bytecode compactness, most of the string operations are restricted to byte strings (7-bit ASCII), except where otherwise specified. Usage of byte string operations on charsets with runes spanning two or more bytes can lead to undefined behavior.\",\"errors\":{\"HexLengthInsufficient()\":[{\"details\":\"The length of the output is too small to contain all the hex digits.\"}],\"StringNot7BitASCII()\":[{\"details\":\"The input string must be a 7-bit ASCII.\"}],\"TooBigForSmallString()\":[{\"details\":\"The length of the string is more than 32 bytes.\"}]},\"kind\":\"dev\",\"methods\":{},\"stateVariables\":{\"ALPHANUMERIC_7_BIT_ASCII\":{\"details\":\"Lookup for '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'.\"},\"DIGITS_7_BIT_ASCII\":{\"details\":\"Lookup for '0123456789'.\"},\"HEXDIGITS_7_BIT_ASCII\":{\"details\":\"Lookup for '0123456789abcdefABCDEF'.\"},\"LETTERS_7_BIT_ASCII\":{\"details\":\"Lookup for 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'.\"},\"LOWERCASE_7_BIT_ASCII\":{\"details\":\"Lookup for 'abcdefghijklmnopqrstuvwxyz'.\"},\"NOT_FOUND\":{\"details\":\"The constant returned when the `search` is not found in the string.\"},\"OCTDIGITS_7_BIT_ASCII\":{\"details\":\"Lookup for '01234567'.\"},\"PRINTABLE_7_BIT_ASCII\":{\"details\":\"Lookup for '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!\\\"#$%&\\\\'()*+,-./:;<=>?@[\\\\\\\\]^_`{|}~ \\\\t\\\\n\\\\r\\\\x0b\\\\x0c'.\"},\"PUNCTUATION_7_BIT_ASCII\":{\"details\":\"Lookup for '!\\\"#$%&\\\\'()*+,-./:;<=>?@[\\\\\\\\]^_`{|}~'.\"},\"UPPERCASE_7_BIT_ASCII\":{\"details\":\"Lookup for 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.\"},\"WHITESPACE_7_BIT_ASCII\":{\"details\":\"Lookup for ' \\\\t\\\\n\\\\r\\\\x0b\\\\x0c'.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Library for converting numbers into strings and other string operations.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/solady/src/utils/LibString.sol\":\"LibString\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/solady/src/utils/LibBytes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\n/// @notice Library for byte related operations.\\n/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibBytes.sol)\\nlibrary LibBytes {\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* STRUCTS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Goated bytes storage struct that totally MOGs, no cap, fr.\\n /// Uses less gas and bytecode than Solidity's native bytes storage. It's meta af.\\n /// Packs length with the first 31 bytes if <255 bytes, so it\\u2019s mad tight.\\n struct BytesStorage {\\n bytes32 _spacer;\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* CONSTANTS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev The constant returned when the `search` is not found in the bytes.\\n uint256 internal constant NOT_FOUND = type(uint256).max;\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* BYTE STORAGE OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Sets the value of the bytes storage `$` to `s`.\\n function set(BytesStorage storage $, bytes memory s) internal {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := mload(s)\\n let packed := or(0xff, shl(8, n))\\n for { let i := 0 } 1 {} {\\n if iszero(gt(n, 0xfe)) {\\n i := 0x1f\\n packed := or(n, shl(8, mload(add(s, i))))\\n if iszero(gt(n, i)) { break }\\n }\\n let o := add(s, 0x20)\\n mstore(0x00, $.slot)\\n for { let p := keccak256(0x00, 0x20) } 1 {} {\\n sstore(add(p, shr(5, i)), mload(add(o, i)))\\n i := add(i, 0x20)\\n if iszero(lt(i, n)) { break }\\n }\\n break\\n }\\n sstore($.slot, packed)\\n }\\n }\\n\\n /// @dev Sets the value of the bytes storage `$` to `s`.\\n function setCalldata(BytesStorage storage $, bytes calldata s) internal {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let packed := or(0xff, shl(8, s.length))\\n for { let i := 0 } 1 {} {\\n if iszero(gt(s.length, 0xfe)) {\\n i := 0x1f\\n packed := or(s.length, shl(8, shr(8, calldataload(s.offset))))\\n if iszero(gt(s.length, i)) { break }\\n }\\n mstore(0x00, $.slot)\\n for { let p := keccak256(0x00, 0x20) } 1 {} {\\n sstore(add(p, shr(5, i)), calldataload(add(s.offset, i)))\\n i := add(i, 0x20)\\n if iszero(lt(i, s.length)) { break }\\n }\\n break\\n }\\n sstore($.slot, packed)\\n }\\n }\\n\\n /// @dev Sets the value of the bytes storage `$` to the empty bytes.\\n function clear(BytesStorage storage $) internal {\\n delete $._spacer;\\n }\\n\\n /// @dev Returns whether the value stored is `$` is the empty bytes \\\"\\\".\\n function isEmpty(BytesStorage storage $) internal view returns (bool) {\\n return uint256($._spacer) & 0xff == uint256(0);\\n }\\n\\n /// @dev Returns the length of the value stored in `$`.\\n function length(BytesStorage storage $) internal view returns (uint256 result) {\\n result = uint256($._spacer);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := and(0xff, result)\\n result := or(mul(shr(8, result), eq(0xff, n)), mul(n, iszero(eq(0xff, n))))\\n }\\n }\\n\\n /// @dev Returns the value stored in `$`.\\n function get(BytesStorage storage $) internal view returns (bytes memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n let o := add(result, 0x20)\\n let packed := sload($.slot)\\n let n := shr(8, packed)\\n for { let i := 0 } 1 {} {\\n if iszero(eq(or(packed, 0xff), packed)) {\\n mstore(o, packed)\\n n := and(0xff, packed)\\n i := 0x1f\\n if iszero(gt(n, i)) { break }\\n }\\n mstore(0x00, $.slot)\\n for { let p := keccak256(0x00, 0x20) } 1 {} {\\n mstore(add(o, i), sload(add(p, shr(5, i))))\\n i := add(i, 0x20)\\n if iszero(lt(i, n)) { break }\\n }\\n break\\n }\\n mstore(result, n) // Store the length of the memory.\\n mstore(add(o, n), 0) // Zeroize the slot after the bytes.\\n mstore(0x40, add(add(o, n), 0x20)) // Allocate memory.\\n }\\n }\\n\\n /// @dev Returns the uint8 at index `i`. If out-of-bounds, returns 0.\\n function uint8At(BytesStorage storage $, uint256 i) internal view returns (uint8 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n for { let packed := sload($.slot) } 1 {} {\\n if iszero(eq(or(packed, 0xff), packed)) {\\n if iszero(gt(i, 0x1e)) {\\n result := byte(i, packed)\\n break\\n }\\n if iszero(gt(i, and(0xff, packed))) {\\n mstore(0x00, $.slot)\\n let j := sub(i, 0x1f)\\n result := byte(and(j, 0x1f), sload(add(keccak256(0x00, 0x20), shr(5, j))))\\n }\\n break\\n }\\n if iszero(gt(i, shr(8, packed))) {\\n mstore(0x00, $.slot)\\n result := byte(and(i, 0x1f), sload(add(keccak256(0x00, 0x20), shr(5, i))))\\n }\\n break\\n }\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* BYTES OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns `subject` all occurrences of `needle` replaced with `replacement`.\\n function replace(bytes memory subject, bytes memory needle, bytes memory replacement)\\n internal\\n pure\\n returns (bytes memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n let needleLen := mload(needle)\\n let replacementLen := mload(replacement)\\n let d := sub(result, subject) // Memory difference.\\n let i := add(subject, 0x20) // Subject bytes pointer.\\n mstore(0x00, add(i, mload(subject))) // End of subject.\\n if iszero(gt(needleLen, mload(subject))) {\\n let subjectSearchEnd := add(sub(mload(0x00), needleLen), 1)\\n let h := 0 // The hash of `needle`.\\n if iszero(lt(needleLen, 0x20)) { h := keccak256(add(needle, 0x20), needleLen) }\\n let s := mload(add(needle, 0x20))\\n for { let m := shl(3, sub(0x20, and(needleLen, 0x1f))) } 1 {} {\\n let t := mload(i)\\n // Whether the first `needleLen % 32` bytes of `subject` and `needle` matches.\\n if iszero(shr(m, xor(t, s))) {\\n if h {\\n if iszero(eq(keccak256(i, needleLen), h)) {\\n mstore(add(i, d), t)\\n i := add(i, 1)\\n if iszero(lt(i, subjectSearchEnd)) { break }\\n continue\\n }\\n }\\n // Copy the `replacement` one word at a time.\\n for { let j := 0 } 1 {} {\\n mstore(add(add(i, d), j), mload(add(add(replacement, 0x20), j)))\\n j := add(j, 0x20)\\n if iszero(lt(j, replacementLen)) { break }\\n }\\n d := sub(add(d, replacementLen), needleLen)\\n if needleLen {\\n i := add(i, needleLen)\\n if iszero(lt(i, subjectSearchEnd)) { break }\\n continue\\n }\\n }\\n mstore(add(i, d), t)\\n i := add(i, 1)\\n if iszero(lt(i, subjectSearchEnd)) { break }\\n }\\n }\\n let end := mload(0x00)\\n let n := add(sub(d, add(result, 0x20)), end)\\n // Copy the rest of the bytes one word at a time.\\n for {} lt(i, end) { i := add(i, 0x20) } { mstore(add(i, d), mload(i)) }\\n let o := add(i, d)\\n mstore(o, 0) // Zeroize the slot after the bytes.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from left to right, starting from `from`.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function indexOf(bytes memory subject, bytes memory needle, uint256 from)\\n internal\\n pure\\n returns (uint256 result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := not(0) // Initialize to `NOT_FOUND`.\\n for { let subjectLen := mload(subject) } 1 {} {\\n if iszero(mload(needle)) {\\n result := from\\n if iszero(gt(from, subjectLen)) { break }\\n result := subjectLen\\n break\\n }\\n let needleLen := mload(needle)\\n let subjectStart := add(subject, 0x20)\\n\\n subject := add(subjectStart, from)\\n let end := add(sub(add(subjectStart, subjectLen), needleLen), 1)\\n let m := shl(3, sub(0x20, and(needleLen, 0x1f)))\\n let s := mload(add(needle, 0x20))\\n\\n if iszero(and(lt(subject, end), lt(from, subjectLen))) { break }\\n\\n if iszero(lt(needleLen, 0x20)) {\\n for { let h := keccak256(add(needle, 0x20), needleLen) } 1 {} {\\n if iszero(shr(m, xor(mload(subject), s))) {\\n if eq(keccak256(subject, needleLen), h) {\\n result := sub(subject, subjectStart)\\n break\\n }\\n }\\n subject := add(subject, 1)\\n if iszero(lt(subject, end)) { break }\\n }\\n break\\n }\\n for {} 1 {} {\\n if iszero(shr(m, xor(mload(subject), s))) {\\n result := sub(subject, subjectStart)\\n break\\n }\\n subject := add(subject, 1)\\n if iszero(lt(subject, end)) { break }\\n }\\n break\\n }\\n }\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from left to right.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function indexOf(bytes memory subject, bytes memory needle) internal pure returns (uint256) {\\n return indexOf(subject, needle, 0);\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from right to left, starting from `from`.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function lastIndexOf(bytes memory subject, bytes memory needle, uint256 from)\\n internal\\n pure\\n returns (uint256 result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n for {} 1 {} {\\n result := not(0) // Initialize to `NOT_FOUND`.\\n let needleLen := mload(needle)\\n if gt(needleLen, mload(subject)) { break }\\n let w := result\\n\\n let fromMax := sub(mload(subject), needleLen)\\n if iszero(gt(fromMax, from)) { from := fromMax }\\n\\n let end := add(add(subject, 0x20), w)\\n subject := add(add(subject, 0x20), from)\\n if iszero(gt(subject, end)) { break }\\n // As this function is not too often used,\\n // we shall simply use keccak256 for smaller bytecode size.\\n for { let h := keccak256(add(needle, 0x20), needleLen) } 1 {} {\\n if eq(keccak256(subject, needleLen), h) {\\n result := sub(subject, add(end, 1))\\n break\\n }\\n subject := add(subject, w) // `sub(subject, 1)`.\\n if iszero(gt(subject, end)) { break }\\n }\\n break\\n }\\n }\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from right to left.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function lastIndexOf(bytes memory subject, bytes memory needle)\\n internal\\n pure\\n returns (uint256)\\n {\\n return lastIndexOf(subject, needle, type(uint256).max);\\n }\\n\\n /// @dev Returns true if `needle` is found in `subject`, false otherwise.\\n function contains(bytes memory subject, bytes memory needle) internal pure returns (bool) {\\n return indexOf(subject, needle) != NOT_FOUND;\\n }\\n\\n /// @dev Returns whether `subject` starts with `needle`.\\n function startsWith(bytes memory subject, bytes memory needle)\\n internal\\n pure\\n returns (bool result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := mload(needle)\\n // Just using keccak256 directly is actually cheaper.\\n let t := eq(keccak256(add(subject, 0x20), n), keccak256(add(needle, 0x20), n))\\n result := lt(gt(n, mload(subject)), t)\\n }\\n }\\n\\n /// @dev Returns whether `subject` ends with `needle`.\\n function endsWith(bytes memory subject, bytes memory needle)\\n internal\\n pure\\n returns (bool result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := mload(needle)\\n let notInRange := gt(n, mload(subject))\\n // `subject + 0x20 + max(subject.length - needle.length, 0)`.\\n let t := add(add(subject, 0x20), mul(iszero(notInRange), sub(mload(subject), n)))\\n // Just using keccak256 directly is actually cheaper.\\n result := gt(eq(keccak256(t, n), keccak256(add(needle, 0x20), n)), notInRange)\\n }\\n }\\n\\n /// @dev Returns `subject` repeated `times`.\\n function repeat(bytes memory subject, uint256 times)\\n internal\\n pure\\n returns (bytes memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let l := mload(subject) // Subject length.\\n if iszero(or(iszero(times), iszero(l))) {\\n result := mload(0x40)\\n subject := add(subject, 0x20)\\n let o := add(result, 0x20)\\n for {} 1 {} {\\n // Copy the `subject` one word at a time.\\n for { let j := 0 } 1 {} {\\n mstore(add(o, j), mload(add(subject, j)))\\n j := add(j, 0x20)\\n if iszero(lt(j, l)) { break }\\n }\\n o := add(o, l)\\n times := sub(times, 1)\\n if iszero(times) { break }\\n }\\n mstore(o, 0) // Zeroize the slot after the bytes.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n mstore(result, sub(o, add(result, 0x20))) // Store the length.\\n }\\n }\\n }\\n\\n /// @dev Returns a copy of `subject` sliced from `start` to `end` (exclusive).\\n /// `start` and `end` are byte offsets.\\n function slice(bytes memory subject, uint256 start, uint256 end)\\n internal\\n pure\\n returns (bytes memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let l := mload(subject) // Subject length.\\n if iszero(gt(l, end)) { end := l }\\n if iszero(gt(l, start)) { start := l }\\n if lt(start, end) {\\n result := mload(0x40)\\n let n := sub(end, start)\\n let i := add(subject, start)\\n let w := not(0x1f)\\n // Copy the `subject` one word at a time, backwards.\\n for { let j := and(add(n, 0x1f), w) } 1 {} {\\n mstore(add(result, j), mload(add(i, j)))\\n j := add(j, w) // `sub(j, 0x20)`.\\n if iszero(j) { break }\\n }\\n let o := add(add(result, 0x20), n)\\n mstore(o, 0) // Zeroize the slot after the bytes.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n mstore(result, n) // Store the length.\\n }\\n }\\n }\\n\\n /// @dev Returns a copy of `subject` sliced from `start` to the end of the bytes.\\n /// `start` is a byte offset.\\n function slice(bytes memory subject, uint256 start)\\n internal\\n pure\\n returns (bytes memory result)\\n {\\n result = slice(subject, start, type(uint256).max);\\n }\\n\\n /// @dev Returns a copy of `subject` sliced from `start` to `end` (exclusive).\\n /// `start` and `end` are byte offsets. Faster than Solidity's native slicing.\\n function sliceCalldata(bytes calldata subject, uint256 start, uint256 end)\\n internal\\n pure\\n returns (bytes calldata result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n end := xor(end, mul(xor(end, subject.length), lt(subject.length, end)))\\n start := xor(start, mul(xor(start, subject.length), lt(subject.length, start)))\\n result.offset := add(subject.offset, start)\\n result.length := mul(lt(start, end), sub(end, start))\\n }\\n }\\n\\n /// @dev Returns a copy of `subject` sliced from `start` to the end of the bytes.\\n /// `start` is a byte offset. Faster than Solidity's native slicing.\\n function sliceCalldata(bytes calldata subject, uint256 start)\\n internal\\n pure\\n returns (bytes calldata result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n start := xor(start, mul(xor(start, subject.length), lt(subject.length, start)))\\n result.offset := add(subject.offset, start)\\n result.length := mul(lt(start, subject.length), sub(subject.length, start))\\n }\\n }\\n\\n /// @dev Reduces the size of `subject` to `n`.\\n /// If `n` is greater than the size of `subject`, this will be a no-op.\\n function truncate(bytes memory subject, uint256 n)\\n internal\\n pure\\n returns (bytes memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := subject\\n mstore(mul(lt(n, mload(result)), result), n)\\n }\\n }\\n\\n /// @dev Returns a copy of `subject`, with the length reduced to `n`.\\n /// If `n` is greater than the size of `subject`, this will be a no-op.\\n function truncatedCalldata(bytes calldata subject, uint256 n)\\n internal\\n pure\\n returns (bytes calldata result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result.offset := subject.offset\\n result.length := xor(n, mul(xor(n, subject.length), lt(subject.length, n)))\\n }\\n }\\n\\n /// @dev Returns all the indices of `needle` in `subject`.\\n /// The indices are byte offsets.\\n function indicesOf(bytes memory subject, bytes memory needle)\\n internal\\n pure\\n returns (uint256[] memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let searchLen := mload(needle)\\n if iszero(gt(searchLen, mload(subject))) {\\n result := mload(0x40)\\n let i := add(subject, 0x20)\\n let o := add(result, 0x20)\\n let subjectSearchEnd := add(sub(add(i, mload(subject)), searchLen), 1)\\n let h := 0 // The hash of `needle`.\\n if iszero(lt(searchLen, 0x20)) { h := keccak256(add(needle, 0x20), searchLen) }\\n let s := mload(add(needle, 0x20))\\n for { let m := shl(3, sub(0x20, and(searchLen, 0x1f))) } 1 {} {\\n let t := mload(i)\\n // Whether the first `searchLen % 32` bytes of `subject` and `needle` matches.\\n if iszero(shr(m, xor(t, s))) {\\n if h {\\n if iszero(eq(keccak256(i, searchLen), h)) {\\n i := add(i, 1)\\n if iszero(lt(i, subjectSearchEnd)) { break }\\n continue\\n }\\n }\\n mstore(o, sub(i, add(subject, 0x20))) // Append to `result`.\\n o := add(o, 0x20)\\n i := add(i, searchLen) // Advance `i` by `searchLen`.\\n if searchLen {\\n if iszero(lt(i, subjectSearchEnd)) { break }\\n continue\\n }\\n }\\n i := add(i, 1)\\n if iszero(lt(i, subjectSearchEnd)) { break }\\n }\\n mstore(result, shr(5, sub(o, add(result, 0x20)))) // Store the length of `result`.\\n // Allocate memory for result.\\n // We allocate one more word, so this array can be recycled for {split}.\\n mstore(0x40, add(o, 0x20))\\n }\\n }\\n }\\n\\n /// @dev Returns an arrays of bytess based on the `delimiter` inside of the `subject` bytes.\\n function split(bytes memory subject, bytes memory delimiter)\\n internal\\n pure\\n returns (bytes[] memory result)\\n {\\n uint256[] memory indices = indicesOf(subject, delimiter);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let w := not(0x1f)\\n let indexPtr := add(indices, 0x20)\\n let indicesEnd := add(indexPtr, shl(5, add(mload(indices), 1)))\\n mstore(add(indicesEnd, w), mload(subject))\\n mstore(indices, add(mload(indices), 1))\\n for { let prevIndex := 0 } 1 {} {\\n let index := mload(indexPtr)\\n mstore(indexPtr, 0x60)\\n if iszero(eq(index, prevIndex)) {\\n let element := mload(0x40)\\n let l := sub(index, prevIndex)\\n mstore(element, l) // Store the length of the element.\\n // Copy the `subject` one word at a time, backwards.\\n for { let o := and(add(l, 0x1f), w) } 1 {} {\\n mstore(add(element, o), mload(add(add(subject, prevIndex), o)))\\n o := add(o, w) // `sub(o, 0x20)`.\\n if iszero(o) { break }\\n }\\n mstore(add(add(element, 0x20), l), 0) // Zeroize the slot after the bytes.\\n // Allocate memory for the length and the bytes, rounded up to a multiple of 32.\\n mstore(0x40, add(element, and(add(l, 0x3f), w)))\\n mstore(indexPtr, element) // Store the `element` into the array.\\n }\\n prevIndex := add(index, mload(delimiter))\\n indexPtr := add(indexPtr, 0x20)\\n if iszero(lt(indexPtr, indicesEnd)) { break }\\n }\\n result := indices\\n if iszero(mload(delimiter)) {\\n result := add(indices, 0x20)\\n mstore(result, sub(mload(indices), 2))\\n }\\n }\\n }\\n\\n /// @dev Returns a concatenated bytes of `a` and `b`.\\n /// Cheaper than `bytes.concat()` and does not de-align the free memory pointer.\\n function concat(bytes memory a, bytes memory b) internal pure returns (bytes memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n let w := not(0x1f)\\n let aLen := mload(a)\\n // Copy `a` one word at a time, backwards.\\n for { let o := and(add(aLen, 0x20), w) } 1 {} {\\n mstore(add(result, o), mload(add(a, o)))\\n o := add(o, w) // `sub(o, 0x20)`.\\n if iszero(o) { break }\\n }\\n let bLen := mload(b)\\n let output := add(result, aLen)\\n // Copy `b` one word at a time, backwards.\\n for { let o := and(add(bLen, 0x20), w) } 1 {} {\\n mstore(add(output, o), mload(add(b, o)))\\n o := add(o, w) // `sub(o, 0x20)`.\\n if iszero(o) { break }\\n }\\n let totalLen := add(aLen, bLen)\\n let last := add(add(result, 0x20), totalLen)\\n mstore(last, 0) // Zeroize the slot after the bytes.\\n mstore(result, totalLen) // Store the length.\\n mstore(0x40, add(last, 0x20)) // Allocate memory.\\n }\\n }\\n\\n /// @dev Returns whether `a` equals `b`.\\n function eq(bytes memory a, bytes memory b) internal pure returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := eq(keccak256(add(a, 0x20), mload(a)), keccak256(add(b, 0x20), mload(b)))\\n }\\n }\\n\\n /// @dev Returns whether `a` equals `b`, where `b` is a null-terminated small bytes.\\n function eqs(bytes memory a, bytes32 b) internal pure returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // These should be evaluated on compile time, as far as possible.\\n let m := not(shl(7, div(not(iszero(b)), 255))) // `0x7f7f ...`.\\n let x := not(or(m, or(b, add(m, and(b, m)))))\\n let r := shl(7, iszero(iszero(shr(128, x))))\\n r := or(r, shl(6, iszero(iszero(shr(64, shr(r, x))))))\\n r := or(r, shl(5, lt(0xffffffff, shr(r, x))))\\n r := or(r, shl(4, lt(0xffff, shr(r, x))))\\n r := or(r, shl(3, lt(0xff, shr(r, x))))\\n // forgefmt: disable-next-item\\n result := gt(eq(mload(a), add(iszero(x), xor(31, shr(3, r)))),\\n xor(shr(add(8, r), b), shr(add(8, r), mload(add(a, 0x20)))))\\n }\\n }\\n\\n /// @dev Returns 0 if `a == b`, -1 if `a < b`, +1 if `a > b`.\\n /// If `a` == b[:a.length]`, and `a.length < b.length`, returns -1.\\n function cmp(bytes memory a, bytes memory b) internal pure returns (int256 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let aLen := mload(a)\\n let bLen := mload(b)\\n let n := and(xor(aLen, mul(xor(aLen, bLen), lt(bLen, aLen))), not(0x1f))\\n if n {\\n for { let i := 0x20 } 1 {} {\\n let x := mload(add(a, i))\\n let y := mload(add(b, i))\\n if iszero(or(xor(x, y), eq(i, n))) {\\n i := add(i, 0x20)\\n continue\\n }\\n result := sub(gt(x, y), lt(x, y))\\n break\\n }\\n }\\n // forgefmt: disable-next-item\\n if iszero(result) {\\n let l := 0x201f1e1d1c1b1a191817161514131211100f0e0d0c0b0a090807060504030201\\n let x := and(mload(add(add(a, 0x20), n)), shl(shl(3, byte(sub(aLen, n), l)), not(0)))\\n let y := and(mload(add(add(b, 0x20), n)), shl(shl(3, byte(sub(bLen, n), l)), not(0)))\\n result := sub(gt(x, y), lt(x, y))\\n if iszero(result) { result := sub(gt(aLen, bLen), lt(aLen, bLen)) }\\n }\\n }\\n }\\n\\n /// @dev Directly returns `a` without copying.\\n function directReturn(bytes memory a) internal pure {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Assumes that the bytes does not start from the scratch space.\\n let retStart := sub(a, 0x20)\\n let retUnpaddedSize := add(mload(a), 0x40)\\n // Right pad with zeroes. Just in case the bytes is produced\\n // by a method that doesn't zero right pad.\\n mstore(add(retStart, retUnpaddedSize), 0)\\n mstore(retStart, 0x20) // Store the return offset.\\n // End the transaction, returning the bytes.\\n return(retStart, and(not(0x1f), add(0x1f, retUnpaddedSize)))\\n }\\n }\\n\\n /// @dev Directly returns `a` with minimal copying.\\n function directReturn(bytes[] memory a) internal pure {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := mload(a) // `a.length`.\\n let o := add(a, 0x20) // Start of elements in `a`.\\n let u := a // Highest memory slot.\\n let w := not(0x1f)\\n for { let i := 0 } iszero(eq(i, n)) { i := add(i, 1) } {\\n let c := add(o, shl(5, i)) // Location of pointer to `a[i]`.\\n let s := mload(c) // `a[i]`.\\n let l := mload(s) // `a[i].length`.\\n let r := and(l, 0x1f) // `a[i].length % 32`.\\n let z := add(0x20, and(l, w)) // Offset of last word in `a[i]` from `s`.\\n // If `s` comes before `o`, or `s` is not zero right padded.\\n if iszero(lt(lt(s, o), or(iszero(r), iszero(shl(shl(3, r), mload(add(s, z))))))) {\\n let m := mload(0x40)\\n mstore(m, l) // Copy `a[i].length`.\\n for {} 1 {} {\\n mstore(add(m, z), mload(add(s, z))) // Copy `a[i]`, backwards.\\n z := add(z, w) // `sub(z, 0x20)`.\\n if iszero(z) { break }\\n }\\n let e := add(add(m, 0x20), l)\\n mstore(e, 0) // Zeroize the slot after the copied bytes.\\n mstore(0x40, add(e, 0x20)) // Allocate memory.\\n s := m\\n }\\n mstore(c, sub(s, o)) // Convert to calldata offset.\\n let t := add(l, add(s, 0x20))\\n if iszero(lt(t, u)) { u := t }\\n }\\n let retStart := add(a, w) // Assumes `a` doesn't start from scratch space.\\n mstore(retStart, 0x20) // Store the return offset.\\n return(retStart, add(0x40, sub(u, retStart))) // End the transaction.\\n }\\n }\\n\\n /// @dev Returns the word at `offset`, without any bounds checks.\\n function load(bytes memory a, uint256 offset) internal pure returns (bytes32 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(add(add(a, 0x20), offset))\\n }\\n }\\n\\n /// @dev Returns the word at `offset`, without any bounds checks.\\n function loadCalldata(bytes calldata a, uint256 offset)\\n internal\\n pure\\n returns (bytes32 result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := calldataload(add(a.offset, offset))\\n }\\n }\\n\\n /// @dev Returns a slice representing a static struct in the calldata. Performs bounds checks.\\n function staticStructInCalldata(bytes calldata a, uint256 offset)\\n internal\\n pure\\n returns (bytes calldata result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let l := sub(a.length, 0x20)\\n result.offset := add(a.offset, offset)\\n result.length := sub(a.length, offset)\\n if or(shr(64, or(l, a.offset)), gt(offset, l)) { revert(l, 0x00) }\\n }\\n }\\n\\n /// @dev Returns a slice representing a dynamic struct in the calldata. Performs bounds checks.\\n function dynamicStructInCalldata(bytes calldata a, uint256 offset)\\n internal\\n pure\\n returns (bytes calldata result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let l := sub(a.length, 0x20)\\n let s := calldataload(add(a.offset, offset)) // Relative offset of `result` from `a.offset`.\\n result.offset := add(a.offset, s)\\n result.length := sub(a.length, s)\\n if or(shr(64, or(s, or(l, a.offset))), gt(offset, l)) { revert(l, 0x00) }\\n }\\n }\\n\\n /// @dev Returns bytes in calldata. Performs bounds checks.\\n function bytesInCalldata(bytes calldata a, uint256 offset)\\n internal\\n pure\\n returns (bytes calldata result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let l := sub(a.length, 0x20)\\n let s := calldataload(add(a.offset, offset)) // Relative offset of `result` from `a.offset`.\\n result.offset := add(add(a.offset, s), 0x20)\\n result.length := calldataload(add(a.offset, s))\\n // forgefmt: disable-next-item\\n if or(shr(64, or(result.length, or(s, or(l, a.offset)))),\\n or(gt(add(s, result.length), l), gt(offset, l))) { revert(l, 0x00) }\\n }\\n }\\n\\n /// @dev Returns empty calldata bytes. For silencing the compiler.\\n function emptyCalldata() internal pure returns (bytes calldata result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result.length := 0\\n }\\n }\\n}\\n\",\"keccak256\":\"0x320c3c933df51e8fd6f1fc96de721c8cc6f1be1d4c586c11f1c472a23b86eba5\",\"license\":\"MIT\"},\"lib/solady/src/utils/LibString.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport {LibBytes} from \\\"./LibBytes.sol\\\";\\n\\n/// @notice Library for converting numbers into strings and other string operations.\\n/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibString.sol)\\n/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/LibString.sol)\\n///\\n/// @dev Note:\\n/// For performance and bytecode compactness, most of the string operations are restricted to\\n/// byte strings (7-bit ASCII), except where otherwise specified.\\n/// Usage of byte string operations on charsets with runes spanning two or more bytes\\n/// can lead to undefined behavior.\\nlibrary LibString {\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* STRUCTS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Goated string storage struct that totally MOGs, no cap, fr.\\n /// Uses less gas and bytecode than Solidity's native string storage. It's meta af.\\n /// Packs length with the first 31 bytes if <255 bytes, so it\\u2019s mad tight.\\n struct StringStorage {\\n bytes32 _spacer;\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* CUSTOM ERRORS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev The length of the output is too small to contain all the hex digits.\\n error HexLengthInsufficient();\\n\\n /// @dev The length of the string is more than 32 bytes.\\n error TooBigForSmallString();\\n\\n /// @dev The input string must be a 7-bit ASCII.\\n error StringNot7BitASCII();\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* CONSTANTS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev The constant returned when the `search` is not found in the string.\\n uint256 internal constant NOT_FOUND = type(uint256).max;\\n\\n /// @dev Lookup for '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'.\\n uint128 internal constant ALPHANUMERIC_7_BIT_ASCII = 0x7fffffe07fffffe03ff000000000000;\\n\\n /// @dev Lookup for 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'.\\n uint128 internal constant LETTERS_7_BIT_ASCII = 0x7fffffe07fffffe0000000000000000;\\n\\n /// @dev Lookup for 'abcdefghijklmnopqrstuvwxyz'.\\n uint128 internal constant LOWERCASE_7_BIT_ASCII = 0x7fffffe000000000000000000000000;\\n\\n /// @dev Lookup for 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.\\n uint128 internal constant UPPERCASE_7_BIT_ASCII = 0x7fffffe0000000000000000;\\n\\n /// @dev Lookup for '0123456789'.\\n uint128 internal constant DIGITS_7_BIT_ASCII = 0x3ff000000000000;\\n\\n /// @dev Lookup for '0123456789abcdefABCDEF'.\\n uint128 internal constant HEXDIGITS_7_BIT_ASCII = 0x7e0000007e03ff000000000000;\\n\\n /// @dev Lookup for '01234567'.\\n uint128 internal constant OCTDIGITS_7_BIT_ASCII = 0xff000000000000;\\n\\n /// @dev Lookup for '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!\\\"#$%&\\\\'()*+,-./:;<=>?@[\\\\\\\\]^_`{|}~ \\\\t\\\\n\\\\r\\\\x0b\\\\x0c'.\\n uint128 internal constant PRINTABLE_7_BIT_ASCII = 0x7fffffffffffffffffffffff00003e00;\\n\\n /// @dev Lookup for '!\\\"#$%&\\\\'()*+,-./:;<=>?@[\\\\\\\\]^_`{|}~'.\\n uint128 internal constant PUNCTUATION_7_BIT_ASCII = 0x78000001f8000001fc00fffe00000000;\\n\\n /// @dev Lookup for ' \\\\t\\\\n\\\\r\\\\x0b\\\\x0c'.\\n uint128 internal constant WHITESPACE_7_BIT_ASCII = 0x100003e00;\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* STRING STORAGE OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Sets the value of the string storage `$` to `s`.\\n function set(StringStorage storage $, string memory s) internal {\\n LibBytes.set(bytesStorage($), bytes(s));\\n }\\n\\n /// @dev Sets the value of the string storage `$` to `s`.\\n function setCalldata(StringStorage storage $, string calldata s) internal {\\n LibBytes.setCalldata(bytesStorage($), bytes(s));\\n }\\n\\n /// @dev Sets the value of the string storage `$` to the empty string.\\n function clear(StringStorage storage $) internal {\\n delete $._spacer;\\n }\\n\\n /// @dev Returns whether the value stored is `$` is the empty string \\\"\\\".\\n function isEmpty(StringStorage storage $) internal view returns (bool) {\\n return uint256($._spacer) & 0xff == uint256(0);\\n }\\n\\n /// @dev Returns the length of the value stored in `$`.\\n function length(StringStorage storage $) internal view returns (uint256) {\\n return LibBytes.length(bytesStorage($));\\n }\\n\\n /// @dev Returns the value stored in `$`.\\n function get(StringStorage storage $) internal view returns (string memory) {\\n return string(LibBytes.get(bytesStorage($)));\\n }\\n\\n /// @dev Returns the uint8 at index `i`. If out-of-bounds, returns 0.\\n function uint8At(StringStorage storage $, uint256 i) internal view returns (uint8) {\\n return LibBytes.uint8At(bytesStorage($), i);\\n }\\n\\n /// @dev Helper to cast `$` to a `BytesStorage`.\\n function bytesStorage(StringStorage storage $)\\n internal\\n pure\\n returns (LibBytes.BytesStorage storage casted)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n casted.slot := $.slot\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* DECIMAL OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns the base 10 decimal representation of `value`.\\n function toString(uint256 value) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // The maximum value of a uint256 contains 78 digits (1 byte per digit), but\\n // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.\\n // We will need 1 word for the trailing zeros padding, 1 word for the length,\\n // and 3 words for a maximum of 78 digits.\\n result := add(mload(0x40), 0x80)\\n mstore(0x40, add(result, 0x20)) // Allocate memory.\\n mstore(result, 0) // Zeroize the slot after the string.\\n\\n let end := result // Cache the end of the memory to calculate the length later.\\n let w := not(0) // Tsk.\\n // We write the string from rightmost digit to leftmost digit.\\n // The following is essentially a do-while loop that also handles the zero case.\\n for { let temp := value } 1 {} {\\n result := add(result, w) // `sub(result, 1)`.\\n // Store the character to the pointer.\\n // The ASCII index of the '0' character is 48.\\n mstore8(result, add(48, mod(temp, 10)))\\n temp := div(temp, 10) // Keep dividing `temp` until zero.\\n if iszero(temp) { break }\\n }\\n let n := sub(end, result)\\n result := sub(result, 0x20) // Move the pointer 32 bytes back to make room for the length.\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the base 10 decimal representation of `value`.\\n function toString(int256 value) internal pure returns (string memory result) {\\n if (value >= 0) return toString(uint256(value));\\n unchecked {\\n result = toString(~uint256(value) + 1);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n // We still have some spare memory space on the left,\\n // as we have allocated 3 words (96 bytes) for up to 78 digits.\\n let n := mload(result) // Load the string length.\\n mstore(result, 0x2d) // Store the '-' character.\\n result := sub(result, 1) // Move back the string pointer by a byte.\\n mstore(result, add(n, 1)) // Update the string length.\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* HEXADECIMAL OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns the hexadecimal representation of `value`,\\n /// left-padded to an input length of `byteCount` bytes.\\n /// The output is prefixed with \\\"0x\\\" encoded using 2 hexadecimal digits per byte,\\n /// giving a total length of `byteCount * 2 + 2` bytes.\\n /// Reverts if `byteCount` is too small for the output to contain all the digits.\\n function toHexString(uint256 value, uint256 byteCount)\\n internal\\n pure\\n returns (string memory result)\\n {\\n result = toHexStringNoPrefix(value, byteCount);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := add(mload(result), 2) // Compute the length.\\n mstore(result, 0x3078) // Store the \\\"0x\\\" prefix.\\n result := sub(result, 2) // Move the pointer.\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`,\\n /// left-padded to an input length of `byteCount` bytes.\\n /// The output is not prefixed with \\\"0x\\\" and is encoded using 2 hexadecimal digits per byte,\\n /// giving a total length of `byteCount * 2` bytes.\\n /// Reverts if `byteCount` is too small for the output to contain all the digits.\\n function toHexStringNoPrefix(uint256 value, uint256 byteCount)\\n internal\\n pure\\n returns (string memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // We need 0x20 bytes for the trailing zeros padding, `byteCount * 2` bytes\\n // for the digits, 0x02 bytes for the prefix, and 0x20 bytes for the length.\\n // We add 0x20 to the total and round down to a multiple of 0x20.\\n // (0x20 + 0x20 + 0x02 + 0x20) = 0x62.\\n result := add(mload(0x40), and(add(shl(1, byteCount), 0x42), not(0x1f)))\\n mstore(0x40, add(result, 0x20)) // Allocate memory.\\n mstore(result, 0) // Zeroize the slot after the string.\\n\\n let end := result // Cache the end to calculate the length later.\\n // Store \\\"0123456789abcdef\\\" in scratch space.\\n mstore(0x0f, 0x30313233343536373839616263646566)\\n\\n let start := sub(result, add(byteCount, byteCount))\\n let w := not(1) // Tsk.\\n let temp := value\\n // We write the string from rightmost digit to leftmost digit.\\n // The following is essentially a do-while loop that also handles the zero case.\\n for {} 1 {} {\\n result := add(result, w) // `sub(result, 2)`.\\n mstore8(add(result, 1), mload(and(temp, 15)))\\n mstore8(result, mload(and(shr(4, temp), 15)))\\n temp := shr(8, temp)\\n if iszero(xor(result, start)) { break }\\n }\\n if temp {\\n mstore(0x00, 0x2194895a) // `HexLengthInsufficient()`.\\n revert(0x1c, 0x04)\\n }\\n let n := sub(end, result)\\n result := sub(result, 0x20)\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`.\\n /// The output is prefixed with \\\"0x\\\" and encoded using 2 hexadecimal digits per byte.\\n /// As address are 20 bytes long, the output will left-padded to have\\n /// a length of `20 * 2 + 2` bytes.\\n function toHexString(uint256 value) internal pure returns (string memory result) {\\n result = toHexStringNoPrefix(value);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := add(mload(result), 2) // Compute the length.\\n mstore(result, 0x3078) // Store the \\\"0x\\\" prefix.\\n result := sub(result, 2) // Move the pointer.\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`.\\n /// The output is prefixed with \\\"0x\\\".\\n /// The output excludes leading \\\"0\\\" from the `toHexString` output.\\n /// `0x00: \\\"0x0\\\", 0x01: \\\"0x1\\\", 0x12: \\\"0x12\\\", 0x123: \\\"0x123\\\"`.\\n function toMinimalHexString(uint256 value) internal pure returns (string memory result) {\\n result = toHexStringNoPrefix(value);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let o := eq(byte(0, mload(add(result, 0x20))), 0x30) // Whether leading zero is present.\\n let n := add(mload(result), 2) // Compute the length.\\n mstore(add(result, o), 0x3078) // Store the \\\"0x\\\" prefix, accounting for leading zero.\\n result := sub(add(result, o), 2) // Move the pointer, accounting for leading zero.\\n mstore(result, sub(n, o)) // Store the length, accounting for leading zero.\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`.\\n /// The output excludes leading \\\"0\\\" from the `toHexStringNoPrefix` output.\\n /// `0x00: \\\"0\\\", 0x01: \\\"1\\\", 0x12: \\\"12\\\", 0x123: \\\"123\\\"`.\\n function toMinimalHexStringNoPrefix(uint256 value)\\n internal\\n pure\\n returns (string memory result)\\n {\\n result = toHexStringNoPrefix(value);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let o := eq(byte(0, mload(add(result, 0x20))), 0x30) // Whether leading zero is present.\\n let n := mload(result) // Get the length.\\n result := add(result, o) // Move the pointer, accounting for leading zero.\\n mstore(result, sub(n, o)) // Store the length, accounting for leading zero.\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`.\\n /// The output is encoded using 2 hexadecimal digits per byte.\\n /// As address are 20 bytes long, the output will left-padded to have\\n /// a length of `20 * 2` bytes.\\n function toHexStringNoPrefix(uint256 value) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // We need 0x20 bytes for the trailing zeros padding, 0x20 bytes for the length,\\n // 0x02 bytes for the prefix, and 0x40 bytes for the digits.\\n // The next multiple of 0x20 above (0x20 + 0x20 + 0x02 + 0x40) is 0xa0.\\n result := add(mload(0x40), 0x80)\\n mstore(0x40, add(result, 0x20)) // Allocate memory.\\n mstore(result, 0) // Zeroize the slot after the string.\\n\\n let end := result // Cache the end to calculate the length later.\\n mstore(0x0f, 0x30313233343536373839616263646566) // Store the \\\"0123456789abcdef\\\" lookup.\\n\\n let w := not(1) // Tsk.\\n // We write the string from rightmost digit to leftmost digit.\\n // The following is essentially a do-while loop that also handles the zero case.\\n for { let temp := value } 1 {} {\\n result := add(result, w) // `sub(result, 2)`.\\n mstore8(add(result, 1), mload(and(temp, 15)))\\n mstore8(result, mload(and(shr(4, temp), 15)))\\n temp := shr(8, temp)\\n if iszero(temp) { break }\\n }\\n let n := sub(end, result)\\n result := sub(result, 0x20)\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`.\\n /// The output is prefixed with \\\"0x\\\", encoded using 2 hexadecimal digits per byte,\\n /// and the alphabets are capitalized conditionally according to\\n /// https://eips.ethereum.org/EIPS/eip-55\\n function toHexStringChecksummed(address value) internal pure returns (string memory result) {\\n result = toHexString(value);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let mask := shl(6, div(not(0), 255)) // `0b010000000100000000 ...`\\n let o := add(result, 0x22)\\n let hashed := and(keccak256(o, 40), mul(34, mask)) // `0b10001000 ... `\\n let t := shl(240, 136) // `0b10001000 << 240`\\n for { let i := 0 } 1 {} {\\n mstore(add(i, i), mul(t, byte(i, hashed)))\\n i := add(i, 1)\\n if eq(i, 20) { break }\\n }\\n mstore(o, xor(mload(o), shr(1, and(mload(0x00), and(mload(o), mask)))))\\n o := add(o, 0x20)\\n mstore(o, xor(mload(o), shr(1, and(mload(0x20), and(mload(o), mask)))))\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`.\\n /// The output is prefixed with \\\"0x\\\" and encoded using 2 hexadecimal digits per byte.\\n function toHexString(address value) internal pure returns (string memory result) {\\n result = toHexStringNoPrefix(value);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := add(mload(result), 2) // Compute the length.\\n mstore(result, 0x3078) // Store the \\\"0x\\\" prefix.\\n result := sub(result, 2) // Move the pointer.\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`.\\n /// The output is encoded using 2 hexadecimal digits per byte.\\n function toHexStringNoPrefix(address value) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n // Allocate memory.\\n // We need 0x20 bytes for the trailing zeros padding, 0x20 bytes for the length,\\n // 0x02 bytes for the prefix, and 0x28 bytes for the digits.\\n // The next multiple of 0x20 above (0x20 + 0x20 + 0x02 + 0x28) is 0x80.\\n mstore(0x40, add(result, 0x80))\\n mstore(0x0f, 0x30313233343536373839616263646566) // Store the \\\"0123456789abcdef\\\" lookup.\\n\\n result := add(result, 2)\\n mstore(result, 40) // Store the length.\\n let o := add(result, 0x20)\\n mstore(add(o, 40), 0) // Zeroize the slot after the string.\\n value := shl(96, value)\\n // We write the string from rightmost digit to leftmost digit.\\n // The following is essentially a do-while loop that also handles the zero case.\\n for { let i := 0 } 1 {} {\\n let p := add(o, add(i, i))\\n let temp := byte(i, value)\\n mstore8(add(p, 1), mload(and(temp, 15)))\\n mstore8(p, mload(shr(4, temp)))\\n i := add(i, 1)\\n if eq(i, 20) { break }\\n }\\n }\\n }\\n\\n /// @dev Returns the hex encoded string from the raw bytes.\\n /// The output is encoded using 2 hexadecimal digits per byte.\\n function toHexString(bytes memory raw) internal pure returns (string memory result) {\\n result = toHexStringNoPrefix(raw);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := add(mload(result), 2) // Compute the length.\\n mstore(result, 0x3078) // Store the \\\"0x\\\" prefix.\\n result := sub(result, 2) // Move the pointer.\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the hex encoded string from the raw bytes.\\n /// The output is encoded using 2 hexadecimal digits per byte.\\n function toHexStringNoPrefix(bytes memory raw) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := mload(raw)\\n result := add(mload(0x40), 2) // Skip 2 bytes for the optional prefix.\\n mstore(result, add(n, n)) // Store the length of the output.\\n\\n mstore(0x0f, 0x30313233343536373839616263646566) // Store the \\\"0123456789abcdef\\\" lookup.\\n let o := add(result, 0x20)\\n let end := add(raw, n)\\n for {} iszero(eq(raw, end)) {} {\\n raw := add(raw, 1)\\n mstore8(add(o, 1), mload(and(mload(raw), 15)))\\n mstore8(o, mload(and(shr(4, mload(raw)), 15)))\\n o := add(o, 2)\\n }\\n mstore(o, 0) // Zeroize the slot after the string.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* RUNE STRING OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns the number of UTF characters in the string.\\n function runeCount(string memory s) internal pure returns (uint256 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n if mload(s) {\\n mstore(0x00, div(not(0), 255))\\n mstore(0x20, 0x0202020202020202020202020202020202020202020202020303030304040506)\\n let o := add(s, 0x20)\\n let end := add(o, mload(s))\\n for { result := 1 } 1 { result := add(result, 1) } {\\n o := add(o, byte(0, mload(shr(250, mload(o)))))\\n if iszero(lt(o, end)) { break }\\n }\\n }\\n }\\n }\\n\\n /// @dev Returns if this string is a 7-bit ASCII string.\\n /// (i.e. all characters codes are in [0..127])\\n function is7BitASCII(string memory s) internal pure returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := 1\\n let mask := shl(7, div(not(0), 255))\\n let n := mload(s)\\n if n {\\n let o := add(s, 0x20)\\n let end := add(o, n)\\n let last := mload(end)\\n mstore(end, 0)\\n for {} 1 {} {\\n if and(mask, mload(o)) {\\n result := 0\\n break\\n }\\n o := add(o, 0x20)\\n if iszero(lt(o, end)) { break }\\n }\\n mstore(end, last)\\n }\\n }\\n }\\n\\n /// @dev Returns if this string is a 7-bit ASCII string,\\n /// AND all characters are in the `allowed` lookup.\\n /// Note: If `s` is empty, returns true regardless of `allowed`.\\n function is7BitASCII(string memory s, uint128 allowed) internal pure returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := 1\\n if mload(s) {\\n let allowed_ := shr(128, shl(128, allowed))\\n let o := add(s, 0x20)\\n for { let end := add(o, mload(s)) } 1 {} {\\n result := and(result, shr(byte(0, mload(o)), allowed_))\\n o := add(o, 1)\\n if iszero(and(result, lt(o, end))) { break }\\n }\\n }\\n }\\n }\\n\\n /// @dev Converts the bytes in the 7-bit ASCII string `s` to\\n /// an allowed lookup for use in `is7BitASCII(s, allowed)`.\\n /// To save runtime gas, you can cache the result in an immutable variable.\\n function to7BitASCIIAllowedLookup(string memory s) internal pure returns (uint128 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n if mload(s) {\\n let o := add(s, 0x20)\\n for { let end := add(o, mload(s)) } 1 {} {\\n result := or(result, shl(byte(0, mload(o)), 1))\\n o := add(o, 1)\\n if iszero(lt(o, end)) { break }\\n }\\n if shr(128, result) {\\n mstore(0x00, 0xc9807e0d) // `StringNot7BitASCII()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* BYTE STRING OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n // For performance and bytecode compactness, byte string operations are restricted\\n // to 7-bit ASCII strings. All offsets are byte offsets, not UTF character offsets.\\n // Usage of byte string operations on charsets with runes spanning two or more bytes\\n // can lead to undefined behavior.\\n\\n /// @dev Returns `subject` all occurrences of `needle` replaced with `replacement`.\\n function replace(string memory subject, string memory needle, string memory replacement)\\n internal\\n pure\\n returns (string memory)\\n {\\n return string(LibBytes.replace(bytes(subject), bytes(needle), bytes(replacement)));\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from left to right, starting from `from`.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function indexOf(string memory subject, string memory needle, uint256 from)\\n internal\\n pure\\n returns (uint256)\\n {\\n return LibBytes.indexOf(bytes(subject), bytes(needle), from);\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from left to right.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function indexOf(string memory subject, string memory needle) internal pure returns (uint256) {\\n return LibBytes.indexOf(bytes(subject), bytes(needle), 0);\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from right to left, starting from `from`.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function lastIndexOf(string memory subject, string memory needle, uint256 from)\\n internal\\n pure\\n returns (uint256)\\n {\\n return LibBytes.lastIndexOf(bytes(subject), bytes(needle), from);\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from right to left.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function lastIndexOf(string memory subject, string memory needle)\\n internal\\n pure\\n returns (uint256)\\n {\\n return LibBytes.lastIndexOf(bytes(subject), bytes(needle), type(uint256).max);\\n }\\n\\n /// @dev Returns true if `needle` is found in `subject`, false otherwise.\\n function contains(string memory subject, string memory needle) internal pure returns (bool) {\\n return LibBytes.contains(bytes(subject), bytes(needle));\\n }\\n\\n /// @dev Returns whether `subject` starts with `needle`.\\n function startsWith(string memory subject, string memory needle) internal pure returns (bool) {\\n return LibBytes.startsWith(bytes(subject), bytes(needle));\\n }\\n\\n /// @dev Returns whether `subject` ends with `needle`.\\n function endsWith(string memory subject, string memory needle) internal pure returns (bool) {\\n return LibBytes.endsWith(bytes(subject), bytes(needle));\\n }\\n\\n /// @dev Returns `subject` repeated `times`.\\n function repeat(string memory subject, uint256 times) internal pure returns (string memory) {\\n return string(LibBytes.repeat(bytes(subject), times));\\n }\\n\\n /// @dev Returns a copy of `subject` sliced from `start` to `end` (exclusive).\\n /// `start` and `end` are byte offsets.\\n function slice(string memory subject, uint256 start, uint256 end)\\n internal\\n pure\\n returns (string memory)\\n {\\n return string(LibBytes.slice(bytes(subject), start, end));\\n }\\n\\n /// @dev Returns a copy of `subject` sliced from `start` to the end of the string.\\n /// `start` is a byte offset.\\n function slice(string memory subject, uint256 start) internal pure returns (string memory) {\\n return string(LibBytes.slice(bytes(subject), start, type(uint256).max));\\n }\\n\\n /// @dev Returns all the indices of `needle` in `subject`.\\n /// The indices are byte offsets.\\n function indicesOf(string memory subject, string memory needle)\\n internal\\n pure\\n returns (uint256[] memory)\\n {\\n return LibBytes.indicesOf(bytes(subject), bytes(needle));\\n }\\n\\n /// @dev Returns an arrays of strings based on the `delimiter` inside of the `subject` string.\\n function split(string memory subject, string memory delimiter)\\n internal\\n pure\\n returns (string[] memory result)\\n {\\n bytes[] memory a = LibBytes.split(bytes(subject), bytes(delimiter));\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := a\\n }\\n }\\n\\n /// @dev Returns a concatenated string of `a` and `b`.\\n /// Cheaper than `string.concat()` and does not de-align the free memory pointer.\\n function concat(string memory a, string memory b) internal pure returns (string memory) {\\n return string(LibBytes.concat(bytes(a), bytes(b)));\\n }\\n\\n /// @dev Returns a copy of the string in either lowercase or UPPERCASE.\\n /// WARNING! This function is only compatible with 7-bit ASCII strings.\\n function toCase(string memory subject, bool toUpper)\\n internal\\n pure\\n returns (string memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := mload(subject)\\n if n {\\n result := mload(0x40)\\n let o := add(result, 0x20)\\n let d := sub(subject, result)\\n let flags := shl(add(70, shl(5, toUpper)), 0x3ffffff)\\n for { let end := add(o, n) } 1 {} {\\n let b := byte(0, mload(add(d, o)))\\n mstore8(o, xor(and(shr(b, flags), 0x20), b))\\n o := add(o, 1)\\n if eq(o, end) { break }\\n }\\n mstore(result, n) // Store the length.\\n mstore(o, 0) // Zeroize the slot after the string.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n }\\n }\\n }\\n\\n /// @dev Returns a string from a small bytes32 string.\\n /// `s` must be null-terminated, or behavior will be undefined.\\n function fromSmallString(bytes32 s) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n let n := 0\\n for {} byte(n, s) { n := add(n, 1) } {} // Scan for '\\\\0'.\\n mstore(result, n) // Store the length.\\n let o := add(result, 0x20)\\n mstore(o, s) // Store the bytes of the string.\\n mstore(add(o, n), 0) // Zeroize the slot after the string.\\n mstore(0x40, add(result, 0x40)) // Allocate memory.\\n }\\n }\\n\\n /// @dev Returns the small string, with all bytes after the first null byte zeroized.\\n function normalizeSmallString(bytes32 s) internal pure returns (bytes32 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n for {} byte(result, s) { result := add(result, 1) } {} // Scan for '\\\\0'.\\n mstore(0x00, s)\\n mstore(result, 0x00)\\n result := mload(0x00)\\n }\\n }\\n\\n /// @dev Returns the string as a normalized null-terminated small string.\\n function toSmallString(string memory s) internal pure returns (bytes32 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(s)\\n if iszero(lt(result, 33)) {\\n mstore(0x00, 0xec92f9a3) // `TooBigForSmallString()`.\\n revert(0x1c, 0x04)\\n }\\n result := shl(shl(3, sub(32, result)), mload(add(s, result)))\\n }\\n }\\n\\n /// @dev Returns a lowercased copy of the string.\\n /// WARNING! This function is only compatible with 7-bit ASCII strings.\\n function lower(string memory subject) internal pure returns (string memory result) {\\n result = toCase(subject, false);\\n }\\n\\n /// @dev Returns an UPPERCASED copy of the string.\\n /// WARNING! This function is only compatible with 7-bit ASCII strings.\\n function upper(string memory subject) internal pure returns (string memory result) {\\n result = toCase(subject, true);\\n }\\n\\n /// @dev Escapes the string to be used within HTML tags.\\n function escapeHTML(string memory s) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n let end := add(s, mload(s))\\n let o := add(result, 0x20)\\n // Store the bytes of the packed offsets and strides into the scratch space.\\n // `packed = (stride << 5) | offset`. Max offset is 20. Max stride is 6.\\n mstore(0x1f, 0x900094)\\n mstore(0x08, 0xc0000000a6ab)\\n // Store \\\""&'<>\\\" into the scratch space.\\n mstore(0x00, shl(64, 0x2671756f743b26616d703b262333393b266c743b2667743b))\\n for {} iszero(eq(s, end)) {} {\\n s := add(s, 1)\\n let c := and(mload(s), 0xff)\\n // Not in `[\\\"\\\\\\\"\\\",\\\"'\\\",\\\"&\\\",\\\"<\\\",\\\">\\\"]`.\\n if iszero(and(shl(c, 1), 0x500000c400000000)) {\\n mstore8(o, c)\\n o := add(o, 1)\\n continue\\n }\\n let t := shr(248, mload(c))\\n mstore(o, mload(and(t, 0x1f)))\\n o := add(o, shr(5, t))\\n }\\n mstore(o, 0) // Zeroize the slot after the string.\\n mstore(result, sub(o, add(result, 0x20))) // Store the length.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n }\\n }\\n\\n /// @dev Escapes the string to be used within double-quotes in a JSON.\\n /// If `addDoubleQuotes` is true, the result will be enclosed in double-quotes.\\n function escapeJSON(string memory s, bool addDoubleQuotes)\\n internal\\n pure\\n returns (string memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n let o := add(result, 0x20)\\n if addDoubleQuotes {\\n mstore8(o, 34)\\n o := add(1, o)\\n }\\n // Store \\\"\\\\\\\\u0000\\\" in scratch space.\\n // Store \\\"0123456789abcdef\\\" in scratch space.\\n // Also, store `{0x08:\\\"b\\\", 0x09:\\\"t\\\", 0x0a:\\\"n\\\", 0x0c:\\\"f\\\", 0x0d:\\\"r\\\"}`.\\n // into the scratch space.\\n mstore(0x15, 0x5c75303030303031323334353637383961626364656662746e006672)\\n // Bitmask for detecting `[\\\"\\\\\\\"\\\",\\\"\\\\\\\\\\\"]`.\\n let e := or(shl(0x22, 1), shl(0x5c, 1))\\n for { let end := add(s, mload(s)) } iszero(eq(s, end)) {} {\\n s := add(s, 1)\\n let c := and(mload(s), 0xff)\\n if iszero(lt(c, 0x20)) {\\n if iszero(and(shl(c, 1), e)) {\\n // Not in `[\\\"\\\\\\\"\\\",\\\"\\\\\\\\\\\"]`.\\n mstore8(o, c)\\n o := add(o, 1)\\n continue\\n }\\n mstore8(o, 0x5c) // \\\"\\\\\\\\\\\".\\n mstore8(add(o, 1), c)\\n o := add(o, 2)\\n continue\\n }\\n if iszero(and(shl(c, 1), 0x3700)) {\\n // Not in `[\\\"\\\\b\\\",\\\"\\\\t\\\",\\\"\\\\n\\\",\\\"\\\\f\\\",\\\"\\\\d\\\"]`.\\n mstore8(0x1d, mload(shr(4, c))) // Hex value.\\n mstore8(0x1e, mload(and(c, 15))) // Hex value.\\n mstore(o, mload(0x19)) // \\\"\\\\\\\\u00XX\\\".\\n o := add(o, 6)\\n continue\\n }\\n mstore8(o, 0x5c) // \\\"\\\\\\\\\\\".\\n mstore8(add(o, 1), mload(add(c, 8)))\\n o := add(o, 2)\\n }\\n if addDoubleQuotes {\\n mstore8(o, 34)\\n o := add(1, o)\\n }\\n mstore(o, 0) // Zeroize the slot after the string.\\n mstore(result, sub(o, add(result, 0x20))) // Store the length.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n }\\n }\\n\\n /// @dev Escapes the string to be used within double-quotes in a JSON.\\n function escapeJSON(string memory s) internal pure returns (string memory result) {\\n result = escapeJSON(s, false);\\n }\\n\\n /// @dev Encodes `s` so that it can be safely used in a URI,\\n /// just like `encodeURIComponent` in JavaScript.\\n /// See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent\\n /// See: https://datatracker.ietf.org/doc/html/rfc2396\\n /// See: https://datatracker.ietf.org/doc/html/rfc3986\\n function encodeURIComponent(string memory s) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n // Store \\\"0123456789ABCDEF\\\" in scratch space.\\n // Uppercased to be consistent with JavaScript's implementation.\\n mstore(0x0f, 0x30313233343536373839414243444546)\\n let o := add(result, 0x20)\\n for { let end := add(s, mload(s)) } iszero(eq(s, end)) {} {\\n s := add(s, 1)\\n let c := and(mload(s), 0xff)\\n // If not in `[0-9A-Z-a-z-_.!~*'()]`.\\n if iszero(and(1, shr(c, 0x47fffffe87fffffe03ff678200000000))) {\\n mstore8(o, 0x25) // '%'.\\n mstore8(add(o, 1), mload(and(shr(4, c), 15)))\\n mstore8(add(o, 2), mload(and(c, 15)))\\n o := add(o, 3)\\n continue\\n }\\n mstore8(o, c)\\n o := add(o, 1)\\n }\\n mstore(result, sub(o, add(result, 0x20))) // Store the length.\\n mstore(o, 0) // Zeroize the slot after the string.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n }\\n }\\n\\n /// @dev Returns whether `a` equals `b`.\\n function eq(string memory a, string memory b) internal pure returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := eq(keccak256(add(a, 0x20), mload(a)), keccak256(add(b, 0x20), mload(b)))\\n }\\n }\\n\\n /// @dev Returns whether `a` equals `b`, where `b` is a null-terminated small string.\\n function eqs(string memory a, bytes32 b) internal pure returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // These should be evaluated on compile time, as far as possible.\\n let m := not(shl(7, div(not(iszero(b)), 255))) // `0x7f7f ...`.\\n let x := not(or(m, or(b, add(m, and(b, m)))))\\n let r := shl(7, iszero(iszero(shr(128, x))))\\n r := or(r, shl(6, iszero(iszero(shr(64, shr(r, x))))))\\n r := or(r, shl(5, lt(0xffffffff, shr(r, x))))\\n r := or(r, shl(4, lt(0xffff, shr(r, x))))\\n r := or(r, shl(3, lt(0xff, shr(r, x))))\\n // forgefmt: disable-next-item\\n result := gt(eq(mload(a), add(iszero(x), xor(31, shr(3, r)))),\\n xor(shr(add(8, r), b), shr(add(8, r), mload(add(a, 0x20)))))\\n }\\n }\\n\\n /// @dev Returns 0 if `a == b`, -1 if `a < b`, +1 if `a > b`.\\n /// If `a` == b[:a.length]`, and `a.length < b.length`, returns -1.\\n function cmp(string memory a, string memory b) internal pure returns (int256) {\\n return LibBytes.cmp(bytes(a), bytes(b));\\n }\\n\\n /// @dev Packs a single string with its length into a single word.\\n /// Returns `bytes32(0)` if the length is zero or greater than 31.\\n function packOne(string memory a) internal pure returns (bytes32 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // We don't need to zero right pad the string,\\n // since this is our own custom non-standard packing scheme.\\n result :=\\n mul(\\n // Load the length and the bytes.\\n mload(add(a, 0x1f)),\\n // `length != 0 && length < 32`. Abuses underflow.\\n // Assumes that the length is valid and within the block gas limit.\\n lt(sub(mload(a), 1), 0x1f)\\n )\\n }\\n }\\n\\n /// @dev Unpacks a string packed using {packOne}.\\n /// Returns the empty string if `packed` is `bytes32(0)`.\\n /// If `packed` is not an output of {packOne}, the output behavior is undefined.\\n function unpackOne(bytes32 packed) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40) // Grab the free memory pointer.\\n mstore(0x40, add(result, 0x40)) // Allocate 2 words (1 for the length, 1 for the bytes).\\n mstore(result, 0) // Zeroize the length slot.\\n mstore(add(result, 0x1f), packed) // Store the length and bytes.\\n mstore(add(add(result, 0x20), mload(result)), 0) // Right pad with zeroes.\\n }\\n }\\n\\n /// @dev Packs two strings with their lengths into a single word.\\n /// Returns `bytes32(0)` if combined length is zero or greater than 30.\\n function packTwo(string memory a, string memory b) internal pure returns (bytes32 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let aLen := mload(a)\\n // We don't need to zero right pad the strings,\\n // since this is our own custom non-standard packing scheme.\\n result :=\\n mul(\\n or( // Load the length and the bytes of `a` and `b`.\\n shl(shl(3, sub(0x1f, aLen)), mload(add(a, aLen))), mload(sub(add(b, 0x1e), aLen))),\\n // `totalLen != 0 && totalLen < 31`. Abuses underflow.\\n // Assumes that the lengths are valid and within the block gas limit.\\n lt(sub(add(aLen, mload(b)), 1), 0x1e)\\n )\\n }\\n }\\n\\n /// @dev Unpacks strings packed using {packTwo}.\\n /// Returns the empty strings if `packed` is `bytes32(0)`.\\n /// If `packed` is not an output of {packTwo}, the output behavior is undefined.\\n function unpackTwo(bytes32 packed)\\n internal\\n pure\\n returns (string memory resultA, string memory resultB)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n resultA := mload(0x40) // Grab the free memory pointer.\\n resultB := add(resultA, 0x40)\\n // Allocate 2 words for each string (1 for the length, 1 for the byte). Total 4 words.\\n mstore(0x40, add(resultB, 0x40))\\n // Zeroize the length slots.\\n mstore(resultA, 0)\\n mstore(resultB, 0)\\n // Store the lengths and bytes.\\n mstore(add(resultA, 0x1f), packed)\\n mstore(add(resultB, 0x1f), mload(add(add(resultA, 0x20), mload(resultA))))\\n // Right pad with zeroes.\\n mstore(add(add(resultA, 0x20), mload(resultA)), 0)\\n mstore(add(add(resultB, 0x20), mload(resultB)), 0)\\n }\\n }\\n\\n /// @dev Directly returns `a` without copying.\\n function directReturn(string memory a) internal pure {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Assumes that the string does not start from the scratch space.\\n let retStart := sub(a, 0x20)\\n let retUnpaddedSize := add(mload(a), 0x40)\\n // Right pad with zeroes. Just in case the string is produced\\n // by a method that doesn't zero right pad.\\n mstore(add(retStart, retUnpaddedSize), 0)\\n mstore(retStart, 0x20) // Store the return offset.\\n // End the transaction, returning the string.\\n return(retStart, and(not(0x1f), add(0x1f, retUnpaddedSize)))\\n }\\n }\\n}\\n\",\"keccak256\":\"0x8a6b219f6ccda90c08e2debae62618d78d6f0cef086eb6c9503793d7f12815dd\",\"license\":\"MIT\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": {}, + "notice": "Library for converting numbers into strings and other string operations.", + "version": 1 + } + } + }, + "lib/solady/src/utils/MerkleProofLib.sol": { + "MerkleProofLib": { + "abi": [], + "devdoc": { + "author": "Solady (https://github.com/vectorized/solady/blob/main/src/utils/MerkleProofLib.sol)Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/MerkleProofLib.sol)Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/MerkleProof.sol)", + "kind": "dev", + "methods": {}, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": { + "allocate_unbounded": { + "entryPoint": 33, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb": { + "entryPoint": 39, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + } + }, + "generatedSources": [], + "linkReferences": {}, + "object": "608060405234601d57600e6021565b603f602d823930815050603f90f35b6027565b60405190565b600080fdfe6080604052600080fdfea2646970667358221220e1d4a0b683226884b1b4ab16e01bed4fc68e68e0d371efc8b4ba23b7d18fa03664736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x1D JUMPI PUSH1 0xE PUSH1 0x21 JUMP JUMPDEST PUSH1 0x3F PUSH1 0x2D DUP3 CODECOPY ADDRESS DUP2 POP POP PUSH1 0x3F SWAP1 RETURN JUMPDEST PUSH1 0x27 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xE1 0xD4 LOG0 0xB6 DUP4 0x22 PUSH9 0x84B1B4AB16E01BED4F 0xC6 DUP15 PUSH9 0xE0D371EFC8B4BA23B7 0xD1 DUP16 LOG0 CALLDATASIZE PUSH5 0x736F6C6343 STOP ADDMOD SHL STOP CALLER ", + "sourceMap": "515:14189:32:-:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + } + }, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "6080604052600080fdfea2646970667358221220e1d4a0b683226884b1b4ab16e01bed4fc68e68e0d371efc8b4ba23b7d18fa03664736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xE1 0xD4 LOG0 0xB6 DUP4 0x22 PUSH9 0x84B1B4AB16E01BED4F 0xC6 DUP15 PUSH9 0xE0D371EFC8B4BA23B7 0xD1 DUP16 LOG0 CALLDATASIZE PUSH5 0x736F6C6343 STOP ADDMOD SHL STOP CALLER ", + "sourceMap": "515:14189:32:-:0;;;;;" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"author\":\"Solady (https://github.com/vectorized/solady/blob/main/src/utils/MerkleProofLib.sol)Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/MerkleProofLib.sol)Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/MerkleProof.sol)\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Gas optimized verification of proof of inclusion for a leaf in a Merkle tree.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/solady/src/utils/MerkleProofLib.sol\":\"MerkleProofLib\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/solady/src/utils/MerkleProofLib.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\n/// @notice Gas optimized verification of proof of inclusion for a leaf in a Merkle tree.\\n/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/MerkleProofLib.sol)\\n/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/MerkleProofLib.sol)\\n/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/MerkleProof.sol)\\nlibrary MerkleProofLib {\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* MERKLE PROOF VERIFICATION OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns whether `leaf` exists in the Merkle tree with `root`, given `proof`.\\n function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf)\\n internal\\n pure\\n returns (bool isValid)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n if mload(proof) {\\n // Initialize `offset` to the offset of `proof` elements in memory.\\n let offset := add(proof, 0x20)\\n // Left shift by 5 is equivalent to multiplying by 0x20.\\n let end := add(offset, shl(5, mload(proof)))\\n // Iterate over proof elements to compute root hash.\\n for {} 1 {} {\\n // Slot of `leaf` in scratch space.\\n // If the condition is true: 0x20, otherwise: 0x00.\\n let scratch := shl(5, gt(leaf, mload(offset)))\\n // Store elements to hash contiguously in scratch space.\\n // Scratch space is 64 bytes (0x00 - 0x3f) and both elements are 32 bytes.\\n mstore(scratch, leaf)\\n mstore(xor(scratch, 0x20), mload(offset))\\n // Reuse `leaf` to store the hash to reduce stack operations.\\n leaf := keccak256(0x00, 0x40)\\n offset := add(offset, 0x20)\\n if iszero(lt(offset, end)) { break }\\n }\\n }\\n isValid := eq(leaf, root)\\n }\\n }\\n\\n /// @dev Returns whether `leaf` exists in the Merkle tree with `root`, given `proof`.\\n function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf)\\n internal\\n pure\\n returns (bool isValid)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n if proof.length {\\n // Left shift by 5 is equivalent to multiplying by 0x20.\\n let end := add(proof.offset, shl(5, proof.length))\\n // Initialize `offset` to the offset of `proof` in the calldata.\\n let offset := proof.offset\\n // Iterate over proof elements to compute root hash.\\n for {} 1 {} {\\n // Slot of `leaf` in scratch space.\\n // If the condition is true: 0x20, otherwise: 0x00.\\n let scratch := shl(5, gt(leaf, calldataload(offset)))\\n // Store elements to hash contiguously in scratch space.\\n // Scratch space is 64 bytes (0x00 - 0x3f) and both elements are 32 bytes.\\n mstore(scratch, leaf)\\n mstore(xor(scratch, 0x20), calldataload(offset))\\n // Reuse `leaf` to store the hash to reduce stack operations.\\n leaf := keccak256(0x00, 0x40)\\n offset := add(offset, 0x20)\\n if iszero(lt(offset, end)) { break }\\n }\\n }\\n isValid := eq(leaf, root)\\n }\\n }\\n\\n /// @dev Returns whether all `leaves` exist in the Merkle tree with `root`,\\n /// given `proof` and `flags`.\\n ///\\n /// Note:\\n /// - Breaking the invariant `flags.length == (leaves.length - 1) + proof.length`\\n /// will always return false.\\n /// - The sum of the lengths of `proof` and `leaves` must never overflow.\\n /// - Any non-zero word in the `flags` array is treated as true.\\n /// - The memory offset of `proof` must be non-zero\\n /// (i.e. `proof` is not pointing to the scratch space).\\n function verifyMultiProof(\\n bytes32[] memory proof,\\n bytes32 root,\\n bytes32[] memory leaves,\\n bool[] memory flags\\n ) internal pure returns (bool isValid) {\\n // Rebuilds the root by consuming and producing values on a queue.\\n // The queue starts with the `leaves` array, and goes into a `hashes` array.\\n // After the process, the last element on the queue is verified\\n // to be equal to the `root`.\\n //\\n // The `flags` array denotes whether the sibling\\n // should be popped from the queue (`flag == true`), or\\n // should be popped from the `proof` (`flag == false`).\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Cache the lengths of the arrays.\\n let leavesLength := mload(leaves)\\n let proofLength := mload(proof)\\n let flagsLength := mload(flags)\\n\\n // Advance the pointers of the arrays to point to the data.\\n leaves := add(0x20, leaves)\\n proof := add(0x20, proof)\\n flags := add(0x20, flags)\\n\\n // If the number of flags is correct.\\n for {} eq(add(leavesLength, proofLength), add(flagsLength, 1)) {} {\\n // For the case where `proof.length + leaves.length == 1`.\\n if iszero(flagsLength) {\\n // `isValid = (proof.length == 1 ? proof[0] : leaves[0]) == root`.\\n isValid := eq(mload(xor(leaves, mul(xor(proof, leaves), proofLength))), root)\\n break\\n }\\n\\n // The required final proof offset if `flagsLength` is not zero, otherwise zero.\\n let proofEnd := add(proof, shl(5, proofLength))\\n // We can use the free memory space for the queue.\\n // We don't need to allocate, since the queue is temporary.\\n let hashesFront := mload(0x40)\\n // Copy the leaves into the hashes.\\n // Sometimes, a little memory expansion costs less than branching.\\n // Should cost less, even with a high free memory offset of 0x7d00.\\n leavesLength := shl(5, leavesLength)\\n for { let i := 0 } iszero(eq(i, leavesLength)) { i := add(i, 0x20) } {\\n mstore(add(hashesFront, i), mload(add(leaves, i)))\\n }\\n // Compute the back of the hashes.\\n let hashesBack := add(hashesFront, leavesLength)\\n // This is the end of the memory for the queue.\\n // We recycle `flagsLength` to save on stack variables (sometimes save gas).\\n flagsLength := add(hashesBack, shl(5, flagsLength))\\n\\n for {} 1 {} {\\n // Pop from `hashes`.\\n let a := mload(hashesFront)\\n // Pop from `hashes`.\\n let b := mload(add(hashesFront, 0x20))\\n hashesFront := add(hashesFront, 0x40)\\n\\n // If the flag is false, load the next proof,\\n // else, pops from the queue.\\n if iszero(mload(flags)) {\\n // Loads the next proof.\\n b := mload(proof)\\n proof := add(proof, 0x20)\\n // Unpop from `hashes`.\\n hashesFront := sub(hashesFront, 0x20)\\n }\\n\\n // Advance to the next flag.\\n flags := add(flags, 0x20)\\n\\n // Slot of `a` in scratch space.\\n // If the condition is true: 0x20, otherwise: 0x00.\\n let scratch := shl(5, gt(a, b))\\n // Hash the scratch space and push the result onto the queue.\\n mstore(scratch, a)\\n mstore(xor(scratch, 0x20), b)\\n mstore(hashesBack, keccak256(0x00, 0x40))\\n hashesBack := add(hashesBack, 0x20)\\n if iszero(lt(hashesBack, flagsLength)) { break }\\n }\\n isValid :=\\n and(\\n // Checks if the last value in the queue is same as the root.\\n eq(mload(sub(hashesBack, 0x20)), root),\\n // And whether all the proofs are used, if required.\\n eq(proofEnd, proof)\\n )\\n break\\n }\\n }\\n }\\n\\n /// @dev Returns whether all `leaves` exist in the Merkle tree with `root`,\\n /// given `proof` and `flags`.\\n ///\\n /// Note:\\n /// - Breaking the invariant `flags.length == (leaves.length - 1) + proof.length`\\n /// will always return false.\\n /// - Any non-zero word in the `flags` array is treated as true.\\n /// - The calldata offset of `proof` must be non-zero\\n /// (i.e. `proof` is from a regular Solidity function with a 4-byte selector).\\n function verifyMultiProofCalldata(\\n bytes32[] calldata proof,\\n bytes32 root,\\n bytes32[] calldata leaves,\\n bool[] calldata flags\\n ) internal pure returns (bool isValid) {\\n // Rebuilds the root by consuming and producing values on a queue.\\n // The queue starts with the `leaves` array, and goes into a `hashes` array.\\n // After the process, the last element on the queue is verified\\n // to be equal to the `root`.\\n //\\n // The `flags` array denotes whether the sibling\\n // should be popped from the queue (`flag == true`), or\\n // should be popped from the `proof` (`flag == false`).\\n /// @solidity memory-safe-assembly\\n assembly {\\n // If the number of flags is correct.\\n for {} eq(add(leaves.length, proof.length), add(flags.length, 1)) {} {\\n // For the case where `proof.length + leaves.length == 1`.\\n if iszero(flags.length) {\\n // `isValid = (proof.length == 1 ? proof[0] : leaves[0]) == root`.\\n // forgefmt: disable-next-item\\n isValid := eq(\\n calldataload(\\n xor(leaves.offset, mul(xor(proof.offset, leaves.offset), proof.length))\\n ),\\n root\\n )\\n break\\n }\\n\\n // The required final proof offset if `flagsLength` is not zero, otherwise zero.\\n let proofEnd := add(proof.offset, shl(5, proof.length))\\n // We can use the free memory space for the queue.\\n // We don't need to allocate, since the queue is temporary.\\n let hashesFront := mload(0x40)\\n // Copy the leaves into the hashes.\\n // Sometimes, a little memory expansion costs less than branching.\\n // Should cost less, even with a high free memory offset of 0x7d00.\\n calldatacopy(hashesFront, leaves.offset, shl(5, leaves.length))\\n // Compute the back of the hashes.\\n let hashesBack := add(hashesFront, shl(5, leaves.length))\\n // This is the end of the memory for the queue.\\n // We recycle `flagsLength` to save on stack variables (sometimes save gas).\\n flags.length := add(hashesBack, shl(5, flags.length))\\n\\n // We don't need to make a copy of `proof.offset` or `flags.offset`,\\n // as they are pass-by-value (this trick may not always save gas).\\n\\n for {} 1 {} {\\n // Pop from `hashes`.\\n let a := mload(hashesFront)\\n // Pop from `hashes`.\\n let b := mload(add(hashesFront, 0x20))\\n hashesFront := add(hashesFront, 0x40)\\n\\n // If the flag is false, load the next proof,\\n // else, pops from the queue.\\n if iszero(calldataload(flags.offset)) {\\n // Loads the next proof.\\n b := calldataload(proof.offset)\\n proof.offset := add(proof.offset, 0x20)\\n // Unpop from `hashes`.\\n hashesFront := sub(hashesFront, 0x20)\\n }\\n\\n // Advance to the next flag offset.\\n flags.offset := add(flags.offset, 0x20)\\n\\n // Slot of `a` in scratch space.\\n // If the condition is true: 0x20, otherwise: 0x00.\\n let scratch := shl(5, gt(a, b))\\n // Hash the scratch space and push the result onto the queue.\\n mstore(scratch, a)\\n mstore(xor(scratch, 0x20), b)\\n mstore(hashesBack, keccak256(0x00, 0x40))\\n hashesBack := add(hashesBack, 0x20)\\n if iszero(lt(hashesBack, flags.length)) { break }\\n }\\n isValid :=\\n and(\\n // Checks if the last value in the queue is same as the root.\\n eq(mload(sub(hashesBack, 0x20)), root),\\n // And whether all the proofs are used, if required.\\n eq(proofEnd, proof.offset)\\n )\\n break\\n }\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* EMPTY CALLDATA HELPERS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns an empty calldata bytes32 array.\\n function emptyProof() internal pure returns (bytes32[] calldata proof) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n proof.length := 0\\n }\\n }\\n\\n /// @dev Returns an empty calldata bytes32 array.\\n function emptyLeaves() internal pure returns (bytes32[] calldata leaves) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n leaves.length := 0\\n }\\n }\\n\\n /// @dev Returns an empty calldata bool array.\\n function emptyFlags() internal pure returns (bool[] calldata flags) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n flags.length := 0\\n }\\n }\\n}\\n\",\"keccak256\":\"0x36e0da7695b2a2316db2ee41192cddb9327394920e38ee3fadea2308d796fbd2\",\"license\":\"MIT\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": {}, + "notice": "Gas optimized verification of proof of inclusion for a leaf in a Merkle tree.", + "version": 1 + } + } + }, + "src/proxies/SequenceProxyFactory.sol": { + "SequenceProxyFactory": { + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "beacon", + "outputs": [ + { + "internalType": "contract UpgradeableBeacon", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "upgradeBeacon", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "devdoc": { + "details": "The factory owner is able to upgrade the beacon implementation.Proxy deployers are able to override the beacon reference with their own.", + "kind": "dev", + "methods": { + "owner()": { + "details": "Returns the address of the current owner." + }, + "renounceOwnership()": { + "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner." + }, + "transferOwnership(address)": { + "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." + }, + "upgradeBeacon(address)": { + "params": { + "implementation": "The new beacon implementation." + } + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "beacon()": "59659e90", + "owner()": "8da5cb5b", + "renounceOwnership()": "715018a6", + "transferOwnership(address)": "f2fde38b", + "upgradeBeacon(address)": "1bce4583" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"beacon\",\"outputs\":[{\"internalType\":\"contract UpgradeableBeacon\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"upgradeBeacon\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The factory owner is able to upgrade the beacon implementation.Proxy deployers are able to override the beacon reference with their own.\",\"kind\":\"dev\",\"methods\":{\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"upgradeBeacon(address)\":{\"params\":{\"implementation\":\"The new beacon implementation.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"upgradeBeacon(address)\":{\"notice\":\"Upgrades the beacon implementation.\"}},\"notice\":\"An proxy factory that deploys upgradeable beacon proxies.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/proxies/SequenceProxyFactory.sol\":\"SequenceProxyFactory\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby disabling any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/interfaces/IERC1967.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\\n *\\n * _Available since v4.8.3._\\n */\\ninterface IERC1967 {\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Emitted when the beacon is changed.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n}\\n\",\"keccak256\":\"0x3cbef5ebc24b415252e2f8c0c9254555d30d9f085603b4b80d9b5ed20ab87e90\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/IERC1967.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract ERC1967Upgrade is IERC1967 {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n Address.isContract(IBeacon(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x3b21ae06bf5957f73fa16754b0669c77b7abd8ba6c072d35c3281d446fdb86c2\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n /**\\n * @dev Delegates the current call to `implementation`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _delegate(address implementation) internal virtual {\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n /**\\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback function\\n * and {_fallback} should delegate.\\n */\\n function _implementation() internal view virtual returns (address);\\n\\n /**\\n * @dev Delegates the current call to the address returned by `_implementation()`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _fallback() internal virtual {\\n _beforeFallback();\\n _delegate(_implementation());\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n * function in the contract matches the call data.\\n */\\n fallback() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n * is empty.\\n */\\n receive() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n * call, or as part of the Solidity `fallback` or `receive` functions.\\n *\\n * If overridden should call `super._beforeFallback()`.\\n */\\n function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xc130fe33f1b2132158531a87734153293f6d07bc263ff4ac90e85da9c82c0e27\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/proxy/beacon/UpgradeableBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/UpgradeableBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IBeacon.sol\\\";\\nimport \\\"../../access/Ownable.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\n\\n/**\\n * @dev This contract is used in conjunction with one or more instances of {BeaconProxy} to determine their\\n * implementation contract, which is where they will delegate all function calls.\\n *\\n * An owner is able to change the implementation the beacon points to, thus upgrading the proxies that use this beacon.\\n */\\ncontract UpgradeableBeacon is IBeacon, Ownable {\\n address private _implementation;\\n\\n /**\\n * @dev Emitted when the implementation returned by the beacon is changed.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Sets the address of the initial implementation, and the deployer account as the owner who can upgrade the\\n * beacon.\\n */\\n constructor(address implementation_) {\\n _setImplementation(implementation_);\\n }\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function implementation() public view virtual override returns (address) {\\n return _implementation;\\n }\\n\\n /**\\n * @dev Upgrades the beacon to a new implementation.\\n *\\n * Emits an {Upgraded} event.\\n *\\n * Requirements:\\n *\\n * - msg.sender must be the owner of the contract.\\n * - `newImplementation` must be a contract.\\n */\\n function upgradeTo(address newImplementation) public virtual onlyOwner {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Sets the implementation contract address for this beacon\\n *\\n * Requirements:\\n *\\n * - `newImplementation` must be a contract.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"UpgradeableBeacon: implementation is not a contract\\\");\\n _implementation = newImplementation;\\n }\\n}\\n\",\"keccak256\":\"0x6ec71aef5659f3f74011169948d2fcda8c6599be5bb38f986380a8737f96cc0f\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n *\\n * Furthermore, `isContract` will also return true if the target contract within\\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\\n * which only has an effect at the end of a transaction.\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Create2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Create2.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\\n * `CREATE2` can be used to compute in advance the address where a smart\\n * contract will be deployed, which allows for interesting new mechanisms known\\n * as 'counterfactual interactions'.\\n *\\n * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\\n * information.\\n */\\nlibrary Create2 {\\n /**\\n * @dev Deploys a contract using `CREATE2`. The address where the contract\\n * will be deployed can be known in advance via {computeAddress}.\\n *\\n * The bytecode for a contract can be obtained from Solidity with\\n * `type(contractName).creationCode`.\\n *\\n * Requirements:\\n *\\n * - `bytecode` must not be empty.\\n * - `salt` must have not been used for `bytecode` already.\\n * - the factory must have a balance of at least `amount`.\\n * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.\\n */\\n function deploy(uint256 amount, bytes32 salt, bytes memory bytecode) internal returns (address addr) {\\n require(address(this).balance >= amount, \\\"Create2: insufficient balance\\\");\\n require(bytecode.length != 0, \\\"Create2: bytecode length is zero\\\");\\n /// @solidity memory-safe-assembly\\n assembly {\\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\\n }\\n require(addr != address(0), \\\"Create2: Failed on deploy\\\");\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\\n * `bytecodeHash` or `salt` will result in a new destination address.\\n */\\n function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {\\n return computeAddress(salt, bytecodeHash, address(this));\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\\n * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.\\n */\\n function computeAddress(bytes32 salt, bytes32 bytecodeHash, address deployer) internal pure returns (address addr) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let ptr := mload(0x40) // Get free memory pointer\\n\\n // | | \\u2193 ptr ... \\u2193 ptr + 0x0B (start) ... \\u2193 ptr + 0x20 ... \\u2193 ptr + 0x40 ... |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | bytecodeHash | CCCCCCCCCCCCC...CC |\\n // | salt | BBBBBBBBBBBBB...BB |\\n // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |\\n // | 0xFF | FF |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |\\n // | keccak(start, 85) | \\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191 |\\n\\n mstore(add(ptr, 0x40), bytecodeHash)\\n mstore(add(ptr, 0x20), salt)\\n mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes\\n let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff\\n mstore8(start, 0xff)\\n addr := keccak256(start, 85)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x6e00f269073ffc4350e56b7e8153c9092d5f70bfba423299990514183101ef89\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._\\n * _Available since v4.9 for `string`, `bytes`._\\n */\\nlibrary StorageSlot {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n struct StringSlot {\\n string value;\\n }\\n\\n struct BytesSlot {\\n bytes value;\\n }\\n\\n /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n */\\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n */\\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n */\\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `StringSlot` with member `value` located at `slot`.\\n */\\n function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\\n */\\n function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := store.slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BytesSlot` with member `value` located at `slot`.\\n */\\n function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\\n */\\n function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := store.slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf09e68aa0dc6722a25bc46490e8d48ed864466d17313b8a0b254c36b54e49899\",\"license\":\"MIT\"},\"src/proxies/SequenceProxyFactory.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\nimport {\\n ITransparentUpgradeableBeaconProxy,\\n TransparentUpgradeableBeaconProxy\\n} from \\\"./TransparentUpgradeableBeaconProxy.sol\\\";\\n\\nimport { Ownable } from \\\"openzeppelin-contracts/contracts/access/Ownable.sol\\\";\\nimport { UpgradeableBeacon } from \\\"openzeppelin-contracts/contracts/proxy/beacon/UpgradeableBeacon.sol\\\";\\nimport { Create2 } from \\\"openzeppelin-contracts/contracts/utils/Create2.sol\\\";\\n\\n/**\\n * An proxy factory that deploys upgradeable beacon proxies.\\n * @dev The factory owner is able to upgrade the beacon implementation.\\n * @dev Proxy deployers are able to override the beacon reference with their own.\\n */\\nabstract contract SequenceProxyFactory is Ownable {\\n\\n UpgradeableBeacon public beacon;\\n\\n /**\\n * Initialize a Sequence Proxy Factory.\\n * @param implementation The initial beacon implementation.\\n * @param factoryOwner The owner of the factory.\\n */\\n function _initialize(address implementation, address factoryOwner) internal {\\n beacon = new UpgradeableBeacon(implementation);\\n Ownable._transferOwnership(factoryOwner);\\n }\\n\\n /**\\n * Deploys and initializes a new proxy instance.\\n * @param _salt The deployment salt.\\n * @param _proxyOwner The owner of the proxy.\\n * @param _data The initialization data.\\n * @return proxyAddress The address of the deployed proxy.\\n */\\n function _createProxy(\\n bytes32 _salt,\\n address _proxyOwner,\\n bytes memory _data\\n ) internal returns (address proxyAddress) {\\n bytes32 saltedHash = keccak256(abi.encodePacked(_salt, _proxyOwner, address(beacon), _data));\\n bytes memory bytecode = type(TransparentUpgradeableBeaconProxy).creationCode;\\n\\n proxyAddress = Create2.deploy(0, saltedHash, bytecode);\\n ITransparentUpgradeableBeaconProxy(payable(proxyAddress)).initialize(_proxyOwner, address(beacon), _data);\\n }\\n\\n /**\\n * Computes the address of a proxy instance.\\n * @param _salt The deployment salt.\\n * @param _proxyOwner The owner of the proxy.\\n * @return proxy The expected address of the deployed proxy.\\n */\\n function _computeProxyAddress(\\n bytes32 _salt,\\n address _proxyOwner,\\n bytes memory _data\\n ) internal view returns (address) {\\n bytes32 saltedHash = keccak256(abi.encodePacked(_salt, _proxyOwner, address(beacon), _data));\\n bytes32 bytecodeHash = keccak256(type(TransparentUpgradeableBeaconProxy).creationCode);\\n\\n return Create2.computeAddress(saltedHash, bytecodeHash);\\n }\\n\\n /**\\n * Upgrades the beacon implementation.\\n * @param implementation The new beacon implementation.\\n */\\n function upgradeBeacon(\\n address implementation\\n ) public onlyOwner {\\n beacon.upgradeTo(implementation);\\n }\\n\\n}\\n\",\"keccak256\":\"0x1cfe45a8e44b7a1b8f11631da9bdd1420fe040e2322ca725d644fbb26813de73\",\"license\":\"Apache-2.0\"},\"src/proxies/TransparentUpgradeableBeaconProxy.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\nimport { BeaconProxy, Proxy } from \\\"./openzeppelin/BeaconProxy.sol\\\";\\nimport { ERC1967Proxy, TransparentUpgradeableProxy } from \\\"./openzeppelin/TransparentUpgradeableProxy.sol\\\";\\n\\ninterface ITransparentUpgradeableBeaconProxy {\\n\\n function initialize(address admin, address beacon, bytes memory data) external;\\n\\n}\\n\\nerror InvalidInitialization();\\n\\n/**\\n * @dev As the underlying proxy implementation (TransparentUpgradeableProxy) allows the admin to call the implementation,\\n * care must be taken to avoid proxy selector collisions. Implementation selectors must not conflict with the proxy selectors.\\n * See https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector clashing].\\n * The proxy selectors are:\\n * - 0xcf7a1d77: initialize\\n * - 0x3659cfe6: upgradeTo (from TransparentUpgradeableProxy)\\n * - 0x4f1ef286: upgradeToAndCall (from TransparentUpgradeableProxy)\\n * - 0x8f283970: changeAdmin (from TransparentUpgradeableProxy)\\n * - 0xf851a440: admin (from TransparentUpgradeableProxy)\\n * - 0x5c60da1b: implementation (from TransparentUpgradeableProxy)\\n */\\ncontract TransparentUpgradeableBeaconProxy is TransparentUpgradeableProxy, BeaconProxy {\\n\\n /**\\n * Decode the initialization data from the msg.data and call the initialize function.\\n */\\n function _dispatchInitialize() private returns (bytes memory) {\\n _requireZeroValue();\\n\\n (address admin, address beacon, bytes memory data) = abi.decode(msg.data[4:], (address, address, bytes));\\n initialize(admin, beacon, data);\\n\\n return \\\"\\\";\\n }\\n\\n function initialize(address admin, address beacon, bytes memory data) internal {\\n if (_admin() != address(0)) {\\n // Redundant call. This function can only be called when the admin is not set.\\n revert InvalidInitialization();\\n }\\n _changeAdmin(admin);\\n _upgradeBeaconToAndCall(beacon, data, false);\\n }\\n\\n /**\\n * @dev If the admin is not set, the fallback function is used to initialize the proxy.\\n * @dev If the admin is set, the fallback function is used to delegatecall the implementation.\\n */\\n function _fallback() internal override(TransparentUpgradeableProxy, Proxy) {\\n if (_getAdmin() == address(0)) {\\n bytes memory ret;\\n bytes4 selector = msg.sig;\\n if (selector == ITransparentUpgradeableBeaconProxy.initialize.selector) {\\n ret = _dispatchInitialize();\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n return(add(ret, 0x20), mload(ret))\\n }\\n }\\n // When the admin is not set, the fallback function is used to initialize the proxy.\\n revert InvalidInitialization();\\n }\\n TransparentUpgradeableProxy._fallback();\\n }\\n\\n /**\\n * Returns the current implementation address.\\n * @dev This is the implementation address set by the admin, or the beacon implementation.\\n */\\n function _implementation() internal view override(ERC1967Proxy, BeaconProxy) returns (address) {\\n address implementation = ERC1967Proxy._implementation();\\n if (implementation != address(0)) {\\n return implementation;\\n }\\n return BeaconProxy._implementation();\\n }\\n\\n}\\n\",\"keccak256\":\"0xf7c7834545a955cedbe5228c3583f72fb332337dd0b4ebcd5fdb0b6504c5a8cb\",\"license\":\"Apache-2.0\"},\"src/proxies/openzeppelin/BeaconProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (proxy/beacon/BeaconProxy.sol)\\n\\n// Note: This implementation is an exact copy with the constructor removed, and pragma and imports updated.\\n\\npragma solidity ^0.8.19;\\n\\nimport \\\"openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Upgrade.sol\\\";\\nimport \\\"openzeppelin-contracts/contracts/proxy/Proxy.sol\\\";\\nimport \\\"openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol\\\";\\n\\n/**\\n * @dev This contract implements a proxy that gets the implementation address for each call from an {UpgradeableBeacon}.\\n *\\n * The beacon address is stored in storage slot `uint256(keccak256('eip1967.proxy.beacon')) - 1`, so that it doesn't\\n * conflict with the storage layout of the implementation behind the proxy.\\n *\\n * _Available since v3.4._\\n */\\ncontract BeaconProxy is Proxy, ERC1967Upgrade {\\n\\n /**\\n * @dev Returns the current beacon address.\\n */\\n function _beacon() internal view virtual returns (address) {\\n return _getBeacon();\\n }\\n\\n /**\\n * @dev Returns the current implementation address of the associated beacon.\\n */\\n function _implementation() internal view virtual override returns (address) {\\n return IBeacon(_getBeacon()).implementation();\\n }\\n\\n /**\\n * @dev Changes the proxy to use a new beacon. Deprecated: see {_upgradeBeaconToAndCall}.\\n *\\n * If `data` is nonempty, it's used as data in a delegate call to the implementation returned by the beacon.\\n *\\n * Requirements:\\n *\\n * - `beacon` must be a contract.\\n * - The implementation returned by `beacon` must be a contract.\\n */\\n function _setBeacon(address beacon, bytes memory data) internal virtual {\\n _upgradeBeaconToAndCall(beacon, data, false);\\n }\\n\\n}\\n\",\"keccak256\":\"0x2aa58701eaf7336890fae8a17f5769adf764beac64f3c5873199cd56abd66d0d\",\"license\":\"MIT\"},\"src/proxies/openzeppelin/ERC1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (proxy/ERC1967/ERC1967Proxy.sol)\\n\\n// Note: This implementation is an exact copy with the constructor removed, and pragma and imports updated.\\n\\npragma solidity ^0.8.19;\\n\\nimport \\\"openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Upgrade.sol\\\";\\nimport \\\"openzeppelin-contracts/contracts/proxy/Proxy.sol\\\";\\n\\n/**\\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\\n * implementation address that can be changed. This address is stored in storage in the location specified by\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\\n * implementation behind the proxy.\\n */\\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _implementation() internal view virtual override returns (address impl) {\\n return ERC1967Upgrade._getImplementation();\\n }\\n\\n}\\n\",\"keccak256\":\"0x87a69f59211b7b73c737e399211fd71d9b549b7d416e05c85b8ab605f64b3b00\",\"license\":\"MIT\"},\"src/proxies/openzeppelin/TransparentUpgradeableProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/transparent/TransparentUpgradeableProxy.sol)\\n\\n/// @notice This implementation is a copy of OpenZeppelin's with the following changes:\\n/// - Pragma updated\\n/// - Imports updated\\n/// - Constructor removed\\n/// - Allows admin to call implementation\\n\\npragma solidity ^0.8.19;\\n\\nimport \\\"./ERC1967Proxy.sol\\\";\\n\\n/**\\n * @dev Interface for {TransparentUpgradeableProxy}. In order to implement transparency, {TransparentUpgradeableProxy}\\n * does not implement this interface directly, and some of its functions are implemented by an internal dispatch\\n * mechanism. The compiler is unaware that these functions are implemented by {TransparentUpgradeableProxy} and will not\\n * include them in the ABI so this interface must be used to interact with it.\\n */\\ninterface ITransparentUpgradeableProxy is IERC1967 {\\n\\n function admin() external view returns (address);\\n\\n function implementation() external view returns (address);\\n\\n function changeAdmin(\\n address\\n ) external;\\n\\n function upgradeTo(\\n address\\n ) external;\\n\\n function upgradeToAndCall(address, bytes memory) external payable;\\n\\n}\\n\\n/**\\n * @dev This contract implements a proxy that is upgradeable by an admin.\\n *\\n * Unlike the original OpenZeppelin implementation, this contract does not prevent the admin from calling the implementation.\\n * This potentially exposes the admin to a proxy selector attack. See\\n * https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector clashing].\\n * When using this contract, you must ensure that the implementation function selectors do not clash with the proxy selectors.\\n * The proxy selectors are:\\n * - 0x3659cfe6: upgradeTo\\n * - 0x4f1ef286: upgradeToAndCall\\n * - 0x8f283970: changeAdmin\\n * - 0xf851a440: admin\\n * - 0x5c60da1b: implementation\\n *\\n * NOTE: The real interface of this proxy is that defined in `ITransparentUpgradeableProxy`. This contract does not\\n * inherit from that interface, and instead the admin functions are implicitly implemented using a custom dispatch\\n * mechanism in `_fallback`. Consequently, the compiler will not produce an ABI for this contract. This is necessary to\\n * fully implement transparency without decoding reverts caused by selector clashes between the proxy and the\\n * implementation.\\n *\\n * WARNING: It is not recommended to extend this contract to add additional external functions. If you do so, the compiler\\n * will not check that there are no selector conflicts, due to the note above. A selector clash between any new function\\n * and the functions declared in {ITransparentUpgradeableProxy} will be resolved in favor of the new one. This could\\n * render the admin operations inaccessible, which could prevent upgradeability. Transparency may also be compromised.\\n */\\ncontract TransparentUpgradeableProxy is ERC1967Proxy {\\n\\n /**\\n * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.\\n *\\n * CAUTION: This modifier is deprecated, as it could cause issues if the modified function has arguments, and the\\n * implementation provides a function with the same selector.\\n */\\n modifier ifAdmin() {\\n if (msg.sender == _getAdmin()) {\\n _;\\n } else {\\n _fallback();\\n }\\n }\\n\\n /**\\n * @dev If caller is the admin process the call internally, otherwise transparently fallback to the proxy behavior\\n */\\n function _fallback() internal virtual override {\\n if (msg.sender == _getAdmin()) {\\n bytes memory ret;\\n bytes4 selector = msg.sig;\\n if (selector == ITransparentUpgradeableProxy.upgradeTo.selector) {\\n ret = _dispatchUpgradeTo();\\n } else if (selector == ITransparentUpgradeableProxy.upgradeToAndCall.selector) {\\n ret = _dispatchUpgradeToAndCall();\\n } else if (selector == ITransparentUpgradeableProxy.changeAdmin.selector) {\\n ret = _dispatchChangeAdmin();\\n } else if (selector == ITransparentUpgradeableProxy.admin.selector) {\\n ret = _dispatchAdmin();\\n } else if (selector == ITransparentUpgradeableProxy.implementation.selector) {\\n ret = _dispatchImplementation();\\n } else {\\n // Call implementation\\n return super._fallback();\\n }\\n assembly {\\n return(add(ret, 0x20), mload(ret))\\n }\\n } else {\\n super._fallback();\\n }\\n }\\n\\n /**\\n * @dev Returns the current admin.\\n *\\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\\n */\\n function _dispatchAdmin() private returns (bytes memory) {\\n _requireZeroValue();\\n\\n address admin = _getAdmin();\\n return abi.encode(admin);\\n }\\n\\n /**\\n * @dev Returns the current implementation.\\n *\\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\\n * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\\n */\\n function _dispatchImplementation() private returns (bytes memory) {\\n _requireZeroValue();\\n\\n address implementation = _implementation();\\n return abi.encode(implementation);\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _dispatchChangeAdmin() private returns (bytes memory) {\\n _requireZeroValue();\\n\\n address newAdmin = abi.decode(msg.data[4:], (address));\\n _changeAdmin(newAdmin);\\n\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy.\\n */\\n function _dispatchUpgradeTo() private returns (bytes memory) {\\n _requireZeroValue();\\n\\n address newImplementation = abi.decode(msg.data[4:], (address));\\n _upgradeToAndCall(newImplementation, bytes(\\\"\\\"), false);\\n\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified\\n * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the\\n * proxied contract.\\n */\\n function _dispatchUpgradeToAndCall() private returns (bytes memory) {\\n (address newImplementation, bytes memory data) = abi.decode(msg.data[4:], (address, bytes));\\n _upgradeToAndCall(newImplementation, data, true);\\n\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev Returns the current admin.\\n *\\n * CAUTION: This function is deprecated. Use {ERC1967Upgrade-_getAdmin} instead.\\n */\\n function _admin() internal view virtual returns (address) {\\n return _getAdmin();\\n }\\n\\n /**\\n * @dev To keep this contract fully transparent, all `ifAdmin` functions must be payable. This helper is here to\\n * emulate some proxy functions being non-payable while still allowing value to pass through.\\n */\\n function _requireZeroValue() internal {\\n require(msg.value == 0);\\n }\\n\\n}\\n\",\"keccak256\":\"0x4615fce1ce5dccba23058d4d4567a4a4cd01ba0c434960fa0b94bf9d44f14e99\",\"license\":\"MIT\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": { + "upgradeBeacon(address)": { + "notice": "Upgrades the beacon implementation." + } + }, + "notice": "An proxy factory that deploys upgradeable beacon proxies.", + "version": 1 + } + } + }, + "src/proxies/TransparentUpgradeableBeaconProxy.sol": { + "ITransparentUpgradeableBeaconProxy": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "admin", + "type": "address" + }, + { + "internalType": "address", + "name": "beacon", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "initialize(address,address,bytes)": "cf7a1d77" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/proxies/TransparentUpgradeableBeaconProxy.sol\":\"ITransparentUpgradeableBeaconProxy\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/interfaces/IERC1967.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\\n *\\n * _Available since v4.8.3._\\n */\\ninterface IERC1967 {\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Emitted when the beacon is changed.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n}\\n\",\"keccak256\":\"0x3cbef5ebc24b415252e2f8c0c9254555d30d9f085603b4b80d9b5ed20ab87e90\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/IERC1967.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract ERC1967Upgrade is IERC1967 {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n Address.isContract(IBeacon(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x3b21ae06bf5957f73fa16754b0669c77b7abd8ba6c072d35c3281d446fdb86c2\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n /**\\n * @dev Delegates the current call to `implementation`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _delegate(address implementation) internal virtual {\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n /**\\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback function\\n * and {_fallback} should delegate.\\n */\\n function _implementation() internal view virtual returns (address);\\n\\n /**\\n * @dev Delegates the current call to the address returned by `_implementation()`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _fallback() internal virtual {\\n _beforeFallback();\\n _delegate(_implementation());\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n * function in the contract matches the call data.\\n */\\n fallback() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n * is empty.\\n */\\n receive() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n * call, or as part of the Solidity `fallback` or `receive` functions.\\n *\\n * If overridden should call `super._beforeFallback()`.\\n */\\n function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xc130fe33f1b2132158531a87734153293f6d07bc263ff4ac90e85da9c82c0e27\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n *\\n * Furthermore, `isContract` will also return true if the target contract within\\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\\n * which only has an effect at the end of a transaction.\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._\\n * _Available since v4.9 for `string`, `bytes`._\\n */\\nlibrary StorageSlot {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n struct StringSlot {\\n string value;\\n }\\n\\n struct BytesSlot {\\n bytes value;\\n }\\n\\n /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n */\\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n */\\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n */\\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `StringSlot` with member `value` located at `slot`.\\n */\\n function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\\n */\\n function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := store.slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BytesSlot` with member `value` located at `slot`.\\n */\\n function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\\n */\\n function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := store.slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf09e68aa0dc6722a25bc46490e8d48ed864466d17313b8a0b254c36b54e49899\",\"license\":\"MIT\"},\"src/proxies/TransparentUpgradeableBeaconProxy.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\nimport { BeaconProxy, Proxy } from \\\"./openzeppelin/BeaconProxy.sol\\\";\\nimport { ERC1967Proxy, TransparentUpgradeableProxy } from \\\"./openzeppelin/TransparentUpgradeableProxy.sol\\\";\\n\\ninterface ITransparentUpgradeableBeaconProxy {\\n\\n function initialize(address admin, address beacon, bytes memory data) external;\\n\\n}\\n\\nerror InvalidInitialization();\\n\\n/**\\n * @dev As the underlying proxy implementation (TransparentUpgradeableProxy) allows the admin to call the implementation,\\n * care must be taken to avoid proxy selector collisions. Implementation selectors must not conflict with the proxy selectors.\\n * See https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector clashing].\\n * The proxy selectors are:\\n * - 0xcf7a1d77: initialize\\n * - 0x3659cfe6: upgradeTo (from TransparentUpgradeableProxy)\\n * - 0x4f1ef286: upgradeToAndCall (from TransparentUpgradeableProxy)\\n * - 0x8f283970: changeAdmin (from TransparentUpgradeableProxy)\\n * - 0xf851a440: admin (from TransparentUpgradeableProxy)\\n * - 0x5c60da1b: implementation (from TransparentUpgradeableProxy)\\n */\\ncontract TransparentUpgradeableBeaconProxy is TransparentUpgradeableProxy, BeaconProxy {\\n\\n /**\\n * Decode the initialization data from the msg.data and call the initialize function.\\n */\\n function _dispatchInitialize() private returns (bytes memory) {\\n _requireZeroValue();\\n\\n (address admin, address beacon, bytes memory data) = abi.decode(msg.data[4:], (address, address, bytes));\\n initialize(admin, beacon, data);\\n\\n return \\\"\\\";\\n }\\n\\n function initialize(address admin, address beacon, bytes memory data) internal {\\n if (_admin() != address(0)) {\\n // Redundant call. This function can only be called when the admin is not set.\\n revert InvalidInitialization();\\n }\\n _changeAdmin(admin);\\n _upgradeBeaconToAndCall(beacon, data, false);\\n }\\n\\n /**\\n * @dev If the admin is not set, the fallback function is used to initialize the proxy.\\n * @dev If the admin is set, the fallback function is used to delegatecall the implementation.\\n */\\n function _fallback() internal override(TransparentUpgradeableProxy, Proxy) {\\n if (_getAdmin() == address(0)) {\\n bytes memory ret;\\n bytes4 selector = msg.sig;\\n if (selector == ITransparentUpgradeableBeaconProxy.initialize.selector) {\\n ret = _dispatchInitialize();\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n return(add(ret, 0x20), mload(ret))\\n }\\n }\\n // When the admin is not set, the fallback function is used to initialize the proxy.\\n revert InvalidInitialization();\\n }\\n TransparentUpgradeableProxy._fallback();\\n }\\n\\n /**\\n * Returns the current implementation address.\\n * @dev This is the implementation address set by the admin, or the beacon implementation.\\n */\\n function _implementation() internal view override(ERC1967Proxy, BeaconProxy) returns (address) {\\n address implementation = ERC1967Proxy._implementation();\\n if (implementation != address(0)) {\\n return implementation;\\n }\\n return BeaconProxy._implementation();\\n }\\n\\n}\\n\",\"keccak256\":\"0xf7c7834545a955cedbe5228c3583f72fb332337dd0b4ebcd5fdb0b6504c5a8cb\",\"license\":\"Apache-2.0\"},\"src/proxies/openzeppelin/BeaconProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (proxy/beacon/BeaconProxy.sol)\\n\\n// Note: This implementation is an exact copy with the constructor removed, and pragma and imports updated.\\n\\npragma solidity ^0.8.19;\\n\\nimport \\\"openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Upgrade.sol\\\";\\nimport \\\"openzeppelin-contracts/contracts/proxy/Proxy.sol\\\";\\nimport \\\"openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol\\\";\\n\\n/**\\n * @dev This contract implements a proxy that gets the implementation address for each call from an {UpgradeableBeacon}.\\n *\\n * The beacon address is stored in storage slot `uint256(keccak256('eip1967.proxy.beacon')) - 1`, so that it doesn't\\n * conflict with the storage layout of the implementation behind the proxy.\\n *\\n * _Available since v3.4._\\n */\\ncontract BeaconProxy is Proxy, ERC1967Upgrade {\\n\\n /**\\n * @dev Returns the current beacon address.\\n */\\n function _beacon() internal view virtual returns (address) {\\n return _getBeacon();\\n }\\n\\n /**\\n * @dev Returns the current implementation address of the associated beacon.\\n */\\n function _implementation() internal view virtual override returns (address) {\\n return IBeacon(_getBeacon()).implementation();\\n }\\n\\n /**\\n * @dev Changes the proxy to use a new beacon. Deprecated: see {_upgradeBeaconToAndCall}.\\n *\\n * If `data` is nonempty, it's used as data in a delegate call to the implementation returned by the beacon.\\n *\\n * Requirements:\\n *\\n * - `beacon` must be a contract.\\n * - The implementation returned by `beacon` must be a contract.\\n */\\n function _setBeacon(address beacon, bytes memory data) internal virtual {\\n _upgradeBeaconToAndCall(beacon, data, false);\\n }\\n\\n}\\n\",\"keccak256\":\"0x2aa58701eaf7336890fae8a17f5769adf764beac64f3c5873199cd56abd66d0d\",\"license\":\"MIT\"},\"src/proxies/openzeppelin/ERC1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (proxy/ERC1967/ERC1967Proxy.sol)\\n\\n// Note: This implementation is an exact copy with the constructor removed, and pragma and imports updated.\\n\\npragma solidity ^0.8.19;\\n\\nimport \\\"openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Upgrade.sol\\\";\\nimport \\\"openzeppelin-contracts/contracts/proxy/Proxy.sol\\\";\\n\\n/**\\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\\n * implementation address that can be changed. This address is stored in storage in the location specified by\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\\n * implementation behind the proxy.\\n */\\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _implementation() internal view virtual override returns (address impl) {\\n return ERC1967Upgrade._getImplementation();\\n }\\n\\n}\\n\",\"keccak256\":\"0x87a69f59211b7b73c737e399211fd71d9b549b7d416e05c85b8ab605f64b3b00\",\"license\":\"MIT\"},\"src/proxies/openzeppelin/TransparentUpgradeableProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/transparent/TransparentUpgradeableProxy.sol)\\n\\n/// @notice This implementation is a copy of OpenZeppelin's with the following changes:\\n/// - Pragma updated\\n/// - Imports updated\\n/// - Constructor removed\\n/// - Allows admin to call implementation\\n\\npragma solidity ^0.8.19;\\n\\nimport \\\"./ERC1967Proxy.sol\\\";\\n\\n/**\\n * @dev Interface for {TransparentUpgradeableProxy}. In order to implement transparency, {TransparentUpgradeableProxy}\\n * does not implement this interface directly, and some of its functions are implemented by an internal dispatch\\n * mechanism. The compiler is unaware that these functions are implemented by {TransparentUpgradeableProxy} and will not\\n * include them in the ABI so this interface must be used to interact with it.\\n */\\ninterface ITransparentUpgradeableProxy is IERC1967 {\\n\\n function admin() external view returns (address);\\n\\n function implementation() external view returns (address);\\n\\n function changeAdmin(\\n address\\n ) external;\\n\\n function upgradeTo(\\n address\\n ) external;\\n\\n function upgradeToAndCall(address, bytes memory) external payable;\\n\\n}\\n\\n/**\\n * @dev This contract implements a proxy that is upgradeable by an admin.\\n *\\n * Unlike the original OpenZeppelin implementation, this contract does not prevent the admin from calling the implementation.\\n * This potentially exposes the admin to a proxy selector attack. See\\n * https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector clashing].\\n * When using this contract, you must ensure that the implementation function selectors do not clash with the proxy selectors.\\n * The proxy selectors are:\\n * - 0x3659cfe6: upgradeTo\\n * - 0x4f1ef286: upgradeToAndCall\\n * - 0x8f283970: changeAdmin\\n * - 0xf851a440: admin\\n * - 0x5c60da1b: implementation\\n *\\n * NOTE: The real interface of this proxy is that defined in `ITransparentUpgradeableProxy`. This contract does not\\n * inherit from that interface, and instead the admin functions are implicitly implemented using a custom dispatch\\n * mechanism in `_fallback`. Consequently, the compiler will not produce an ABI for this contract. This is necessary to\\n * fully implement transparency without decoding reverts caused by selector clashes between the proxy and the\\n * implementation.\\n *\\n * WARNING: It is not recommended to extend this contract to add additional external functions. If you do so, the compiler\\n * will not check that there are no selector conflicts, due to the note above. A selector clash between any new function\\n * and the functions declared in {ITransparentUpgradeableProxy} will be resolved in favor of the new one. This could\\n * render the admin operations inaccessible, which could prevent upgradeability. Transparency may also be compromised.\\n */\\ncontract TransparentUpgradeableProxy is ERC1967Proxy {\\n\\n /**\\n * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.\\n *\\n * CAUTION: This modifier is deprecated, as it could cause issues if the modified function has arguments, and the\\n * implementation provides a function with the same selector.\\n */\\n modifier ifAdmin() {\\n if (msg.sender == _getAdmin()) {\\n _;\\n } else {\\n _fallback();\\n }\\n }\\n\\n /**\\n * @dev If caller is the admin process the call internally, otherwise transparently fallback to the proxy behavior\\n */\\n function _fallback() internal virtual override {\\n if (msg.sender == _getAdmin()) {\\n bytes memory ret;\\n bytes4 selector = msg.sig;\\n if (selector == ITransparentUpgradeableProxy.upgradeTo.selector) {\\n ret = _dispatchUpgradeTo();\\n } else if (selector == ITransparentUpgradeableProxy.upgradeToAndCall.selector) {\\n ret = _dispatchUpgradeToAndCall();\\n } else if (selector == ITransparentUpgradeableProxy.changeAdmin.selector) {\\n ret = _dispatchChangeAdmin();\\n } else if (selector == ITransparentUpgradeableProxy.admin.selector) {\\n ret = _dispatchAdmin();\\n } else if (selector == ITransparentUpgradeableProxy.implementation.selector) {\\n ret = _dispatchImplementation();\\n } else {\\n // Call implementation\\n return super._fallback();\\n }\\n assembly {\\n return(add(ret, 0x20), mload(ret))\\n }\\n } else {\\n super._fallback();\\n }\\n }\\n\\n /**\\n * @dev Returns the current admin.\\n *\\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\\n */\\n function _dispatchAdmin() private returns (bytes memory) {\\n _requireZeroValue();\\n\\n address admin = _getAdmin();\\n return abi.encode(admin);\\n }\\n\\n /**\\n * @dev Returns the current implementation.\\n *\\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\\n * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\\n */\\n function _dispatchImplementation() private returns (bytes memory) {\\n _requireZeroValue();\\n\\n address implementation = _implementation();\\n return abi.encode(implementation);\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _dispatchChangeAdmin() private returns (bytes memory) {\\n _requireZeroValue();\\n\\n address newAdmin = abi.decode(msg.data[4:], (address));\\n _changeAdmin(newAdmin);\\n\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy.\\n */\\n function _dispatchUpgradeTo() private returns (bytes memory) {\\n _requireZeroValue();\\n\\n address newImplementation = abi.decode(msg.data[4:], (address));\\n _upgradeToAndCall(newImplementation, bytes(\\\"\\\"), false);\\n\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified\\n * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the\\n * proxied contract.\\n */\\n function _dispatchUpgradeToAndCall() private returns (bytes memory) {\\n (address newImplementation, bytes memory data) = abi.decode(msg.data[4:], (address, bytes));\\n _upgradeToAndCall(newImplementation, data, true);\\n\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev Returns the current admin.\\n *\\n * CAUTION: This function is deprecated. Use {ERC1967Upgrade-_getAdmin} instead.\\n */\\n function _admin() internal view virtual returns (address) {\\n return _getAdmin();\\n }\\n\\n /**\\n * @dev To keep this contract fully transparent, all `ifAdmin` functions must be payable. This helper is here to\\n * emulate some proxy functions being non-payable while still allowing value to pass through.\\n */\\n function _requireZeroValue() internal {\\n require(msg.value == 0);\\n }\\n\\n}\\n\",\"keccak256\":\"0x4615fce1ce5dccba23058d4d4567a4a4cd01ba0c434960fa0b94bf9d44f14e99\",\"license\":\"MIT\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + }, + "TransparentUpgradeableBeaconProxy": { + "abi": [ + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "devdoc": { + "details": "As the underlying proxy implementation (TransparentUpgradeableProxy) allows the admin to call the implementation, care must be taken to avoid proxy selector collisions. Implementation selectors must not conflict with the proxy selectors. See https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector clashing]. The proxy selectors are: - 0xcf7a1d77: initialize - 0x3659cfe6: upgradeTo (from TransparentUpgradeableProxy) - 0x4f1ef286: upgradeToAndCall (from TransparentUpgradeableProxy) - 0x8f283970: changeAdmin (from TransparentUpgradeableProxy) - 0xf851a440: admin (from TransparentUpgradeableProxy) - 0x5c60da1b: implementation (from TransparentUpgradeableProxy)", + "events": { + "AdminChanged(address,address)": { + "details": "Emitted when the admin account has changed." + }, + "BeaconUpgraded(address)": { + "details": "Emitted when the beacon is changed." + }, + "Upgraded(address)": { + "details": "Emitted when the implementation is upgraded." + } + }, + "kind": "dev", + "methods": {}, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": { + "allocate_unbounded": { + "entryPoint": 32, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb": { + "entryPoint": 38, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + } + }, + "generatedSources": [], + "linkReferences": {}, + "object": "608060405234601c57600e6020565b61145e61002c823961145e90f35b6026565b60405190565b600080fdfe6080604052361561006b5761006b565b90565b60018060a01b031690565b90565b61003461002f6100399261000f565b61001d565b610012565b90565b61004590610020565b90565b61005190610012565b90565b606090565b63ffffffff60e01b1690565b60000190565b61007361017e565b61008e610088610083600061003c565b610048565b91610048565b0361046c5761009b610054565b5063ffffffff60e01b600035166100c16100bb63cf7a1d7760e01b610059565b91610059565b146100e357600063f92ee8a960e01b8152806100df60048201610065565b0390fd5b6100eb610401565b602081519101f35b600090565b90565b90565b60001b90565b61011861011361011d926100f8565b6100fe565b6100fb565b90565b6101497fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103610104565b90565b60001c90565b60018060a01b031690565b61016961016e9161014c565b610152565b90565b61017b905461015d565b90565b6101866100f3565b506101a2600061019c610197610120565b6105a2565b01610171565b90565b90565b90565b6101bf6101ba6101c4926101a5565b61001d565b6101a8565b90565b60405190565b600080fd5b600080fd5b909392938483116101f75784116101f2576001820201920390565b6101d2565b6101cd565b91565b600080fd5b600080fd5b61021290610012565b90565b61021e81610209565b0361022557565b600080fd5b9050359061023782610215565b565b600080fd5b600080fd5b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b9061026d90610243565b810190811067ffffffffffffffff82111761028757604052565b61024d565b9061029f6102986101c7565b9283610263565b565b67ffffffffffffffff81116102bf576102bb602091610243565b0190565b61024d565b90826000939282370152565b909291926102e56102e0826102a1565b61028c565b93818552602085019082840111610301576102ff926102c4565b565b61023e565b9080601f8301121561032457816020610321933591016102d0565b90565b610239565b9160608383031261037657610341826000850161022a565b9261034f836020830161022a565b92604082013567ffffffffffffffff81116103715761036e9201610306565b90565b610204565b6101ff565b61038f61038a61039492610012565b61001d565b610012565b90565b6103a09061037b565b90565b6103ac90610397565b90565b67ffffffffffffffff81116103cd576103c9602091610243565b0190565b61024d565b906103e46103df836103af565b61028c565b918252565b6103f360006103d2565b90565b6103fe6103e9565b90565b610409610054565b506104126105cd565b61046161045761045161044761043f61043960003661043160046101ab565b9080926101d7565b906101fc565b810190610329565b93919290926103a3565b916103a3565b91909190916105ec565b6104696103f6565b90565b3361048661048061047b61017e565b610048565b91610048565b1460001461059d57610496610054565b5063ffffffff60e01b60003516806104bd6104b7631b2ce7f360e11b610059565b91610059565b146000146104d757506104ce610817565b5b602081519101f35b806104f16104eb63278f794360e11b610059565b91610059565b1460001461050857506105026107c1565b5b6104cf565b8061052261051c6308f2839760e41b610059565b91610059565b146000146105395750610533610723565b5b610503565b8061055361054d6303e1469160e61b610059565b91610059565b1460001461056a57506105646106bf565b5b610534565b61058361057d635c60da1b60e01b610059565b91610059565b146000146105985761059361067a565b610565565b61064a565b61064a565b90565b6105b96105b46105be9261000f565b61001d565b6101a8565b90565b156105c857565b600080fd5b6105ea346105e46105de60006105a5565b916101a8565b146105c1565b565b91906105f661087a565b61061161060b610606600061003c565b610048565b91610048565b0361062d5761062261062b936108b2565b9060009161098d565b565b600063f92ee8a960e01b81528061064660048201610065565b0390fd5b610652610aa6565b610ae7565b61066090610048565b9052565b919061067890600060208501940190610657565b565b610682610054565b5061068b6105cd565b6106ad6106bc610699610aa6565b6106a16101c7565b92839160208301610664565b60208201810382520382610263565b90565b6106c7610054565b506106d06105cd565b6106f26107016106de61017e565b6106e66101c7565b92839160208301610664565b60208201810382520382610263565b90565b9060208282031261071e5761071b9160000161022a565b90565b6101ff565b61072b610054565b506107346105cd565b61077061076b61076661075e61075860003661075060046101ab565b9080926101d7565b906101fc565b810190610704565b6103a3565b6108b2565b6107786103f6565b90565b9190916040818403126107bc57610795836000830161022a565b92602082013567ffffffffffffffff81116107b7576107b49201610306565b90565b610204565b6101ff565b6107c9610054565b5061080c6108036107fc6107f46107ee6000366107e660046101ab565b9080926101d7565b906101fc565b81019061077b565b91906103a3565b90600191610b0a565b6108146103f6565b90565b61081f610054565b506108286105cd565b61086f61085f61085a61085261084c60003661084460046101ab565b9080926101d7565b906101fc565b810190610704565b6103a3565b6108676103f6565b600091610b0a565b6108776103f6565b90565b6108826100f3565b5061088b61017e565b90565b9160206108b09294936108a960408201966000830190610657565b0190610657565b565b6108fd906108be61017e565b817f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f916108f56108ec6101c7565b9283928361088e565b0390a1610c4d565b565b61090890610397565b90565b5190565b6109189061037b565b90565b6109249061090f565b90565b61093090610397565b90565b60e01b90565b61094281610048565b0361094957565b600080fd5b9050519061095b82610939565b565b90602082820312610977576109749160000161094e565b90565b6101ff565b6109846101c7565b3d6000823e3d90fd5b9161099783610e30565b826109c27f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e916108ff565b906109cb6101c7565b806109d581610065565b0390a26109e18261090b565b6109f46109ee60006105a5565b916101a8565b11908115610a9e575b50610a07575b5050565b6020610a1d610a18610a339461091b565b610927565b635c60da1b90610a2b6101c7565b948592610933565b82528180610a4360048201610065565b03915afa908115610a9957610a6192600092610a69575b5090610f65565b503880610a03565b610a8b91925060203d8111610a92575b610a838183610263565b81019061095d565b9038610a5a565b503d610a79565b61097c565b9050386109fd565b610aae6100f3565b50610ab7610f85565b80610ad3610acd610ac8600061003c565b610048565b91610048565b03610ae45750610ae1610f99565b90565b90565b60008091368280378136915af43d6000803e600014610b05573d6000f35b3d6000fd5b91610b148361102f565b610b1d8261090b565b610b30610b2a60006105a5565b916101a8565b11908115610b54575b50610b43575b5050565b610b4c91610f65565b503880610b3f565b905038610b39565b60209181520190565b60207f6464726573730000000000000000000000000000000000000000000000000000917f455243313936373a206e65772061646d696e20697320746865207a65726f206160008201520152565b610bc06026604092610b5c565b610bc981610b65565b0190565b610be39060208101906000818303910152610bb3565b90565b15610bed57565b610bf56101c7565b62461bcd60e51b815280610c0b60048201610bcd565b0390fd5b90610c2060018060a01b03916100fe565b9181191691161790565b90565b90610c42610c3d610c49926108ff565b610c2a565b8254610c0f565b9055565b610c8f90610c7781610c70610c6a610c65600061003c565b610048565b91610048565b1415610be6565b6000610c89610c84610120565b6105a2565b01610c2d565b565b60207f7472616374000000000000000000000000000000000000000000000000000000917f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e60008201520152565b610cec6025604092610b5c565b610cf581610c91565b0190565b610d0f9060208101906000818303910152610cdf565b90565b15610d1957565b610d216101c7565b62461bcd60e51b815280610d3760048201610cf9565b0390fd5b60207f73206e6f74206120636f6e747261637400000000000000000000000000000000917f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960008201520152565b610d966030604092610b5c565b610d9f81610d3b565b0190565b610db99060208101906000818303910152610d89565b90565b15610dc357565b610dcb6101c7565b62461bcd60e51b815280610de160048201610da3565b0390fd5b90565b610dfc610df7610e0192610de5565b6100fe565b6100fb565b90565b610e2d7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50610de8565b90565b610e6e90610e45610e408261107f565b610d12565b6020610e58610e538361091b565b610927565b635c60da1b90610e666101c7565b948592610933565b82528180610e7e60048201610065565b03915afa8015610eee57610ea1610ea691610ebe94600091610ec0575b5061107f565b610dbc565b6000610eb8610eb3610e04565b6105a2565b01610c2d565b565b610ee1915060203d8111610ee7575b610ed98183610263565b81019061095d565b38610e9b565b503d610ecf565b61097c565b60207f206661696c656400000000000000000000000000000000000000000000000000917f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c60008201520152565b610f4b60276103d2565b90610f5860208301610ef3565b565b610f62610f41565b90565b90610f8291610f72610054565b5090610f7c610f5a565b916110e2565b90565b610f8d6100f3565b50610f96611160565b90565b610fa16100f3565b50610fd56020610fbf610fba610fb5611187565b61091b565b610927565b635c60da1b90610fcd6101c7565b938492610933565b82528180610fe560048201610065565b03915afa90811561102a57600091610ffc575b5090565b61101d915060203d8111611023575b6110158183610263565b81019061095d565b38610ff8565b503d61100b565b61097c565b61103881611258565b6110627fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b916108ff565b9061106b6101c7565b8061107581610065565b0390a2565b600090565b61108761107a565b503b61109c61109660006105a5565b916101a8565b1190565b906110b26110ad836102a1565b61028c565b918252565b3d6000146110d4576110c83d6110a0565b903d6000602084013e5b565b6110dc610054565b906110d2565b9091600080611112946110f3610054565b508490602081019051915af4916111086110b7565b909290919261130b565b90565b90565b61112c61112761113192611115565b6100fe565b6100fb565b90565b61115d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc611118565b90565b6111686100f3565b50611184600061117e611179611134565b6105a2565b01610171565b90565b61118f6100f3565b506111ab60006111a56111a0610e04565b6105a2565b01610171565b90565b60207f6f74206120636f6e747261637400000000000000000000000000000000000000917f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60008201520152565b611209602d604092610b5c565b611212816111ae565b0190565b61122c90602081019060008183039101526111fc565b90565b1561123657565b61123e6101c7565b62461bcd60e51b81528061125460048201611216565b0390fd5b6112859061126d6112688261107f565b61122f565b600061127f61127a611134565b6105a2565b01610c2d565b565b60007f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000910152565b6112bc601d602092610b5c565b6112c581611287565b0190565b6112df90602081019060008183039101526112af565b90565b156112e957565b6112f16101c7565b62461bcd60e51b815280611307600482016112c9565b0390fd5b919290611316610054565b5060001461135c57506113288261090b565b61133b61133560006105a5565b916101a8565b14611345575b5090565b6113516113569161107f565b6112e2565b38611341565b826113d5565b5190565b60005b83811061137a575050906000910152565b806020918301518185015201611369565b6113aa6113b36020936113b8936113a181611362565b93848093610b5c565b95869101611366565b610243565b0190565b6113d2916020820191600081840391015261138b565b90565b906113df8261090b565b6113f26113ec60006105a5565b916101a8565b116000146114035750805190602001fd5b6114249061140f6101c7565b91829162461bcd60e51b8352600483016113bc565b0390fdfea2646970667358221220fb1899e61f38faa78bfbab79b8dc2fa613357c2fce2699411f9fee80b624365564736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x1C JUMPI PUSH1 0xE PUSH1 0x20 JUMP JUMPDEST PUSH2 0x145E PUSH2 0x2C DUP3 CODECOPY PUSH2 0x145E SWAP1 RETURN JUMPDEST PUSH1 0x26 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLDATASIZE ISZERO PUSH2 0x6B JUMPI PUSH2 0x6B JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x34 PUSH2 0x2F PUSH2 0x39 SWAP3 PUSH2 0xF JUMP JUMPDEST PUSH2 0x1D JUMP JUMPDEST PUSH2 0x12 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x45 SWAP1 PUSH2 0x20 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x51 SWAP1 PUSH2 0x12 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x60 SWAP1 JUMP JUMPDEST PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL AND SWAP1 JUMP JUMPDEST PUSH1 0x0 ADD SWAP1 JUMP JUMPDEST PUSH2 0x73 PUSH2 0x17E JUMP JUMPDEST PUSH2 0x8E PUSH2 0x88 PUSH2 0x83 PUSH1 0x0 PUSH2 0x3C JUMP JUMPDEST PUSH2 0x48 JUMP JUMPDEST SWAP2 PUSH2 0x48 JUMP JUMPDEST SUB PUSH2 0x46C JUMPI PUSH2 0x9B PUSH2 0x54 JUMP JUMPDEST POP PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL PUSH1 0x0 CALLDATALOAD AND PUSH2 0xC1 PUSH2 0xBB PUSH4 0xCF7A1D77 PUSH1 0xE0 SHL PUSH2 0x59 JUMP JUMPDEST SWAP2 PUSH2 0x59 JUMP JUMPDEST EQ PUSH2 0xE3 JUMPI PUSH1 0x0 PUSH4 0xF92EE8A9 PUSH1 0xE0 SHL DUP2 MSTORE DUP1 PUSH2 0xDF PUSH1 0x4 DUP3 ADD PUSH2 0x65 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0xEB PUSH2 0x401 JUMP JUMPDEST PUSH1 0x20 DUP2 MLOAD SWAP2 ADD RETURN JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SHL SWAP1 JUMP JUMPDEST PUSH2 0x118 PUSH2 0x113 PUSH2 0x11D SWAP3 PUSH2 0xF8 JUMP JUMPDEST PUSH2 0xFE JUMP JUMPDEST PUSH2 0xFB JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x149 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 PUSH2 0x104 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SHR SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x169 PUSH2 0x16E SWAP2 PUSH2 0x14C JUMP JUMPDEST PUSH2 0x152 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x17B SWAP1 SLOAD PUSH2 0x15D JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x186 PUSH2 0xF3 JUMP JUMPDEST POP PUSH2 0x1A2 PUSH1 0x0 PUSH2 0x19C PUSH2 0x197 PUSH2 0x120 JUMP JUMPDEST PUSH2 0x5A2 JUMP JUMPDEST ADD PUSH2 0x171 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1BF PUSH2 0x1BA PUSH2 0x1C4 SWAP3 PUSH2 0x1A5 JUMP JUMPDEST PUSH2 0x1D JUMP JUMPDEST PUSH2 0x1A8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP4 SWAP3 SWAP4 DUP5 DUP4 GT PUSH2 0x1F7 JUMPI DUP5 GT PUSH2 0x1F2 JUMPI PUSH1 0x1 DUP3 MUL ADD SWAP3 SUB SWAP1 JUMP JUMPDEST PUSH2 0x1D2 JUMP JUMPDEST PUSH2 0x1CD JUMP JUMPDEST SWAP2 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x212 SWAP1 PUSH2 0x12 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x21E DUP2 PUSH2 0x209 JUMP JUMPDEST SUB PUSH2 0x225 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x237 DUP3 PUSH2 0x215 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1F DUP1 NOT SWAP2 ADD AND SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH2 0x26D SWAP1 PUSH2 0x243 JUMP JUMPDEST DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x287 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH2 0x24D JUMP JUMPDEST SWAP1 PUSH2 0x29F PUSH2 0x298 PUSH2 0x1C7 JUMP JUMPDEST SWAP3 DUP4 PUSH2 0x263 JUMP JUMPDEST JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BF JUMPI PUSH2 0x2BB PUSH1 0x20 SWAP2 PUSH2 0x243 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x24D JUMP JUMPDEST SWAP1 DUP3 PUSH1 0x0 SWAP4 SWAP3 DUP3 CALLDATACOPY ADD MSTORE JUMP JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x2E5 PUSH2 0x2E0 DUP3 PUSH2 0x2A1 JUMP JUMPDEST PUSH2 0x28C JUMP JUMPDEST SWAP4 DUP2 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP1 DUP3 DUP5 ADD GT PUSH2 0x301 JUMPI PUSH2 0x2FF SWAP3 PUSH2 0x2C4 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x23E JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x324 JUMPI DUP2 PUSH1 0x20 PUSH2 0x321 SWAP4 CALLDATALOAD SWAP2 ADD PUSH2 0x2D0 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x239 JUMP JUMPDEST SWAP2 PUSH1 0x60 DUP4 DUP4 SUB SLT PUSH2 0x376 JUMPI PUSH2 0x341 DUP3 PUSH1 0x0 DUP6 ADD PUSH2 0x22A JUMP JUMPDEST SWAP3 PUSH2 0x34F DUP4 PUSH1 0x20 DUP4 ADD PUSH2 0x22A JUMP JUMPDEST SWAP3 PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x371 JUMPI PUSH2 0x36E SWAP3 ADD PUSH2 0x306 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x204 JUMP JUMPDEST PUSH2 0x1FF JUMP JUMPDEST PUSH2 0x38F PUSH2 0x38A PUSH2 0x394 SWAP3 PUSH2 0x12 JUMP JUMPDEST PUSH2 0x1D JUMP JUMPDEST PUSH2 0x12 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3A0 SWAP1 PUSH2 0x37B JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3AC SWAP1 PUSH2 0x397 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3CD JUMPI PUSH2 0x3C9 PUSH1 0x20 SWAP2 PUSH2 0x243 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x24D JUMP JUMPDEST SWAP1 PUSH2 0x3E4 PUSH2 0x3DF DUP4 PUSH2 0x3AF JUMP JUMPDEST PUSH2 0x28C JUMP JUMPDEST SWAP2 DUP3 MSTORE JUMP JUMPDEST PUSH2 0x3F3 PUSH1 0x0 PUSH2 0x3D2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3FE PUSH2 0x3E9 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x409 PUSH2 0x54 JUMP JUMPDEST POP PUSH2 0x412 PUSH2 0x5CD JUMP JUMPDEST PUSH2 0x461 PUSH2 0x457 PUSH2 0x451 PUSH2 0x447 PUSH2 0x43F PUSH2 0x439 PUSH1 0x0 CALLDATASIZE PUSH2 0x431 PUSH1 0x4 PUSH2 0x1AB JUMP JUMPDEST SWAP1 DUP1 SWAP3 PUSH2 0x1D7 JUMP JUMPDEST SWAP1 PUSH2 0x1FC JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x329 JUMP JUMPDEST SWAP4 SWAP2 SWAP3 SWAP1 SWAP3 PUSH2 0x3A3 JUMP JUMPDEST SWAP2 PUSH2 0x3A3 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 SWAP1 SWAP2 PUSH2 0x5EC JUMP JUMPDEST PUSH2 0x469 PUSH2 0x3F6 JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLER PUSH2 0x486 PUSH2 0x480 PUSH2 0x47B PUSH2 0x17E JUMP JUMPDEST PUSH2 0x48 JUMP JUMPDEST SWAP2 PUSH2 0x48 JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0x59D JUMPI PUSH2 0x496 PUSH2 0x54 JUMP JUMPDEST POP PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL PUSH1 0x0 CALLDATALOAD AND DUP1 PUSH2 0x4BD PUSH2 0x4B7 PUSH4 0x1B2CE7F3 PUSH1 0xE1 SHL PUSH2 0x59 JUMP JUMPDEST SWAP2 PUSH2 0x59 JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0x4D7 JUMPI POP PUSH2 0x4CE PUSH2 0x817 JUMP JUMPDEST JUMPDEST PUSH1 0x20 DUP2 MLOAD SWAP2 ADD RETURN JUMPDEST DUP1 PUSH2 0x4F1 PUSH2 0x4EB PUSH4 0x278F7943 PUSH1 0xE1 SHL PUSH2 0x59 JUMP JUMPDEST SWAP2 PUSH2 0x59 JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0x508 JUMPI POP PUSH2 0x502 PUSH2 0x7C1 JUMP JUMPDEST JUMPDEST PUSH2 0x4CF JUMP JUMPDEST DUP1 PUSH2 0x522 PUSH2 0x51C PUSH4 0x8F28397 PUSH1 0xE4 SHL PUSH2 0x59 JUMP JUMPDEST SWAP2 PUSH2 0x59 JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0x539 JUMPI POP PUSH2 0x533 PUSH2 0x723 JUMP JUMPDEST JUMPDEST PUSH2 0x503 JUMP JUMPDEST DUP1 PUSH2 0x553 PUSH2 0x54D PUSH4 0x3E14691 PUSH1 0xE6 SHL PUSH2 0x59 JUMP JUMPDEST SWAP2 PUSH2 0x59 JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0x56A JUMPI POP PUSH2 0x564 PUSH2 0x6BF JUMP JUMPDEST JUMPDEST PUSH2 0x534 JUMP JUMPDEST PUSH2 0x583 PUSH2 0x57D PUSH4 0x5C60DA1B PUSH1 0xE0 SHL PUSH2 0x59 JUMP JUMPDEST SWAP2 PUSH2 0x59 JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0x598 JUMPI PUSH2 0x593 PUSH2 0x67A JUMP JUMPDEST PUSH2 0x565 JUMP JUMPDEST PUSH2 0x64A JUMP JUMPDEST PUSH2 0x64A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x5B9 PUSH2 0x5B4 PUSH2 0x5BE SWAP3 PUSH2 0xF JUMP JUMPDEST PUSH2 0x1D JUMP JUMPDEST PUSH2 0x1A8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x5C8 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5EA CALLVALUE PUSH2 0x5E4 PUSH2 0x5DE PUSH1 0x0 PUSH2 0x5A5 JUMP JUMPDEST SWAP2 PUSH2 0x1A8 JUMP JUMPDEST EQ PUSH2 0x5C1 JUMP JUMPDEST JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x5F6 PUSH2 0x87A JUMP JUMPDEST PUSH2 0x611 PUSH2 0x60B PUSH2 0x606 PUSH1 0x0 PUSH2 0x3C JUMP JUMPDEST PUSH2 0x48 JUMP JUMPDEST SWAP2 PUSH2 0x48 JUMP JUMPDEST SUB PUSH2 0x62D JUMPI PUSH2 0x622 PUSH2 0x62B SWAP4 PUSH2 0x8B2 JUMP JUMPDEST SWAP1 PUSH1 0x0 SWAP2 PUSH2 0x98D JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 PUSH4 0xF92EE8A9 PUSH1 0xE0 SHL DUP2 MSTORE DUP1 PUSH2 0x646 PUSH1 0x4 DUP3 ADD PUSH2 0x65 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x652 PUSH2 0xAA6 JUMP JUMPDEST PUSH2 0xAE7 JUMP JUMPDEST PUSH2 0x660 SWAP1 PUSH2 0x48 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x678 SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0x657 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x682 PUSH2 0x54 JUMP JUMPDEST POP PUSH2 0x68B PUSH2 0x5CD JUMP JUMPDEST PUSH2 0x6AD PUSH2 0x6BC PUSH2 0x699 PUSH2 0xAA6 JUMP JUMPDEST PUSH2 0x6A1 PUSH2 0x1C7 JUMP JUMPDEST SWAP3 DUP4 SWAP2 PUSH1 0x20 DUP4 ADD PUSH2 0x664 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE SUB DUP3 PUSH2 0x263 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x6C7 PUSH2 0x54 JUMP JUMPDEST POP PUSH2 0x6D0 PUSH2 0x5CD JUMP JUMPDEST PUSH2 0x6F2 PUSH2 0x701 PUSH2 0x6DE PUSH2 0x17E JUMP JUMPDEST PUSH2 0x6E6 PUSH2 0x1C7 JUMP JUMPDEST SWAP3 DUP4 SWAP2 PUSH1 0x20 DUP4 ADD PUSH2 0x664 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE SUB DUP3 PUSH2 0x263 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x71E JUMPI PUSH2 0x71B SWAP2 PUSH1 0x0 ADD PUSH2 0x22A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1FF JUMP JUMPDEST PUSH2 0x72B PUSH2 0x54 JUMP JUMPDEST POP PUSH2 0x734 PUSH2 0x5CD JUMP JUMPDEST PUSH2 0x770 PUSH2 0x76B PUSH2 0x766 PUSH2 0x75E PUSH2 0x758 PUSH1 0x0 CALLDATASIZE PUSH2 0x750 PUSH1 0x4 PUSH2 0x1AB JUMP JUMPDEST SWAP1 DUP1 SWAP3 PUSH2 0x1D7 JUMP JUMPDEST SWAP1 PUSH2 0x1FC JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x704 JUMP JUMPDEST PUSH2 0x3A3 JUMP JUMPDEST PUSH2 0x8B2 JUMP JUMPDEST PUSH2 0x778 PUSH2 0x3F6 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH1 0x40 DUP2 DUP5 SUB SLT PUSH2 0x7BC JUMPI PUSH2 0x795 DUP4 PUSH1 0x0 DUP4 ADD PUSH2 0x22A JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x7B7 JUMPI PUSH2 0x7B4 SWAP3 ADD PUSH2 0x306 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x204 JUMP JUMPDEST PUSH2 0x1FF JUMP JUMPDEST PUSH2 0x7C9 PUSH2 0x54 JUMP JUMPDEST POP PUSH2 0x80C PUSH2 0x803 PUSH2 0x7FC PUSH2 0x7F4 PUSH2 0x7EE PUSH1 0x0 CALLDATASIZE PUSH2 0x7E6 PUSH1 0x4 PUSH2 0x1AB JUMP JUMPDEST SWAP1 DUP1 SWAP3 PUSH2 0x1D7 JUMP JUMPDEST SWAP1 PUSH2 0x1FC JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x77B JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x3A3 JUMP JUMPDEST SWAP1 PUSH1 0x1 SWAP2 PUSH2 0xB0A JUMP JUMPDEST PUSH2 0x814 PUSH2 0x3F6 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x81F PUSH2 0x54 JUMP JUMPDEST POP PUSH2 0x828 PUSH2 0x5CD JUMP JUMPDEST PUSH2 0x86F PUSH2 0x85F PUSH2 0x85A PUSH2 0x852 PUSH2 0x84C PUSH1 0x0 CALLDATASIZE PUSH2 0x844 PUSH1 0x4 PUSH2 0x1AB JUMP JUMPDEST SWAP1 DUP1 SWAP3 PUSH2 0x1D7 JUMP JUMPDEST SWAP1 PUSH2 0x1FC JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x704 JUMP JUMPDEST PUSH2 0x3A3 JUMP JUMPDEST PUSH2 0x867 PUSH2 0x3F6 JUMP JUMPDEST PUSH1 0x0 SWAP2 PUSH2 0xB0A JUMP JUMPDEST PUSH2 0x877 PUSH2 0x3F6 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x882 PUSH2 0xF3 JUMP JUMPDEST POP PUSH2 0x88B PUSH2 0x17E JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP2 PUSH1 0x20 PUSH2 0x8B0 SWAP3 SWAP5 SWAP4 PUSH2 0x8A9 PUSH1 0x40 DUP3 ADD SWAP7 PUSH1 0x0 DUP4 ADD SWAP1 PUSH2 0x657 JUMP JUMPDEST ADD SWAP1 PUSH2 0x657 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x8FD SWAP1 PUSH2 0x8BE PUSH2 0x17E JUMP JUMPDEST DUP2 PUSH32 0x7E644D79422F17C01E4894B5F4F588D331EBFA28653D42AE832DC59E38C9798F SWAP2 PUSH2 0x8F5 PUSH2 0x8EC PUSH2 0x1C7 JUMP JUMPDEST SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x88E JUMP JUMPDEST SUB SWAP1 LOG1 PUSH2 0xC4D JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x908 SWAP1 PUSH2 0x397 JUMP JUMPDEST SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH2 0x918 SWAP1 PUSH2 0x37B JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x924 SWAP1 PUSH2 0x90F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x930 SWAP1 PUSH2 0x397 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xE0 SHL SWAP1 JUMP JUMPDEST PUSH2 0x942 DUP2 PUSH2 0x48 JUMP JUMPDEST SUB PUSH2 0x949 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP MLOAD SWAP1 PUSH2 0x95B DUP3 PUSH2 0x939 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x977 JUMPI PUSH2 0x974 SWAP2 PUSH1 0x0 ADD PUSH2 0x94E JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1FF JUMP JUMPDEST PUSH2 0x984 PUSH2 0x1C7 JUMP JUMPDEST RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST SWAP2 PUSH2 0x997 DUP4 PUSH2 0xE30 JUMP JUMPDEST DUP3 PUSH2 0x9C2 PUSH32 0x1CF3B03A6CF19FA2BABA4DF148E9DCABEDEA7F8A5C07840E207E5C089BE95D3E SWAP2 PUSH2 0x8FF JUMP JUMPDEST SWAP1 PUSH2 0x9CB PUSH2 0x1C7 JUMP JUMPDEST DUP1 PUSH2 0x9D5 DUP2 PUSH2 0x65 JUMP JUMPDEST SUB SWAP1 LOG2 PUSH2 0x9E1 DUP3 PUSH2 0x90B JUMP JUMPDEST PUSH2 0x9F4 PUSH2 0x9EE PUSH1 0x0 PUSH2 0x5A5 JUMP JUMPDEST SWAP2 PUSH2 0x1A8 JUMP JUMPDEST GT SWAP1 DUP2 ISZERO PUSH2 0xA9E JUMPI JUMPDEST POP PUSH2 0xA07 JUMPI JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x20 PUSH2 0xA1D PUSH2 0xA18 PUSH2 0xA33 SWAP5 PUSH2 0x91B JUMP JUMPDEST PUSH2 0x927 JUMP JUMPDEST PUSH4 0x5C60DA1B SWAP1 PUSH2 0xA2B PUSH2 0x1C7 JUMP JUMPDEST SWAP5 DUP6 SWAP3 PUSH2 0x933 JUMP JUMPDEST DUP3 MSTORE DUP2 DUP1 PUSH2 0xA43 PUSH1 0x4 DUP3 ADD PUSH2 0x65 JUMP JUMPDEST SUB SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xA99 JUMPI PUSH2 0xA61 SWAP3 PUSH1 0x0 SWAP3 PUSH2 0xA69 JUMPI JUMPDEST POP SWAP1 PUSH2 0xF65 JUMP JUMPDEST POP CODESIZE DUP1 PUSH2 0xA03 JUMP JUMPDEST PUSH2 0xA8B SWAP2 SWAP3 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xA92 JUMPI JUMPDEST PUSH2 0xA83 DUP2 DUP4 PUSH2 0x263 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x95D JUMP JUMPDEST SWAP1 CODESIZE PUSH2 0xA5A JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xA79 JUMP JUMPDEST PUSH2 0x97C JUMP JUMPDEST SWAP1 POP CODESIZE PUSH2 0x9FD JUMP JUMPDEST PUSH2 0xAAE PUSH2 0xF3 JUMP JUMPDEST POP PUSH2 0xAB7 PUSH2 0xF85 JUMP JUMPDEST DUP1 PUSH2 0xAD3 PUSH2 0xACD PUSH2 0xAC8 PUSH1 0x0 PUSH2 0x3C JUMP JUMPDEST PUSH2 0x48 JUMP JUMPDEST SWAP2 PUSH2 0x48 JUMP JUMPDEST SUB PUSH2 0xAE4 JUMPI POP PUSH2 0xAE1 PUSH2 0xF99 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP2 CALLDATASIZE DUP3 DUP1 CALLDATACOPY DUP2 CALLDATASIZE SWAP2 GAS DELEGATECALL RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY PUSH1 0x0 EQ PUSH2 0xB05 JUMPI RETURNDATASIZE PUSH1 0x0 RETURN JUMPDEST RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH2 0xB14 DUP4 PUSH2 0x102F JUMP JUMPDEST PUSH2 0xB1D DUP3 PUSH2 0x90B JUMP JUMPDEST PUSH2 0xB30 PUSH2 0xB2A PUSH1 0x0 PUSH2 0x5A5 JUMP JUMPDEST SWAP2 PUSH2 0x1A8 JUMP JUMPDEST GT SWAP1 DUP2 ISZERO PUSH2 0xB54 JUMPI JUMPDEST POP PUSH2 0xB43 JUMPI JUMPDEST POP POP JUMP JUMPDEST PUSH2 0xB4C SWAP2 PUSH2 0xF65 JUMP JUMPDEST POP CODESIZE DUP1 PUSH2 0xB3F JUMP JUMPDEST SWAP1 POP CODESIZE PUSH2 0xB39 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0x455243313936373A206E65772061646D696E20697320746865207A65726F2061 PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xBC0 PUSH1 0x26 PUSH1 0x40 SWAP3 PUSH2 0xB5C JUMP JUMPDEST PUSH2 0xBC9 DUP2 PUSH2 0xB65 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0xBE3 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0xBB3 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0xBED JUMPI JUMP JUMPDEST PUSH2 0xBF5 PUSH2 0x1C7 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0xC0B PUSH1 0x4 DUP3 ADD PUSH2 0xBCD JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP1 PUSH2 0xC20 PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB SWAP2 PUSH2 0xFE JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0xC42 PUSH2 0xC3D PUSH2 0xC49 SWAP3 PUSH2 0x8FF JUMP JUMPDEST PUSH2 0xC2A JUMP JUMPDEST DUP3 SLOAD PUSH2 0xC0F JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH2 0xC8F SWAP1 PUSH2 0xC77 DUP2 PUSH2 0xC70 PUSH2 0xC6A PUSH2 0xC65 PUSH1 0x0 PUSH2 0x3C JUMP JUMPDEST PUSH2 0x48 JUMP JUMPDEST SWAP2 PUSH2 0x48 JUMP JUMPDEST EQ ISZERO PUSH2 0xBE6 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC89 PUSH2 0xC84 PUSH2 0x120 JUMP JUMPDEST PUSH2 0x5A2 JUMP JUMPDEST ADD PUSH2 0xC2D JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x20 PUSH32 0x7472616374000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0x455243313936373A206E657720626561636F6E206973206E6F74206120636F6E PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xCEC PUSH1 0x25 PUSH1 0x40 SWAP3 PUSH2 0xB5C JUMP JUMPDEST PUSH2 0xCF5 DUP2 PUSH2 0xC91 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0xD0F SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0xCDF JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0xD19 JUMPI JUMP JUMPDEST PUSH2 0xD21 PUSH2 0x1C7 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0xD37 PUSH1 0x4 DUP3 ADD PUSH2 0xCF9 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH1 0x20 PUSH32 0x73206E6F74206120636F6E747261637400000000000000000000000000000000 SWAP2 PUSH32 0x455243313936373A20626561636F6E20696D706C656D656E746174696F6E2069 PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xD96 PUSH1 0x30 PUSH1 0x40 SWAP3 PUSH2 0xB5C JUMP JUMPDEST PUSH2 0xD9F DUP2 PUSH2 0xD3B JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0xDB9 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0xD89 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0xDC3 JUMPI JUMP JUMPDEST PUSH2 0xDCB PUSH2 0x1C7 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0xDE1 PUSH1 0x4 DUP3 ADD PUSH2 0xDA3 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xDFC PUSH2 0xDF7 PUSH2 0xE01 SWAP3 PUSH2 0xDE5 JUMP JUMPDEST PUSH2 0xFE JUMP JUMPDEST PUSH2 0xFB JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xE2D PUSH32 0xA3F0AD74E5423AEBFD80D3EF4346578335A9A72AEAEE59FF6CB3582B35133D50 PUSH2 0xDE8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xE6E SWAP1 PUSH2 0xE45 PUSH2 0xE40 DUP3 PUSH2 0x107F JUMP JUMPDEST PUSH2 0xD12 JUMP JUMPDEST PUSH1 0x20 PUSH2 0xE58 PUSH2 0xE53 DUP4 PUSH2 0x91B JUMP JUMPDEST PUSH2 0x927 JUMP JUMPDEST PUSH4 0x5C60DA1B SWAP1 PUSH2 0xE66 PUSH2 0x1C7 JUMP JUMPDEST SWAP5 DUP6 SWAP3 PUSH2 0x933 JUMP JUMPDEST DUP3 MSTORE DUP2 DUP1 PUSH2 0xE7E PUSH1 0x4 DUP3 ADD PUSH2 0x65 JUMP JUMPDEST SUB SWAP2 GAS STATICCALL DUP1 ISZERO PUSH2 0xEEE JUMPI PUSH2 0xEA1 PUSH2 0xEA6 SWAP2 PUSH2 0xEBE SWAP5 PUSH1 0x0 SWAP2 PUSH2 0xEC0 JUMPI JUMPDEST POP PUSH2 0x107F JUMP JUMPDEST PUSH2 0xDBC JUMP JUMPDEST PUSH1 0x0 PUSH2 0xEB8 PUSH2 0xEB3 PUSH2 0xE04 JUMP JUMPDEST PUSH2 0x5A2 JUMP JUMPDEST ADD PUSH2 0xC2D JUMP JUMPDEST JUMP JUMPDEST PUSH2 0xEE1 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xEE7 JUMPI JUMPDEST PUSH2 0xED9 DUP2 DUP4 PUSH2 0x263 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x95D JUMP JUMPDEST CODESIZE PUSH2 0xE9B JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xECF JUMP JUMPDEST PUSH2 0x97C JUMP JUMPDEST PUSH1 0x20 PUSH32 0x206661696C656400000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0x416464726573733A206C6F772D6C6576656C2064656C65676174652063616C6C PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xF4B PUSH1 0x27 PUSH2 0x3D2 JUMP JUMPDEST SWAP1 PUSH2 0xF58 PUSH1 0x20 DUP4 ADD PUSH2 0xEF3 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0xF62 PUSH2 0xF41 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0xF82 SWAP2 PUSH2 0xF72 PUSH2 0x54 JUMP JUMPDEST POP SWAP1 PUSH2 0xF7C PUSH2 0xF5A JUMP JUMPDEST SWAP2 PUSH2 0x10E2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xF8D PUSH2 0xF3 JUMP JUMPDEST POP PUSH2 0xF96 PUSH2 0x1160 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xFA1 PUSH2 0xF3 JUMP JUMPDEST POP PUSH2 0xFD5 PUSH1 0x20 PUSH2 0xFBF PUSH2 0xFBA PUSH2 0xFB5 PUSH2 0x1187 JUMP JUMPDEST PUSH2 0x91B JUMP JUMPDEST PUSH2 0x927 JUMP JUMPDEST PUSH4 0x5C60DA1B SWAP1 PUSH2 0xFCD PUSH2 0x1C7 JUMP JUMPDEST SWAP4 DUP5 SWAP3 PUSH2 0x933 JUMP JUMPDEST DUP3 MSTORE DUP2 DUP1 PUSH2 0xFE5 PUSH1 0x4 DUP3 ADD PUSH2 0x65 JUMP JUMPDEST SUB SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x102A JUMPI PUSH1 0x0 SWAP2 PUSH2 0xFFC JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x101D SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x1023 JUMPI JUMPDEST PUSH2 0x1015 DUP2 DUP4 PUSH2 0x263 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x95D JUMP JUMPDEST CODESIZE PUSH2 0xFF8 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x100B JUMP JUMPDEST PUSH2 0x97C JUMP JUMPDEST PUSH2 0x1038 DUP2 PUSH2 0x1258 JUMP JUMPDEST PUSH2 0x1062 PUSH32 0xBC7CD75A20EE27FD9ADEBAB32041F755214DBC6BFFA90CC0225B39DA2E5C2D3B SWAP2 PUSH2 0x8FF JUMP JUMPDEST SWAP1 PUSH2 0x106B PUSH2 0x1C7 JUMP JUMPDEST DUP1 PUSH2 0x1075 DUP2 PUSH2 0x65 JUMP JUMPDEST SUB SWAP1 LOG2 JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x1087 PUSH2 0x107A JUMP JUMPDEST POP EXTCODESIZE PUSH2 0x109C PUSH2 0x1096 PUSH1 0x0 PUSH2 0x5A5 JUMP JUMPDEST SWAP2 PUSH2 0x1A8 JUMP JUMPDEST GT SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x10B2 PUSH2 0x10AD DUP4 PUSH2 0x2A1 JUMP JUMPDEST PUSH2 0x28C JUMP JUMPDEST SWAP2 DUP3 MSTORE JUMP JUMPDEST RETURNDATASIZE PUSH1 0x0 EQ PUSH2 0x10D4 JUMPI PUSH2 0x10C8 RETURNDATASIZE PUSH2 0x10A0 JUMP JUMPDEST SWAP1 RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST JUMP JUMPDEST PUSH2 0x10DC PUSH2 0x54 JUMP JUMPDEST SWAP1 PUSH2 0x10D2 JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x0 DUP1 PUSH2 0x1112 SWAP5 PUSH2 0x10F3 PUSH2 0x54 JUMP JUMPDEST POP DUP5 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 MLOAD SWAP2 GAS DELEGATECALL SWAP2 PUSH2 0x1108 PUSH2 0x10B7 JUMP JUMPDEST SWAP1 SWAP3 SWAP1 SWAP2 SWAP3 PUSH2 0x130B JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x112C PUSH2 0x1127 PUSH2 0x1131 SWAP3 PUSH2 0x1115 JUMP JUMPDEST PUSH2 0xFE JUMP JUMPDEST PUSH2 0xFB JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x115D PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC PUSH2 0x1118 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1168 PUSH2 0xF3 JUMP JUMPDEST POP PUSH2 0x1184 PUSH1 0x0 PUSH2 0x117E PUSH2 0x1179 PUSH2 0x1134 JUMP JUMPDEST PUSH2 0x5A2 JUMP JUMPDEST ADD PUSH2 0x171 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x118F PUSH2 0xF3 JUMP JUMPDEST POP PUSH2 0x11AB PUSH1 0x0 PUSH2 0x11A5 PUSH2 0x11A0 PUSH2 0xE04 JUMP JUMPDEST PUSH2 0x5A2 JUMP JUMPDEST ADD PUSH2 0x171 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x20 PUSH32 0x6F74206120636F6E747261637400000000000000000000000000000000000000 SWAP2 PUSH32 0x455243313936373A206E657720696D706C656D656E746174696F6E206973206E PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x1209 PUSH1 0x2D PUSH1 0x40 SWAP3 PUSH2 0xB5C JUMP JUMPDEST PUSH2 0x1212 DUP2 PUSH2 0x11AE JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x122C SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x11FC JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x1236 JUMPI JUMP JUMPDEST PUSH2 0x123E PUSH2 0x1C7 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x1254 PUSH1 0x4 DUP3 ADD PUSH2 0x1216 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x1285 SWAP1 PUSH2 0x126D PUSH2 0x1268 DUP3 PUSH2 0x107F JUMP JUMPDEST PUSH2 0x122F JUMP JUMPDEST PUSH1 0x0 PUSH2 0x127F PUSH2 0x127A PUSH2 0x1134 JUMP JUMPDEST PUSH2 0x5A2 JUMP JUMPDEST ADD PUSH2 0xC2D JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x12BC PUSH1 0x1D PUSH1 0x20 SWAP3 PUSH2 0xB5C JUMP JUMPDEST PUSH2 0x12C5 DUP2 PUSH2 0x1287 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x12DF SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x12AF JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x12E9 JUMPI JUMP JUMPDEST PUSH2 0x12F1 PUSH2 0x1C7 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x1307 PUSH1 0x4 DUP3 ADD PUSH2 0x12C9 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP2 SWAP3 SWAP1 PUSH2 0x1316 PUSH2 0x54 JUMP JUMPDEST POP PUSH1 0x0 EQ PUSH2 0x135C JUMPI POP PUSH2 0x1328 DUP3 PUSH2 0x90B JUMP JUMPDEST PUSH2 0x133B PUSH2 0x1335 PUSH1 0x0 PUSH2 0x5A5 JUMP JUMPDEST SWAP2 PUSH2 0x1A8 JUMP JUMPDEST EQ PUSH2 0x1345 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x1351 PUSH2 0x1356 SWAP2 PUSH2 0x107F JUMP JUMPDEST PUSH2 0x12E2 JUMP JUMPDEST CODESIZE PUSH2 0x1341 JUMP JUMPDEST DUP3 PUSH2 0x13D5 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x137A JUMPI POP POP SWAP1 PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP1 PUSH1 0x20 SWAP2 DUP4 ADD MLOAD DUP2 DUP6 ADD MSTORE ADD PUSH2 0x1369 JUMP JUMPDEST PUSH2 0x13AA PUSH2 0x13B3 PUSH1 0x20 SWAP4 PUSH2 0x13B8 SWAP4 PUSH2 0x13A1 DUP2 PUSH2 0x1362 JUMP JUMPDEST SWAP4 DUP5 DUP1 SWAP4 PUSH2 0xB5C JUMP JUMPDEST SWAP6 DUP7 SWAP2 ADD PUSH2 0x1366 JUMP JUMPDEST PUSH2 0x243 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x13D2 SWAP2 PUSH1 0x20 DUP3 ADD SWAP2 PUSH1 0x0 DUP2 DUP5 SUB SWAP2 ADD MSTORE PUSH2 0x138B JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x13DF DUP3 PUSH2 0x90B JUMP JUMPDEST PUSH2 0x13F2 PUSH2 0x13EC PUSH1 0x0 PUSH2 0x5A5 JUMP JUMPDEST SWAP2 PUSH2 0x1A8 JUMP JUMPDEST GT PUSH1 0x0 EQ PUSH2 0x1403 JUMPI POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD REVERT JUMPDEST PUSH2 0x1424 SWAP1 PUSH2 0x140F PUSH2 0x1C7 JUMP JUMPDEST SWAP2 DUP3 SWAP2 PUSH3 0x461BCD PUSH1 0xE5 SHL DUP4 MSTORE PUSH1 0x4 DUP4 ADD PUSH2 0x13BC JUMP JUMPDEST SUB SWAP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xFB XOR SWAP10 0xE6 0x1F CODESIZE STATICCALL 0xA7 DUP12 0xFB 0xAB PUSH26 0xB8DC2FA613357C2FCE2699411F9FEE80B624365564736F6C6343 STOP ADDMOD SHL STOP CALLER ", + "sourceMap": "1165:2219:34:-:0;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "abi_decode_address_fromMemory": { + "entryPoint": 2382, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_address_payable": { + "entryPoint": 554, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_address_payablet_address_payablet_bytes": { + "entryPoint": 809, + "id": null, + "parameterSlots": 2, + "returnSlots": 3 + }, + "abi_decode_address_payablet_bytes": { + "entryPoint": 1915, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_available_length_bytes": { + "entryPoint": 720, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_decode_bytes": { + "entryPoint": 774, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_address_fromMemory": { + "entryPoint": 2397, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_address_payable": { + "entryPoint": 1796, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_address": { + "entryPoint": 1623, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_address_address": { + "entryPoint": 2190, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_string": { + "entryPoint": 5052, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_string_memory_ptr": { + "entryPoint": 5003, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_stringliteral": { + "entryPoint": 3321, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_stringliteral_3820": { + "entryPoint": 2995, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_stringliteral_9589": { + "entryPoint": 3295, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_stringliteral_972b": { + "entryPoint": 4604, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_stringliteral_cc2e": { + "entryPoint": 4809, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad": { + "entryPoint": 4783, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_stringliteral_f95f": { + "entryPoint": 3491, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_stringliteral_f95fd1f5b5578816eb23f6ca0f2439b4b5e4094dc16e99c3b8e91603a83f93c8": { + "entryPoint": 3465, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple": { + "entryPoint": 101, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple_address": { + "entryPoint": 1636, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_stringliteral": { + "entryPoint": 3021, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple_stringliteral_972b": { + "entryPoint": 4630, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "allocate_memory": { + "entryPoint": 652, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "allocate_memory_array_bytes": { + "entryPoint": 4256, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "allocate_memory_array_string": { + "entryPoint": 978, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "allocate_unbounded": { + "entryPoint": 455, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "array_allocation_size_bytes": { + "entryPoint": 673, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_allocation_size_string": { + "entryPoint": 943, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_length_bytes": { + "entryPoint": 2315, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_length_string": { + "entryPoint": 4962, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_storeLengthForEncoding_string": { + "entryPoint": 2908, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "calldata_array_index_range_access_bytes_calldata": { + "entryPoint": 471, + "id": null, + "parameterSlots": 4, + "returnSlots": 2 + }, + "cleanup_address": { + "entryPoint": 72, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_address_payable": { + "entryPoint": 521, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_bytes32": { + "entryPoint": 251, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_bytes4": { + "entryPoint": 89, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_from_storage_address": { + "entryPoint": 338, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_rational_24440054405305269366569402256811496959409073762505157381672968839269610695612_by": { + "entryPoint": 4373, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_rational_by": { + "entryPoint": 3557, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_rational_by_1": { + "entryPoint": 248, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_t_rational_by": { + "entryPoint": 421, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_t_rational_by_1": { + "entryPoint": 15, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_uint160": { + "entryPoint": 18, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_uint256": { + "entryPoint": 424, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "constant_ADMIN_SLOT": { + "entryPoint": 288, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "constant_BEACON_SLOT": { + "entryPoint": 3588, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "constant_IMPLEMENTATION_SLOT": { + "entryPoint": 4404, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "convert_address_payable_to_address": { + "entryPoint": 931, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_address_to_address": { + "entryPoint": 2303, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_address_to_contract_IBeacon": { + "entryPoint": 2331, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_bytes_calldata_slice_to_bytes_calldata": { + "entryPoint": 508, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "convert_contract_IBeacon_to_address": { + "entryPoint": 2343, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_74152234768234802001998023604048924213078445070507226371336425913862612794704_by_1_to_bytes32": { + "entryPoint": 3560, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_by_to_address": { + "entryPoint": 60, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_by_to_bytes32": { + "entryPoint": 4376, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_by_to_uint160": { + "entryPoint": 32, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_by_to_uint256": { + "entryPoint": 427, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_stringliteral_9fdc_to_string": { + "entryPoint": 3930, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "convert_stringliteral_c5d2_to_bytes": { + "entryPoint": 1014, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "convert_t_rational_by_to_t_bytes32": { + "entryPoint": 260, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_t_rational_by_to_t_uint256": { + "entryPoint": 1445, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint160_to_address": { + "entryPoint": 919, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint160_to_contract_IBeacon": { + "entryPoint": 2319, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint160_to_uint160": { + "entryPoint": 891, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "copy_calldata_to_memory_with_cleanup": { + "entryPoint": 708, + "id": null, + "parameterSlots": 3, + "returnSlots": 0 + }, + "copy_literal_to_memory_9fdcd12e4b726339b32a442b0a448365d5d85c96b2d2cff917b4f66c63110398": { + "entryPoint": 3905, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "copy_literal_to_memory_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470": { + "entryPoint": 1001, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "copy_memory_to_memory_with_cleanup": { + "entryPoint": 4966, + "id": null, + "parameterSlots": 3, + "returnSlots": 0 + }, + "extract_from_storage_value_offsett_address": { + "entryPoint": 349, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "extract_returndata": { + "entryPoint": 4279, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "finalize_allocation": { + "entryPoint": 611, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun": { + "entryPoint": null, + "id": 1051, + "parameterSlots": 0, + "returnSlots": 0 + }, + "fun_": { + "entryPoint": null, + "id": 1043, + "parameterSlots": 0, + "returnSlots": 0 + }, + "fun__fallback": { + "entryPoint": 1610, + "id": 1035, + "parameterSlots": 0, + "returnSlots": 0 + }, + "fun__implementation": { + "entryPoint": 3993, + "id": 8001, + "parameterSlots": 0, + "returnSlots": 1 + }, + "fun_admin": { + "entryPoint": 2170, + "id": 8330, + "parameterSlots": 0, + "returnSlots": 1 + }, + "fun_changeAdmin": { + "entryPoint": 2226, + "id": 913, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_delegate": { + "entryPoint": 2791, + "id": 1016, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_dispatchAdmin": { + "entryPoint": 1727, + "id": 8205, + "parameterSlots": 0, + "returnSlots": 1 + }, + "fun_dispatchChangeAdmin": { + "entryPoint": 1827, + "id": 8254, + "parameterSlots": 0, + "returnSlots": 1 + }, + "fun_dispatchImplementation": { + "entryPoint": 1658, + "id": 8225, + "parameterSlots": 0, + "returnSlots": 1 + }, + "fun_dispatchInitialize": { + "entryPoint": 1025, + "id": 7857, + "parameterSlots": 0, + "returnSlots": 1 + }, + "fun_dispatchUpgradeTo": { + "entryPoint": 2071, + "id": 8288, + "parameterSlots": 0, + "returnSlots": 1 + }, + "fun_dispatchUpgradeToAndCall": { + "entryPoint": 1985, + "id": 8320, + "parameterSlots": 0, + "returnSlots": 1 + }, + "fun_fallback": { + "entryPoint": 107, + "id": 7935, + "parameterSlots": 0, + "returnSlots": 0 + }, + "fun_fallback_8185": { + "entryPoint": 1132, + "id": 8185, + "parameterSlots": 0, + "returnSlots": 0 + }, + "fun_functionDelegateCall": { + "entryPoint": 3941, + "id": 1557, + "parameterSlots": 2, + "returnSlots": 1 + }, + "fun_functionDelegateCall_1586": { + "entryPoint": 4322, + "id": 1586, + "parameterSlots": 3, + "returnSlots": 1 + }, + "fun_getAddressSlot": { + "entryPoint": 1442, + "id": 1805, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_getAdmin": { + "entryPoint": 382, + "id": 870, + "parameterSlots": 0, + "returnSlots": 1 + }, + "fun_getBeacon": { + "entryPoint": 4487, + "id": 930, + "parameterSlots": 0, + "returnSlots": 1 + }, + "fun_getImplementation": { + "entryPoint": 4448, + "id": 731, + "parameterSlots": 0, + "returnSlots": 1 + }, + "fun_implementation": { + "entryPoint": 2726, + "id": 7965, + "parameterSlots": 0, + "returnSlots": 1 + }, + "fun_implementation_8038": { + "entryPoint": 3973, + "id": 8038, + "parameterSlots": 0, + "returnSlots": 1 + }, + "fun_initialize": { + "entryPoint": 1516, + "id": 7889, + "parameterSlots": 3, + "returnSlots": 0 + }, + "fun_isContract": { + "entryPoint": 4223, + "id": 1358, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_requireZeroValue": { + "entryPoint": 1485, + "id": 8342, + "parameterSlots": 0, + "returnSlots": 0 + }, + "fun_revert": { + "entryPoint": 5077, + "id": 1669, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun_setAdmin": { + "entryPoint": 3149, + "id": 896, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_setBeacon": { + "entryPoint": 3632, + "id": 966, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_setImplementation": { + "entryPoint": 4696, + "id": 755, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_upgradeBeaconToAndCall": { + "entryPoint": 2445, + "id": 1004, + "parameterSlots": 3, + "returnSlots": 0 + }, + "fun_upgradeTo": { + "entryPoint": 4143, + "id": 770, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_upgradeToAndCall": { + "entryPoint": 2826, + "id": 800, + "parameterSlots": 3, + "returnSlots": 0 + }, + "fun_verifyCallResultFromTarget": { + "entryPoint": 4875, + "id": 1625, + "parameterSlots": 4, + "returnSlots": 1 + }, + "identity": { + "entryPoint": 29, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "panic_error_0x41": { + "entryPoint": 589, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "prepare_store_address": { + "entryPoint": 3114, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "read_from_storage_split_offset_address": { + "entryPoint": 369, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "require_helper": { + "entryPoint": 1473, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "require_helper_stringliteral": { + "entryPoint": 3046, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "require_helper_stringliteral_9589": { + "entryPoint": 3346, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "require_helper_stringliteral_972b": { + "entryPoint": 4655, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "require_helper_stringliteral_cc2e": { + "entryPoint": 4834, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "require_helper_stringliteral_f95f": { + "entryPoint": 3516, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "revert_error_1b9f4a0a5773e33b91aa01db23bf8c55fce1411167c872835e7fa00a4f17d46d": { + "entryPoint": 569, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_46e3e63c93837e9efa638abb3b4e76ced8c11259a873f1381a0abdf6ae6a823c": { + "entryPoint": 466, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_7678404c0552a58cf14944d1a786cf4c81aab3563e2735cb332aee47bbb57c4a": { + "entryPoint": 461, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_987264b3b1d58a9c7f8255e93e81c77d86d6299019c33110a076957a3e06e2ae": { + "entryPoint": 574, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db": { + "entryPoint": 516, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b": { + "entryPoint": 511, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_forward": { + "entryPoint": 2428, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "round_up_to_mul_of": { + "entryPoint": 579, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_left": { + "entryPoint": 254, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_left_224": { + "entryPoint": 2355, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_right_unsigned": { + "entryPoint": 332, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "store_literal_in_memory_3820e16891102c1360a787e6e648431097d92537f969d458f5c94b56f8318be5": { + "entryPoint": 2917, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "store_literal_in_memory_9589b7809634e4928033de18bb696e9af4ef71b703652af5245f2dbebf2f4470": { + "entryPoint": 3217, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "store_literal_in_memory_972b7028e8de0bff0d553b3264eba2312ec98a552add05e58853b313f9f4ac65": { + "entryPoint": 4526, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "store_literal_in_memory_9fdcd12e4b726339b32a442b0a448365d5d85c96b2d2cff917b4f66c63110398": { + "entryPoint": 3827, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "store_literal_in_memory_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad": { + "entryPoint": 4743, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "store_literal_in_memory_f95fd1f5b5578816eb23f6ca0f2439b4b5e4094dc16e99c3b8e91603a83f93c8": { + "entryPoint": 3387, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "update_byte_slice_shift": { + "entryPoint": 3087, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "update_storage_value_offsett_address_to_address": { + "entryPoint": 3117, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "validator_revert_address": { + "entryPoint": 2361, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "validator_revert_address_payable": { + "entryPoint": 533, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "zero_value_for_split_address": { + "entryPoint": 243, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "zero_value_for_split_bool": { + "entryPoint": 4218, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "zero_value_for_split_bytes": { + "entryPoint": 84, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + } + }, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "6080604052361561006b5761006b565b90565b60018060a01b031690565b90565b61003461002f6100399261000f565b61001d565b610012565b90565b61004590610020565b90565b61005190610012565b90565b606090565b63ffffffff60e01b1690565b60000190565b61007361017e565b61008e610088610083600061003c565b610048565b91610048565b0361046c5761009b610054565b5063ffffffff60e01b600035166100c16100bb63cf7a1d7760e01b610059565b91610059565b146100e357600063f92ee8a960e01b8152806100df60048201610065565b0390fd5b6100eb610401565b602081519101f35b600090565b90565b90565b60001b90565b61011861011361011d926100f8565b6100fe565b6100fb565b90565b6101497fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103610104565b90565b60001c90565b60018060a01b031690565b61016961016e9161014c565b610152565b90565b61017b905461015d565b90565b6101866100f3565b506101a2600061019c610197610120565b6105a2565b01610171565b90565b90565b90565b6101bf6101ba6101c4926101a5565b61001d565b6101a8565b90565b60405190565b600080fd5b600080fd5b909392938483116101f75784116101f2576001820201920390565b6101d2565b6101cd565b91565b600080fd5b600080fd5b61021290610012565b90565b61021e81610209565b0361022557565b600080fd5b9050359061023782610215565b565b600080fd5b600080fd5b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b9061026d90610243565b810190811067ffffffffffffffff82111761028757604052565b61024d565b9061029f6102986101c7565b9283610263565b565b67ffffffffffffffff81116102bf576102bb602091610243565b0190565b61024d565b90826000939282370152565b909291926102e56102e0826102a1565b61028c565b93818552602085019082840111610301576102ff926102c4565b565b61023e565b9080601f8301121561032457816020610321933591016102d0565b90565b610239565b9160608383031261037657610341826000850161022a565b9261034f836020830161022a565b92604082013567ffffffffffffffff81116103715761036e9201610306565b90565b610204565b6101ff565b61038f61038a61039492610012565b61001d565b610012565b90565b6103a09061037b565b90565b6103ac90610397565b90565b67ffffffffffffffff81116103cd576103c9602091610243565b0190565b61024d565b906103e46103df836103af565b61028c565b918252565b6103f360006103d2565b90565b6103fe6103e9565b90565b610409610054565b506104126105cd565b61046161045761045161044761043f61043960003661043160046101ab565b9080926101d7565b906101fc565b810190610329565b93919290926103a3565b916103a3565b91909190916105ec565b6104696103f6565b90565b3361048661048061047b61017e565b610048565b91610048565b1460001461059d57610496610054565b5063ffffffff60e01b60003516806104bd6104b7631b2ce7f360e11b610059565b91610059565b146000146104d757506104ce610817565b5b602081519101f35b806104f16104eb63278f794360e11b610059565b91610059565b1460001461050857506105026107c1565b5b6104cf565b8061052261051c6308f2839760e41b610059565b91610059565b146000146105395750610533610723565b5b610503565b8061055361054d6303e1469160e61b610059565b91610059565b1460001461056a57506105646106bf565b5b610534565b61058361057d635c60da1b60e01b610059565b91610059565b146000146105985761059361067a565b610565565b61064a565b61064a565b90565b6105b96105b46105be9261000f565b61001d565b6101a8565b90565b156105c857565b600080fd5b6105ea346105e46105de60006105a5565b916101a8565b146105c1565b565b91906105f661087a565b61061161060b610606600061003c565b610048565b91610048565b0361062d5761062261062b936108b2565b9060009161098d565b565b600063f92ee8a960e01b81528061064660048201610065565b0390fd5b610652610aa6565b610ae7565b61066090610048565b9052565b919061067890600060208501940190610657565b565b610682610054565b5061068b6105cd565b6106ad6106bc610699610aa6565b6106a16101c7565b92839160208301610664565b60208201810382520382610263565b90565b6106c7610054565b506106d06105cd565b6106f26107016106de61017e565b6106e66101c7565b92839160208301610664565b60208201810382520382610263565b90565b9060208282031261071e5761071b9160000161022a565b90565b6101ff565b61072b610054565b506107346105cd565b61077061076b61076661075e61075860003661075060046101ab565b9080926101d7565b906101fc565b810190610704565b6103a3565b6108b2565b6107786103f6565b90565b9190916040818403126107bc57610795836000830161022a565b92602082013567ffffffffffffffff81116107b7576107b49201610306565b90565b610204565b6101ff565b6107c9610054565b5061080c6108036107fc6107f46107ee6000366107e660046101ab565b9080926101d7565b906101fc565b81019061077b565b91906103a3565b90600191610b0a565b6108146103f6565b90565b61081f610054565b506108286105cd565b61086f61085f61085a61085261084c60003661084460046101ab565b9080926101d7565b906101fc565b810190610704565b6103a3565b6108676103f6565b600091610b0a565b6108776103f6565b90565b6108826100f3565b5061088b61017e565b90565b9160206108b09294936108a960408201966000830190610657565b0190610657565b565b6108fd906108be61017e565b817f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f916108f56108ec6101c7565b9283928361088e565b0390a1610c4d565b565b61090890610397565b90565b5190565b6109189061037b565b90565b6109249061090f565b90565b61093090610397565b90565b60e01b90565b61094281610048565b0361094957565b600080fd5b9050519061095b82610939565b565b90602082820312610977576109749160000161094e565b90565b6101ff565b6109846101c7565b3d6000823e3d90fd5b9161099783610e30565b826109c27f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e916108ff565b906109cb6101c7565b806109d581610065565b0390a26109e18261090b565b6109f46109ee60006105a5565b916101a8565b11908115610a9e575b50610a07575b5050565b6020610a1d610a18610a339461091b565b610927565b635c60da1b90610a2b6101c7565b948592610933565b82528180610a4360048201610065565b03915afa908115610a9957610a6192600092610a69575b5090610f65565b503880610a03565b610a8b91925060203d8111610a92575b610a838183610263565b81019061095d565b9038610a5a565b503d610a79565b61097c565b9050386109fd565b610aae6100f3565b50610ab7610f85565b80610ad3610acd610ac8600061003c565b610048565b91610048565b03610ae45750610ae1610f99565b90565b90565b60008091368280378136915af43d6000803e600014610b05573d6000f35b3d6000fd5b91610b148361102f565b610b1d8261090b565b610b30610b2a60006105a5565b916101a8565b11908115610b54575b50610b43575b5050565b610b4c91610f65565b503880610b3f565b905038610b39565b60209181520190565b60207f6464726573730000000000000000000000000000000000000000000000000000917f455243313936373a206e65772061646d696e20697320746865207a65726f206160008201520152565b610bc06026604092610b5c565b610bc981610b65565b0190565b610be39060208101906000818303910152610bb3565b90565b15610bed57565b610bf56101c7565b62461bcd60e51b815280610c0b60048201610bcd565b0390fd5b90610c2060018060a01b03916100fe565b9181191691161790565b90565b90610c42610c3d610c49926108ff565b610c2a565b8254610c0f565b9055565b610c8f90610c7781610c70610c6a610c65600061003c565b610048565b91610048565b1415610be6565b6000610c89610c84610120565b6105a2565b01610c2d565b565b60207f7472616374000000000000000000000000000000000000000000000000000000917f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e60008201520152565b610cec6025604092610b5c565b610cf581610c91565b0190565b610d0f9060208101906000818303910152610cdf565b90565b15610d1957565b610d216101c7565b62461bcd60e51b815280610d3760048201610cf9565b0390fd5b60207f73206e6f74206120636f6e747261637400000000000000000000000000000000917f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960008201520152565b610d966030604092610b5c565b610d9f81610d3b565b0190565b610db99060208101906000818303910152610d89565b90565b15610dc357565b610dcb6101c7565b62461bcd60e51b815280610de160048201610da3565b0390fd5b90565b610dfc610df7610e0192610de5565b6100fe565b6100fb565b90565b610e2d7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50610de8565b90565b610e6e90610e45610e408261107f565b610d12565b6020610e58610e538361091b565b610927565b635c60da1b90610e666101c7565b948592610933565b82528180610e7e60048201610065565b03915afa8015610eee57610ea1610ea691610ebe94600091610ec0575b5061107f565b610dbc565b6000610eb8610eb3610e04565b6105a2565b01610c2d565b565b610ee1915060203d8111610ee7575b610ed98183610263565b81019061095d565b38610e9b565b503d610ecf565b61097c565b60207f206661696c656400000000000000000000000000000000000000000000000000917f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c60008201520152565b610f4b60276103d2565b90610f5860208301610ef3565b565b610f62610f41565b90565b90610f8291610f72610054565b5090610f7c610f5a565b916110e2565b90565b610f8d6100f3565b50610f96611160565b90565b610fa16100f3565b50610fd56020610fbf610fba610fb5611187565b61091b565b610927565b635c60da1b90610fcd6101c7565b938492610933565b82528180610fe560048201610065565b03915afa90811561102a57600091610ffc575b5090565b61101d915060203d8111611023575b6110158183610263565b81019061095d565b38610ff8565b503d61100b565b61097c565b61103881611258565b6110627fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b916108ff565b9061106b6101c7565b8061107581610065565b0390a2565b600090565b61108761107a565b503b61109c61109660006105a5565b916101a8565b1190565b906110b26110ad836102a1565b61028c565b918252565b3d6000146110d4576110c83d6110a0565b903d6000602084013e5b565b6110dc610054565b906110d2565b9091600080611112946110f3610054565b508490602081019051915af4916111086110b7565b909290919261130b565b90565b90565b61112c61112761113192611115565b6100fe565b6100fb565b90565b61115d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc611118565b90565b6111686100f3565b50611184600061117e611179611134565b6105a2565b01610171565b90565b61118f6100f3565b506111ab60006111a56111a0610e04565b6105a2565b01610171565b90565b60207f6f74206120636f6e747261637400000000000000000000000000000000000000917f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60008201520152565b611209602d604092610b5c565b611212816111ae565b0190565b61122c90602081019060008183039101526111fc565b90565b1561123657565b61123e6101c7565b62461bcd60e51b81528061125460048201611216565b0390fd5b6112859061126d6112688261107f565b61122f565b600061127f61127a611134565b6105a2565b01610c2d565b565b60007f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000910152565b6112bc601d602092610b5c565b6112c581611287565b0190565b6112df90602081019060008183039101526112af565b90565b156112e957565b6112f16101c7565b62461bcd60e51b815280611307600482016112c9565b0390fd5b919290611316610054565b5060001461135c57506113288261090b565b61133b61133560006105a5565b916101a8565b14611345575b5090565b6113516113569161107f565b6112e2565b38611341565b826113d5565b5190565b60005b83811061137a575050906000910152565b806020918301518185015201611369565b6113aa6113b36020936113b8936113a181611362565b93848093610b5c565b95869101611366565b610243565b0190565b6113d2916020820191600081840391015261138b565b90565b906113df8261090b565b6113f26113ec60006105a5565b916101a8565b116000146114035750805190602001fd5b6114249061140f6101c7565b91829162461bcd60e51b8352600483016113bc565b0390fdfea2646970667358221220fb1899e61f38faa78bfbab79b8dc2fa613357c2fce2699411f9fee80b624365564736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLDATASIZE ISZERO PUSH2 0x6B JUMPI PUSH2 0x6B JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x34 PUSH2 0x2F PUSH2 0x39 SWAP3 PUSH2 0xF JUMP JUMPDEST PUSH2 0x1D JUMP JUMPDEST PUSH2 0x12 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x45 SWAP1 PUSH2 0x20 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x51 SWAP1 PUSH2 0x12 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x60 SWAP1 JUMP JUMPDEST PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL AND SWAP1 JUMP JUMPDEST PUSH1 0x0 ADD SWAP1 JUMP JUMPDEST PUSH2 0x73 PUSH2 0x17E JUMP JUMPDEST PUSH2 0x8E PUSH2 0x88 PUSH2 0x83 PUSH1 0x0 PUSH2 0x3C JUMP JUMPDEST PUSH2 0x48 JUMP JUMPDEST SWAP2 PUSH2 0x48 JUMP JUMPDEST SUB PUSH2 0x46C JUMPI PUSH2 0x9B PUSH2 0x54 JUMP JUMPDEST POP PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL PUSH1 0x0 CALLDATALOAD AND PUSH2 0xC1 PUSH2 0xBB PUSH4 0xCF7A1D77 PUSH1 0xE0 SHL PUSH2 0x59 JUMP JUMPDEST SWAP2 PUSH2 0x59 JUMP JUMPDEST EQ PUSH2 0xE3 JUMPI PUSH1 0x0 PUSH4 0xF92EE8A9 PUSH1 0xE0 SHL DUP2 MSTORE DUP1 PUSH2 0xDF PUSH1 0x4 DUP3 ADD PUSH2 0x65 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0xEB PUSH2 0x401 JUMP JUMPDEST PUSH1 0x20 DUP2 MLOAD SWAP2 ADD RETURN JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SHL SWAP1 JUMP JUMPDEST PUSH2 0x118 PUSH2 0x113 PUSH2 0x11D SWAP3 PUSH2 0xF8 JUMP JUMPDEST PUSH2 0xFE JUMP JUMPDEST PUSH2 0xFB JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x149 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 PUSH2 0x104 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SHR SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x169 PUSH2 0x16E SWAP2 PUSH2 0x14C JUMP JUMPDEST PUSH2 0x152 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x17B SWAP1 SLOAD PUSH2 0x15D JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x186 PUSH2 0xF3 JUMP JUMPDEST POP PUSH2 0x1A2 PUSH1 0x0 PUSH2 0x19C PUSH2 0x197 PUSH2 0x120 JUMP JUMPDEST PUSH2 0x5A2 JUMP JUMPDEST ADD PUSH2 0x171 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1BF PUSH2 0x1BA PUSH2 0x1C4 SWAP3 PUSH2 0x1A5 JUMP JUMPDEST PUSH2 0x1D JUMP JUMPDEST PUSH2 0x1A8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP4 SWAP3 SWAP4 DUP5 DUP4 GT PUSH2 0x1F7 JUMPI DUP5 GT PUSH2 0x1F2 JUMPI PUSH1 0x1 DUP3 MUL ADD SWAP3 SUB SWAP1 JUMP JUMPDEST PUSH2 0x1D2 JUMP JUMPDEST PUSH2 0x1CD JUMP JUMPDEST SWAP2 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x212 SWAP1 PUSH2 0x12 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x21E DUP2 PUSH2 0x209 JUMP JUMPDEST SUB PUSH2 0x225 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x237 DUP3 PUSH2 0x215 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1F DUP1 NOT SWAP2 ADD AND SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH2 0x26D SWAP1 PUSH2 0x243 JUMP JUMPDEST DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x287 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH2 0x24D JUMP JUMPDEST SWAP1 PUSH2 0x29F PUSH2 0x298 PUSH2 0x1C7 JUMP JUMPDEST SWAP3 DUP4 PUSH2 0x263 JUMP JUMPDEST JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BF JUMPI PUSH2 0x2BB PUSH1 0x20 SWAP2 PUSH2 0x243 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x24D JUMP JUMPDEST SWAP1 DUP3 PUSH1 0x0 SWAP4 SWAP3 DUP3 CALLDATACOPY ADD MSTORE JUMP JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x2E5 PUSH2 0x2E0 DUP3 PUSH2 0x2A1 JUMP JUMPDEST PUSH2 0x28C JUMP JUMPDEST SWAP4 DUP2 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP1 DUP3 DUP5 ADD GT PUSH2 0x301 JUMPI PUSH2 0x2FF SWAP3 PUSH2 0x2C4 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x23E JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x324 JUMPI DUP2 PUSH1 0x20 PUSH2 0x321 SWAP4 CALLDATALOAD SWAP2 ADD PUSH2 0x2D0 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x239 JUMP JUMPDEST SWAP2 PUSH1 0x60 DUP4 DUP4 SUB SLT PUSH2 0x376 JUMPI PUSH2 0x341 DUP3 PUSH1 0x0 DUP6 ADD PUSH2 0x22A JUMP JUMPDEST SWAP3 PUSH2 0x34F DUP4 PUSH1 0x20 DUP4 ADD PUSH2 0x22A JUMP JUMPDEST SWAP3 PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x371 JUMPI PUSH2 0x36E SWAP3 ADD PUSH2 0x306 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x204 JUMP JUMPDEST PUSH2 0x1FF JUMP JUMPDEST PUSH2 0x38F PUSH2 0x38A PUSH2 0x394 SWAP3 PUSH2 0x12 JUMP JUMPDEST PUSH2 0x1D JUMP JUMPDEST PUSH2 0x12 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3A0 SWAP1 PUSH2 0x37B JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3AC SWAP1 PUSH2 0x397 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3CD JUMPI PUSH2 0x3C9 PUSH1 0x20 SWAP2 PUSH2 0x243 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x24D JUMP JUMPDEST SWAP1 PUSH2 0x3E4 PUSH2 0x3DF DUP4 PUSH2 0x3AF JUMP JUMPDEST PUSH2 0x28C JUMP JUMPDEST SWAP2 DUP3 MSTORE JUMP JUMPDEST PUSH2 0x3F3 PUSH1 0x0 PUSH2 0x3D2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3FE PUSH2 0x3E9 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x409 PUSH2 0x54 JUMP JUMPDEST POP PUSH2 0x412 PUSH2 0x5CD JUMP JUMPDEST PUSH2 0x461 PUSH2 0x457 PUSH2 0x451 PUSH2 0x447 PUSH2 0x43F PUSH2 0x439 PUSH1 0x0 CALLDATASIZE PUSH2 0x431 PUSH1 0x4 PUSH2 0x1AB JUMP JUMPDEST SWAP1 DUP1 SWAP3 PUSH2 0x1D7 JUMP JUMPDEST SWAP1 PUSH2 0x1FC JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x329 JUMP JUMPDEST SWAP4 SWAP2 SWAP3 SWAP1 SWAP3 PUSH2 0x3A3 JUMP JUMPDEST SWAP2 PUSH2 0x3A3 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 SWAP1 SWAP2 PUSH2 0x5EC JUMP JUMPDEST PUSH2 0x469 PUSH2 0x3F6 JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLER PUSH2 0x486 PUSH2 0x480 PUSH2 0x47B PUSH2 0x17E JUMP JUMPDEST PUSH2 0x48 JUMP JUMPDEST SWAP2 PUSH2 0x48 JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0x59D JUMPI PUSH2 0x496 PUSH2 0x54 JUMP JUMPDEST POP PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL PUSH1 0x0 CALLDATALOAD AND DUP1 PUSH2 0x4BD PUSH2 0x4B7 PUSH4 0x1B2CE7F3 PUSH1 0xE1 SHL PUSH2 0x59 JUMP JUMPDEST SWAP2 PUSH2 0x59 JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0x4D7 JUMPI POP PUSH2 0x4CE PUSH2 0x817 JUMP JUMPDEST JUMPDEST PUSH1 0x20 DUP2 MLOAD SWAP2 ADD RETURN JUMPDEST DUP1 PUSH2 0x4F1 PUSH2 0x4EB PUSH4 0x278F7943 PUSH1 0xE1 SHL PUSH2 0x59 JUMP JUMPDEST SWAP2 PUSH2 0x59 JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0x508 JUMPI POP PUSH2 0x502 PUSH2 0x7C1 JUMP JUMPDEST JUMPDEST PUSH2 0x4CF JUMP JUMPDEST DUP1 PUSH2 0x522 PUSH2 0x51C PUSH4 0x8F28397 PUSH1 0xE4 SHL PUSH2 0x59 JUMP JUMPDEST SWAP2 PUSH2 0x59 JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0x539 JUMPI POP PUSH2 0x533 PUSH2 0x723 JUMP JUMPDEST JUMPDEST PUSH2 0x503 JUMP JUMPDEST DUP1 PUSH2 0x553 PUSH2 0x54D PUSH4 0x3E14691 PUSH1 0xE6 SHL PUSH2 0x59 JUMP JUMPDEST SWAP2 PUSH2 0x59 JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0x56A JUMPI POP PUSH2 0x564 PUSH2 0x6BF JUMP JUMPDEST JUMPDEST PUSH2 0x534 JUMP JUMPDEST PUSH2 0x583 PUSH2 0x57D PUSH4 0x5C60DA1B PUSH1 0xE0 SHL PUSH2 0x59 JUMP JUMPDEST SWAP2 PUSH2 0x59 JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0x598 JUMPI PUSH2 0x593 PUSH2 0x67A JUMP JUMPDEST PUSH2 0x565 JUMP JUMPDEST PUSH2 0x64A JUMP JUMPDEST PUSH2 0x64A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x5B9 PUSH2 0x5B4 PUSH2 0x5BE SWAP3 PUSH2 0xF JUMP JUMPDEST PUSH2 0x1D JUMP JUMPDEST PUSH2 0x1A8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x5C8 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5EA CALLVALUE PUSH2 0x5E4 PUSH2 0x5DE PUSH1 0x0 PUSH2 0x5A5 JUMP JUMPDEST SWAP2 PUSH2 0x1A8 JUMP JUMPDEST EQ PUSH2 0x5C1 JUMP JUMPDEST JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x5F6 PUSH2 0x87A JUMP JUMPDEST PUSH2 0x611 PUSH2 0x60B PUSH2 0x606 PUSH1 0x0 PUSH2 0x3C JUMP JUMPDEST PUSH2 0x48 JUMP JUMPDEST SWAP2 PUSH2 0x48 JUMP JUMPDEST SUB PUSH2 0x62D JUMPI PUSH2 0x622 PUSH2 0x62B SWAP4 PUSH2 0x8B2 JUMP JUMPDEST SWAP1 PUSH1 0x0 SWAP2 PUSH2 0x98D JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 PUSH4 0xF92EE8A9 PUSH1 0xE0 SHL DUP2 MSTORE DUP1 PUSH2 0x646 PUSH1 0x4 DUP3 ADD PUSH2 0x65 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x652 PUSH2 0xAA6 JUMP JUMPDEST PUSH2 0xAE7 JUMP JUMPDEST PUSH2 0x660 SWAP1 PUSH2 0x48 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x678 SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0x657 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x682 PUSH2 0x54 JUMP JUMPDEST POP PUSH2 0x68B PUSH2 0x5CD JUMP JUMPDEST PUSH2 0x6AD PUSH2 0x6BC PUSH2 0x699 PUSH2 0xAA6 JUMP JUMPDEST PUSH2 0x6A1 PUSH2 0x1C7 JUMP JUMPDEST SWAP3 DUP4 SWAP2 PUSH1 0x20 DUP4 ADD PUSH2 0x664 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE SUB DUP3 PUSH2 0x263 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x6C7 PUSH2 0x54 JUMP JUMPDEST POP PUSH2 0x6D0 PUSH2 0x5CD JUMP JUMPDEST PUSH2 0x6F2 PUSH2 0x701 PUSH2 0x6DE PUSH2 0x17E JUMP JUMPDEST PUSH2 0x6E6 PUSH2 0x1C7 JUMP JUMPDEST SWAP3 DUP4 SWAP2 PUSH1 0x20 DUP4 ADD PUSH2 0x664 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE SUB DUP3 PUSH2 0x263 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x71E JUMPI PUSH2 0x71B SWAP2 PUSH1 0x0 ADD PUSH2 0x22A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1FF JUMP JUMPDEST PUSH2 0x72B PUSH2 0x54 JUMP JUMPDEST POP PUSH2 0x734 PUSH2 0x5CD JUMP JUMPDEST PUSH2 0x770 PUSH2 0x76B PUSH2 0x766 PUSH2 0x75E PUSH2 0x758 PUSH1 0x0 CALLDATASIZE PUSH2 0x750 PUSH1 0x4 PUSH2 0x1AB JUMP JUMPDEST SWAP1 DUP1 SWAP3 PUSH2 0x1D7 JUMP JUMPDEST SWAP1 PUSH2 0x1FC JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x704 JUMP JUMPDEST PUSH2 0x3A3 JUMP JUMPDEST PUSH2 0x8B2 JUMP JUMPDEST PUSH2 0x778 PUSH2 0x3F6 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH1 0x40 DUP2 DUP5 SUB SLT PUSH2 0x7BC JUMPI PUSH2 0x795 DUP4 PUSH1 0x0 DUP4 ADD PUSH2 0x22A JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x7B7 JUMPI PUSH2 0x7B4 SWAP3 ADD PUSH2 0x306 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x204 JUMP JUMPDEST PUSH2 0x1FF JUMP JUMPDEST PUSH2 0x7C9 PUSH2 0x54 JUMP JUMPDEST POP PUSH2 0x80C PUSH2 0x803 PUSH2 0x7FC PUSH2 0x7F4 PUSH2 0x7EE PUSH1 0x0 CALLDATASIZE PUSH2 0x7E6 PUSH1 0x4 PUSH2 0x1AB JUMP JUMPDEST SWAP1 DUP1 SWAP3 PUSH2 0x1D7 JUMP JUMPDEST SWAP1 PUSH2 0x1FC JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x77B JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x3A3 JUMP JUMPDEST SWAP1 PUSH1 0x1 SWAP2 PUSH2 0xB0A JUMP JUMPDEST PUSH2 0x814 PUSH2 0x3F6 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x81F PUSH2 0x54 JUMP JUMPDEST POP PUSH2 0x828 PUSH2 0x5CD JUMP JUMPDEST PUSH2 0x86F PUSH2 0x85F PUSH2 0x85A PUSH2 0x852 PUSH2 0x84C PUSH1 0x0 CALLDATASIZE PUSH2 0x844 PUSH1 0x4 PUSH2 0x1AB JUMP JUMPDEST SWAP1 DUP1 SWAP3 PUSH2 0x1D7 JUMP JUMPDEST SWAP1 PUSH2 0x1FC JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x704 JUMP JUMPDEST PUSH2 0x3A3 JUMP JUMPDEST PUSH2 0x867 PUSH2 0x3F6 JUMP JUMPDEST PUSH1 0x0 SWAP2 PUSH2 0xB0A JUMP JUMPDEST PUSH2 0x877 PUSH2 0x3F6 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x882 PUSH2 0xF3 JUMP JUMPDEST POP PUSH2 0x88B PUSH2 0x17E JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP2 PUSH1 0x20 PUSH2 0x8B0 SWAP3 SWAP5 SWAP4 PUSH2 0x8A9 PUSH1 0x40 DUP3 ADD SWAP7 PUSH1 0x0 DUP4 ADD SWAP1 PUSH2 0x657 JUMP JUMPDEST ADD SWAP1 PUSH2 0x657 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x8FD SWAP1 PUSH2 0x8BE PUSH2 0x17E JUMP JUMPDEST DUP2 PUSH32 0x7E644D79422F17C01E4894B5F4F588D331EBFA28653D42AE832DC59E38C9798F SWAP2 PUSH2 0x8F5 PUSH2 0x8EC PUSH2 0x1C7 JUMP JUMPDEST SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x88E JUMP JUMPDEST SUB SWAP1 LOG1 PUSH2 0xC4D JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x908 SWAP1 PUSH2 0x397 JUMP JUMPDEST SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH2 0x918 SWAP1 PUSH2 0x37B JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x924 SWAP1 PUSH2 0x90F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x930 SWAP1 PUSH2 0x397 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xE0 SHL SWAP1 JUMP JUMPDEST PUSH2 0x942 DUP2 PUSH2 0x48 JUMP JUMPDEST SUB PUSH2 0x949 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP MLOAD SWAP1 PUSH2 0x95B DUP3 PUSH2 0x939 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x977 JUMPI PUSH2 0x974 SWAP2 PUSH1 0x0 ADD PUSH2 0x94E JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1FF JUMP JUMPDEST PUSH2 0x984 PUSH2 0x1C7 JUMP JUMPDEST RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST SWAP2 PUSH2 0x997 DUP4 PUSH2 0xE30 JUMP JUMPDEST DUP3 PUSH2 0x9C2 PUSH32 0x1CF3B03A6CF19FA2BABA4DF148E9DCABEDEA7F8A5C07840E207E5C089BE95D3E SWAP2 PUSH2 0x8FF JUMP JUMPDEST SWAP1 PUSH2 0x9CB PUSH2 0x1C7 JUMP JUMPDEST DUP1 PUSH2 0x9D5 DUP2 PUSH2 0x65 JUMP JUMPDEST SUB SWAP1 LOG2 PUSH2 0x9E1 DUP3 PUSH2 0x90B JUMP JUMPDEST PUSH2 0x9F4 PUSH2 0x9EE PUSH1 0x0 PUSH2 0x5A5 JUMP JUMPDEST SWAP2 PUSH2 0x1A8 JUMP JUMPDEST GT SWAP1 DUP2 ISZERO PUSH2 0xA9E JUMPI JUMPDEST POP PUSH2 0xA07 JUMPI JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x20 PUSH2 0xA1D PUSH2 0xA18 PUSH2 0xA33 SWAP5 PUSH2 0x91B JUMP JUMPDEST PUSH2 0x927 JUMP JUMPDEST PUSH4 0x5C60DA1B SWAP1 PUSH2 0xA2B PUSH2 0x1C7 JUMP JUMPDEST SWAP5 DUP6 SWAP3 PUSH2 0x933 JUMP JUMPDEST DUP3 MSTORE DUP2 DUP1 PUSH2 0xA43 PUSH1 0x4 DUP3 ADD PUSH2 0x65 JUMP JUMPDEST SUB SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xA99 JUMPI PUSH2 0xA61 SWAP3 PUSH1 0x0 SWAP3 PUSH2 0xA69 JUMPI JUMPDEST POP SWAP1 PUSH2 0xF65 JUMP JUMPDEST POP CODESIZE DUP1 PUSH2 0xA03 JUMP JUMPDEST PUSH2 0xA8B SWAP2 SWAP3 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xA92 JUMPI JUMPDEST PUSH2 0xA83 DUP2 DUP4 PUSH2 0x263 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x95D JUMP JUMPDEST SWAP1 CODESIZE PUSH2 0xA5A JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xA79 JUMP JUMPDEST PUSH2 0x97C JUMP JUMPDEST SWAP1 POP CODESIZE PUSH2 0x9FD JUMP JUMPDEST PUSH2 0xAAE PUSH2 0xF3 JUMP JUMPDEST POP PUSH2 0xAB7 PUSH2 0xF85 JUMP JUMPDEST DUP1 PUSH2 0xAD3 PUSH2 0xACD PUSH2 0xAC8 PUSH1 0x0 PUSH2 0x3C JUMP JUMPDEST PUSH2 0x48 JUMP JUMPDEST SWAP2 PUSH2 0x48 JUMP JUMPDEST SUB PUSH2 0xAE4 JUMPI POP PUSH2 0xAE1 PUSH2 0xF99 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP2 CALLDATASIZE DUP3 DUP1 CALLDATACOPY DUP2 CALLDATASIZE SWAP2 GAS DELEGATECALL RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY PUSH1 0x0 EQ PUSH2 0xB05 JUMPI RETURNDATASIZE PUSH1 0x0 RETURN JUMPDEST RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH2 0xB14 DUP4 PUSH2 0x102F JUMP JUMPDEST PUSH2 0xB1D DUP3 PUSH2 0x90B JUMP JUMPDEST PUSH2 0xB30 PUSH2 0xB2A PUSH1 0x0 PUSH2 0x5A5 JUMP JUMPDEST SWAP2 PUSH2 0x1A8 JUMP JUMPDEST GT SWAP1 DUP2 ISZERO PUSH2 0xB54 JUMPI JUMPDEST POP PUSH2 0xB43 JUMPI JUMPDEST POP POP JUMP JUMPDEST PUSH2 0xB4C SWAP2 PUSH2 0xF65 JUMP JUMPDEST POP CODESIZE DUP1 PUSH2 0xB3F JUMP JUMPDEST SWAP1 POP CODESIZE PUSH2 0xB39 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0x455243313936373A206E65772061646D696E20697320746865207A65726F2061 PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xBC0 PUSH1 0x26 PUSH1 0x40 SWAP3 PUSH2 0xB5C JUMP JUMPDEST PUSH2 0xBC9 DUP2 PUSH2 0xB65 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0xBE3 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0xBB3 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0xBED JUMPI JUMP JUMPDEST PUSH2 0xBF5 PUSH2 0x1C7 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0xC0B PUSH1 0x4 DUP3 ADD PUSH2 0xBCD JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP1 PUSH2 0xC20 PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB SWAP2 PUSH2 0xFE JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0xC42 PUSH2 0xC3D PUSH2 0xC49 SWAP3 PUSH2 0x8FF JUMP JUMPDEST PUSH2 0xC2A JUMP JUMPDEST DUP3 SLOAD PUSH2 0xC0F JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH2 0xC8F SWAP1 PUSH2 0xC77 DUP2 PUSH2 0xC70 PUSH2 0xC6A PUSH2 0xC65 PUSH1 0x0 PUSH2 0x3C JUMP JUMPDEST PUSH2 0x48 JUMP JUMPDEST SWAP2 PUSH2 0x48 JUMP JUMPDEST EQ ISZERO PUSH2 0xBE6 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC89 PUSH2 0xC84 PUSH2 0x120 JUMP JUMPDEST PUSH2 0x5A2 JUMP JUMPDEST ADD PUSH2 0xC2D JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x20 PUSH32 0x7472616374000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0x455243313936373A206E657720626561636F6E206973206E6F74206120636F6E PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xCEC PUSH1 0x25 PUSH1 0x40 SWAP3 PUSH2 0xB5C JUMP JUMPDEST PUSH2 0xCF5 DUP2 PUSH2 0xC91 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0xD0F SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0xCDF JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0xD19 JUMPI JUMP JUMPDEST PUSH2 0xD21 PUSH2 0x1C7 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0xD37 PUSH1 0x4 DUP3 ADD PUSH2 0xCF9 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH1 0x20 PUSH32 0x73206E6F74206120636F6E747261637400000000000000000000000000000000 SWAP2 PUSH32 0x455243313936373A20626561636F6E20696D706C656D656E746174696F6E2069 PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xD96 PUSH1 0x30 PUSH1 0x40 SWAP3 PUSH2 0xB5C JUMP JUMPDEST PUSH2 0xD9F DUP2 PUSH2 0xD3B JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0xDB9 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0xD89 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0xDC3 JUMPI JUMP JUMPDEST PUSH2 0xDCB PUSH2 0x1C7 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0xDE1 PUSH1 0x4 DUP3 ADD PUSH2 0xDA3 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xDFC PUSH2 0xDF7 PUSH2 0xE01 SWAP3 PUSH2 0xDE5 JUMP JUMPDEST PUSH2 0xFE JUMP JUMPDEST PUSH2 0xFB JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xE2D PUSH32 0xA3F0AD74E5423AEBFD80D3EF4346578335A9A72AEAEE59FF6CB3582B35133D50 PUSH2 0xDE8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xE6E SWAP1 PUSH2 0xE45 PUSH2 0xE40 DUP3 PUSH2 0x107F JUMP JUMPDEST PUSH2 0xD12 JUMP JUMPDEST PUSH1 0x20 PUSH2 0xE58 PUSH2 0xE53 DUP4 PUSH2 0x91B JUMP JUMPDEST PUSH2 0x927 JUMP JUMPDEST PUSH4 0x5C60DA1B SWAP1 PUSH2 0xE66 PUSH2 0x1C7 JUMP JUMPDEST SWAP5 DUP6 SWAP3 PUSH2 0x933 JUMP JUMPDEST DUP3 MSTORE DUP2 DUP1 PUSH2 0xE7E PUSH1 0x4 DUP3 ADD PUSH2 0x65 JUMP JUMPDEST SUB SWAP2 GAS STATICCALL DUP1 ISZERO PUSH2 0xEEE JUMPI PUSH2 0xEA1 PUSH2 0xEA6 SWAP2 PUSH2 0xEBE SWAP5 PUSH1 0x0 SWAP2 PUSH2 0xEC0 JUMPI JUMPDEST POP PUSH2 0x107F JUMP JUMPDEST PUSH2 0xDBC JUMP JUMPDEST PUSH1 0x0 PUSH2 0xEB8 PUSH2 0xEB3 PUSH2 0xE04 JUMP JUMPDEST PUSH2 0x5A2 JUMP JUMPDEST ADD PUSH2 0xC2D JUMP JUMPDEST JUMP JUMPDEST PUSH2 0xEE1 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xEE7 JUMPI JUMPDEST PUSH2 0xED9 DUP2 DUP4 PUSH2 0x263 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x95D JUMP JUMPDEST CODESIZE PUSH2 0xE9B JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xECF JUMP JUMPDEST PUSH2 0x97C JUMP JUMPDEST PUSH1 0x20 PUSH32 0x206661696C656400000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0x416464726573733A206C6F772D6C6576656C2064656C65676174652063616C6C PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xF4B PUSH1 0x27 PUSH2 0x3D2 JUMP JUMPDEST SWAP1 PUSH2 0xF58 PUSH1 0x20 DUP4 ADD PUSH2 0xEF3 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0xF62 PUSH2 0xF41 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0xF82 SWAP2 PUSH2 0xF72 PUSH2 0x54 JUMP JUMPDEST POP SWAP1 PUSH2 0xF7C PUSH2 0xF5A JUMP JUMPDEST SWAP2 PUSH2 0x10E2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xF8D PUSH2 0xF3 JUMP JUMPDEST POP PUSH2 0xF96 PUSH2 0x1160 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xFA1 PUSH2 0xF3 JUMP JUMPDEST POP PUSH2 0xFD5 PUSH1 0x20 PUSH2 0xFBF PUSH2 0xFBA PUSH2 0xFB5 PUSH2 0x1187 JUMP JUMPDEST PUSH2 0x91B JUMP JUMPDEST PUSH2 0x927 JUMP JUMPDEST PUSH4 0x5C60DA1B SWAP1 PUSH2 0xFCD PUSH2 0x1C7 JUMP JUMPDEST SWAP4 DUP5 SWAP3 PUSH2 0x933 JUMP JUMPDEST DUP3 MSTORE DUP2 DUP1 PUSH2 0xFE5 PUSH1 0x4 DUP3 ADD PUSH2 0x65 JUMP JUMPDEST SUB SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x102A JUMPI PUSH1 0x0 SWAP2 PUSH2 0xFFC JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x101D SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x1023 JUMPI JUMPDEST PUSH2 0x1015 DUP2 DUP4 PUSH2 0x263 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x95D JUMP JUMPDEST CODESIZE PUSH2 0xFF8 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x100B JUMP JUMPDEST PUSH2 0x97C JUMP JUMPDEST PUSH2 0x1038 DUP2 PUSH2 0x1258 JUMP JUMPDEST PUSH2 0x1062 PUSH32 0xBC7CD75A20EE27FD9ADEBAB32041F755214DBC6BFFA90CC0225B39DA2E5C2D3B SWAP2 PUSH2 0x8FF JUMP JUMPDEST SWAP1 PUSH2 0x106B PUSH2 0x1C7 JUMP JUMPDEST DUP1 PUSH2 0x1075 DUP2 PUSH2 0x65 JUMP JUMPDEST SUB SWAP1 LOG2 JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x1087 PUSH2 0x107A JUMP JUMPDEST POP EXTCODESIZE PUSH2 0x109C PUSH2 0x1096 PUSH1 0x0 PUSH2 0x5A5 JUMP JUMPDEST SWAP2 PUSH2 0x1A8 JUMP JUMPDEST GT SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x10B2 PUSH2 0x10AD DUP4 PUSH2 0x2A1 JUMP JUMPDEST PUSH2 0x28C JUMP JUMPDEST SWAP2 DUP3 MSTORE JUMP JUMPDEST RETURNDATASIZE PUSH1 0x0 EQ PUSH2 0x10D4 JUMPI PUSH2 0x10C8 RETURNDATASIZE PUSH2 0x10A0 JUMP JUMPDEST SWAP1 RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST JUMP JUMPDEST PUSH2 0x10DC PUSH2 0x54 JUMP JUMPDEST SWAP1 PUSH2 0x10D2 JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x0 DUP1 PUSH2 0x1112 SWAP5 PUSH2 0x10F3 PUSH2 0x54 JUMP JUMPDEST POP DUP5 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 MLOAD SWAP2 GAS DELEGATECALL SWAP2 PUSH2 0x1108 PUSH2 0x10B7 JUMP JUMPDEST SWAP1 SWAP3 SWAP1 SWAP2 SWAP3 PUSH2 0x130B JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x112C PUSH2 0x1127 PUSH2 0x1131 SWAP3 PUSH2 0x1115 JUMP JUMPDEST PUSH2 0xFE JUMP JUMPDEST PUSH2 0xFB JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x115D PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC PUSH2 0x1118 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1168 PUSH2 0xF3 JUMP JUMPDEST POP PUSH2 0x1184 PUSH1 0x0 PUSH2 0x117E PUSH2 0x1179 PUSH2 0x1134 JUMP JUMPDEST PUSH2 0x5A2 JUMP JUMPDEST ADD PUSH2 0x171 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x118F PUSH2 0xF3 JUMP JUMPDEST POP PUSH2 0x11AB PUSH1 0x0 PUSH2 0x11A5 PUSH2 0x11A0 PUSH2 0xE04 JUMP JUMPDEST PUSH2 0x5A2 JUMP JUMPDEST ADD PUSH2 0x171 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x20 PUSH32 0x6F74206120636F6E747261637400000000000000000000000000000000000000 SWAP2 PUSH32 0x455243313936373A206E657720696D706C656D656E746174696F6E206973206E PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x1209 PUSH1 0x2D PUSH1 0x40 SWAP3 PUSH2 0xB5C JUMP JUMPDEST PUSH2 0x1212 DUP2 PUSH2 0x11AE JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x122C SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x11FC JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x1236 JUMPI JUMP JUMPDEST PUSH2 0x123E PUSH2 0x1C7 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x1254 PUSH1 0x4 DUP3 ADD PUSH2 0x1216 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x1285 SWAP1 PUSH2 0x126D PUSH2 0x1268 DUP3 PUSH2 0x107F JUMP JUMPDEST PUSH2 0x122F JUMP JUMPDEST PUSH1 0x0 PUSH2 0x127F PUSH2 0x127A PUSH2 0x1134 JUMP JUMPDEST PUSH2 0x5A2 JUMP JUMPDEST ADD PUSH2 0xC2D JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x12BC PUSH1 0x1D PUSH1 0x20 SWAP3 PUSH2 0xB5C JUMP JUMPDEST PUSH2 0x12C5 DUP2 PUSH2 0x1287 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x12DF SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x12AF JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x12E9 JUMPI JUMP JUMPDEST PUSH2 0x12F1 PUSH2 0x1C7 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x1307 PUSH1 0x4 DUP3 ADD PUSH2 0x12C9 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP2 SWAP3 SWAP1 PUSH2 0x1316 PUSH2 0x54 JUMP JUMPDEST POP PUSH1 0x0 EQ PUSH2 0x135C JUMPI POP PUSH2 0x1328 DUP3 PUSH2 0x90B JUMP JUMPDEST PUSH2 0x133B PUSH2 0x1335 PUSH1 0x0 PUSH2 0x5A5 JUMP JUMPDEST SWAP2 PUSH2 0x1A8 JUMP JUMPDEST EQ PUSH2 0x1345 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x1351 PUSH2 0x1356 SWAP2 PUSH2 0x107F JUMP JUMPDEST PUSH2 0x12E2 JUMP JUMPDEST CODESIZE PUSH2 0x1341 JUMP JUMPDEST DUP3 PUSH2 0x13D5 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x137A JUMPI POP POP SWAP1 PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP1 PUSH1 0x20 SWAP2 DUP4 ADD MLOAD DUP2 DUP6 ADD MSTORE ADD PUSH2 0x1369 JUMP JUMPDEST PUSH2 0x13AA PUSH2 0x13B3 PUSH1 0x20 SWAP4 PUSH2 0x13B8 SWAP4 PUSH2 0x13A1 DUP2 PUSH2 0x1362 JUMP JUMPDEST SWAP4 DUP5 DUP1 SWAP4 PUSH2 0xB5C JUMP JUMPDEST SWAP6 DUP7 SWAP2 ADD PUSH2 0x1366 JUMP JUMPDEST PUSH2 0x243 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x13D2 SWAP2 PUSH1 0x20 DUP3 ADD SWAP2 PUSH1 0x0 DUP2 DUP5 SUB SWAP2 ADD MSTORE PUSH2 0x138B JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x13DF DUP3 PUSH2 0x90B JUMP JUMPDEST PUSH2 0x13F2 PUSH2 0x13EC PUSH1 0x0 PUSH2 0x5A5 JUMP JUMPDEST SWAP2 PUSH2 0x1A8 JUMP JUMPDEST GT PUSH1 0x0 EQ PUSH2 0x1403 JUMPI POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD REVERT JUMPDEST PUSH2 0x1424 SWAP1 PUSH2 0x140F PUSH2 0x1C7 JUMP JUMPDEST SWAP2 DUP3 SWAP2 PUSH3 0x461BCD PUSH1 0xE5 SHL DUP4 MSTORE PUSH1 0x4 DUP4 ADD PUSH2 0x13BC JUMP JUMPDEST SUB SWAP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xFB XOR SWAP10 0xE6 0x1F CODESIZE STATICCALL 0xA7 DUP12 0xFB 0xAB PUSH26 0xB8DC2FA613357C2FCE2699411F9FEE80B624365564736F6C6343 STOP ADDMOD SHL STOP CALLER ", + "sourceMap": "1165:2219:34:-:0;;;;;2853:63:9;1165:2219:34;2629:64:9;:::i;1165:2219:34:-;;:::o;:::-;;;;;;;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;:::o;:::-;;;;;;:::o;:::-;;;;:::o;2210:701::-;2299:11;;:::i;:::-;:25;;2314:10;2322:1;2314:10;:::i;:::-;2299:25;:::i;:::-;;;:::i;:::-;;2295:561;;2340:16;;:::i;:::-;1165:2219;;;;2388:7;;;2413:66;;2425:54;;;2413:66;:::i;:::-;;;:::i;:::-;;2409:296;;2822:23;;;;;;;;;;;;:::i;:::-;;;;2409:296;2505:21;;:::i;:::-;2608:83;;;;;;1165:2219;;;:::o;:::-;;:::o;:::-;;:::o;:::-;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;3616:106:8:-;3656:66;;;:::i;:::-;3616:106;:::o;3656:66::-;;;;:::o;:::-;1165:2219:34;;;;;3656:66:8;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;3784:122::-;3828:7;;:::i;:::-;3881:11;3854:45;;:39;3881:11;;:::i;:::-;3854:39;:::i;:::-;:45;;:::i;:::-;3847:52;:::o;1165:2219:34:-;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;:::i;:::-;;;;:::i;:::-;:::o;:::-;;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;:::i;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;:::-;;;;;;:::i;:::-;;:::i;:::-;;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;:::i;:::-;;:::o;1365:274::-;1413:12;;:::i;:::-;;;;:::i;:::-;1607:4;1467:104;;1520:51;;1531:12;:8;;:12;1540:1;1531:12;:::i;:::-;;;;;:::i;:::-;1520:51;;:::i;:::-;;;;;:::i;:::-;1467:104;;;;;;:::i;:::-;;;:::i;:::-;;1592:5;1599:6;1607:4;;;:::i;:::-;1623:9;;:::i;:::-;;:::o;3518:1089:37:-;3579:10;:25;;3593:11;;:::i;:::-;3579:25;:::i;:::-;;;:::i;:::-;;3575:1026;;;;3620:16;;:::i;:::-;1165:2219:34;;;;3668:7:37;;;3693:8;:59;;3705:47;;;3693:59;:::i;:::-;;;:::i;:::-;;3689:766;;;;3778:20;;;:::i;:::-;3689:766;4468:75;;;;;;3689:766;3823:8;:66;;3835:54;;;3823:66;:::i;:::-;;;:::i;:::-;;3819:636;;;;3915:27;;;:::i;:::-;3819:636;3689:766;;3819:636;3967:8;:61;;3979:49;;;3967:61;:::i;:::-;;;:::i;:::-;;3963:492;;;;4054:22;;;:::i;:::-;3963:492;3819:636;;3963:492;4101:8;:55;;4113:43;;;4101:55;:::i;:::-;;;:::i;:::-;;4097:358;;;;4182:16;;;:::i;:::-;4097:358;3963:492;;4097:358;4223:64;;4235:52;;;4223:64;:::i;:::-;;;:::i;:::-;;4219:236;;;;4313:25;;:::i;:::-;4097:358;;4219:236;;:::i;3575:1026::-;;:::i;1859:190:16:-;;:::o;1165:2219:34:-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;;7359:78:37;7407:23;7415:9;:14;;7428:1;7415:14;:::i;:::-;;;:::i;:::-;;7407:23;:::i;:::-;7359:78::o;1645:352:34:-;;;1738:8;;:::i;:::-;:22;;1750:10;1758:1;1750:10;:::i;:::-;1738:22;:::i;:::-;;;:::i;:::-;;1734:174;;1930:5;1984;1930;;:::i;:::-;1978:4;1984:5;;;:::i;:::-;1645:352::o;1734:174::-;1874:23;2822;;;1874;;;;;;;;:::i;:::-;;;;2322:110:9;2407:17;;:::i;:::-;;:::i;1165:2219:34:-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;:::o;5483:198:37:-;5535:12;;:::i;:::-;;;;:::i;:::-;5648:26;;5614:17;;:::i;:::-;5648:26;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;5641:33;:::o;4958:165::-;5001:12;;:::i;:::-;;;;:::i;:::-;5099:17;;5071:11;;:::i;:::-;5099:17;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;5092:24;:::o;1165:2219:34:-;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;5792:216:37:-;5841:12;;:::i;:::-;;;;:::i;:::-;5972:8;5895:54;5914:35;;5925:12;:8;;:12;5934:1;5925:12;:::i;:::-;;;;;:::i;:::-;5914:35;;:::i;:::-;;;;;:::i;:::-;5895:54;:::i;:::-;5972:8;:::i;:::-;5992:9;;:::i;:::-;;:::o;1165:2219:34:-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;:::i;6622:254:37:-;6676:12;;:::i;:::-;6760:8;6844:4;6700:91;6749:42;;6760:12;:8;;:12;6769:1;6760:12;:::i;:::-;;;;;:::i;:::-;6749:42;;:::i;:::-;;;;;:::i;:::-;6700:91;;;:::i;:::-;6838:4;6844;;;:::i;:::-;6860:9;;:::i;:::-;;:::o;6083:255::-;6130:12;;:::i;:::-;;;;:::i;:::-;6305:5;6184:63;6212:35;;6223:12;:8;;:12;6232:1;6223:12;:::i;:::-;;;;;:::i;:::-;6212:35;;:::i;:::-;;;;;:::i;:::-;6184:63;:::i;:::-;6294:9;;:::i;:::-;6305:5;;;:::i;:::-;6322:9;;:::i;:::-;;:::o;7029:93::-;7078:7;;:::i;:::-;7104:11;;;:::i;:::-;7097:18;:::o;1165:2219:34:-;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;:::o;4300:135:8:-;4419:8;4300:135;4377:11;;:::i;:::-;4390:8;4364:35;;;;;:::i;:::-;;;;;;:::i;:::-;;;;4419:8;:::i;:::-;4300:135::o;1165:2219:34:-;;;;:::i;:::-;;:::o;:::-;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;:::i;:::-;;;;;;;;5728:313:8;;5845:9;;;:::i;:::-;5885;5870:25;;;;:::i;:::-;;;;:::i;:::-;;;;;:::i;:::-;;;;5909:11;:4;:11;:::i;:::-;:15;;5923:1;5909:15;:::i;:::-;;;:::i;:::-;;:28;;;;;5728:313;5905:130;;;5728:313;;;:::o;5905:130::-;5982:35;:33;:18;:35;5990:9;5982:18;:::i;:::-;:33;:::i;:::-;;:35;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;5953:71;5982:35;;;;;5905:130;6019:4;5953:71;;:::i;:::-;;5905:130;;;;5982:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;;:::i;5909:28::-;5928:9;;5909:28;;;3079:302:34;3165:7;;:::i;:::-;3209:30;;;:::i;:::-;3253:14;:28;;3271:10;3279:1;3271:10;:::i;:::-;3253:28;:::i;:::-;;;:::i;:::-;;3249:80;;3345:29;;;:::i;:::-;3338:36;:::o;3249:80::-;3297:21;:::o;948:895:9:-;1018:819;948:895;;1018:819;;;;;;;;;;;;;;;;;;;;;;;;2057:265:8;;2176:17;;;:::i;:::-;2208:11;:4;:11;:::i;:::-;:15;;2222:1;2208:15;:::i;:::-;;;:::i;:::-;;:28;;;;;2057:265;2204:112;;;2057:265;;;:::o;2204:112::-;2252:53;2281:17;2252:53;:::i;:::-;;2204:112;;;;2208:28;2227:9;;2208:28;;;1165:2219:34;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;:::o;:::-;;;;;;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;3988:201:8:-;4126:56;3988:201;4043:73;4051:8;:22;;4063:10;4071:1;4063:10;:::i;:::-;4051:22;:::i;:::-;;;:::i;:::-;;;4043:73;:::i;:::-;4126:45;:39;4153:11;;:::i;:::-;4126:39;:::i;:::-;:45;:56;:::i;:::-;3988:201::o;1165:2219:34:-;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;4678:107:8:-;4719:66;;;:::i;:::-;4678:107;:::o;5054:371::-;5240:35;5054:371;5111:79;5119:29;5138:9;5119:29;:::i;:::-;5111:79;:::i;:::-;5240:35;:33;:18;5248:9;5240:18;:::i;:::-;:33;:::i;:::-;;:35;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;5221:55;5200:150;5240:35;5360:58;5240:35;;;;;5054:371;5221:55;;:::i;:::-;5200:150;:::i;:::-;5360:46;:40;5387:12;;:::i;:::-;5360:40;:::i;:::-;:46;:58;:::i;:::-;5054:371::o;5240:35::-;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;:::i;1165:2219:34:-;;;;;;;;;;;:::o;:::-;;;;:::i;:::-;;;;;;;:::i;:::-;:::o;:::-;;;:::i;:::-;;:::o;6674:198:13:-;;6788:77;6674:198;6757:12;;:::i;:::-;6809:6;6817:4;6788:77;;:::i;:::-;;;:::i;:::-;6781:84;:::o;884:140:36:-;951:12;;:::i;:::-;982:35;;;:::i;:::-;975:42;:::o;1121:138:35:-;1188:7;;:::i;:::-;1222:12;1214:38;;:36;:21;1222:12;;:::i;:::-;1214:21;:::i;:::-;:36;:::i;:::-;;:38;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;1121:138;1207:45;;:::o;1214:38::-;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;:::i;1771:152:8:-;1856:17;;;:::i;:::-;1889:27;;;;:::i;:::-;;;;:::i;:::-;;;;;:::i;:::-;;;;1771:152::o;1165:2219:34:-;;;:::o;1412:320:13:-;1472:4;;:::i;:::-;1702:7;:19;:23;;1724:1;1702:23;:::i;:::-;;;:::i;:::-;;1695:30;:::o;1165:2219:34:-;;;;;;:::i;:::-;;:::i;:::-;;;;:::o;:::-;;;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;:::i;:::-;;;;7058:325:13;;;7265:25;7058:325;7307:69;7058:325;7199:12;;:::i;:::-;7265:6;;7285:4;7265:25;;;;;;;;;;;:::i;:::-;7334:6;7342:7;7351:10;7363:12;7307:69;;:::i;:::-;7300:76;:::o;1165:2219:34:-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;981:115:8:-;1030:66;;;:::i;:::-;981:115;:::o;1175:140::-;1228:7;;:::i;:::-;1281:20;1254:54;;:48;1281:20;;:::i;:::-;1254:48;:::i;:::-;:54;;:::i;:::-;1247:61;:::o;4848:124::-;4893:7;;:::i;:::-;4946:12;4919:46;;:40;4946:12;;:::i;:::-;4919:40;:::i;:::-;:46;;:::i;:::-;4912:53;:::o;1165:2219:34:-;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;1406:259:8;1584:74;1406:259;1479:95;1487:37;1506:17;1487:37;:::i;:::-;1479:95;:::i;:::-;1584:54;:48;1611:20;;:::i;:::-;1584:48;:::i;:::-;:54;:74;:::i;:::-;1406:259::o;1165:2219:34:-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;7671:628:13;;;;7851:12;;:::i;:::-;7879:7;7875:418;;;;7906:10;:17;:10;:17;:::i;:::-;:22;;7927:1;7906:22;:::i;:::-;;;:::i;:::-;;7902:286;;7875:418;8208:10;8201:17;:::o;7902:286::-;8121:18;8113:60;8132:6;8121:18;:::i;:::-;8113:60;:::i;:::-;7902:286;;;7875:418;8257:10;8269:12;:::i;1165:2219:34:-;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;8821:540:13:-;;8980:17;:10;:17;:::i;:::-;:21;;9000:1;8980:21;:::i;:::-;;;:::i;:::-;;8976:379;;;;9152:142;;;;;;;8976:379;9324:20;9331:12;9324:20;;:::i;:::-;1165:2219:34;;;;;;9324:20:13;;;;;;:::i;:::-;;;" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"As the underlying proxy implementation (TransparentUpgradeableProxy) allows the admin to call the implementation, care must be taken to avoid proxy selector collisions. Implementation selectors must not conflict with the proxy selectors. See https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector clashing]. The proxy selectors are: - 0xcf7a1d77: initialize - 0x3659cfe6: upgradeTo (from TransparentUpgradeableProxy) - 0x4f1ef286: upgradeToAndCall (from TransparentUpgradeableProxy) - 0x8f283970: changeAdmin (from TransparentUpgradeableProxy) - 0xf851a440: admin (from TransparentUpgradeableProxy) - 0x5c60da1b: implementation (from TransparentUpgradeableProxy)\",\"events\":{\"AdminChanged(address,address)\":{\"details\":\"Emitted when the admin account has changed.\"},\"BeaconUpgraded(address)\":{\"details\":\"Emitted when the beacon is changed.\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/proxies/TransparentUpgradeableBeaconProxy.sol\":\"TransparentUpgradeableBeaconProxy\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/interfaces/IERC1967.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\\n *\\n * _Available since v4.8.3._\\n */\\ninterface IERC1967 {\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Emitted when the beacon is changed.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n}\\n\",\"keccak256\":\"0x3cbef5ebc24b415252e2f8c0c9254555d30d9f085603b4b80d9b5ed20ab87e90\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/IERC1967.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract ERC1967Upgrade is IERC1967 {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n Address.isContract(IBeacon(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x3b21ae06bf5957f73fa16754b0669c77b7abd8ba6c072d35c3281d446fdb86c2\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n /**\\n * @dev Delegates the current call to `implementation`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _delegate(address implementation) internal virtual {\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n /**\\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback function\\n * and {_fallback} should delegate.\\n */\\n function _implementation() internal view virtual returns (address);\\n\\n /**\\n * @dev Delegates the current call to the address returned by `_implementation()`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _fallback() internal virtual {\\n _beforeFallback();\\n _delegate(_implementation());\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n * function in the contract matches the call data.\\n */\\n fallback() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n * is empty.\\n */\\n receive() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n * call, or as part of the Solidity `fallback` or `receive` functions.\\n *\\n * If overridden should call `super._beforeFallback()`.\\n */\\n function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xc130fe33f1b2132158531a87734153293f6d07bc263ff4ac90e85da9c82c0e27\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n *\\n * Furthermore, `isContract` will also return true if the target contract within\\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\\n * which only has an effect at the end of a transaction.\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._\\n * _Available since v4.9 for `string`, `bytes`._\\n */\\nlibrary StorageSlot {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n struct StringSlot {\\n string value;\\n }\\n\\n struct BytesSlot {\\n bytes value;\\n }\\n\\n /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n */\\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n */\\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n */\\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `StringSlot` with member `value` located at `slot`.\\n */\\n function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\\n */\\n function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := store.slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BytesSlot` with member `value` located at `slot`.\\n */\\n function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\\n */\\n function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := store.slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf09e68aa0dc6722a25bc46490e8d48ed864466d17313b8a0b254c36b54e49899\",\"license\":\"MIT\"},\"src/proxies/TransparentUpgradeableBeaconProxy.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\nimport { BeaconProxy, Proxy } from \\\"./openzeppelin/BeaconProxy.sol\\\";\\nimport { ERC1967Proxy, TransparentUpgradeableProxy } from \\\"./openzeppelin/TransparentUpgradeableProxy.sol\\\";\\n\\ninterface ITransparentUpgradeableBeaconProxy {\\n\\n function initialize(address admin, address beacon, bytes memory data) external;\\n\\n}\\n\\nerror InvalidInitialization();\\n\\n/**\\n * @dev As the underlying proxy implementation (TransparentUpgradeableProxy) allows the admin to call the implementation,\\n * care must be taken to avoid proxy selector collisions. Implementation selectors must not conflict with the proxy selectors.\\n * See https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector clashing].\\n * The proxy selectors are:\\n * - 0xcf7a1d77: initialize\\n * - 0x3659cfe6: upgradeTo (from TransparentUpgradeableProxy)\\n * - 0x4f1ef286: upgradeToAndCall (from TransparentUpgradeableProxy)\\n * - 0x8f283970: changeAdmin (from TransparentUpgradeableProxy)\\n * - 0xf851a440: admin (from TransparentUpgradeableProxy)\\n * - 0x5c60da1b: implementation (from TransparentUpgradeableProxy)\\n */\\ncontract TransparentUpgradeableBeaconProxy is TransparentUpgradeableProxy, BeaconProxy {\\n\\n /**\\n * Decode the initialization data from the msg.data and call the initialize function.\\n */\\n function _dispatchInitialize() private returns (bytes memory) {\\n _requireZeroValue();\\n\\n (address admin, address beacon, bytes memory data) = abi.decode(msg.data[4:], (address, address, bytes));\\n initialize(admin, beacon, data);\\n\\n return \\\"\\\";\\n }\\n\\n function initialize(address admin, address beacon, bytes memory data) internal {\\n if (_admin() != address(0)) {\\n // Redundant call. This function can only be called when the admin is not set.\\n revert InvalidInitialization();\\n }\\n _changeAdmin(admin);\\n _upgradeBeaconToAndCall(beacon, data, false);\\n }\\n\\n /**\\n * @dev If the admin is not set, the fallback function is used to initialize the proxy.\\n * @dev If the admin is set, the fallback function is used to delegatecall the implementation.\\n */\\n function _fallback() internal override(TransparentUpgradeableProxy, Proxy) {\\n if (_getAdmin() == address(0)) {\\n bytes memory ret;\\n bytes4 selector = msg.sig;\\n if (selector == ITransparentUpgradeableBeaconProxy.initialize.selector) {\\n ret = _dispatchInitialize();\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n return(add(ret, 0x20), mload(ret))\\n }\\n }\\n // When the admin is not set, the fallback function is used to initialize the proxy.\\n revert InvalidInitialization();\\n }\\n TransparentUpgradeableProxy._fallback();\\n }\\n\\n /**\\n * Returns the current implementation address.\\n * @dev This is the implementation address set by the admin, or the beacon implementation.\\n */\\n function _implementation() internal view override(ERC1967Proxy, BeaconProxy) returns (address) {\\n address implementation = ERC1967Proxy._implementation();\\n if (implementation != address(0)) {\\n return implementation;\\n }\\n return BeaconProxy._implementation();\\n }\\n\\n}\\n\",\"keccak256\":\"0xf7c7834545a955cedbe5228c3583f72fb332337dd0b4ebcd5fdb0b6504c5a8cb\",\"license\":\"Apache-2.0\"},\"src/proxies/openzeppelin/BeaconProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (proxy/beacon/BeaconProxy.sol)\\n\\n// Note: This implementation is an exact copy with the constructor removed, and pragma and imports updated.\\n\\npragma solidity ^0.8.19;\\n\\nimport \\\"openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Upgrade.sol\\\";\\nimport \\\"openzeppelin-contracts/contracts/proxy/Proxy.sol\\\";\\nimport \\\"openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol\\\";\\n\\n/**\\n * @dev This contract implements a proxy that gets the implementation address for each call from an {UpgradeableBeacon}.\\n *\\n * The beacon address is stored in storage slot `uint256(keccak256('eip1967.proxy.beacon')) - 1`, so that it doesn't\\n * conflict with the storage layout of the implementation behind the proxy.\\n *\\n * _Available since v3.4._\\n */\\ncontract BeaconProxy is Proxy, ERC1967Upgrade {\\n\\n /**\\n * @dev Returns the current beacon address.\\n */\\n function _beacon() internal view virtual returns (address) {\\n return _getBeacon();\\n }\\n\\n /**\\n * @dev Returns the current implementation address of the associated beacon.\\n */\\n function _implementation() internal view virtual override returns (address) {\\n return IBeacon(_getBeacon()).implementation();\\n }\\n\\n /**\\n * @dev Changes the proxy to use a new beacon. Deprecated: see {_upgradeBeaconToAndCall}.\\n *\\n * If `data` is nonempty, it's used as data in a delegate call to the implementation returned by the beacon.\\n *\\n * Requirements:\\n *\\n * - `beacon` must be a contract.\\n * - The implementation returned by `beacon` must be a contract.\\n */\\n function _setBeacon(address beacon, bytes memory data) internal virtual {\\n _upgradeBeaconToAndCall(beacon, data, false);\\n }\\n\\n}\\n\",\"keccak256\":\"0x2aa58701eaf7336890fae8a17f5769adf764beac64f3c5873199cd56abd66d0d\",\"license\":\"MIT\"},\"src/proxies/openzeppelin/ERC1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (proxy/ERC1967/ERC1967Proxy.sol)\\n\\n// Note: This implementation is an exact copy with the constructor removed, and pragma and imports updated.\\n\\npragma solidity ^0.8.19;\\n\\nimport \\\"openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Upgrade.sol\\\";\\nimport \\\"openzeppelin-contracts/contracts/proxy/Proxy.sol\\\";\\n\\n/**\\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\\n * implementation address that can be changed. This address is stored in storage in the location specified by\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\\n * implementation behind the proxy.\\n */\\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _implementation() internal view virtual override returns (address impl) {\\n return ERC1967Upgrade._getImplementation();\\n }\\n\\n}\\n\",\"keccak256\":\"0x87a69f59211b7b73c737e399211fd71d9b549b7d416e05c85b8ab605f64b3b00\",\"license\":\"MIT\"},\"src/proxies/openzeppelin/TransparentUpgradeableProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/transparent/TransparentUpgradeableProxy.sol)\\n\\n/// @notice This implementation is a copy of OpenZeppelin's with the following changes:\\n/// - Pragma updated\\n/// - Imports updated\\n/// - Constructor removed\\n/// - Allows admin to call implementation\\n\\npragma solidity ^0.8.19;\\n\\nimport \\\"./ERC1967Proxy.sol\\\";\\n\\n/**\\n * @dev Interface for {TransparentUpgradeableProxy}. In order to implement transparency, {TransparentUpgradeableProxy}\\n * does not implement this interface directly, and some of its functions are implemented by an internal dispatch\\n * mechanism. The compiler is unaware that these functions are implemented by {TransparentUpgradeableProxy} and will not\\n * include them in the ABI so this interface must be used to interact with it.\\n */\\ninterface ITransparentUpgradeableProxy is IERC1967 {\\n\\n function admin() external view returns (address);\\n\\n function implementation() external view returns (address);\\n\\n function changeAdmin(\\n address\\n ) external;\\n\\n function upgradeTo(\\n address\\n ) external;\\n\\n function upgradeToAndCall(address, bytes memory) external payable;\\n\\n}\\n\\n/**\\n * @dev This contract implements a proxy that is upgradeable by an admin.\\n *\\n * Unlike the original OpenZeppelin implementation, this contract does not prevent the admin from calling the implementation.\\n * This potentially exposes the admin to a proxy selector attack. See\\n * https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector clashing].\\n * When using this contract, you must ensure that the implementation function selectors do not clash with the proxy selectors.\\n * The proxy selectors are:\\n * - 0x3659cfe6: upgradeTo\\n * - 0x4f1ef286: upgradeToAndCall\\n * - 0x8f283970: changeAdmin\\n * - 0xf851a440: admin\\n * - 0x5c60da1b: implementation\\n *\\n * NOTE: The real interface of this proxy is that defined in `ITransparentUpgradeableProxy`. This contract does not\\n * inherit from that interface, and instead the admin functions are implicitly implemented using a custom dispatch\\n * mechanism in `_fallback`. Consequently, the compiler will not produce an ABI for this contract. This is necessary to\\n * fully implement transparency without decoding reverts caused by selector clashes between the proxy and the\\n * implementation.\\n *\\n * WARNING: It is not recommended to extend this contract to add additional external functions. If you do so, the compiler\\n * will not check that there are no selector conflicts, due to the note above. A selector clash between any new function\\n * and the functions declared in {ITransparentUpgradeableProxy} will be resolved in favor of the new one. This could\\n * render the admin operations inaccessible, which could prevent upgradeability. Transparency may also be compromised.\\n */\\ncontract TransparentUpgradeableProxy is ERC1967Proxy {\\n\\n /**\\n * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.\\n *\\n * CAUTION: This modifier is deprecated, as it could cause issues if the modified function has arguments, and the\\n * implementation provides a function with the same selector.\\n */\\n modifier ifAdmin() {\\n if (msg.sender == _getAdmin()) {\\n _;\\n } else {\\n _fallback();\\n }\\n }\\n\\n /**\\n * @dev If caller is the admin process the call internally, otherwise transparently fallback to the proxy behavior\\n */\\n function _fallback() internal virtual override {\\n if (msg.sender == _getAdmin()) {\\n bytes memory ret;\\n bytes4 selector = msg.sig;\\n if (selector == ITransparentUpgradeableProxy.upgradeTo.selector) {\\n ret = _dispatchUpgradeTo();\\n } else if (selector == ITransparentUpgradeableProxy.upgradeToAndCall.selector) {\\n ret = _dispatchUpgradeToAndCall();\\n } else if (selector == ITransparentUpgradeableProxy.changeAdmin.selector) {\\n ret = _dispatchChangeAdmin();\\n } else if (selector == ITransparentUpgradeableProxy.admin.selector) {\\n ret = _dispatchAdmin();\\n } else if (selector == ITransparentUpgradeableProxy.implementation.selector) {\\n ret = _dispatchImplementation();\\n } else {\\n // Call implementation\\n return super._fallback();\\n }\\n assembly {\\n return(add(ret, 0x20), mload(ret))\\n }\\n } else {\\n super._fallback();\\n }\\n }\\n\\n /**\\n * @dev Returns the current admin.\\n *\\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\\n */\\n function _dispatchAdmin() private returns (bytes memory) {\\n _requireZeroValue();\\n\\n address admin = _getAdmin();\\n return abi.encode(admin);\\n }\\n\\n /**\\n * @dev Returns the current implementation.\\n *\\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\\n * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\\n */\\n function _dispatchImplementation() private returns (bytes memory) {\\n _requireZeroValue();\\n\\n address implementation = _implementation();\\n return abi.encode(implementation);\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _dispatchChangeAdmin() private returns (bytes memory) {\\n _requireZeroValue();\\n\\n address newAdmin = abi.decode(msg.data[4:], (address));\\n _changeAdmin(newAdmin);\\n\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy.\\n */\\n function _dispatchUpgradeTo() private returns (bytes memory) {\\n _requireZeroValue();\\n\\n address newImplementation = abi.decode(msg.data[4:], (address));\\n _upgradeToAndCall(newImplementation, bytes(\\\"\\\"), false);\\n\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified\\n * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the\\n * proxied contract.\\n */\\n function _dispatchUpgradeToAndCall() private returns (bytes memory) {\\n (address newImplementation, bytes memory data) = abi.decode(msg.data[4:], (address, bytes));\\n _upgradeToAndCall(newImplementation, data, true);\\n\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev Returns the current admin.\\n *\\n * CAUTION: This function is deprecated. Use {ERC1967Upgrade-_getAdmin} instead.\\n */\\n function _admin() internal view virtual returns (address) {\\n return _getAdmin();\\n }\\n\\n /**\\n * @dev To keep this contract fully transparent, all `ifAdmin` functions must be payable. This helper is here to\\n * emulate some proxy functions being non-payable while still allowing value to pass through.\\n */\\n function _requireZeroValue() internal {\\n require(msg.value == 0);\\n }\\n\\n}\\n\",\"keccak256\":\"0x4615fce1ce5dccba23058d4d4567a4a4cd01ba0c434960fa0b94bf9d44f14e99\",\"license\":\"MIT\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "src/proxies/openzeppelin/BeaconProxy.sol": { + "BeaconProxy": { + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "devdoc": { + "details": "This contract implements a proxy that gets the implementation address for each call from an {UpgradeableBeacon}. The beacon address is stored in storage slot `uint256(keccak256('eip1967.proxy.beacon')) - 1`, so that it doesn't conflict with the storage layout of the implementation behind the proxy. _Available since v3.4._", + "events": { + "AdminChanged(address,address)": { + "details": "Emitted when the admin account has changed." + }, + "BeaconUpgraded(address)": { + "details": "Emitted when the beacon is changed." + }, + "Upgraded(address)": { + "details": "Emitted when the implementation is upgraded." + } + }, + "kind": "dev", + "methods": {}, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": { + "allocate_unbounded": { + "entryPoint": 32, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb": { + "entryPoint": 38, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + } + }, + "generatedSources": [], + "linkReferences": {}, + "object": "608060405234601c57600e6020565b6102cf61002c82396102cf90f35b6026565b60405190565b600080fdfe608060405261000c610130565b6101c6565b600090565b60018060a01b031690565b90565b61003861003361003d92610016565b610021565b610016565b90565b61004990610024565b90565b61005590610040565b90565b61006190610024565b90565b61006d90610058565b90565b60405190565b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b906100a090610076565b810190811067ffffffffffffffff8211176100ba57604052565b610080565b60e01b90565b600080fd5b6100d390610016565b90565b6100df816100ca565b036100e657565b600080fd5b905051906100f8826100d6565b565b9060208282031261011457610111916000016100eb565b90565b6100c5565b60000190565b610127610070565b3d6000823e3d90fd5b610138610011565b5061016c602061015661015161014c61026f565b61004c565b610064565b635c60da1b90610164610070565b9384926100bf565b8252818061017c60048201610119565b03915afa9081156101c157600091610193575b5090565b6101b4915060203d81116101ba575b6101ac8183610096565b8101906100fa565b3861018f565b503d6101a2565b61011f565b60008091368280378136915af43d6000803e6000146101e4573d6000f35b3d6000fd5b90565b90565b60001b90565b61020961020461020e926101e9565b6101ef565b6101ec565b90565b61023a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d506101f5565b90565b60001c90565b60018060a01b031690565b61025a61025f9161023d565b610243565b90565b61026c905461024e565b90565b610277610011565b50610293600061028d610288610211565b610296565b01610262565b90565b9056fea26469706673582212200bd23754fe04dc6388cd032ca6024d3edbf6b7e68c22b0013e8bf70e853734c664736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x1C JUMPI PUSH1 0xE PUSH1 0x20 JUMP JUMPDEST PUSH2 0x2CF PUSH2 0x2C DUP3 CODECOPY PUSH2 0x2CF SWAP1 RETURN JUMPDEST PUSH1 0x26 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH2 0xC PUSH2 0x130 JUMP JUMPDEST PUSH2 0x1C6 JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x38 PUSH2 0x33 PUSH2 0x3D SWAP3 PUSH2 0x16 JUMP JUMPDEST PUSH2 0x21 JUMP JUMPDEST PUSH2 0x16 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x49 SWAP1 PUSH2 0x24 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x55 SWAP1 PUSH2 0x40 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x61 SWAP1 PUSH2 0x24 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x6D SWAP1 PUSH2 0x58 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1F DUP1 NOT SWAP2 ADD AND SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH2 0xA0 SWAP1 PUSH2 0x76 JUMP JUMPDEST DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xBA JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH2 0x80 JUMP JUMPDEST PUSH1 0xE0 SHL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xD3 SWAP1 PUSH2 0x16 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xDF DUP2 PUSH2 0xCA JUMP JUMPDEST SUB PUSH2 0xE6 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP MLOAD SWAP1 PUSH2 0xF8 DUP3 PUSH2 0xD6 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x114 JUMPI PUSH2 0x111 SWAP2 PUSH1 0x0 ADD PUSH2 0xEB JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xC5 JUMP JUMPDEST PUSH1 0x0 ADD SWAP1 JUMP JUMPDEST PUSH2 0x127 PUSH2 0x70 JUMP JUMPDEST RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH2 0x138 PUSH2 0x11 JUMP JUMPDEST POP PUSH2 0x16C PUSH1 0x20 PUSH2 0x156 PUSH2 0x151 PUSH2 0x14C PUSH2 0x26F JUMP JUMPDEST PUSH2 0x4C JUMP JUMPDEST PUSH2 0x64 JUMP JUMPDEST PUSH4 0x5C60DA1B SWAP1 PUSH2 0x164 PUSH2 0x70 JUMP JUMPDEST SWAP4 DUP5 SWAP3 PUSH2 0xBF JUMP JUMPDEST DUP3 MSTORE DUP2 DUP1 PUSH2 0x17C PUSH1 0x4 DUP3 ADD PUSH2 0x119 JUMP JUMPDEST SUB SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x1C1 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x193 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x1B4 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x1BA JUMPI JUMPDEST PUSH2 0x1AC DUP2 DUP4 PUSH2 0x96 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xFA JUMP JUMPDEST CODESIZE PUSH2 0x18F JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x1A2 JUMP JUMPDEST PUSH2 0x11F JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP2 CALLDATASIZE DUP3 DUP1 CALLDATACOPY DUP2 CALLDATASIZE SWAP2 GAS DELEGATECALL RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY PUSH1 0x0 EQ PUSH2 0x1E4 JUMPI RETURNDATASIZE PUSH1 0x0 RETURN JUMPDEST RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SHL SWAP1 JUMP JUMPDEST PUSH2 0x209 PUSH2 0x204 PUSH2 0x20E SWAP3 PUSH2 0x1E9 JUMP JUMPDEST PUSH2 0x1EF JUMP JUMPDEST PUSH2 0x1EC JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x23A PUSH32 0xA3F0AD74E5423AEBFD80D3EF4346578335A9A72AEAEE59FF6CB3582B35133D50 PUSH2 0x1F5 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SHR SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x25A PUSH2 0x25F SWAP2 PUSH2 0x23D JUMP JUMPDEST PUSH2 0x243 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x26C SWAP1 SLOAD PUSH2 0x24E JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x277 PUSH2 0x11 JUMP JUMPDEST POP PUSH2 0x293 PUSH1 0x0 PUSH2 0x28D PUSH2 0x288 PUSH2 0x211 JUMP JUMPDEST PUSH2 0x296 JUMP JUMPDEST ADD PUSH2 0x262 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SIGNEXTEND 0xD2 CALLDATACOPY SLOAD INVALID DIV 0xDC PUSH4 0x88CD032C 0xA6 MUL 0x4D RETURNDATACOPY 0xDB 0xF6 0xB7 0xE6 DUP13 0x22 0xB0 ADD RETURNDATACOPY DUP12 0xF7 0xE DUP6 CALLDATACOPY CALLVALUE 0xC6 PUSH5 0x736F6C6343 STOP ADDMOD SHL STOP CALLER ", + "sourceMap": "806:967:35:-:0;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "abi_decode_address_fromMemory": { + "entryPoint": 235, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_address_fromMemory": { + "entryPoint": 250, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple": { + "entryPoint": 281, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "allocate_unbounded": { + "entryPoint": 112, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "cleanup_address": { + "entryPoint": 202, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_bytes32": { + "entryPoint": 492, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_from_storage_address": { + "entryPoint": 579, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_rational_by": { + "entryPoint": 489, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_uint160": { + "entryPoint": 22, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "constant_BEACON_SLOT": { + "entryPoint": 529, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "convert_address_to_contract_IBeacon": { + "entryPoint": 76, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_contract_IBeacon_to_address": { + "entryPoint": 100, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_by_to_bytes32": { + "entryPoint": 501, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint160_to_address": { + "entryPoint": 88, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint160_to_contract_IBeacon": { + "entryPoint": 64, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint160_to_uint160": { + "entryPoint": 36, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "extract_from_storage_value_offsett_address": { + "entryPoint": 590, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "finalize_allocation": { + "entryPoint": 150, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun": { + "entryPoint": null, + "id": 1051, + "parameterSlots": 0, + "returnSlots": 0 + }, + "fun_": { + "entryPoint": null, + "id": 1043, + "parameterSlots": 0, + "returnSlots": 0 + }, + "fun_delegate": { + "entryPoint": 454, + "id": 1016, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_fallback": { + "entryPoint": null, + "id": 1035, + "parameterSlots": 0, + "returnSlots": 0 + }, + "fun_getAddressSlot": { + "entryPoint": 662, + "id": 1805, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_getBeacon": { + "entryPoint": 623, + "id": 930, + "parameterSlots": 0, + "returnSlots": 1 + }, + "fun_implementation": { + "entryPoint": 304, + "id": 8001, + "parameterSlots": 0, + "returnSlots": 1 + }, + "identity": { + "entryPoint": 33, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "panic_error_0x41": { + "entryPoint": 128, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "read_from_storage_split_offset_address": { + "entryPoint": 610, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b": { + "entryPoint": 197, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_forward": { + "entryPoint": 287, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "round_up_to_mul_of": { + "entryPoint": 118, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_left": { + "entryPoint": 495, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_left_224": { + "entryPoint": 191, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_right_unsigned": { + "entryPoint": 573, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "validator_revert_address": { + "entryPoint": 214, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "zero_value_for_split_address": { + "entryPoint": 17, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + } + }, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "608060405261000c610130565b6101c6565b600090565b60018060a01b031690565b90565b61003861003361003d92610016565b610021565b610016565b90565b61004990610024565b90565b61005590610040565b90565b61006190610024565b90565b61006d90610058565b90565b60405190565b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b906100a090610076565b810190811067ffffffffffffffff8211176100ba57604052565b610080565b60e01b90565b600080fd5b6100d390610016565b90565b6100df816100ca565b036100e657565b600080fd5b905051906100f8826100d6565b565b9060208282031261011457610111916000016100eb565b90565b6100c5565b60000190565b610127610070565b3d6000823e3d90fd5b610138610011565b5061016c602061015661015161014c61026f565b61004c565b610064565b635c60da1b90610164610070565b9384926100bf565b8252818061017c60048201610119565b03915afa9081156101c157600091610193575b5090565b6101b4915060203d81116101ba575b6101ac8183610096565b8101906100fa565b3861018f565b503d6101a2565b61011f565b60008091368280378136915af43d6000803e6000146101e4573d6000f35b3d6000fd5b90565b90565b60001b90565b61020961020461020e926101e9565b6101ef565b6101ec565b90565b61023a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d506101f5565b90565b60001c90565b60018060a01b031690565b61025a61025f9161023d565b610243565b90565b61026c905461024e565b90565b610277610011565b50610293600061028d610288610211565b610296565b01610262565b90565b9056fea26469706673582212200bd23754fe04dc6388cd032ca6024d3edbf6b7e68c22b0013e8bf70e853734c664736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH2 0xC PUSH2 0x130 JUMP JUMPDEST PUSH2 0x1C6 JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x38 PUSH2 0x33 PUSH2 0x3D SWAP3 PUSH2 0x16 JUMP JUMPDEST PUSH2 0x21 JUMP JUMPDEST PUSH2 0x16 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x49 SWAP1 PUSH2 0x24 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x55 SWAP1 PUSH2 0x40 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x61 SWAP1 PUSH2 0x24 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x6D SWAP1 PUSH2 0x58 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1F DUP1 NOT SWAP2 ADD AND SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH2 0xA0 SWAP1 PUSH2 0x76 JUMP JUMPDEST DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0xBA JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH2 0x80 JUMP JUMPDEST PUSH1 0xE0 SHL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xD3 SWAP1 PUSH2 0x16 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xDF DUP2 PUSH2 0xCA JUMP JUMPDEST SUB PUSH2 0xE6 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP MLOAD SWAP1 PUSH2 0xF8 DUP3 PUSH2 0xD6 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x114 JUMPI PUSH2 0x111 SWAP2 PUSH1 0x0 ADD PUSH2 0xEB JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xC5 JUMP JUMPDEST PUSH1 0x0 ADD SWAP1 JUMP JUMPDEST PUSH2 0x127 PUSH2 0x70 JUMP JUMPDEST RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH2 0x138 PUSH2 0x11 JUMP JUMPDEST POP PUSH2 0x16C PUSH1 0x20 PUSH2 0x156 PUSH2 0x151 PUSH2 0x14C PUSH2 0x26F JUMP JUMPDEST PUSH2 0x4C JUMP JUMPDEST PUSH2 0x64 JUMP JUMPDEST PUSH4 0x5C60DA1B SWAP1 PUSH2 0x164 PUSH2 0x70 JUMP JUMPDEST SWAP4 DUP5 SWAP3 PUSH2 0xBF JUMP JUMPDEST DUP3 MSTORE DUP2 DUP1 PUSH2 0x17C PUSH1 0x4 DUP3 ADD PUSH2 0x119 JUMP JUMPDEST SUB SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x1C1 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x193 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x1B4 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x1BA JUMPI JUMPDEST PUSH2 0x1AC DUP2 DUP4 PUSH2 0x96 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0xFA JUMP JUMPDEST CODESIZE PUSH2 0x18F JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x1A2 JUMP JUMPDEST PUSH2 0x11F JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP2 CALLDATASIZE DUP3 DUP1 CALLDATACOPY DUP2 CALLDATASIZE SWAP2 GAS DELEGATECALL RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY PUSH1 0x0 EQ PUSH2 0x1E4 JUMPI RETURNDATASIZE PUSH1 0x0 RETURN JUMPDEST RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SHL SWAP1 JUMP JUMPDEST PUSH2 0x209 PUSH2 0x204 PUSH2 0x20E SWAP3 PUSH2 0x1E9 JUMP JUMPDEST PUSH2 0x1EF JUMP JUMPDEST PUSH2 0x1EC JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x23A PUSH32 0xA3F0AD74E5423AEBFD80D3EF4346578335A9A72AEAEE59FF6CB3582B35133D50 PUSH2 0x1F5 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SHR SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x25A PUSH2 0x25F SWAP2 PUSH2 0x23D JUMP JUMPDEST PUSH2 0x243 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x26C SWAP1 SLOAD PUSH2 0x24E JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x277 PUSH2 0x11 JUMP JUMPDEST POP PUSH2 0x293 PUSH1 0x0 PUSH2 0x28D PUSH2 0x288 PUSH2 0x211 JUMP JUMPDEST PUSH2 0x296 JUMP JUMPDEST ADD PUSH2 0x262 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SIGNEXTEND 0xD2 CALLDATACOPY SLOAD INVALID DIV 0xDC PUSH4 0x88CD032C 0xA6 MUL 0x4D RETURNDATACOPY 0xDB 0xF6 0xB7 0xE6 DUP13 0x22 0xB0 ADD RETURNDATACOPY DUP12 0xF7 0xE DUP6 CALLDATACOPY CALLVALUE 0xC6 PUSH5 0x736F6C6343 STOP ADDMOD SHL STOP CALLER ", + "sourceMap": "806:967:35:-:0;;;2407:17:9;;:::i;:::-;;:::i;806:967:35:-;;;:::o;:::-;;;;;;;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;:::o;:::-;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;1121:138;1188:7;;:::i;:::-;1222:12;1214:38;;:36;:21;1222:12;;:::i;:::-;1214:21;:::i;:::-;:36;:::i;:::-;;:38;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;1121:138;1207:45;;:::o;1214:38::-;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;:::i;948:895:9:-;1018:819;948:895;;1018:819;;;;;;;;;;;;;;;;;;;;;;;;806:967:35;;:::o;:::-;;:::o;:::-;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;4678:107:8:-;4719:66;;;:::i;:::-;4678:107;:::o;4719:66::-;;;;:::o;:::-;806:967:35;;;;;4719:66:8;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;4848:124::-;4893:7;;:::i;:::-;4946:12;4919:46;;:40;4946:12;;:::i;:::-;4919:40;:::i;:::-;:46;;:::i;:::-;4912:53;:::o;1859:190:16:-;;:::o" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"This contract implements a proxy that gets the implementation address for each call from an {UpgradeableBeacon}. The beacon address is stored in storage slot `uint256(keccak256('eip1967.proxy.beacon')) - 1`, so that it doesn't conflict with the storage layout of the implementation behind the proxy. _Available since v3.4._\",\"events\":{\"AdminChanged(address,address)\":{\"details\":\"Emitted when the admin account has changed.\"},\"BeaconUpgraded(address)\":{\"details\":\"Emitted when the beacon is changed.\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/proxies/openzeppelin/BeaconProxy.sol\":\"BeaconProxy\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/interfaces/IERC1967.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\\n *\\n * _Available since v4.8.3._\\n */\\ninterface IERC1967 {\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Emitted when the beacon is changed.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n}\\n\",\"keccak256\":\"0x3cbef5ebc24b415252e2f8c0c9254555d30d9f085603b4b80d9b5ed20ab87e90\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/IERC1967.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract ERC1967Upgrade is IERC1967 {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n Address.isContract(IBeacon(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x3b21ae06bf5957f73fa16754b0669c77b7abd8ba6c072d35c3281d446fdb86c2\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n /**\\n * @dev Delegates the current call to `implementation`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _delegate(address implementation) internal virtual {\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n /**\\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback function\\n * and {_fallback} should delegate.\\n */\\n function _implementation() internal view virtual returns (address);\\n\\n /**\\n * @dev Delegates the current call to the address returned by `_implementation()`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _fallback() internal virtual {\\n _beforeFallback();\\n _delegate(_implementation());\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n * function in the contract matches the call data.\\n */\\n fallback() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n * is empty.\\n */\\n receive() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n * call, or as part of the Solidity `fallback` or `receive` functions.\\n *\\n * If overridden should call `super._beforeFallback()`.\\n */\\n function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xc130fe33f1b2132158531a87734153293f6d07bc263ff4ac90e85da9c82c0e27\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n *\\n * Furthermore, `isContract` will also return true if the target contract within\\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\\n * which only has an effect at the end of a transaction.\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._\\n * _Available since v4.9 for `string`, `bytes`._\\n */\\nlibrary StorageSlot {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n struct StringSlot {\\n string value;\\n }\\n\\n struct BytesSlot {\\n bytes value;\\n }\\n\\n /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n */\\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n */\\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n */\\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `StringSlot` with member `value` located at `slot`.\\n */\\n function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\\n */\\n function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := store.slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BytesSlot` with member `value` located at `slot`.\\n */\\n function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\\n */\\n function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := store.slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf09e68aa0dc6722a25bc46490e8d48ed864466d17313b8a0b254c36b54e49899\",\"license\":\"MIT\"},\"src/proxies/openzeppelin/BeaconProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (proxy/beacon/BeaconProxy.sol)\\n\\n// Note: This implementation is an exact copy with the constructor removed, and pragma and imports updated.\\n\\npragma solidity ^0.8.19;\\n\\nimport \\\"openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Upgrade.sol\\\";\\nimport \\\"openzeppelin-contracts/contracts/proxy/Proxy.sol\\\";\\nimport \\\"openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol\\\";\\n\\n/**\\n * @dev This contract implements a proxy that gets the implementation address for each call from an {UpgradeableBeacon}.\\n *\\n * The beacon address is stored in storage slot `uint256(keccak256('eip1967.proxy.beacon')) - 1`, so that it doesn't\\n * conflict with the storage layout of the implementation behind the proxy.\\n *\\n * _Available since v3.4._\\n */\\ncontract BeaconProxy is Proxy, ERC1967Upgrade {\\n\\n /**\\n * @dev Returns the current beacon address.\\n */\\n function _beacon() internal view virtual returns (address) {\\n return _getBeacon();\\n }\\n\\n /**\\n * @dev Returns the current implementation address of the associated beacon.\\n */\\n function _implementation() internal view virtual override returns (address) {\\n return IBeacon(_getBeacon()).implementation();\\n }\\n\\n /**\\n * @dev Changes the proxy to use a new beacon. Deprecated: see {_upgradeBeaconToAndCall}.\\n *\\n * If `data` is nonempty, it's used as data in a delegate call to the implementation returned by the beacon.\\n *\\n * Requirements:\\n *\\n * - `beacon` must be a contract.\\n * - The implementation returned by `beacon` must be a contract.\\n */\\n function _setBeacon(address beacon, bytes memory data) internal virtual {\\n _upgradeBeaconToAndCall(beacon, data, false);\\n }\\n\\n}\\n\",\"keccak256\":\"0x2aa58701eaf7336890fae8a17f5769adf764beac64f3c5873199cd56abd66d0d\",\"license\":\"MIT\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "src/proxies/openzeppelin/ERC1967Proxy.sol": { + "ERC1967Proxy": { + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "devdoc": { + "details": "This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an implementation address that can be changed. This address is stored in storage in the location specified by https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the implementation behind the proxy.", + "events": { + "AdminChanged(address,address)": { + "details": "Emitted when the admin account has changed." + }, + "BeaconUpgraded(address)": { + "details": "Emitted when the beacon is changed." + }, + "Upgraded(address)": { + "details": "Emitted when the implementation is upgraded." + } + }, + "kind": "dev", + "methods": {}, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": { + "allocate_unbounded": { + "entryPoint": 32, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb": { + "entryPoint": 38, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + } + }, + "generatedSources": [], + "linkReferences": {}, + "object": "608060405234601c57600e6020565b61011561002c823961011590f35b6026565b60405190565b600080fdfe6080604052600a6013565b6023565b600090565b6019600e565b50602060bd565b90565b60008091368280378136915af43d6000803e6000146040573d6000f35b3d6000fd5b90565b90565b60001b90565b6060605c6064926045565b604b565b6048565b90565b608e7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6051565b90565b60001c90565b60018060a01b031690565b60ab60af916091565b6097565b90565b60ba905460a2565b90565b60c3600e565b5060d9600060d460d06067565b60dc565b0160b2565b90565b9056fea2646970667358221220c4774b3f82388b8e099324853fb11a387930ccc2b0039d7d5e38799126adc14264736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x1C JUMPI PUSH1 0xE PUSH1 0x20 JUMP JUMPDEST PUSH2 0x115 PUSH2 0x2C DUP3 CODECOPY PUSH2 0x115 SWAP1 RETURN JUMPDEST PUSH1 0x26 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0xA PUSH1 0x13 JUMP JUMPDEST PUSH1 0x23 JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH1 0x19 PUSH1 0xE JUMP JUMPDEST POP PUSH1 0x20 PUSH1 0xBD JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP2 CALLDATASIZE DUP3 DUP1 CALLDATACOPY DUP2 CALLDATASIZE SWAP2 GAS DELEGATECALL RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY PUSH1 0x0 EQ PUSH1 0x40 JUMPI RETURNDATASIZE PUSH1 0x0 RETURN JUMPDEST RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SHL SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x5C PUSH1 0x64 SWAP3 PUSH1 0x45 JUMP JUMPDEST PUSH1 0x4B JUMP JUMPDEST PUSH1 0x48 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x8E PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC PUSH1 0x51 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SHR SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0xAB PUSH1 0xAF SWAP2 PUSH1 0x91 JUMP JUMPDEST PUSH1 0x97 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xBA SWAP1 SLOAD PUSH1 0xA2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xC3 PUSH1 0xE JUMP JUMPDEST POP PUSH1 0xD9 PUSH1 0x0 PUSH1 0xD4 PUSH1 0xD0 PUSH1 0x67 JUMP JUMPDEST PUSH1 0xDC JUMP JUMPDEST ADD PUSH1 0xB2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC4 PUSH24 0x4B3F82388B8E099324853FB11A387930CCC2B0039D7D5E38 PUSH26 0x9126ADC14264736F6C634300081B003300000000000000000000 ", + "sourceMap": "758:269:36:-:0;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "cleanup_bytes32": { + "entryPoint": 72, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_from_storage_address": { + "entryPoint": 151, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_rational_by": { + "entryPoint": 69, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "constant_IMPLEMENTATION_SLOT": { + "entryPoint": 103, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "convert_rational_by_to_bytes32": { + "entryPoint": 81, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "extract_from_storage_value_offsett_address": { + "entryPoint": 162, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun": { + "entryPoint": null, + "id": 1051, + "parameterSlots": 0, + "returnSlots": 0 + }, + "fun_": { + "entryPoint": null, + "id": 1043, + "parameterSlots": 0, + "returnSlots": 0 + }, + "fun_delegate": { + "entryPoint": 35, + "id": 1016, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_fallback": { + "entryPoint": null, + "id": 1035, + "parameterSlots": 0, + "returnSlots": 0 + }, + "fun_getAddressSlot": { + "entryPoint": 220, + "id": 1805, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_getImplementation": { + "entryPoint": 189, + "id": 731, + "parameterSlots": 0, + "returnSlots": 1 + }, + "fun_implementation": { + "entryPoint": 19, + "id": 8038, + "parameterSlots": 0, + "returnSlots": 1 + }, + "read_from_storage_split_offset_address": { + "entryPoint": 178, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_left": { + "entryPoint": 75, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_right_unsigned": { + "entryPoint": 145, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "zero_value_for_split_address": { + "entryPoint": 14, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + } + }, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "6080604052600a6013565b6023565b600090565b6019600e565b50602060bd565b90565b60008091368280378136915af43d6000803e6000146040573d6000f35b3d6000fd5b90565b90565b60001b90565b6060605c6064926045565b604b565b6048565b90565b608e7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6051565b90565b60001c90565b60018060a01b031690565b60ab60af916091565b6097565b90565b60ba905460a2565b90565b60c3600e565b5060d9600060d460d06067565b60dc565b0160b2565b90565b9056fea2646970667358221220c4774b3f82388b8e099324853fb11a387930ccc2b0039d7d5e38799126adc14264736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0xA PUSH1 0x13 JUMP JUMPDEST PUSH1 0x23 JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH1 0x19 PUSH1 0xE JUMP JUMPDEST POP PUSH1 0x20 PUSH1 0xBD JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP2 CALLDATASIZE DUP3 DUP1 CALLDATACOPY DUP2 CALLDATASIZE SWAP2 GAS DELEGATECALL RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY PUSH1 0x0 EQ PUSH1 0x40 JUMPI RETURNDATASIZE PUSH1 0x0 RETURN JUMPDEST RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SHL SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x5C PUSH1 0x64 SWAP3 PUSH1 0x45 JUMP JUMPDEST PUSH1 0x4B JUMP JUMPDEST PUSH1 0x48 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x8E PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC PUSH1 0x51 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SHR SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0xAB PUSH1 0xAF SWAP2 PUSH1 0x91 JUMP JUMPDEST PUSH1 0x97 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xBA SWAP1 SLOAD PUSH1 0xA2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xC3 PUSH1 0xE JUMP JUMPDEST POP PUSH1 0xD9 PUSH1 0x0 PUSH1 0xD4 PUSH1 0xD0 PUSH1 0x67 JUMP JUMPDEST PUSH1 0xDC JUMP JUMPDEST ADD PUSH1 0xB2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC4 PUSH24 0x4B3F82388B8E099324853FB11A387930CCC2B0039D7D5E38 PUSH26 0x9126ADC14264736F6C634300081B003300000000000000000000 ", + "sourceMap": "758:269:36:-:0;;;2407:17:9;;:::i;:::-;;:::i;758:269:36:-;;;:::o;884:140::-;951:12;;:::i;:::-;982:35;;;:::i;:::-;975:42;:::o;948:895:9:-;1018:819;948:895;;1018:819;;;;;;;;;;;;;;;;;;;;;;;;758:269:36;;:::o;:::-;;:::o;:::-;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;981:115:8:-;1030:66;;;:::i;:::-;981:115;:::o;1030:66::-;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;1175:140::-;1228:7;;:::i;:::-;1281:20;1254:54;;:48;1281:20;;:::i;:::-;1254:48;:::i;:::-;:54;;:::i;:::-;1247:61;:::o;1859:190:16:-;;:::o" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an implementation address that can be changed. This address is stored in storage in the location specified by https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the implementation behind the proxy.\",\"events\":{\"AdminChanged(address,address)\":{\"details\":\"Emitted when the admin account has changed.\"},\"BeaconUpgraded(address)\":{\"details\":\"Emitted when the beacon is changed.\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/proxies/openzeppelin/ERC1967Proxy.sol\":\"ERC1967Proxy\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/interfaces/IERC1967.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\\n *\\n * _Available since v4.8.3._\\n */\\ninterface IERC1967 {\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Emitted when the beacon is changed.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n}\\n\",\"keccak256\":\"0x3cbef5ebc24b415252e2f8c0c9254555d30d9f085603b4b80d9b5ed20ab87e90\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/IERC1967.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract ERC1967Upgrade is IERC1967 {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n Address.isContract(IBeacon(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x3b21ae06bf5957f73fa16754b0669c77b7abd8ba6c072d35c3281d446fdb86c2\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n /**\\n * @dev Delegates the current call to `implementation`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _delegate(address implementation) internal virtual {\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n /**\\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback function\\n * and {_fallback} should delegate.\\n */\\n function _implementation() internal view virtual returns (address);\\n\\n /**\\n * @dev Delegates the current call to the address returned by `_implementation()`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _fallback() internal virtual {\\n _beforeFallback();\\n _delegate(_implementation());\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n * function in the contract matches the call data.\\n */\\n fallback() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n * is empty.\\n */\\n receive() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n * call, or as part of the Solidity `fallback` or `receive` functions.\\n *\\n * If overridden should call `super._beforeFallback()`.\\n */\\n function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xc130fe33f1b2132158531a87734153293f6d07bc263ff4ac90e85da9c82c0e27\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n *\\n * Furthermore, `isContract` will also return true if the target contract within\\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\\n * which only has an effect at the end of a transaction.\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._\\n * _Available since v4.9 for `string`, `bytes`._\\n */\\nlibrary StorageSlot {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n struct StringSlot {\\n string value;\\n }\\n\\n struct BytesSlot {\\n bytes value;\\n }\\n\\n /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n */\\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n */\\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n */\\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `StringSlot` with member `value` located at `slot`.\\n */\\n function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\\n */\\n function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := store.slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BytesSlot` with member `value` located at `slot`.\\n */\\n function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\\n */\\n function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := store.slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf09e68aa0dc6722a25bc46490e8d48ed864466d17313b8a0b254c36b54e49899\",\"license\":\"MIT\"},\"src/proxies/openzeppelin/ERC1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (proxy/ERC1967/ERC1967Proxy.sol)\\n\\n// Note: This implementation is an exact copy with the constructor removed, and pragma and imports updated.\\n\\npragma solidity ^0.8.19;\\n\\nimport \\\"openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Upgrade.sol\\\";\\nimport \\\"openzeppelin-contracts/contracts/proxy/Proxy.sol\\\";\\n\\n/**\\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\\n * implementation address that can be changed. This address is stored in storage in the location specified by\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\\n * implementation behind the proxy.\\n */\\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _implementation() internal view virtual override returns (address impl) {\\n return ERC1967Upgrade._getImplementation();\\n }\\n\\n}\\n\",\"keccak256\":\"0x87a69f59211b7b73c737e399211fd71d9b549b7d416e05c85b8ab605f64b3b00\",\"license\":\"MIT\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "src/proxies/openzeppelin/TransparentUpgradeableProxy.sol": { + "ITransparentUpgradeableProxy": { + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "inputs": [], + "name": "admin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "changeAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "implementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } + ], + "devdoc": { + "details": "Interface for {TransparentUpgradeableProxy}. In order to implement transparency, {TransparentUpgradeableProxy} does not implement this interface directly, and some of its functions are implemented by an internal dispatch mechanism. The compiler is unaware that these functions are implemented by {TransparentUpgradeableProxy} and will not include them in the ABI so this interface must be used to interact with it.", + "events": { + "AdminChanged(address,address)": { + "details": "Emitted when the admin account has changed." + }, + "BeaconUpgraded(address)": { + "details": "Emitted when the beacon is changed." + }, + "Upgraded(address)": { + "details": "Emitted when the implementation is upgraded." + } + }, + "kind": "dev", + "methods": {}, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "admin()": "f851a440", + "changeAdmin(address)": "8f283970", + "implementation()": "5c60da1b", + "upgradeTo(address)": "3659cfe6", + "upgradeToAndCall(address,bytes)": "4f1ef286" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"admin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"changeAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"implementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Interface for {TransparentUpgradeableProxy}. In order to implement transparency, {TransparentUpgradeableProxy} does not implement this interface directly, and some of its functions are implemented by an internal dispatch mechanism. The compiler is unaware that these functions are implemented by {TransparentUpgradeableProxy} and will not include them in the ABI so this interface must be used to interact with it.\",\"events\":{\"AdminChanged(address,address)\":{\"details\":\"Emitted when the admin account has changed.\"},\"BeaconUpgraded(address)\":{\"details\":\"Emitted when the beacon is changed.\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/proxies/openzeppelin/TransparentUpgradeableProxy.sol\":\"ITransparentUpgradeableProxy\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/interfaces/IERC1967.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\\n *\\n * _Available since v4.8.3._\\n */\\ninterface IERC1967 {\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Emitted when the beacon is changed.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n}\\n\",\"keccak256\":\"0x3cbef5ebc24b415252e2f8c0c9254555d30d9f085603b4b80d9b5ed20ab87e90\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/IERC1967.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract ERC1967Upgrade is IERC1967 {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n Address.isContract(IBeacon(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x3b21ae06bf5957f73fa16754b0669c77b7abd8ba6c072d35c3281d446fdb86c2\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n /**\\n * @dev Delegates the current call to `implementation`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _delegate(address implementation) internal virtual {\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n /**\\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback function\\n * and {_fallback} should delegate.\\n */\\n function _implementation() internal view virtual returns (address);\\n\\n /**\\n * @dev Delegates the current call to the address returned by `_implementation()`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _fallback() internal virtual {\\n _beforeFallback();\\n _delegate(_implementation());\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n * function in the contract matches the call data.\\n */\\n fallback() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n * is empty.\\n */\\n receive() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n * call, or as part of the Solidity `fallback` or `receive` functions.\\n *\\n * If overridden should call `super._beforeFallback()`.\\n */\\n function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xc130fe33f1b2132158531a87734153293f6d07bc263ff4ac90e85da9c82c0e27\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n *\\n * Furthermore, `isContract` will also return true if the target contract within\\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\\n * which only has an effect at the end of a transaction.\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._\\n * _Available since v4.9 for `string`, `bytes`._\\n */\\nlibrary StorageSlot {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n struct StringSlot {\\n string value;\\n }\\n\\n struct BytesSlot {\\n bytes value;\\n }\\n\\n /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n */\\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n */\\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n */\\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `StringSlot` with member `value` located at `slot`.\\n */\\n function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\\n */\\n function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := store.slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BytesSlot` with member `value` located at `slot`.\\n */\\n function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\\n */\\n function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := store.slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf09e68aa0dc6722a25bc46490e8d48ed864466d17313b8a0b254c36b54e49899\",\"license\":\"MIT\"},\"src/proxies/openzeppelin/ERC1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (proxy/ERC1967/ERC1967Proxy.sol)\\n\\n// Note: This implementation is an exact copy with the constructor removed, and pragma and imports updated.\\n\\npragma solidity ^0.8.19;\\n\\nimport \\\"openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Upgrade.sol\\\";\\nimport \\\"openzeppelin-contracts/contracts/proxy/Proxy.sol\\\";\\n\\n/**\\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\\n * implementation address that can be changed. This address is stored in storage in the location specified by\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\\n * implementation behind the proxy.\\n */\\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _implementation() internal view virtual override returns (address impl) {\\n return ERC1967Upgrade._getImplementation();\\n }\\n\\n}\\n\",\"keccak256\":\"0x87a69f59211b7b73c737e399211fd71d9b549b7d416e05c85b8ab605f64b3b00\",\"license\":\"MIT\"},\"src/proxies/openzeppelin/TransparentUpgradeableProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/transparent/TransparentUpgradeableProxy.sol)\\n\\n/// @notice This implementation is a copy of OpenZeppelin's with the following changes:\\n/// - Pragma updated\\n/// - Imports updated\\n/// - Constructor removed\\n/// - Allows admin to call implementation\\n\\npragma solidity ^0.8.19;\\n\\nimport \\\"./ERC1967Proxy.sol\\\";\\n\\n/**\\n * @dev Interface for {TransparentUpgradeableProxy}. In order to implement transparency, {TransparentUpgradeableProxy}\\n * does not implement this interface directly, and some of its functions are implemented by an internal dispatch\\n * mechanism. The compiler is unaware that these functions are implemented by {TransparentUpgradeableProxy} and will not\\n * include them in the ABI so this interface must be used to interact with it.\\n */\\ninterface ITransparentUpgradeableProxy is IERC1967 {\\n\\n function admin() external view returns (address);\\n\\n function implementation() external view returns (address);\\n\\n function changeAdmin(\\n address\\n ) external;\\n\\n function upgradeTo(\\n address\\n ) external;\\n\\n function upgradeToAndCall(address, bytes memory) external payable;\\n\\n}\\n\\n/**\\n * @dev This contract implements a proxy that is upgradeable by an admin.\\n *\\n * Unlike the original OpenZeppelin implementation, this contract does not prevent the admin from calling the implementation.\\n * This potentially exposes the admin to a proxy selector attack. See\\n * https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector clashing].\\n * When using this contract, you must ensure that the implementation function selectors do not clash with the proxy selectors.\\n * The proxy selectors are:\\n * - 0x3659cfe6: upgradeTo\\n * - 0x4f1ef286: upgradeToAndCall\\n * - 0x8f283970: changeAdmin\\n * - 0xf851a440: admin\\n * - 0x5c60da1b: implementation\\n *\\n * NOTE: The real interface of this proxy is that defined in `ITransparentUpgradeableProxy`. This contract does not\\n * inherit from that interface, and instead the admin functions are implicitly implemented using a custom dispatch\\n * mechanism in `_fallback`. Consequently, the compiler will not produce an ABI for this contract. This is necessary to\\n * fully implement transparency without decoding reverts caused by selector clashes between the proxy and the\\n * implementation.\\n *\\n * WARNING: It is not recommended to extend this contract to add additional external functions. If you do so, the compiler\\n * will not check that there are no selector conflicts, due to the note above. A selector clash between any new function\\n * and the functions declared in {ITransparentUpgradeableProxy} will be resolved in favor of the new one. This could\\n * render the admin operations inaccessible, which could prevent upgradeability. Transparency may also be compromised.\\n */\\ncontract TransparentUpgradeableProxy is ERC1967Proxy {\\n\\n /**\\n * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.\\n *\\n * CAUTION: This modifier is deprecated, as it could cause issues if the modified function has arguments, and the\\n * implementation provides a function with the same selector.\\n */\\n modifier ifAdmin() {\\n if (msg.sender == _getAdmin()) {\\n _;\\n } else {\\n _fallback();\\n }\\n }\\n\\n /**\\n * @dev If caller is the admin process the call internally, otherwise transparently fallback to the proxy behavior\\n */\\n function _fallback() internal virtual override {\\n if (msg.sender == _getAdmin()) {\\n bytes memory ret;\\n bytes4 selector = msg.sig;\\n if (selector == ITransparentUpgradeableProxy.upgradeTo.selector) {\\n ret = _dispatchUpgradeTo();\\n } else if (selector == ITransparentUpgradeableProxy.upgradeToAndCall.selector) {\\n ret = _dispatchUpgradeToAndCall();\\n } else if (selector == ITransparentUpgradeableProxy.changeAdmin.selector) {\\n ret = _dispatchChangeAdmin();\\n } else if (selector == ITransparentUpgradeableProxy.admin.selector) {\\n ret = _dispatchAdmin();\\n } else if (selector == ITransparentUpgradeableProxy.implementation.selector) {\\n ret = _dispatchImplementation();\\n } else {\\n // Call implementation\\n return super._fallback();\\n }\\n assembly {\\n return(add(ret, 0x20), mload(ret))\\n }\\n } else {\\n super._fallback();\\n }\\n }\\n\\n /**\\n * @dev Returns the current admin.\\n *\\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\\n */\\n function _dispatchAdmin() private returns (bytes memory) {\\n _requireZeroValue();\\n\\n address admin = _getAdmin();\\n return abi.encode(admin);\\n }\\n\\n /**\\n * @dev Returns the current implementation.\\n *\\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\\n * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\\n */\\n function _dispatchImplementation() private returns (bytes memory) {\\n _requireZeroValue();\\n\\n address implementation = _implementation();\\n return abi.encode(implementation);\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _dispatchChangeAdmin() private returns (bytes memory) {\\n _requireZeroValue();\\n\\n address newAdmin = abi.decode(msg.data[4:], (address));\\n _changeAdmin(newAdmin);\\n\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy.\\n */\\n function _dispatchUpgradeTo() private returns (bytes memory) {\\n _requireZeroValue();\\n\\n address newImplementation = abi.decode(msg.data[4:], (address));\\n _upgradeToAndCall(newImplementation, bytes(\\\"\\\"), false);\\n\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified\\n * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the\\n * proxied contract.\\n */\\n function _dispatchUpgradeToAndCall() private returns (bytes memory) {\\n (address newImplementation, bytes memory data) = abi.decode(msg.data[4:], (address, bytes));\\n _upgradeToAndCall(newImplementation, data, true);\\n\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev Returns the current admin.\\n *\\n * CAUTION: This function is deprecated. Use {ERC1967Upgrade-_getAdmin} instead.\\n */\\n function _admin() internal view virtual returns (address) {\\n return _getAdmin();\\n }\\n\\n /**\\n * @dev To keep this contract fully transparent, all `ifAdmin` functions must be payable. This helper is here to\\n * emulate some proxy functions being non-payable while still allowing value to pass through.\\n */\\n function _requireZeroValue() internal {\\n require(msg.value == 0);\\n }\\n\\n}\\n\",\"keccak256\":\"0x4615fce1ce5dccba23058d4d4567a4a4cd01ba0c434960fa0b94bf9d44f14e99\",\"license\":\"MIT\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + }, + "TransparentUpgradeableProxy": { + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "devdoc": { + "details": "This contract implements a proxy that is upgradeable by an admin. Unlike the original OpenZeppelin implementation, this contract does not prevent the admin from calling the implementation. This potentially exposes the admin to a proxy selector attack. See https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector clashing]. When using this contract, you must ensure that the implementation function selectors do not clash with the proxy selectors. The proxy selectors are: - 0x3659cfe6: upgradeTo - 0x4f1ef286: upgradeToAndCall - 0x8f283970: changeAdmin - 0xf851a440: admin - 0x5c60da1b: implementation NOTE: The real interface of this proxy is that defined in `ITransparentUpgradeableProxy`. This contract does not inherit from that interface, and instead the admin functions are implicitly implemented using a custom dispatch mechanism in `_fallback`. Consequently, the compiler will not produce an ABI for this contract. This is necessary to fully implement transparency without decoding reverts caused by selector clashes between the proxy and the implementation. WARNING: It is not recommended to extend this contract to add additional external functions. If you do so, the compiler will not check that there are no selector conflicts, due to the note above. A selector clash between any new function and the functions declared in {ITransparentUpgradeableProxy} will be resolved in favor of the new one. This could render the admin operations inaccessible, which could prevent upgradeability. Transparency may also be compromised.", + "events": { + "AdminChanged(address,address)": { + "details": "Emitted when the admin account has changed." + }, + "BeaconUpgraded(address)": { + "details": "Emitted when the beacon is changed." + }, + "Upgraded(address)": { + "details": "Emitted when the implementation is upgraded." + } + }, + "kind": "dev", + "methods": {}, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": { + "allocate_unbounded": { + "entryPoint": 32, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb": { + "entryPoint": 38, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + } + }, + "generatedSources": [], + "linkReferences": {}, + "object": "608060405234601c57600e6020565b610db061002c8239610db090f35b6026565b60405190565b600080fdfe6080604052361561003757610037565b60018060a01b031690565b6100239061000f565b90565b606090565b63ffffffff60e01b1690565b3361005161004b6100466101f8565b61001a565b9161001a565b1460001461016857610061610026565b5063ffffffff60e01b6000351680610088610082631b2ce7f360e11b61002b565b9161002b565b146000146100a257506100996105f9565b5b602081519101f35b806100bc6100b663278f794360e11b61002b565b9161002b565b146000146100d357506100cd6105a3565b5b61009a565b806100ed6100e76308f2839760e41b61002b565b9161002b565b1460001461010457506100fe610473565b5b6100ce565b8061011e6101186303e1469160e61b61002b565b9161002b565b14600014610135575061012f6102e3565b5b6100ff565b61014e610148635c60da1b60e01b61002b565b9161002b565b146000146101635761015e61029e565b610130565b61021f565b61021f565b600090565b90565b90565b60001b90565b61019261018d61019792610172565b610178565b610175565b90565b6101c37fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610361017e565b90565b60001c90565b60018060a01b031690565b6101e36101e8916101c6565b6101cc565b90565b6101f590546101d7565b90565b61020061016d565b5061021c600061021661021161019a565b61065c565b016101eb565b90565b61022761065f565b610673565b60405190565b61023b9061001a565b9052565b919061025390600060208501940190610232565b565b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b9061027f90610255565b810190811067ffffffffffffffff82111761029957604052565b61025f565b6102a6610026565b506102af6106c1565b6102d16102e06102bd61065f565b6102c561022c565b9283916020830161023f565b60208201810382520382610275565b90565b6102eb610026565b506102f46106c1565b6103166103256103026101f8565b61030a61022c565b9283916020830161023f565b60208201810382520382610275565b90565b90565b90565b90565b61034561034061034a92610328565b61032e565b61032b565b90565b600080fd5b600080fd5b90939293848311610377578411610372576001820201920390565b610352565b61034d565b91565b600080fd5b600080fd5b6103929061000f565b90565b61039e81610389565b036103a557565b600080fd5b905035906103b782610395565b565b906020828203126103d3576103d0916000016103aa565b90565b61037f565b6103ec6103e76103f19261000f565b61032e565b61000f565b90565b6103fd906103d8565b90565b610409906103f4565b90565b9061041f61041861022c565b9283610275565b565b67ffffffffffffffff811161043f5761043b602091610255565b0190565b61025f565b9061045661045183610421565b61040c565b918252565b6104656000610444565b90565b61047061045b565b90565b61047b610026565b506104846106c1565b6104c06104bb6104b66104ae6104a86000366104a06004610331565b908092610357565b9061037c565b8101906103b9565b610400565b610704565b6104c8610468565b90565b600080fd5b600080fd5b67ffffffffffffffff81116104f3576104ef602091610255565b0190565b61025f565b90826000939282370152565b90929192610519610514826104d5565b61040c565b9381855260208501908284011161053557610533926104f8565b565b6104d0565b9080601f830112156105585781602061055593359101610504565b90565b6104cb565b91909160408184031261059e5761057783600083016103aa565b92602082013567ffffffffffffffff811161059957610596920161053a565b90565b610384565b61037f565b6105ab610026565b506105ee6105e56105de6105d66105d06000366105c86004610331565b908092610357565b9061037c565b81019061055d565b9190610400565b90600191610755565b6105f6610468565b90565b610601610026565b5061060a6106c1565b61065161064161063c61063461062e6000366106266004610331565b908092610357565b9061037c565b8101906103b9565b610400565b610649610468565b600091610755565b610659610468565b90565b90565b61066761016d565b506106706107f2565b90565b60008091368280378136915af43d6000803e600014610691573d6000f35b3d6000fd5b90565b6106ad6106a86106b292610696565b61032e565b61032b565b90565b156106bc57565b600080fd5b6106de346106d86106d26000610699565b9161032b565b146106b5565b565b9160206107029294936106fb60408201966000830190610232565b0190610232565b565b61074f906107106101f8565b817f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f9161074761073e61022c565b928392836106e0565b0390a161093e565b565b5190565b9161075f83610988565b61076882610751565b61077b6107756000610699565b9161032b565b1190811561079f575b5061078e575b5050565b61079791610a45565b50388061078a565b905038610784565b90565b6107be6107b96107c3926107a7565b610178565b610175565b90565b6107ef7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6107aa565b90565b6107fa61016d565b50610816600061081061080b6107c6565b61065c565b016101eb565b90565b61082d61082861083292610696565b61032e565b61000f565b90565b61083e90610819565b90565b60209181520190565b60207f6464726573730000000000000000000000000000000000000000000000000000917f455243313936373a206e65772061646d696e20697320746865207a65726f206160008201520152565b6108a56026604092610841565b6108ae8161084a565b0190565b6108c89060208101906000818303910152610898565b90565b156108d257565b6108da61022c565b62461bcd60e51b8152806108f0600482016108b2565b0390fd5b9061090560018060a01b0391610178565b9181191691161790565b610918906103f4565b90565b90565b9061093361092e61093a9261090f565b61091b565b82546108f4565b9055565b610980906109688161096161095b6109566000610835565b61001a565b9161001a565b14156108cb565b600061097a61097561019a565b61065c565b0161091e565b565b60000190565b61099181610b0f565b6109bb7fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b9161090f565b906109c461022c565b806109ce81610982565b0390a2565b60207f206661696c656400000000000000000000000000000000000000000000000000917f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c60008201520152565b610a2b6027610444565b90610a38602083016109d3565b565b610a42610a21565b90565b90610a6291610a52610026565b5090610a5c610a3a565b91610b80565b90565b60207f6f74206120636f6e747261637400000000000000000000000000000000000000917f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60008201520152565b610ac0602d604092610841565b610ac981610a65565b0190565b610ae39060208101906000818303910152610ab3565b90565b15610aed57565b610af561022c565b62461bcd60e51b815280610b0b60048201610acd565b0390fd5b610b3c90610b24610b1f82610bb8565b610ae6565b6000610b36610b316107c6565b61065c565b0161091e565b565b90610b50610b4b836104d5565b61040c565b918252565b3d600014610b7257610b663d610b3e565b903d6000602084013e5b565b610b7a610026565b90610b70565b9091600080610bb094610b91610026565b508490602081019051915af491610ba6610b55565b9092909192610c5d565b90565b600090565b610bc0610bb3565b503b610bd5610bcf6000610699565b9161032b565b1190565b60007f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000910152565b610c0e601d602092610841565b610c1781610bd9565b0190565b610c319060208101906000818303910152610c01565b90565b15610c3b57565b610c4361022c565b62461bcd60e51b815280610c5960048201610c1b565b0390fd5b919290610c68610026565b50600014610cae5750610c7a82610751565b610c8d610c876000610699565b9161032b565b14610c97575b5090565b610ca3610ca891610bb8565b610c34565b38610c93565b82610d27565b5190565b60005b838110610ccc575050906000910152565b806020918301518185015201610cbb565b610cfc610d05602093610d0a93610cf381610cb4565b93848093610841565b95869101610cb8565b610255565b0190565b610d249160208201916000818403910152610cdd565b90565b90610d3182610751565b610d44610d3e6000610699565b9161032b565b11600014610d555750805190602001fd5b610d7690610d6161022c565b91829162461bcd60e51b835260048301610d0e565b0390fdfea26469706673582212204e42c1b81ea1dd5dcc8fbcb8bfdf933e9239705676a402a624342386fe3fb73064736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x1C JUMPI PUSH1 0xE PUSH1 0x20 JUMP JUMPDEST PUSH2 0xDB0 PUSH2 0x2C DUP3 CODECOPY PUSH2 0xDB0 SWAP1 RETURN JUMPDEST PUSH1 0x26 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLDATASIZE ISZERO PUSH2 0x37 JUMPI PUSH2 0x37 JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x23 SWAP1 PUSH2 0xF JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x60 SWAP1 JUMP JUMPDEST PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL AND SWAP1 JUMP JUMPDEST CALLER PUSH2 0x51 PUSH2 0x4B PUSH2 0x46 PUSH2 0x1F8 JUMP JUMPDEST PUSH2 0x1A JUMP JUMPDEST SWAP2 PUSH2 0x1A JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0x168 JUMPI PUSH2 0x61 PUSH2 0x26 JUMP JUMPDEST POP PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL PUSH1 0x0 CALLDATALOAD AND DUP1 PUSH2 0x88 PUSH2 0x82 PUSH4 0x1B2CE7F3 PUSH1 0xE1 SHL PUSH2 0x2B JUMP JUMPDEST SWAP2 PUSH2 0x2B JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0xA2 JUMPI POP PUSH2 0x99 PUSH2 0x5F9 JUMP JUMPDEST JUMPDEST PUSH1 0x20 DUP2 MLOAD SWAP2 ADD RETURN JUMPDEST DUP1 PUSH2 0xBC PUSH2 0xB6 PUSH4 0x278F7943 PUSH1 0xE1 SHL PUSH2 0x2B JUMP JUMPDEST SWAP2 PUSH2 0x2B JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0xD3 JUMPI POP PUSH2 0xCD PUSH2 0x5A3 JUMP JUMPDEST JUMPDEST PUSH2 0x9A JUMP JUMPDEST DUP1 PUSH2 0xED PUSH2 0xE7 PUSH4 0x8F28397 PUSH1 0xE4 SHL PUSH2 0x2B JUMP JUMPDEST SWAP2 PUSH2 0x2B JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0x104 JUMPI POP PUSH2 0xFE PUSH2 0x473 JUMP JUMPDEST JUMPDEST PUSH2 0xCE JUMP JUMPDEST DUP1 PUSH2 0x11E PUSH2 0x118 PUSH4 0x3E14691 PUSH1 0xE6 SHL PUSH2 0x2B JUMP JUMPDEST SWAP2 PUSH2 0x2B JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0x135 JUMPI POP PUSH2 0x12F PUSH2 0x2E3 JUMP JUMPDEST JUMPDEST PUSH2 0xFF JUMP JUMPDEST PUSH2 0x14E PUSH2 0x148 PUSH4 0x5C60DA1B PUSH1 0xE0 SHL PUSH2 0x2B JUMP JUMPDEST SWAP2 PUSH2 0x2B JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0x163 JUMPI PUSH2 0x15E PUSH2 0x29E JUMP JUMPDEST PUSH2 0x130 JUMP JUMPDEST PUSH2 0x21F JUMP JUMPDEST PUSH2 0x21F JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SHL SWAP1 JUMP JUMPDEST PUSH2 0x192 PUSH2 0x18D PUSH2 0x197 SWAP3 PUSH2 0x172 JUMP JUMPDEST PUSH2 0x178 JUMP JUMPDEST PUSH2 0x175 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1C3 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 PUSH2 0x17E JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SHR SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x1E3 PUSH2 0x1E8 SWAP2 PUSH2 0x1C6 JUMP JUMPDEST PUSH2 0x1CC JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1F5 SWAP1 SLOAD PUSH2 0x1D7 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x200 PUSH2 0x16D JUMP JUMPDEST POP PUSH2 0x21C PUSH1 0x0 PUSH2 0x216 PUSH2 0x211 PUSH2 0x19A JUMP JUMPDEST PUSH2 0x65C JUMP JUMPDEST ADD PUSH2 0x1EB JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x227 PUSH2 0x65F JUMP JUMPDEST PUSH2 0x673 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH2 0x23B SWAP1 PUSH2 0x1A JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x253 SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0x232 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x1F DUP1 NOT SWAP2 ADD AND SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH2 0x27F SWAP1 PUSH2 0x255 JUMP JUMPDEST DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x299 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH2 0x25F JUMP JUMPDEST PUSH2 0x2A6 PUSH2 0x26 JUMP JUMPDEST POP PUSH2 0x2AF PUSH2 0x6C1 JUMP JUMPDEST PUSH2 0x2D1 PUSH2 0x2E0 PUSH2 0x2BD PUSH2 0x65F JUMP JUMPDEST PUSH2 0x2C5 PUSH2 0x22C JUMP JUMPDEST SWAP3 DUP4 SWAP2 PUSH1 0x20 DUP4 ADD PUSH2 0x23F JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE SUB DUP3 PUSH2 0x275 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2EB PUSH2 0x26 JUMP JUMPDEST POP PUSH2 0x2F4 PUSH2 0x6C1 JUMP JUMPDEST PUSH2 0x316 PUSH2 0x325 PUSH2 0x302 PUSH2 0x1F8 JUMP JUMPDEST PUSH2 0x30A PUSH2 0x22C JUMP JUMPDEST SWAP3 DUP4 SWAP2 PUSH1 0x20 DUP4 ADD PUSH2 0x23F JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE SUB DUP3 PUSH2 0x275 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x345 PUSH2 0x340 PUSH2 0x34A SWAP3 PUSH2 0x328 JUMP JUMPDEST PUSH2 0x32E JUMP JUMPDEST PUSH2 0x32B JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP4 SWAP3 SWAP4 DUP5 DUP4 GT PUSH2 0x377 JUMPI DUP5 GT PUSH2 0x372 JUMPI PUSH1 0x1 DUP3 MUL ADD SWAP3 SUB SWAP1 JUMP JUMPDEST PUSH2 0x352 JUMP JUMPDEST PUSH2 0x34D JUMP JUMPDEST SWAP2 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x392 SWAP1 PUSH2 0xF JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x39E DUP2 PUSH2 0x389 JUMP JUMPDEST SUB PUSH2 0x3A5 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x3B7 DUP3 PUSH2 0x395 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x3D3 JUMPI PUSH2 0x3D0 SWAP2 PUSH1 0x0 ADD PUSH2 0x3AA JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x37F JUMP JUMPDEST PUSH2 0x3EC PUSH2 0x3E7 PUSH2 0x3F1 SWAP3 PUSH2 0xF JUMP JUMPDEST PUSH2 0x32E JUMP JUMPDEST PUSH2 0xF JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3FD SWAP1 PUSH2 0x3D8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x409 SWAP1 PUSH2 0x3F4 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x41F PUSH2 0x418 PUSH2 0x22C JUMP JUMPDEST SWAP3 DUP4 PUSH2 0x275 JUMP JUMPDEST JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x43F JUMPI PUSH2 0x43B PUSH1 0x20 SWAP2 PUSH2 0x255 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x25F JUMP JUMPDEST SWAP1 PUSH2 0x456 PUSH2 0x451 DUP4 PUSH2 0x421 JUMP JUMPDEST PUSH2 0x40C JUMP JUMPDEST SWAP2 DUP3 MSTORE JUMP JUMPDEST PUSH2 0x465 PUSH1 0x0 PUSH2 0x444 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x470 PUSH2 0x45B JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x47B PUSH2 0x26 JUMP JUMPDEST POP PUSH2 0x484 PUSH2 0x6C1 JUMP JUMPDEST PUSH2 0x4C0 PUSH2 0x4BB PUSH2 0x4B6 PUSH2 0x4AE PUSH2 0x4A8 PUSH1 0x0 CALLDATASIZE PUSH2 0x4A0 PUSH1 0x4 PUSH2 0x331 JUMP JUMPDEST SWAP1 DUP1 SWAP3 PUSH2 0x357 JUMP JUMPDEST SWAP1 PUSH2 0x37C JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3B9 JUMP JUMPDEST PUSH2 0x400 JUMP JUMPDEST PUSH2 0x704 JUMP JUMPDEST PUSH2 0x4C8 PUSH2 0x468 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x4F3 JUMPI PUSH2 0x4EF PUSH1 0x20 SWAP2 PUSH2 0x255 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x25F JUMP JUMPDEST SWAP1 DUP3 PUSH1 0x0 SWAP4 SWAP3 DUP3 CALLDATACOPY ADD MSTORE JUMP JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x519 PUSH2 0x514 DUP3 PUSH2 0x4D5 JUMP JUMPDEST PUSH2 0x40C JUMP JUMPDEST SWAP4 DUP2 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP1 DUP3 DUP5 ADD GT PUSH2 0x535 JUMPI PUSH2 0x533 SWAP3 PUSH2 0x4F8 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x4D0 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x558 JUMPI DUP2 PUSH1 0x20 PUSH2 0x555 SWAP4 CALLDATALOAD SWAP2 ADD PUSH2 0x504 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x4CB JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH1 0x40 DUP2 DUP5 SUB SLT PUSH2 0x59E JUMPI PUSH2 0x577 DUP4 PUSH1 0x0 DUP4 ADD PUSH2 0x3AA JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x599 JUMPI PUSH2 0x596 SWAP3 ADD PUSH2 0x53A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x384 JUMP JUMPDEST PUSH2 0x37F JUMP JUMPDEST PUSH2 0x5AB PUSH2 0x26 JUMP JUMPDEST POP PUSH2 0x5EE PUSH2 0x5E5 PUSH2 0x5DE PUSH2 0x5D6 PUSH2 0x5D0 PUSH1 0x0 CALLDATASIZE PUSH2 0x5C8 PUSH1 0x4 PUSH2 0x331 JUMP JUMPDEST SWAP1 DUP1 SWAP3 PUSH2 0x357 JUMP JUMPDEST SWAP1 PUSH2 0x37C JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x55D JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x400 JUMP JUMPDEST SWAP1 PUSH1 0x1 SWAP2 PUSH2 0x755 JUMP JUMPDEST PUSH2 0x5F6 PUSH2 0x468 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x601 PUSH2 0x26 JUMP JUMPDEST POP PUSH2 0x60A PUSH2 0x6C1 JUMP JUMPDEST PUSH2 0x651 PUSH2 0x641 PUSH2 0x63C PUSH2 0x634 PUSH2 0x62E PUSH1 0x0 CALLDATASIZE PUSH2 0x626 PUSH1 0x4 PUSH2 0x331 JUMP JUMPDEST SWAP1 DUP1 SWAP3 PUSH2 0x357 JUMP JUMPDEST SWAP1 PUSH2 0x37C JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3B9 JUMP JUMPDEST PUSH2 0x400 JUMP JUMPDEST PUSH2 0x649 PUSH2 0x468 JUMP JUMPDEST PUSH1 0x0 SWAP2 PUSH2 0x755 JUMP JUMPDEST PUSH2 0x659 PUSH2 0x468 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x667 PUSH2 0x16D JUMP JUMPDEST POP PUSH2 0x670 PUSH2 0x7F2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP2 CALLDATASIZE DUP3 DUP1 CALLDATACOPY DUP2 CALLDATASIZE SWAP2 GAS DELEGATECALL RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY PUSH1 0x0 EQ PUSH2 0x691 JUMPI RETURNDATASIZE PUSH1 0x0 RETURN JUMPDEST RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x6AD PUSH2 0x6A8 PUSH2 0x6B2 SWAP3 PUSH2 0x696 JUMP JUMPDEST PUSH2 0x32E JUMP JUMPDEST PUSH2 0x32B JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x6BC JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x6DE CALLVALUE PUSH2 0x6D8 PUSH2 0x6D2 PUSH1 0x0 PUSH2 0x699 JUMP JUMPDEST SWAP2 PUSH2 0x32B JUMP JUMPDEST EQ PUSH2 0x6B5 JUMP JUMPDEST JUMP JUMPDEST SWAP2 PUSH1 0x20 PUSH2 0x702 SWAP3 SWAP5 SWAP4 PUSH2 0x6FB PUSH1 0x40 DUP3 ADD SWAP7 PUSH1 0x0 DUP4 ADD SWAP1 PUSH2 0x232 JUMP JUMPDEST ADD SWAP1 PUSH2 0x232 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x74F SWAP1 PUSH2 0x710 PUSH2 0x1F8 JUMP JUMPDEST DUP2 PUSH32 0x7E644D79422F17C01E4894B5F4F588D331EBFA28653D42AE832DC59E38C9798F SWAP2 PUSH2 0x747 PUSH2 0x73E PUSH2 0x22C JUMP JUMPDEST SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x6E0 JUMP JUMPDEST SUB SWAP1 LOG1 PUSH2 0x93E JUMP JUMPDEST JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST SWAP2 PUSH2 0x75F DUP4 PUSH2 0x988 JUMP JUMPDEST PUSH2 0x768 DUP3 PUSH2 0x751 JUMP JUMPDEST PUSH2 0x77B PUSH2 0x775 PUSH1 0x0 PUSH2 0x699 JUMP JUMPDEST SWAP2 PUSH2 0x32B JUMP JUMPDEST GT SWAP1 DUP2 ISZERO PUSH2 0x79F JUMPI JUMPDEST POP PUSH2 0x78E JUMPI JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x797 SWAP2 PUSH2 0xA45 JUMP JUMPDEST POP CODESIZE DUP1 PUSH2 0x78A JUMP JUMPDEST SWAP1 POP CODESIZE PUSH2 0x784 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x7BE PUSH2 0x7B9 PUSH2 0x7C3 SWAP3 PUSH2 0x7A7 JUMP JUMPDEST PUSH2 0x178 JUMP JUMPDEST PUSH2 0x175 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x7EF PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC PUSH2 0x7AA JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x7FA PUSH2 0x16D JUMP JUMPDEST POP PUSH2 0x816 PUSH1 0x0 PUSH2 0x810 PUSH2 0x80B PUSH2 0x7C6 JUMP JUMPDEST PUSH2 0x65C JUMP JUMPDEST ADD PUSH2 0x1EB JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x82D PUSH2 0x828 PUSH2 0x832 SWAP3 PUSH2 0x696 JUMP JUMPDEST PUSH2 0x32E JUMP JUMPDEST PUSH2 0xF JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x83E SWAP1 PUSH2 0x819 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0x455243313936373A206E65772061646D696E20697320746865207A65726F2061 PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x8A5 PUSH1 0x26 PUSH1 0x40 SWAP3 PUSH2 0x841 JUMP JUMPDEST PUSH2 0x8AE DUP2 PUSH2 0x84A JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x8C8 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x898 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x8D2 JUMPI JUMP JUMPDEST PUSH2 0x8DA PUSH2 0x22C JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x8F0 PUSH1 0x4 DUP3 ADD PUSH2 0x8B2 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP1 PUSH2 0x905 PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB SWAP2 PUSH2 0x178 JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST PUSH2 0x918 SWAP1 PUSH2 0x3F4 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x933 PUSH2 0x92E PUSH2 0x93A SWAP3 PUSH2 0x90F JUMP JUMPDEST PUSH2 0x91B JUMP JUMPDEST DUP3 SLOAD PUSH2 0x8F4 JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x980 SWAP1 PUSH2 0x968 DUP2 PUSH2 0x961 PUSH2 0x95B PUSH2 0x956 PUSH1 0x0 PUSH2 0x835 JUMP JUMPDEST PUSH2 0x1A JUMP JUMPDEST SWAP2 PUSH2 0x1A JUMP JUMPDEST EQ ISZERO PUSH2 0x8CB JUMP JUMPDEST PUSH1 0x0 PUSH2 0x97A PUSH2 0x975 PUSH2 0x19A JUMP JUMPDEST PUSH2 0x65C JUMP JUMPDEST ADD PUSH2 0x91E JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 ADD SWAP1 JUMP JUMPDEST PUSH2 0x991 DUP2 PUSH2 0xB0F JUMP JUMPDEST PUSH2 0x9BB PUSH32 0xBC7CD75A20EE27FD9ADEBAB32041F755214DBC6BFFA90CC0225B39DA2E5C2D3B SWAP2 PUSH2 0x90F JUMP JUMPDEST SWAP1 PUSH2 0x9C4 PUSH2 0x22C JUMP JUMPDEST DUP1 PUSH2 0x9CE DUP2 PUSH2 0x982 JUMP JUMPDEST SUB SWAP1 LOG2 JUMP JUMPDEST PUSH1 0x20 PUSH32 0x206661696C656400000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0x416464726573733A206C6F772D6C6576656C2064656C65676174652063616C6C PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xA2B PUSH1 0x27 PUSH2 0x444 JUMP JUMPDEST SWAP1 PUSH2 0xA38 PUSH1 0x20 DUP4 ADD PUSH2 0x9D3 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0xA42 PUSH2 0xA21 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0xA62 SWAP2 PUSH2 0xA52 PUSH2 0x26 JUMP JUMPDEST POP SWAP1 PUSH2 0xA5C PUSH2 0xA3A JUMP JUMPDEST SWAP2 PUSH2 0xB80 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x20 PUSH32 0x6F74206120636F6E747261637400000000000000000000000000000000000000 SWAP2 PUSH32 0x455243313936373A206E657720696D706C656D656E746174696F6E206973206E PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xAC0 PUSH1 0x2D PUSH1 0x40 SWAP3 PUSH2 0x841 JUMP JUMPDEST PUSH2 0xAC9 DUP2 PUSH2 0xA65 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0xAE3 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0xAB3 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0xAED JUMPI JUMP JUMPDEST PUSH2 0xAF5 PUSH2 0x22C JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0xB0B PUSH1 0x4 DUP3 ADD PUSH2 0xACD JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0xB3C SWAP1 PUSH2 0xB24 PUSH2 0xB1F DUP3 PUSH2 0xBB8 JUMP JUMPDEST PUSH2 0xAE6 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xB36 PUSH2 0xB31 PUSH2 0x7C6 JUMP JUMPDEST PUSH2 0x65C JUMP JUMPDEST ADD PUSH2 0x91E JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0xB50 PUSH2 0xB4B DUP4 PUSH2 0x4D5 JUMP JUMPDEST PUSH2 0x40C JUMP JUMPDEST SWAP2 DUP3 MSTORE JUMP JUMPDEST RETURNDATASIZE PUSH1 0x0 EQ PUSH2 0xB72 JUMPI PUSH2 0xB66 RETURNDATASIZE PUSH2 0xB3E JUMP JUMPDEST SWAP1 RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST JUMP JUMPDEST PUSH2 0xB7A PUSH2 0x26 JUMP JUMPDEST SWAP1 PUSH2 0xB70 JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x0 DUP1 PUSH2 0xBB0 SWAP5 PUSH2 0xB91 PUSH2 0x26 JUMP JUMPDEST POP DUP5 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 MLOAD SWAP2 GAS DELEGATECALL SWAP2 PUSH2 0xBA6 PUSH2 0xB55 JUMP JUMPDEST SWAP1 SWAP3 SWAP1 SWAP2 SWAP3 PUSH2 0xC5D JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0xBC0 PUSH2 0xBB3 JUMP JUMPDEST POP EXTCODESIZE PUSH2 0xBD5 PUSH2 0xBCF PUSH1 0x0 PUSH2 0x699 JUMP JUMPDEST SWAP2 PUSH2 0x32B JUMP JUMPDEST GT SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0xC0E PUSH1 0x1D PUSH1 0x20 SWAP3 PUSH2 0x841 JUMP JUMPDEST PUSH2 0xC17 DUP2 PUSH2 0xBD9 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0xC31 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0xC01 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0xC3B JUMPI JUMP JUMPDEST PUSH2 0xC43 PUSH2 0x22C JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0xC59 PUSH1 0x4 DUP3 ADD PUSH2 0xC1B JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP2 SWAP3 SWAP1 PUSH2 0xC68 PUSH2 0x26 JUMP JUMPDEST POP PUSH1 0x0 EQ PUSH2 0xCAE JUMPI POP PUSH2 0xC7A DUP3 PUSH2 0x751 JUMP JUMPDEST PUSH2 0xC8D PUSH2 0xC87 PUSH1 0x0 PUSH2 0x699 JUMP JUMPDEST SWAP2 PUSH2 0x32B JUMP JUMPDEST EQ PUSH2 0xC97 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0xCA3 PUSH2 0xCA8 SWAP2 PUSH2 0xBB8 JUMP JUMPDEST PUSH2 0xC34 JUMP JUMPDEST CODESIZE PUSH2 0xC93 JUMP JUMPDEST DUP3 PUSH2 0xD27 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0xCCC JUMPI POP POP SWAP1 PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP1 PUSH1 0x20 SWAP2 DUP4 ADD MLOAD DUP2 DUP6 ADD MSTORE ADD PUSH2 0xCBB JUMP JUMPDEST PUSH2 0xCFC PUSH2 0xD05 PUSH1 0x20 SWAP4 PUSH2 0xD0A SWAP4 PUSH2 0xCF3 DUP2 PUSH2 0xCB4 JUMP JUMPDEST SWAP4 DUP5 DUP1 SWAP4 PUSH2 0x841 JUMP JUMPDEST SWAP6 DUP7 SWAP2 ADD PUSH2 0xCB8 JUMP JUMPDEST PUSH2 0x255 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0xD24 SWAP2 PUSH1 0x20 DUP3 ADD SWAP2 PUSH1 0x0 DUP2 DUP5 SUB SWAP2 ADD MSTORE PUSH2 0xCDD JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0xD31 DUP3 PUSH2 0x751 JUMP JUMPDEST PUSH2 0xD44 PUSH2 0xD3E PUSH1 0x0 PUSH2 0x699 JUMP JUMPDEST SWAP2 PUSH2 0x32B JUMP JUMPDEST GT PUSH1 0x0 EQ PUSH2 0xD55 JUMPI POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD REVERT JUMPDEST PUSH2 0xD76 SWAP1 PUSH2 0xD61 PUSH2 0x22C JUMP JUMPDEST SWAP2 DUP3 SWAP2 PUSH3 0x461BCD PUSH1 0xE5 SHL DUP4 MSTORE PUSH1 0x4 DUP4 ADD PUSH2 0xD0E JUMP JUMPDEST SUB SWAP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x4E TIMESTAMP 0xC1 0xB8 0x1E LOG1 0xDD TSTORE 0xCC DUP16 0xBC 0xB8 0xBF 0xDF SWAP4 RETURNDATACOPY SWAP3 CODECOPY PUSH17 0x5676A402A624342386FE3FB73064736F6C PUSH4 0x4300081B STOP CALLER ", + "sourceMap": "2857:4583:37:-:0;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "abi_decode_address_payable": { + "entryPoint": 938, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_address_payablet_bytes": { + "entryPoint": 1373, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_available_length_bytes": { + "entryPoint": 1284, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_decode_bytes": { + "entryPoint": 1338, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_address_payable": { + "entryPoint": 953, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_address": { + "entryPoint": 562, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_address_address": { + "entryPoint": 1760, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_string": { + "entryPoint": 3342, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_string_memory_ptr": { + "entryPoint": 3293, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_stringliteral": { + "entryPoint": 2200, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_stringliteral_972b": { + "entryPoint": 2739, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_stringliteral_cc2e": { + "entryPoint": 3099, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad": { + "entryPoint": 3073, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple": { + "entryPoint": 2434, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple_address": { + "entryPoint": 575, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_stringliteral": { + "entryPoint": 2226, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple_stringliteral_972b": { + "entryPoint": 2765, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "allocate_memory": { + "entryPoint": 1036, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "allocate_memory_array_bytes": { + "entryPoint": 2878, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "allocate_memory_array_string": { + "entryPoint": 1092, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "allocate_unbounded": { + "entryPoint": 556, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "array_allocation_size_bytes": { + "entryPoint": 1237, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_allocation_size_string": { + "entryPoint": 1057, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_length_bytes": { + "entryPoint": 1873, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_length_string": { + "entryPoint": 3252, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_storeLengthForEncoding_string": { + "entryPoint": 2113, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "calldata_array_index_range_access_bytes_calldata": { + "entryPoint": 855, + "id": null, + "parameterSlots": 4, + "returnSlots": 2 + }, + "cleanup_address": { + "entryPoint": 26, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_address_payable": { + "entryPoint": 905, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_bytes32": { + "entryPoint": 373, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_bytes4": { + "entryPoint": 43, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_from_storage_address": { + "entryPoint": 460, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_rational_by": { + "entryPoint": 808, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_rational_by_1": { + "entryPoint": 1686, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_t_rational_by": { + "entryPoint": 370, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_t_rational_by_1": { + "entryPoint": 1959, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_uint160": { + "entryPoint": 15, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_uint256": { + "entryPoint": 811, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "constant_ADMIN_SLOT": { + "entryPoint": 410, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "constant_IMPLEMENTATION_SLOT": { + "entryPoint": 1990, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "convert_address_payable_to_address": { + "entryPoint": 1024, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_address_to_address": { + "entryPoint": 2319, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_bytes_calldata_slice_to_bytes_calldata": { + "entryPoint": 892, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "convert_rational_by_to_address": { + "entryPoint": 2101, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_by_to_bytes32": { + "entryPoint": 1962, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_by_to_uint160": { + "entryPoint": 2073, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_by_to_uint256": { + "entryPoint": 817, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_stringliteral_9fdc_to_string": { + "entryPoint": 2618, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "convert_stringliteral_c5d2_to_bytes": { + "entryPoint": 1128, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "convert_t_rational_by_to_t_bytes32": { + "entryPoint": 382, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_t_rational_by_to_t_uint256": { + "entryPoint": 1689, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint160_to_address": { + "entryPoint": 1012, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint160_to_uint160": { + "entryPoint": 984, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "copy_calldata_to_memory_with_cleanup": { + "entryPoint": 1272, + "id": null, + "parameterSlots": 3, + "returnSlots": 0 + }, + "copy_literal_to_memory_9fdcd12e4b726339b32a442b0a448365d5d85c96b2d2cff917b4f66c63110398": { + "entryPoint": 2593, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "copy_literal_to_memory_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470": { + "entryPoint": 1115, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "copy_memory_to_memory_with_cleanup": { + "entryPoint": 3256, + "id": null, + "parameterSlots": 3, + "returnSlots": 0 + }, + "extract_from_storage_value_offsett_address": { + "entryPoint": 471, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "extract_returndata": { + "entryPoint": 2901, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "finalize_allocation": { + "entryPoint": 629, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun": { + "entryPoint": null, + "id": 1051, + "parameterSlots": 0, + "returnSlots": 0 + }, + "fun_": { + "entryPoint": null, + "id": 1043, + "parameterSlots": 0, + "returnSlots": 0 + }, + "fun__fallback": { + "entryPoint": 55, + "id": 8185, + "parameterSlots": 0, + "returnSlots": 0 + }, + "fun_changeAdmin": { + "entryPoint": 1796, + "id": 913, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_delegate": { + "entryPoint": 1651, + "id": 1016, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_dispatchAdmin": { + "entryPoint": 739, + "id": 8205, + "parameterSlots": 0, + "returnSlots": 1 + }, + "fun_dispatchChangeAdmin": { + "entryPoint": 1139, + "id": 8254, + "parameterSlots": 0, + "returnSlots": 1 + }, + "fun_dispatchImplementation": { + "entryPoint": 670, + "id": 8225, + "parameterSlots": 0, + "returnSlots": 1 + }, + "fun_dispatchUpgradeTo": { + "entryPoint": 1529, + "id": 8288, + "parameterSlots": 0, + "returnSlots": 1 + }, + "fun_dispatchUpgradeToAndCall": { + "entryPoint": 1443, + "id": 8320, + "parameterSlots": 0, + "returnSlots": 1 + }, + "fun_fallback": { + "entryPoint": 543, + "id": 1035, + "parameterSlots": 0, + "returnSlots": 0 + }, + "fun_functionDelegateCall": { + "entryPoint": 2629, + "id": 1557, + "parameterSlots": 2, + "returnSlots": 1 + }, + "fun_functionDelegateCall_1586": { + "entryPoint": 2944, + "id": 1586, + "parameterSlots": 3, + "returnSlots": 1 + }, + "fun_getAddressSlot": { + "entryPoint": 1628, + "id": 1805, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_getAdmin": { + "entryPoint": 504, + "id": 870, + "parameterSlots": 0, + "returnSlots": 1 + }, + "fun_getImplementation": { + "entryPoint": 2034, + "id": 731, + "parameterSlots": 0, + "returnSlots": 1 + }, + "fun_implementation": { + "entryPoint": 1631, + "id": 8038, + "parameterSlots": 0, + "returnSlots": 1 + }, + "fun_isContract": { + "entryPoint": 3000, + "id": 1358, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_requireZeroValue": { + "entryPoint": 1729, + "id": 8342, + "parameterSlots": 0, + "returnSlots": 0 + }, + "fun_revert": { + "entryPoint": 3367, + "id": 1669, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun_setAdmin": { + "entryPoint": 2366, + "id": 896, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_setImplementation": { + "entryPoint": 2831, + "id": 755, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_upgradeTo": { + "entryPoint": 2440, + "id": 770, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_upgradeToAndCall": { + "entryPoint": 1877, + "id": 800, + "parameterSlots": 3, + "returnSlots": 0 + }, + "fun_verifyCallResultFromTarget": { + "entryPoint": 3165, + "id": 1625, + "parameterSlots": 4, + "returnSlots": 1 + }, + "identity": { + "entryPoint": 814, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "panic_error_0x41": { + "entryPoint": 607, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "prepare_store_address": { + "entryPoint": 2331, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "read_from_storage_split_offset_address": { + "entryPoint": 491, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "require_helper": { + "entryPoint": 1717, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "require_helper_stringliteral": { + "entryPoint": 2251, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "require_helper_stringliteral_972b": { + "entryPoint": 2790, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "require_helper_stringliteral_cc2e": { + "entryPoint": 3124, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "revert_error_1b9f4a0a5773e33b91aa01db23bf8c55fce1411167c872835e7fa00a4f17d46d": { + "entryPoint": 1227, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_46e3e63c93837e9efa638abb3b4e76ced8c11259a873f1381a0abdf6ae6a823c": { + "entryPoint": 850, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_7678404c0552a58cf14944d1a786cf4c81aab3563e2735cb332aee47bbb57c4a": { + "entryPoint": 845, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_987264b3b1d58a9c7f8255e93e81c77d86d6299019c33110a076957a3e06e2ae": { + "entryPoint": 1232, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db": { + "entryPoint": 900, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b": { + "entryPoint": 895, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "round_up_to_mul_of": { + "entryPoint": 597, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_left": { + "entryPoint": 376, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_right_unsigned": { + "entryPoint": 454, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "store_literal_in_memory_3820e16891102c1360a787e6e648431097d92537f969d458f5c94b56f8318be5": { + "entryPoint": 2122, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "store_literal_in_memory_972b7028e8de0bff0d553b3264eba2312ec98a552add05e58853b313f9f4ac65": { + "entryPoint": 2661, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "store_literal_in_memory_9fdcd12e4b726339b32a442b0a448365d5d85c96b2d2cff917b4f66c63110398": { + "entryPoint": 2515, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "store_literal_in_memory_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad": { + "entryPoint": 3033, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "update_byte_slice_shift": { + "entryPoint": 2292, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "update_storage_value_offsett_address_to_address": { + "entryPoint": 2334, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "validator_revert_address_payable": { + "entryPoint": 917, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "zero_value_for_split_address": { + "entryPoint": 365, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "zero_value_for_split_bool": { + "entryPoint": 2995, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "zero_value_for_split_bytes": { + "entryPoint": 38, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + } + }, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "6080604052361561003757610037565b60018060a01b031690565b6100239061000f565b90565b606090565b63ffffffff60e01b1690565b3361005161004b6100466101f8565b61001a565b9161001a565b1460001461016857610061610026565b5063ffffffff60e01b6000351680610088610082631b2ce7f360e11b61002b565b9161002b565b146000146100a257506100996105f9565b5b602081519101f35b806100bc6100b663278f794360e11b61002b565b9161002b565b146000146100d357506100cd6105a3565b5b61009a565b806100ed6100e76308f2839760e41b61002b565b9161002b565b1460001461010457506100fe610473565b5b6100ce565b8061011e6101186303e1469160e61b61002b565b9161002b565b14600014610135575061012f6102e3565b5b6100ff565b61014e610148635c60da1b60e01b61002b565b9161002b565b146000146101635761015e61029e565b610130565b61021f565b61021f565b600090565b90565b90565b60001b90565b61019261018d61019792610172565b610178565b610175565b90565b6101c37fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610361017e565b90565b60001c90565b60018060a01b031690565b6101e36101e8916101c6565b6101cc565b90565b6101f590546101d7565b90565b61020061016d565b5061021c600061021661021161019a565b61065c565b016101eb565b90565b61022761065f565b610673565b60405190565b61023b9061001a565b9052565b919061025390600060208501940190610232565b565b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b9061027f90610255565b810190811067ffffffffffffffff82111761029957604052565b61025f565b6102a6610026565b506102af6106c1565b6102d16102e06102bd61065f565b6102c561022c565b9283916020830161023f565b60208201810382520382610275565b90565b6102eb610026565b506102f46106c1565b6103166103256103026101f8565b61030a61022c565b9283916020830161023f565b60208201810382520382610275565b90565b90565b90565b90565b61034561034061034a92610328565b61032e565b61032b565b90565b600080fd5b600080fd5b90939293848311610377578411610372576001820201920390565b610352565b61034d565b91565b600080fd5b600080fd5b6103929061000f565b90565b61039e81610389565b036103a557565b600080fd5b905035906103b782610395565b565b906020828203126103d3576103d0916000016103aa565b90565b61037f565b6103ec6103e76103f19261000f565b61032e565b61000f565b90565b6103fd906103d8565b90565b610409906103f4565b90565b9061041f61041861022c565b9283610275565b565b67ffffffffffffffff811161043f5761043b602091610255565b0190565b61025f565b9061045661045183610421565b61040c565b918252565b6104656000610444565b90565b61047061045b565b90565b61047b610026565b506104846106c1565b6104c06104bb6104b66104ae6104a86000366104a06004610331565b908092610357565b9061037c565b8101906103b9565b610400565b610704565b6104c8610468565b90565b600080fd5b600080fd5b67ffffffffffffffff81116104f3576104ef602091610255565b0190565b61025f565b90826000939282370152565b90929192610519610514826104d5565b61040c565b9381855260208501908284011161053557610533926104f8565b565b6104d0565b9080601f830112156105585781602061055593359101610504565b90565b6104cb565b91909160408184031261059e5761057783600083016103aa565b92602082013567ffffffffffffffff811161059957610596920161053a565b90565b610384565b61037f565b6105ab610026565b506105ee6105e56105de6105d66105d06000366105c86004610331565b908092610357565b9061037c565b81019061055d565b9190610400565b90600191610755565b6105f6610468565b90565b610601610026565b5061060a6106c1565b61065161064161063c61063461062e6000366106266004610331565b908092610357565b9061037c565b8101906103b9565b610400565b610649610468565b600091610755565b610659610468565b90565b90565b61066761016d565b506106706107f2565b90565b60008091368280378136915af43d6000803e600014610691573d6000f35b3d6000fd5b90565b6106ad6106a86106b292610696565b61032e565b61032b565b90565b156106bc57565b600080fd5b6106de346106d86106d26000610699565b9161032b565b146106b5565b565b9160206107029294936106fb60408201966000830190610232565b0190610232565b565b61074f906107106101f8565b817f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f9161074761073e61022c565b928392836106e0565b0390a161093e565b565b5190565b9161075f83610988565b61076882610751565b61077b6107756000610699565b9161032b565b1190811561079f575b5061078e575b5050565b61079791610a45565b50388061078a565b905038610784565b90565b6107be6107b96107c3926107a7565b610178565b610175565b90565b6107ef7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6107aa565b90565b6107fa61016d565b50610816600061081061080b6107c6565b61065c565b016101eb565b90565b61082d61082861083292610696565b61032e565b61000f565b90565b61083e90610819565b90565b60209181520190565b60207f6464726573730000000000000000000000000000000000000000000000000000917f455243313936373a206e65772061646d696e20697320746865207a65726f206160008201520152565b6108a56026604092610841565b6108ae8161084a565b0190565b6108c89060208101906000818303910152610898565b90565b156108d257565b6108da61022c565b62461bcd60e51b8152806108f0600482016108b2565b0390fd5b9061090560018060a01b0391610178565b9181191691161790565b610918906103f4565b90565b90565b9061093361092e61093a9261090f565b61091b565b82546108f4565b9055565b610980906109688161096161095b6109566000610835565b61001a565b9161001a565b14156108cb565b600061097a61097561019a565b61065c565b0161091e565b565b60000190565b61099181610b0f565b6109bb7fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b9161090f565b906109c461022c565b806109ce81610982565b0390a2565b60207f206661696c656400000000000000000000000000000000000000000000000000917f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c60008201520152565b610a2b6027610444565b90610a38602083016109d3565b565b610a42610a21565b90565b90610a6291610a52610026565b5090610a5c610a3a565b91610b80565b90565b60207f6f74206120636f6e747261637400000000000000000000000000000000000000917f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60008201520152565b610ac0602d604092610841565b610ac981610a65565b0190565b610ae39060208101906000818303910152610ab3565b90565b15610aed57565b610af561022c565b62461bcd60e51b815280610b0b60048201610acd565b0390fd5b610b3c90610b24610b1f82610bb8565b610ae6565b6000610b36610b316107c6565b61065c565b0161091e565b565b90610b50610b4b836104d5565b61040c565b918252565b3d600014610b7257610b663d610b3e565b903d6000602084013e5b565b610b7a610026565b90610b70565b9091600080610bb094610b91610026565b508490602081019051915af491610ba6610b55565b9092909192610c5d565b90565b600090565b610bc0610bb3565b503b610bd5610bcf6000610699565b9161032b565b1190565b60007f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000910152565b610c0e601d602092610841565b610c1781610bd9565b0190565b610c319060208101906000818303910152610c01565b90565b15610c3b57565b610c4361022c565b62461bcd60e51b815280610c5960048201610c1b565b0390fd5b919290610c68610026565b50600014610cae5750610c7a82610751565b610c8d610c876000610699565b9161032b565b14610c97575b5090565b610ca3610ca891610bb8565b610c34565b38610c93565b82610d27565b5190565b60005b838110610ccc575050906000910152565b806020918301518185015201610cbb565b610cfc610d05602093610d0a93610cf381610cb4565b93848093610841565b95869101610cb8565b610255565b0190565b610d249160208201916000818403910152610cdd565b90565b90610d3182610751565b610d44610d3e6000610699565b9161032b565b11600014610d555750805190602001fd5b610d7690610d6161022c565b91829162461bcd60e51b835260048301610d0e565b0390fdfea26469706673582212204e42c1b81ea1dd5dcc8fbcb8bfdf933e9239705676a402a624342386fe3fb73064736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLDATASIZE ISZERO PUSH2 0x37 JUMPI PUSH2 0x37 JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x23 SWAP1 PUSH2 0xF JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x60 SWAP1 JUMP JUMPDEST PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL AND SWAP1 JUMP JUMPDEST CALLER PUSH2 0x51 PUSH2 0x4B PUSH2 0x46 PUSH2 0x1F8 JUMP JUMPDEST PUSH2 0x1A JUMP JUMPDEST SWAP2 PUSH2 0x1A JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0x168 JUMPI PUSH2 0x61 PUSH2 0x26 JUMP JUMPDEST POP PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL PUSH1 0x0 CALLDATALOAD AND DUP1 PUSH2 0x88 PUSH2 0x82 PUSH4 0x1B2CE7F3 PUSH1 0xE1 SHL PUSH2 0x2B JUMP JUMPDEST SWAP2 PUSH2 0x2B JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0xA2 JUMPI POP PUSH2 0x99 PUSH2 0x5F9 JUMP JUMPDEST JUMPDEST PUSH1 0x20 DUP2 MLOAD SWAP2 ADD RETURN JUMPDEST DUP1 PUSH2 0xBC PUSH2 0xB6 PUSH4 0x278F7943 PUSH1 0xE1 SHL PUSH2 0x2B JUMP JUMPDEST SWAP2 PUSH2 0x2B JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0xD3 JUMPI POP PUSH2 0xCD PUSH2 0x5A3 JUMP JUMPDEST JUMPDEST PUSH2 0x9A JUMP JUMPDEST DUP1 PUSH2 0xED PUSH2 0xE7 PUSH4 0x8F28397 PUSH1 0xE4 SHL PUSH2 0x2B JUMP JUMPDEST SWAP2 PUSH2 0x2B JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0x104 JUMPI POP PUSH2 0xFE PUSH2 0x473 JUMP JUMPDEST JUMPDEST PUSH2 0xCE JUMP JUMPDEST DUP1 PUSH2 0x11E PUSH2 0x118 PUSH4 0x3E14691 PUSH1 0xE6 SHL PUSH2 0x2B JUMP JUMPDEST SWAP2 PUSH2 0x2B JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0x135 JUMPI POP PUSH2 0x12F PUSH2 0x2E3 JUMP JUMPDEST JUMPDEST PUSH2 0xFF JUMP JUMPDEST PUSH2 0x14E PUSH2 0x148 PUSH4 0x5C60DA1B PUSH1 0xE0 SHL PUSH2 0x2B JUMP JUMPDEST SWAP2 PUSH2 0x2B JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0x163 JUMPI PUSH2 0x15E PUSH2 0x29E JUMP JUMPDEST PUSH2 0x130 JUMP JUMPDEST PUSH2 0x21F JUMP JUMPDEST PUSH2 0x21F JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SHL SWAP1 JUMP JUMPDEST PUSH2 0x192 PUSH2 0x18D PUSH2 0x197 SWAP3 PUSH2 0x172 JUMP JUMPDEST PUSH2 0x178 JUMP JUMPDEST PUSH2 0x175 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1C3 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 PUSH2 0x17E JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SHR SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x1E3 PUSH2 0x1E8 SWAP2 PUSH2 0x1C6 JUMP JUMPDEST PUSH2 0x1CC JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1F5 SWAP1 SLOAD PUSH2 0x1D7 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x200 PUSH2 0x16D JUMP JUMPDEST POP PUSH2 0x21C PUSH1 0x0 PUSH2 0x216 PUSH2 0x211 PUSH2 0x19A JUMP JUMPDEST PUSH2 0x65C JUMP JUMPDEST ADD PUSH2 0x1EB JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x227 PUSH2 0x65F JUMP JUMPDEST PUSH2 0x673 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH2 0x23B SWAP1 PUSH2 0x1A JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x253 SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0x232 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x1F DUP1 NOT SWAP2 ADD AND SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH2 0x27F SWAP1 PUSH2 0x255 JUMP JUMPDEST DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x299 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH2 0x25F JUMP JUMPDEST PUSH2 0x2A6 PUSH2 0x26 JUMP JUMPDEST POP PUSH2 0x2AF PUSH2 0x6C1 JUMP JUMPDEST PUSH2 0x2D1 PUSH2 0x2E0 PUSH2 0x2BD PUSH2 0x65F JUMP JUMPDEST PUSH2 0x2C5 PUSH2 0x22C JUMP JUMPDEST SWAP3 DUP4 SWAP2 PUSH1 0x20 DUP4 ADD PUSH2 0x23F JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE SUB DUP3 PUSH2 0x275 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2EB PUSH2 0x26 JUMP JUMPDEST POP PUSH2 0x2F4 PUSH2 0x6C1 JUMP JUMPDEST PUSH2 0x316 PUSH2 0x325 PUSH2 0x302 PUSH2 0x1F8 JUMP JUMPDEST PUSH2 0x30A PUSH2 0x22C JUMP JUMPDEST SWAP3 DUP4 SWAP2 PUSH1 0x20 DUP4 ADD PUSH2 0x23F JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE SUB DUP3 PUSH2 0x275 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x345 PUSH2 0x340 PUSH2 0x34A SWAP3 PUSH2 0x328 JUMP JUMPDEST PUSH2 0x32E JUMP JUMPDEST PUSH2 0x32B JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP4 SWAP3 SWAP4 DUP5 DUP4 GT PUSH2 0x377 JUMPI DUP5 GT PUSH2 0x372 JUMPI PUSH1 0x1 DUP3 MUL ADD SWAP3 SUB SWAP1 JUMP JUMPDEST PUSH2 0x352 JUMP JUMPDEST PUSH2 0x34D JUMP JUMPDEST SWAP2 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x392 SWAP1 PUSH2 0xF JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x39E DUP2 PUSH2 0x389 JUMP JUMPDEST SUB PUSH2 0x3A5 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x3B7 DUP3 PUSH2 0x395 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x3D3 JUMPI PUSH2 0x3D0 SWAP2 PUSH1 0x0 ADD PUSH2 0x3AA JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x37F JUMP JUMPDEST PUSH2 0x3EC PUSH2 0x3E7 PUSH2 0x3F1 SWAP3 PUSH2 0xF JUMP JUMPDEST PUSH2 0x32E JUMP JUMPDEST PUSH2 0xF JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3FD SWAP1 PUSH2 0x3D8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x409 SWAP1 PUSH2 0x3F4 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x41F PUSH2 0x418 PUSH2 0x22C JUMP JUMPDEST SWAP3 DUP4 PUSH2 0x275 JUMP JUMPDEST JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x43F JUMPI PUSH2 0x43B PUSH1 0x20 SWAP2 PUSH2 0x255 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x25F JUMP JUMPDEST SWAP1 PUSH2 0x456 PUSH2 0x451 DUP4 PUSH2 0x421 JUMP JUMPDEST PUSH2 0x40C JUMP JUMPDEST SWAP2 DUP3 MSTORE JUMP JUMPDEST PUSH2 0x465 PUSH1 0x0 PUSH2 0x444 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x470 PUSH2 0x45B JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x47B PUSH2 0x26 JUMP JUMPDEST POP PUSH2 0x484 PUSH2 0x6C1 JUMP JUMPDEST PUSH2 0x4C0 PUSH2 0x4BB PUSH2 0x4B6 PUSH2 0x4AE PUSH2 0x4A8 PUSH1 0x0 CALLDATASIZE PUSH2 0x4A0 PUSH1 0x4 PUSH2 0x331 JUMP JUMPDEST SWAP1 DUP1 SWAP3 PUSH2 0x357 JUMP JUMPDEST SWAP1 PUSH2 0x37C JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3B9 JUMP JUMPDEST PUSH2 0x400 JUMP JUMPDEST PUSH2 0x704 JUMP JUMPDEST PUSH2 0x4C8 PUSH2 0x468 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x4F3 JUMPI PUSH2 0x4EF PUSH1 0x20 SWAP2 PUSH2 0x255 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x25F JUMP JUMPDEST SWAP1 DUP3 PUSH1 0x0 SWAP4 SWAP3 DUP3 CALLDATACOPY ADD MSTORE JUMP JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x519 PUSH2 0x514 DUP3 PUSH2 0x4D5 JUMP JUMPDEST PUSH2 0x40C JUMP JUMPDEST SWAP4 DUP2 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP1 DUP3 DUP5 ADD GT PUSH2 0x535 JUMPI PUSH2 0x533 SWAP3 PUSH2 0x4F8 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x4D0 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x558 JUMPI DUP2 PUSH1 0x20 PUSH2 0x555 SWAP4 CALLDATALOAD SWAP2 ADD PUSH2 0x504 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x4CB JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH1 0x40 DUP2 DUP5 SUB SLT PUSH2 0x59E JUMPI PUSH2 0x577 DUP4 PUSH1 0x0 DUP4 ADD PUSH2 0x3AA JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x599 JUMPI PUSH2 0x596 SWAP3 ADD PUSH2 0x53A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x384 JUMP JUMPDEST PUSH2 0x37F JUMP JUMPDEST PUSH2 0x5AB PUSH2 0x26 JUMP JUMPDEST POP PUSH2 0x5EE PUSH2 0x5E5 PUSH2 0x5DE PUSH2 0x5D6 PUSH2 0x5D0 PUSH1 0x0 CALLDATASIZE PUSH2 0x5C8 PUSH1 0x4 PUSH2 0x331 JUMP JUMPDEST SWAP1 DUP1 SWAP3 PUSH2 0x357 JUMP JUMPDEST SWAP1 PUSH2 0x37C JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x55D JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x400 JUMP JUMPDEST SWAP1 PUSH1 0x1 SWAP2 PUSH2 0x755 JUMP JUMPDEST PUSH2 0x5F6 PUSH2 0x468 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x601 PUSH2 0x26 JUMP JUMPDEST POP PUSH2 0x60A PUSH2 0x6C1 JUMP JUMPDEST PUSH2 0x651 PUSH2 0x641 PUSH2 0x63C PUSH2 0x634 PUSH2 0x62E PUSH1 0x0 CALLDATASIZE PUSH2 0x626 PUSH1 0x4 PUSH2 0x331 JUMP JUMPDEST SWAP1 DUP1 SWAP3 PUSH2 0x357 JUMP JUMPDEST SWAP1 PUSH2 0x37C JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x3B9 JUMP JUMPDEST PUSH2 0x400 JUMP JUMPDEST PUSH2 0x649 PUSH2 0x468 JUMP JUMPDEST PUSH1 0x0 SWAP2 PUSH2 0x755 JUMP JUMPDEST PUSH2 0x659 PUSH2 0x468 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x667 PUSH2 0x16D JUMP JUMPDEST POP PUSH2 0x670 PUSH2 0x7F2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP2 CALLDATASIZE DUP3 DUP1 CALLDATACOPY DUP2 CALLDATASIZE SWAP2 GAS DELEGATECALL RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY PUSH1 0x0 EQ PUSH2 0x691 JUMPI RETURNDATASIZE PUSH1 0x0 RETURN JUMPDEST RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x6AD PUSH2 0x6A8 PUSH2 0x6B2 SWAP3 PUSH2 0x696 JUMP JUMPDEST PUSH2 0x32E JUMP JUMPDEST PUSH2 0x32B JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x6BC JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x6DE CALLVALUE PUSH2 0x6D8 PUSH2 0x6D2 PUSH1 0x0 PUSH2 0x699 JUMP JUMPDEST SWAP2 PUSH2 0x32B JUMP JUMPDEST EQ PUSH2 0x6B5 JUMP JUMPDEST JUMP JUMPDEST SWAP2 PUSH1 0x20 PUSH2 0x702 SWAP3 SWAP5 SWAP4 PUSH2 0x6FB PUSH1 0x40 DUP3 ADD SWAP7 PUSH1 0x0 DUP4 ADD SWAP1 PUSH2 0x232 JUMP JUMPDEST ADD SWAP1 PUSH2 0x232 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x74F SWAP1 PUSH2 0x710 PUSH2 0x1F8 JUMP JUMPDEST DUP2 PUSH32 0x7E644D79422F17C01E4894B5F4F588D331EBFA28653D42AE832DC59E38C9798F SWAP2 PUSH2 0x747 PUSH2 0x73E PUSH2 0x22C JUMP JUMPDEST SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x6E0 JUMP JUMPDEST SUB SWAP1 LOG1 PUSH2 0x93E JUMP JUMPDEST JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST SWAP2 PUSH2 0x75F DUP4 PUSH2 0x988 JUMP JUMPDEST PUSH2 0x768 DUP3 PUSH2 0x751 JUMP JUMPDEST PUSH2 0x77B PUSH2 0x775 PUSH1 0x0 PUSH2 0x699 JUMP JUMPDEST SWAP2 PUSH2 0x32B JUMP JUMPDEST GT SWAP1 DUP2 ISZERO PUSH2 0x79F JUMPI JUMPDEST POP PUSH2 0x78E JUMPI JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x797 SWAP2 PUSH2 0xA45 JUMP JUMPDEST POP CODESIZE DUP1 PUSH2 0x78A JUMP JUMPDEST SWAP1 POP CODESIZE PUSH2 0x784 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x7BE PUSH2 0x7B9 PUSH2 0x7C3 SWAP3 PUSH2 0x7A7 JUMP JUMPDEST PUSH2 0x178 JUMP JUMPDEST PUSH2 0x175 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x7EF PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC PUSH2 0x7AA JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x7FA PUSH2 0x16D JUMP JUMPDEST POP PUSH2 0x816 PUSH1 0x0 PUSH2 0x810 PUSH2 0x80B PUSH2 0x7C6 JUMP JUMPDEST PUSH2 0x65C JUMP JUMPDEST ADD PUSH2 0x1EB JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x82D PUSH2 0x828 PUSH2 0x832 SWAP3 PUSH2 0x696 JUMP JUMPDEST PUSH2 0x32E JUMP JUMPDEST PUSH2 0xF JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x83E SWAP1 PUSH2 0x819 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0x455243313936373A206E65772061646D696E20697320746865207A65726F2061 PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x8A5 PUSH1 0x26 PUSH1 0x40 SWAP3 PUSH2 0x841 JUMP JUMPDEST PUSH2 0x8AE DUP2 PUSH2 0x84A JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x8C8 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x898 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x8D2 JUMPI JUMP JUMPDEST PUSH2 0x8DA PUSH2 0x22C JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x8F0 PUSH1 0x4 DUP3 ADD PUSH2 0x8B2 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP1 PUSH2 0x905 PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB SWAP2 PUSH2 0x178 JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST PUSH2 0x918 SWAP1 PUSH2 0x3F4 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x933 PUSH2 0x92E PUSH2 0x93A SWAP3 PUSH2 0x90F JUMP JUMPDEST PUSH2 0x91B JUMP JUMPDEST DUP3 SLOAD PUSH2 0x8F4 JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x980 SWAP1 PUSH2 0x968 DUP2 PUSH2 0x961 PUSH2 0x95B PUSH2 0x956 PUSH1 0x0 PUSH2 0x835 JUMP JUMPDEST PUSH2 0x1A JUMP JUMPDEST SWAP2 PUSH2 0x1A JUMP JUMPDEST EQ ISZERO PUSH2 0x8CB JUMP JUMPDEST PUSH1 0x0 PUSH2 0x97A PUSH2 0x975 PUSH2 0x19A JUMP JUMPDEST PUSH2 0x65C JUMP JUMPDEST ADD PUSH2 0x91E JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 ADD SWAP1 JUMP JUMPDEST PUSH2 0x991 DUP2 PUSH2 0xB0F JUMP JUMPDEST PUSH2 0x9BB PUSH32 0xBC7CD75A20EE27FD9ADEBAB32041F755214DBC6BFFA90CC0225B39DA2E5C2D3B SWAP2 PUSH2 0x90F JUMP JUMPDEST SWAP1 PUSH2 0x9C4 PUSH2 0x22C JUMP JUMPDEST DUP1 PUSH2 0x9CE DUP2 PUSH2 0x982 JUMP JUMPDEST SUB SWAP1 LOG2 JUMP JUMPDEST PUSH1 0x20 PUSH32 0x206661696C656400000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0x416464726573733A206C6F772D6C6576656C2064656C65676174652063616C6C PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xA2B PUSH1 0x27 PUSH2 0x444 JUMP JUMPDEST SWAP1 PUSH2 0xA38 PUSH1 0x20 DUP4 ADD PUSH2 0x9D3 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0xA42 PUSH2 0xA21 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0xA62 SWAP2 PUSH2 0xA52 PUSH2 0x26 JUMP JUMPDEST POP SWAP1 PUSH2 0xA5C PUSH2 0xA3A JUMP JUMPDEST SWAP2 PUSH2 0xB80 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x20 PUSH32 0x6F74206120636F6E747261637400000000000000000000000000000000000000 SWAP2 PUSH32 0x455243313936373A206E657720696D706C656D656E746174696F6E206973206E PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xAC0 PUSH1 0x2D PUSH1 0x40 SWAP3 PUSH2 0x841 JUMP JUMPDEST PUSH2 0xAC9 DUP2 PUSH2 0xA65 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0xAE3 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0xAB3 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0xAED JUMPI JUMP JUMPDEST PUSH2 0xAF5 PUSH2 0x22C JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0xB0B PUSH1 0x4 DUP3 ADD PUSH2 0xACD JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0xB3C SWAP1 PUSH2 0xB24 PUSH2 0xB1F DUP3 PUSH2 0xBB8 JUMP JUMPDEST PUSH2 0xAE6 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xB36 PUSH2 0xB31 PUSH2 0x7C6 JUMP JUMPDEST PUSH2 0x65C JUMP JUMPDEST ADD PUSH2 0x91E JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0xB50 PUSH2 0xB4B DUP4 PUSH2 0x4D5 JUMP JUMPDEST PUSH2 0x40C JUMP JUMPDEST SWAP2 DUP3 MSTORE JUMP JUMPDEST RETURNDATASIZE PUSH1 0x0 EQ PUSH2 0xB72 JUMPI PUSH2 0xB66 RETURNDATASIZE PUSH2 0xB3E JUMP JUMPDEST SWAP1 RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST JUMP JUMPDEST PUSH2 0xB7A PUSH2 0x26 JUMP JUMPDEST SWAP1 PUSH2 0xB70 JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x0 DUP1 PUSH2 0xBB0 SWAP5 PUSH2 0xB91 PUSH2 0x26 JUMP JUMPDEST POP DUP5 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 MLOAD SWAP2 GAS DELEGATECALL SWAP2 PUSH2 0xBA6 PUSH2 0xB55 JUMP JUMPDEST SWAP1 SWAP3 SWAP1 SWAP2 SWAP3 PUSH2 0xC5D JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0xBC0 PUSH2 0xBB3 JUMP JUMPDEST POP EXTCODESIZE PUSH2 0xBD5 PUSH2 0xBCF PUSH1 0x0 PUSH2 0x699 JUMP JUMPDEST SWAP2 PUSH2 0x32B JUMP JUMPDEST GT SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0xC0E PUSH1 0x1D PUSH1 0x20 SWAP3 PUSH2 0x841 JUMP JUMPDEST PUSH2 0xC17 DUP2 PUSH2 0xBD9 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0xC31 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0xC01 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0xC3B JUMPI JUMP JUMPDEST PUSH2 0xC43 PUSH2 0x22C JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0xC59 PUSH1 0x4 DUP3 ADD PUSH2 0xC1B JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP2 SWAP3 SWAP1 PUSH2 0xC68 PUSH2 0x26 JUMP JUMPDEST POP PUSH1 0x0 EQ PUSH2 0xCAE JUMPI POP PUSH2 0xC7A DUP3 PUSH2 0x751 JUMP JUMPDEST PUSH2 0xC8D PUSH2 0xC87 PUSH1 0x0 PUSH2 0x699 JUMP JUMPDEST SWAP2 PUSH2 0x32B JUMP JUMPDEST EQ PUSH2 0xC97 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0xCA3 PUSH2 0xCA8 SWAP2 PUSH2 0xBB8 JUMP JUMPDEST PUSH2 0xC34 JUMP JUMPDEST CODESIZE PUSH2 0xC93 JUMP JUMPDEST DUP3 PUSH2 0xD27 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0xCCC JUMPI POP POP SWAP1 PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP1 PUSH1 0x20 SWAP2 DUP4 ADD MLOAD DUP2 DUP6 ADD MSTORE ADD PUSH2 0xCBB JUMP JUMPDEST PUSH2 0xCFC PUSH2 0xD05 PUSH1 0x20 SWAP4 PUSH2 0xD0A SWAP4 PUSH2 0xCF3 DUP2 PUSH2 0xCB4 JUMP JUMPDEST SWAP4 DUP5 DUP1 SWAP4 PUSH2 0x841 JUMP JUMPDEST SWAP6 DUP7 SWAP2 ADD PUSH2 0xCB8 JUMP JUMPDEST PUSH2 0x255 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0xD24 SWAP2 PUSH1 0x20 DUP3 ADD SWAP2 PUSH1 0x0 DUP2 DUP5 SUB SWAP2 ADD MSTORE PUSH2 0xCDD JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0xD31 DUP3 PUSH2 0x751 JUMP JUMPDEST PUSH2 0xD44 PUSH2 0xD3E PUSH1 0x0 PUSH2 0x699 JUMP JUMPDEST SWAP2 PUSH2 0x32B JUMP JUMPDEST GT PUSH1 0x0 EQ PUSH2 0xD55 JUMPI POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD REVERT JUMPDEST PUSH2 0xD76 SWAP1 PUSH2 0xD61 PUSH2 0x22C JUMP JUMPDEST SWAP2 DUP3 SWAP2 PUSH3 0x461BCD PUSH1 0xE5 SHL DUP4 MSTORE PUSH1 0x4 DUP4 ADD PUSH2 0xD0E JUMP JUMPDEST SUB SWAP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x4E TIMESTAMP 0xC1 0xB8 0x1E LOG1 0xDD TSTORE 0xCC DUP16 0xBC 0xB8 0xBF 0xDF SWAP4 RETURNDATACOPY SWAP3 CODECOPY PUSH17 0x5676A402A624342386FE3FB73064736F6C PUSH4 0x4300081B STOP CALLER ", + "sourceMap": "2857:4583:37:-:0;;;;;2853:63:9;2857:4583:37;2629:64:9;:::i;2857:4583:37:-;;;;;;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;:::o;:::-;;;;;;:::o;3518:1089::-;3579:10;:25;;3593:11;;:::i;:::-;3579:25;:::i;:::-;;;:::i;:::-;;3575:1026;;;;3620:16;;:::i;:::-;2857:4583;;;;3668:7;;;3693:8;:59;;3705:47;;;3693:59;:::i;:::-;;;:::i;:::-;;3689:766;;;;3778:20;;;:::i;:::-;3689:766;4468:75;;;;;;3689:766;3823:8;:66;;3835:54;;;3823:66;:::i;:::-;;;:::i;:::-;;3819:636;;;;3915:27;;;:::i;:::-;3819:636;3689:766;;3819:636;3967:8;:61;;3979:49;;;3967:61;:::i;:::-;;;:::i;:::-;;3963:492;;;;4054:22;;;:::i;:::-;3963:492;3819:636;;3963:492;4101:8;:55;;4113:43;;;4101:55;:::i;:::-;;;:::i;:::-;;4097:358;;;;4182:16;;;:::i;:::-;4097:358;3963:492;;4097:358;4223:64;;4235:52;;;4223:64;:::i;:::-;;;:::i;:::-;;4219:236;;;;4313:25;;:::i;:::-;4097:358;;4219:236;;:::i;3575:1026::-;;:::i;2857:4583::-;;;:::o;:::-;;:::o;:::-;;:::o;:::-;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;3616:106:8:-;3656:66;;;:::i;:::-;3616:106;:::o;3656:66::-;;;;:::o;:::-;2857:4583:37;;;;;3656:66:8;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;3784:122::-;3828:7;;:::i;:::-;3881:11;3854:45;;:39;3881:11;;:::i;:::-;3854:39;:::i;:::-;:45;;:::i;:::-;3847:52;:::o;2322:110:9:-;2407:17;;:::i;:::-;;:::i;2857:4583:37:-;;;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::o;:::-;;:::i;5483:198::-;5535:12;;:::i;:::-;;;;:::i;:::-;5648:26;;5614:17;;:::i;:::-;5648:26;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;5641:33;:::o;4958:165::-;5001:12;;:::i;:::-;;;;:::i;:::-;5099:17;;5071:11;;:::i;:::-;5099:17;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;5092:24;:::o;2857:4583::-;;:::o;:::-;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;;;:::i;:::-;:::o;:::-;;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;:::-;;;;;;:::i;:::-;;:::i;:::-;;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;:::i;:::-;;:::o;5792:216::-;5841:12;;:::i;:::-;;;;:::i;:::-;5972:8;5895:54;5914:35;;5925:12;:8;;:12;5934:1;5925:12;:::i;:::-;;;;;:::i;:::-;5914:35;;:::i;:::-;;;;;:::i;:::-;5895:54;:::i;:::-;5972:8;:::i;:::-;5992:9;;:::i;:::-;;:::o;2857:4583::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;:::i;6622:254::-;6676:12;;:::i;:::-;6760:8;6844:4;6700:91;6749:42;;6760:12;:8;;:12;6769:1;6760:12;:::i;:::-;;;;;:::i;:::-;6749:42;;:::i;:::-;;;;;:::i;:::-;6700:91;;;:::i;:::-;6838:4;6844;;;:::i;:::-;6860:9;;:::i;:::-;;:::o;6083:255::-;6130:12;;:::i;:::-;;;;:::i;:::-;6305:5;6184:63;6212:35;;6223:12;:8;;:12;6232:1;6223:12;:::i;:::-;;;;;:::i;:::-;6212:35;;:::i;:::-;;;;;:::i;:::-;6184:63;:::i;:::-;6294:9;;:::i;:::-;6305:5;;;:::i;:::-;6322:9;;:::i;:::-;;:::o;1859:190:16:-;;:::o;884:140:36:-;951:12;;:::i;:::-;982:35;;;:::i;:::-;975:42;:::o;948:895:9:-;1018:819;948:895;;1018:819;;;;;;;;;;;;;;;;;;;;;;;;2857:4583:37;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;;7359:78;7407:23;7415:9;:14;;7428:1;7415:14;:::i;:::-;;;:::i;:::-;;7407:23;:::i;:::-;7359:78::o;2857:4583::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;:::o;4300:135:8:-;4419:8;4300:135;4377:11;;:::i;:::-;4390:8;4364:35;;;;;:::i;:::-;;;;;;:::i;:::-;;;;4419:8;:::i;:::-;4300:135::o;2857:4583:37:-;;;:::o;2057:265:8:-;;2176:17;;;:::i;:::-;2208:11;:4;:11;:::i;:::-;:15;;2222:1;2208:15;:::i;:::-;;;:::i;:::-;;:28;;;;;2057:265;2204:112;;;2057:265;;;:::o;2204:112::-;2252:53;2281:17;2252:53;:::i;:::-;;2204:112;;;;2208:28;2227:9;;2208:28;;;2857:4583:37;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;981:115:8:-;1030:66;;;:::i;:::-;981:115;:::o;1175:140::-;1228:7;;:::i;:::-;1281:20;1254:54;;:48;1281:20;;:::i;:::-;1254:48;:::i;:::-;:54;;:::i;:::-;1247:61;:::o;2857:4583:37:-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;3988:201:8:-;4126:56;3988:201;4043:73;4051:8;:22;;4063:10;4071:1;4063:10;:::i;:::-;4051:22;:::i;:::-;;;:::i;:::-;;;4043:73;:::i;:::-;4126:45;:39;4153:11;;:::i;:::-;4126:39;:::i;:::-;:45;:56;:::i;:::-;3988:201::o;2857:4583:37:-;;;;:::o;1771:152:8:-;1856:17;;;:::i;:::-;1889:27;;;;:::i;:::-;;;;:::i;:::-;;;;;:::i;:::-;;;;1771:152::o;2857:4583:37:-;;;;;;;;;;;:::o;:::-;;;;:::i;:::-;;;;;;;:::i;:::-;:::o;:::-;;;:::i;:::-;;:::o;6674:198:13:-;;6788:77;6674:198;6757:12;;:::i;:::-;6809:6;6817:4;6788:77;;:::i;:::-;;;:::i;:::-;6781:84;:::o;2857:4583:37:-;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;1406:259:8;1584:74;1406:259;1479:95;1487:37;1506:17;1487:37;:::i;:::-;1479:95;:::i;:::-;1584:54;:48;1611:20;;:::i;:::-;1584:48;:::i;:::-;:54;:74;:::i;:::-;1406:259::o;2857:4583:37:-;;;;;;:::i;:::-;;:::i;:::-;;;;:::o;:::-;;;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;:::i;:::-;;;;7058:325:13;;;7265:25;7058:325;7307:69;7058:325;7199:12;;:::i;:::-;7265:6;;7285:4;7265:25;;;;;;;;;;;:::i;:::-;7334:6;7342:7;7351:10;7363:12;7307:69;;:::i;:::-;7300:76;:::o;2857:4583:37:-;;;:::o;1412:320:13:-;1472:4;;:::i;:::-;1702:7;:19;:23;;1724:1;1702:23;:::i;:::-;;;:::i;:::-;;1695:30;:::o;2857:4583:37:-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;7671:628:13;;;;7851:12;;:::i;:::-;7879:7;7875:418;;;;7906:10;:17;:10;:17;:::i;:::-;:22;;7927:1;7906:22;:::i;:::-;;;:::i;:::-;;7902:286;;7875:418;8208:10;8201:17;:::o;7902:286::-;8121:18;8113:60;8132:6;8121:18;:::i;:::-;8113:60;:::i;:::-;7902:286;;;7875:418;8257:10;8269:12;:::i;2857:4583:37:-;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;8821:540:13:-;;8980:17;:10;:17;:::i;:::-;:21;;9000:1;8980:21;:::i;:::-;;;:::i;:::-;;8976:379;;;;9152:142;;;;;;;8976:379;9324:20;9331:12;9324:20;;:::i;:::-;2857:4583:37;;;;;;9324:20:13;;;;;;:::i;:::-;;;" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"This contract implements a proxy that is upgradeable by an admin. Unlike the original OpenZeppelin implementation, this contract does not prevent the admin from calling the implementation. This potentially exposes the admin to a proxy selector attack. See https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector clashing]. When using this contract, you must ensure that the implementation function selectors do not clash with the proxy selectors. The proxy selectors are: - 0x3659cfe6: upgradeTo - 0x4f1ef286: upgradeToAndCall - 0x8f283970: changeAdmin - 0xf851a440: admin - 0x5c60da1b: implementation NOTE: The real interface of this proxy is that defined in `ITransparentUpgradeableProxy`. This contract does not inherit from that interface, and instead the admin functions are implicitly implemented using a custom dispatch mechanism in `_fallback`. Consequently, the compiler will not produce an ABI for this contract. This is necessary to fully implement transparency without decoding reverts caused by selector clashes between the proxy and the implementation. WARNING: It is not recommended to extend this contract to add additional external functions. If you do so, the compiler will not check that there are no selector conflicts, due to the note above. A selector clash between any new function and the functions declared in {ITransparentUpgradeableProxy} will be resolved in favor of the new one. This could render the admin operations inaccessible, which could prevent upgradeability. Transparency may also be compromised.\",\"events\":{\"AdminChanged(address,address)\":{\"details\":\"Emitted when the admin account has changed.\"},\"BeaconUpgraded(address)\":{\"details\":\"Emitted when the beacon is changed.\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/proxies/openzeppelin/TransparentUpgradeableProxy.sol\":\"TransparentUpgradeableProxy\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/interfaces/IERC1967.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\\n *\\n * _Available since v4.8.3._\\n */\\ninterface IERC1967 {\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Emitted when the beacon is changed.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n}\\n\",\"keccak256\":\"0x3cbef5ebc24b415252e2f8c0c9254555d30d9f085603b4b80d9b5ed20ab87e90\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/IERC1967.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract ERC1967Upgrade is IERC1967 {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n Address.isContract(IBeacon(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x3b21ae06bf5957f73fa16754b0669c77b7abd8ba6c072d35c3281d446fdb86c2\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n /**\\n * @dev Delegates the current call to `implementation`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _delegate(address implementation) internal virtual {\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n /**\\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback function\\n * and {_fallback} should delegate.\\n */\\n function _implementation() internal view virtual returns (address);\\n\\n /**\\n * @dev Delegates the current call to the address returned by `_implementation()`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _fallback() internal virtual {\\n _beforeFallback();\\n _delegate(_implementation());\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n * function in the contract matches the call data.\\n */\\n fallback() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n * is empty.\\n */\\n receive() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n * call, or as part of the Solidity `fallback` or `receive` functions.\\n *\\n * If overridden should call `super._beforeFallback()`.\\n */\\n function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xc130fe33f1b2132158531a87734153293f6d07bc263ff4ac90e85da9c82c0e27\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n *\\n * Furthermore, `isContract` will also return true if the target contract within\\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\\n * which only has an effect at the end of a transaction.\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._\\n * _Available since v4.9 for `string`, `bytes`._\\n */\\nlibrary StorageSlot {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n struct StringSlot {\\n string value;\\n }\\n\\n struct BytesSlot {\\n bytes value;\\n }\\n\\n /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n */\\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n */\\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n */\\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `StringSlot` with member `value` located at `slot`.\\n */\\n function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\\n */\\n function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := store.slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BytesSlot` with member `value` located at `slot`.\\n */\\n function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\\n */\\n function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := store.slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf09e68aa0dc6722a25bc46490e8d48ed864466d17313b8a0b254c36b54e49899\",\"license\":\"MIT\"},\"src/proxies/openzeppelin/ERC1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (proxy/ERC1967/ERC1967Proxy.sol)\\n\\n// Note: This implementation is an exact copy with the constructor removed, and pragma and imports updated.\\n\\npragma solidity ^0.8.19;\\n\\nimport \\\"openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Upgrade.sol\\\";\\nimport \\\"openzeppelin-contracts/contracts/proxy/Proxy.sol\\\";\\n\\n/**\\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\\n * implementation address that can be changed. This address is stored in storage in the location specified by\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\\n * implementation behind the proxy.\\n */\\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _implementation() internal view virtual override returns (address impl) {\\n return ERC1967Upgrade._getImplementation();\\n }\\n\\n}\\n\",\"keccak256\":\"0x87a69f59211b7b73c737e399211fd71d9b549b7d416e05c85b8ab605f64b3b00\",\"license\":\"MIT\"},\"src/proxies/openzeppelin/TransparentUpgradeableProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/transparent/TransparentUpgradeableProxy.sol)\\n\\n/// @notice This implementation is a copy of OpenZeppelin's with the following changes:\\n/// - Pragma updated\\n/// - Imports updated\\n/// - Constructor removed\\n/// - Allows admin to call implementation\\n\\npragma solidity ^0.8.19;\\n\\nimport \\\"./ERC1967Proxy.sol\\\";\\n\\n/**\\n * @dev Interface for {TransparentUpgradeableProxy}. In order to implement transparency, {TransparentUpgradeableProxy}\\n * does not implement this interface directly, and some of its functions are implemented by an internal dispatch\\n * mechanism. The compiler is unaware that these functions are implemented by {TransparentUpgradeableProxy} and will not\\n * include them in the ABI so this interface must be used to interact with it.\\n */\\ninterface ITransparentUpgradeableProxy is IERC1967 {\\n\\n function admin() external view returns (address);\\n\\n function implementation() external view returns (address);\\n\\n function changeAdmin(\\n address\\n ) external;\\n\\n function upgradeTo(\\n address\\n ) external;\\n\\n function upgradeToAndCall(address, bytes memory) external payable;\\n\\n}\\n\\n/**\\n * @dev This contract implements a proxy that is upgradeable by an admin.\\n *\\n * Unlike the original OpenZeppelin implementation, this contract does not prevent the admin from calling the implementation.\\n * This potentially exposes the admin to a proxy selector attack. See\\n * https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector clashing].\\n * When using this contract, you must ensure that the implementation function selectors do not clash with the proxy selectors.\\n * The proxy selectors are:\\n * - 0x3659cfe6: upgradeTo\\n * - 0x4f1ef286: upgradeToAndCall\\n * - 0x8f283970: changeAdmin\\n * - 0xf851a440: admin\\n * - 0x5c60da1b: implementation\\n *\\n * NOTE: The real interface of this proxy is that defined in `ITransparentUpgradeableProxy`. This contract does not\\n * inherit from that interface, and instead the admin functions are implicitly implemented using a custom dispatch\\n * mechanism in `_fallback`. Consequently, the compiler will not produce an ABI for this contract. This is necessary to\\n * fully implement transparency without decoding reverts caused by selector clashes between the proxy and the\\n * implementation.\\n *\\n * WARNING: It is not recommended to extend this contract to add additional external functions. If you do so, the compiler\\n * will not check that there are no selector conflicts, due to the note above. A selector clash between any new function\\n * and the functions declared in {ITransparentUpgradeableProxy} will be resolved in favor of the new one. This could\\n * render the admin operations inaccessible, which could prevent upgradeability. Transparency may also be compromised.\\n */\\ncontract TransparentUpgradeableProxy is ERC1967Proxy {\\n\\n /**\\n * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.\\n *\\n * CAUTION: This modifier is deprecated, as it could cause issues if the modified function has arguments, and the\\n * implementation provides a function with the same selector.\\n */\\n modifier ifAdmin() {\\n if (msg.sender == _getAdmin()) {\\n _;\\n } else {\\n _fallback();\\n }\\n }\\n\\n /**\\n * @dev If caller is the admin process the call internally, otherwise transparently fallback to the proxy behavior\\n */\\n function _fallback() internal virtual override {\\n if (msg.sender == _getAdmin()) {\\n bytes memory ret;\\n bytes4 selector = msg.sig;\\n if (selector == ITransparentUpgradeableProxy.upgradeTo.selector) {\\n ret = _dispatchUpgradeTo();\\n } else if (selector == ITransparentUpgradeableProxy.upgradeToAndCall.selector) {\\n ret = _dispatchUpgradeToAndCall();\\n } else if (selector == ITransparentUpgradeableProxy.changeAdmin.selector) {\\n ret = _dispatchChangeAdmin();\\n } else if (selector == ITransparentUpgradeableProxy.admin.selector) {\\n ret = _dispatchAdmin();\\n } else if (selector == ITransparentUpgradeableProxy.implementation.selector) {\\n ret = _dispatchImplementation();\\n } else {\\n // Call implementation\\n return super._fallback();\\n }\\n assembly {\\n return(add(ret, 0x20), mload(ret))\\n }\\n } else {\\n super._fallback();\\n }\\n }\\n\\n /**\\n * @dev Returns the current admin.\\n *\\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\\n */\\n function _dispatchAdmin() private returns (bytes memory) {\\n _requireZeroValue();\\n\\n address admin = _getAdmin();\\n return abi.encode(admin);\\n }\\n\\n /**\\n * @dev Returns the current implementation.\\n *\\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\\n * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\\n */\\n function _dispatchImplementation() private returns (bytes memory) {\\n _requireZeroValue();\\n\\n address implementation = _implementation();\\n return abi.encode(implementation);\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _dispatchChangeAdmin() private returns (bytes memory) {\\n _requireZeroValue();\\n\\n address newAdmin = abi.decode(msg.data[4:], (address));\\n _changeAdmin(newAdmin);\\n\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy.\\n */\\n function _dispatchUpgradeTo() private returns (bytes memory) {\\n _requireZeroValue();\\n\\n address newImplementation = abi.decode(msg.data[4:], (address));\\n _upgradeToAndCall(newImplementation, bytes(\\\"\\\"), false);\\n\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified\\n * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the\\n * proxied contract.\\n */\\n function _dispatchUpgradeToAndCall() private returns (bytes memory) {\\n (address newImplementation, bytes memory data) = abi.decode(msg.data[4:], (address, bytes));\\n _upgradeToAndCall(newImplementation, data, true);\\n\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev Returns the current admin.\\n *\\n * CAUTION: This function is deprecated. Use {ERC1967Upgrade-_getAdmin} instead.\\n */\\n function _admin() internal view virtual returns (address) {\\n return _getAdmin();\\n }\\n\\n /**\\n * @dev To keep this contract fully transparent, all `ifAdmin` functions must be payable. This helper is here to\\n * emulate some proxy functions being non-payable while still allowing value to pass through.\\n */\\n function _requireZeroValue() internal {\\n require(msg.value == 0);\\n }\\n\\n}\\n\",\"keccak256\":\"0x4615fce1ce5dccba23058d4d4567a4a4cd01ba0c434960fa0b94bf9d44f14e99\",\"license\":\"MIT\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "src/tokens/ERC1155/ERC1155BaseToken.sol": { + "ERC1155BaseToken": { + "abi": [ + { + "inputs": [], + "name": "AccountBalanceOverflow", + "type": "error" + }, + { + "inputs": [], + "name": "ArrayLengthsMismatch", + "type": "error" + }, + { + "inputs": [], + "name": "InsufficientBalance", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidArrayLength", + "type": "error" + }, + { + "inputs": [], + "name": "NotOwnerNorApproved", + "type": "error" + }, + { + "inputs": [], + "name": "TransferToNonERC1155ReceiverImplementer", + "type": "error" + }, + { + "inputs": [], + "name": "TransferToZeroAddress", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "isApproved", + "type": "bool" + } + ], + "name": "ApprovalForAll", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "ids", + "type": "uint256[]" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "name": "TransferBatch", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "TransferSingle", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "value", + "type": "string" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "URI", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "wallet", + "type": "address" + }, + { + "components": [ + { + "internalType": "address", + "name": "approvedSigner", + "type": "address" + }, + { + "internalType": "bytes4", + "name": "identityType", + "type": "bytes4" + }, + { + "internalType": "bytes32", + "name": "issuerHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "audienceHash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "applicationData", + "type": "bytes" + }, + { + "components": [ + { + "internalType": "string", + "name": "redirectUrl", + "type": "string" + }, + { + "internalType": "uint64", + "name": "issuedAt", + "type": "uint64" + } + ], + "internalType": "struct AuthData", + "name": "authData", + "type": "tuple" + } + ], + "internalType": "struct Attestation", + "name": "attestation", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call", + "name": "call", + "type": "tuple" + } + ], + "name": "acceptImplicitRequest", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "owners", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "ids", + "type": "uint256[]" + } + ], + "name": "balanceOfBatch", + "outputs": [ + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "baseURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "name": "batchBurn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "contractURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "result", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "salePrice", + "type": "uint256" + } + ], + "name": "royaltyInfo", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "ids", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "safeBatchTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "isApproved", + "type": "bool" + } + ], + "name": "setApprovalForAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "tokenBaseURI", + "type": "string" + } + ], + "name": "setBaseMetadataURI", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "tokenName", + "type": "string" + } + ], + "name": "setContractName", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "tokenContractURI", + "type": "string" + } + ], + "name": "setContractURI", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "uint96", + "name": "feeNumerator", + "type": "uint96" + } + ], + "name": "setDefaultRoyalty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "projectId", + "type": "bytes32" + } + ], + "name": "setImplicitModeProjectId", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "validator", + "type": "address" + } + ], + "name": "setImplicitModeValidator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "uint96", + "name": "feeNumerator", + "type": "uint96" + } + ], + "name": "setTokenRoyalty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "tokenSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "uri", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "errors": { + "AccountBalanceOverflow()": [ + { + "details": "The recipient's balance has overflowed." + } + ], + "ArrayLengthsMismatch()": [ + { + "details": "The lengths of the input arrays are not the same." + } + ], + "InsufficientBalance()": [ + { + "details": "Insufficient balance." + } + ], + "NotOwnerNorApproved()": [ + { + "details": "Only the token owner or an approved account can manage the tokens." + } + ], + "TransferToNonERC1155ReceiverImplementer()": [ + { + "details": "Cannot safely transfer to a contract that does not implement the ERC1155Receiver interface." + } + ], + "TransferToZeroAddress()": [ + { + "details": "Cannot mint or transfer to the zero address." + } + ] + }, + "events": { + "ApprovalForAll(address,address,bool)": { + "details": "Emitted when `owner` enables or disables `operator` to manage all of their tokens." + }, + "RoleAdminChanged(bytes32,bytes32,bytes32)": { + "details": "Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this. _Available since v3.1._" + }, + "RoleGranted(bytes32,address,address)": { + "details": "Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}." + }, + "RoleRevoked(bytes32,address,address)": { + "details": "Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)" + }, + "TransferBatch(address,address,address,uint256[],uint256[])": { + "details": "Emitted when `amounts` of token `ids` are transferred from `from` to `to` by `operator`." + }, + "TransferSingle(address,address,address,uint256,uint256)": { + "details": "Emitted when `amount` of token `id` is transferred from `from` to `to` by `operator`." + }, + "URI(string,uint256)": { + "details": "Emitted when the Uniform Resource Identifier (URI) for token `id` is updated to `value`. This event is not used in the base contract. You may need to emit this event depending on your URI logic. See: https://eips.ethereum.org/EIPS/eip-1155#metadata" + } + }, + "kind": "dev", + "methods": { + "acceptImplicitRequest(address,(address,bytes4,bytes32,bytes32,bytes,(string,uint64)),(address,uint256,bytes,uint256,bool,bool,uint256))": { + "params": { + "attestation": "The attestation data", + "call": "The call to validate", + "wallet": "The wallet's address" + }, + "returns": { + "_0": "The hash of the implicit request if valid" + } + }, + "balanceOf(address,uint256)": { + "details": "Returns the amount of `id` owned by `owner`." + }, + "balanceOfBatch(address[],uint256[])": { + "details": "Returns the amounts of `ids` for `owners. Requirements: - `owners` and `ids` must have the same length." + }, + "batchBurn(uint256[],uint256[])": { + "params": { + "amounts": "Array of the amount to be burned", + "tokenIds": "Array of token ids to burn" + } + }, + "burn(uint256,uint256)": { + "params": { + "amount": "Amount of tokens to burn", + "tokenId": "Id of token to burn" + } + }, + "getRoleAdmin(bytes32)": { + "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}." + }, + "getRoleMember(bytes32,uint256)": { + "details": "Returns one of the accounts that have `role`. `index` must be a value between 0 and {getRoleMemberCount}, non-inclusive. Role bearers are not sorted in any particular way, and their ordering may change at any point. WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure you perform all queries on the same block. See the following https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] for more information." + }, + "getRoleMemberCount(bytes32)": { + "details": "Returns the number of accounts that have `role`. Can be used together with {getRoleMember} to enumerate all bearers of a role." + }, + "grantRole(bytes32,address)": { + "details": "Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event." + }, + "hasRole(bytes32,address)": { + "details": "Returns `true` if `account` has been granted `role`." + }, + "isApprovedForAll(address,address)": { + "details": "Returns whether `operator` is approved to manage the tokens of `owner`." + }, + "renounceRole(bytes32,address)": { + "details": "Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event." + }, + "revokeRole(bytes32,address)": { + "details": "Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event." + }, + "royaltyInfo(uint256,uint256)": { + "details": "Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of exchange. The royalty amount is denominated and should be paid in that same unit of exchange." + }, + "safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)": { + "details": "Transfers `amounts` of `ids` from `from` to `to`. Requirements: - `to` cannot be the zero address. - `from` must have at least `amount` of `id`. - `ids` and `amounts` must have the same length. - If the caller is not `from`, it must be approved to manage the tokens of `from`. - If `to` refers to a smart contract, it must implement {ERC1155-onERC1155BatchReceived}, which is called upon a batch transfer. Emits a {TransferBatch} event." + }, + "safeTransferFrom(address,address,uint256,uint256,bytes)": { + "details": "Transfers `amount` of `id` from `from` to `to`. Requirements: - `to` cannot be the zero address. - `from` must have at least `amount` of `id`. - If the caller is not `from`, it must be approved to manage the tokens of `from`. - If `to` refers to a smart contract, it must implement {ERC1155-onERC1155Received}, which is called upon a batch transfer. Emits a {TransferSingle} event." + }, + "setApprovalForAll(address,bool)": { + "details": "Sets whether `operator` is approved to manage the tokens of the caller. Emits a {ApprovalForAll} event." + }, + "setBaseMetadataURI(string)": { + "params": { + "tokenBaseURI": "New base URI of token's URI" + } + }, + "setContractName(string)": { + "params": { + "tokenName": "New contract name" + } + }, + "setContractURI(string)": { + "params": { + "tokenContractURI": "New contract URI of token's URI" + } + }, + "setDefaultRoyalty(address,uint96)": { + "params": { + "feeNumerator": "The royalty fee numerator in basis points (e.g. 15% would be 1500)", + "receiver": "Address of who should be sent the royalty payment" + } + }, + "setImplicitModeProjectId(bytes32)": { + "params": { + "projectId": "The project id." + } + }, + "setImplicitModeValidator(address)": { + "params": { + "validator": "The validator address." + } + }, + "setTokenRoyalty(uint256,address,uint96)": { + "params": { + "feeNumerator": "The royalty fee numerator in basis points (e.g. 15% would be 1500)", + "receiver": "Address of who should be sent the royalty payment", + "tokenId": "The token id to set the royalty information for" + } + }, + "supportsInterface(bytes4)": { + "params": { + "interfaceId": "Interface id" + }, + "returns": { + "_0": "True if supported" + } + }, + "uri(uint256)": { + "details": "Returns the URI for token `id`. You can either return the same templated URI for all token IDs, (e.g. \"https://example.com/api/{id}.json\"), or return a unique URI for each `id`. See: https://eips.ethereum.org/EIPS/eip-1155#metadata" + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "DEFAULT_ADMIN_ROLE()": "a217fddf", + "acceptImplicitRequest(address,(address,bytes4,bytes32,bytes32,bytes,(string,uint64)),(address,uint256,bytes,uint256,bool,bool,uint256))": "9d043a66", + "balanceOf(address,uint256)": "00fdd58e", + "balanceOfBatch(address[],uint256[])": "4e1273f4", + "baseURI()": "6c0360eb", + "batchBurn(uint256[],uint256[])": "20ec271b", + "burn(uint256,uint256)": "b390c0ab", + "contractURI()": "e8a3d485", + "getRoleAdmin(bytes32)": "248a9ca3", + "getRoleMember(bytes32,uint256)": "9010d07c", + "getRoleMemberCount(bytes32)": "ca15c873", + "grantRole(bytes32,address)": "2f2ff15d", + "hasRole(bytes32,address)": "91d14854", + "isApprovedForAll(address,address)": "e985e9c5", + "name()": "06fdde03", + "renounceRole(bytes32,address)": "36568abe", + "revokeRole(bytes32,address)": "d547741f", + "royaltyInfo(uint256,uint256)": "2a55205a", + "safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)": "2eb2c2d6", + "safeTransferFrom(address,address,uint256,uint256,bytes)": "f242432a", + "setApprovalForAll(address,bool)": "a22cb465", + "setBaseMetadataURI(string)": "7e518ec8", + "setContractName(string)": "0b5ee006", + "setContractURI(string)": "938e3d7b", + "setDefaultRoyalty(address,uint96)": "04634d8d", + "setImplicitModeProjectId(bytes32)": "ed4c2ac7", + "setImplicitModeValidator(address)": "0bb310de", + "setTokenRoyalty(uint256,address,uint96)": "5944c753", + "supportsInterface(bytes4)": "01ffc9a7", + "tokenSupply(uint256)": "2693ebf2", + "totalSupply()": "18160ddd", + "uri(uint256)": "0e89341c" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"AccountBalanceOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ArrayLengthsMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidArrayLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotOwnerNorApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToNonERC1155ReceiverImplementer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isApproved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"TransferBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TransferSingle\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"value\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"URI\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wallet\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"approvedSigner\",\"type\":\"address\"},{\"internalType\":\"bytes4\",\"name\":\"identityType\",\"type\":\"bytes4\"},{\"internalType\":\"bytes32\",\"name\":\"issuerHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"audienceHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"applicationData\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"redirectUrl\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"issuedAt\",\"type\":\"uint64\"}],\"internalType\":\"struct AuthData\",\"name\":\"authData\",\"type\":\"tuple\"}],\"internalType\":\"struct Attestation\",\"name\":\"attestation\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"delegateCall\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"onlyFallback\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"behaviorOnError\",\"type\":\"uint256\"}],\"internalType\":\"struct Payload.Call\",\"name\":\"call\",\"type\":\"tuple\"}],\"name\":\"acceptImplicitRequest\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"result\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"owners\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"}],\"name\":\"balanceOfBatch\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"balances\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"baseURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"batchBurn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"contractURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"getRoleMember\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleMemberCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"salePrice\",\"type\":\"uint256\"}],\"name\":\"royaltyInfo\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeBatchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isApproved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenBaseURI\",\"type\":\"string\"}],\"name\":\"setBaseMetadataURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"}],\"name\":\"setContractName\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenContractURI\",\"type\":\"string\"}],\"name\":\"setContractURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"feeNumerator\",\"type\":\"uint96\"}],\"name\":\"setDefaultRoyalty\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"projectId\",\"type\":\"bytes32\"}],\"name\":\"setImplicitModeProjectId\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"setImplicitModeValidator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"feeNumerator\",\"type\":\"uint96\"}],\"name\":\"setTokenRoyalty\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"tokenSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"}],\"name\":\"uri\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AccountBalanceOverflow()\":[{\"details\":\"The recipient's balance has overflowed.\"}],\"ArrayLengthsMismatch()\":[{\"details\":\"The lengths of the input arrays are not the same.\"}],\"InsufficientBalance()\":[{\"details\":\"Insufficient balance.\"}],\"NotOwnerNorApproved()\":[{\"details\":\"Only the token owner or an approved account can manage the tokens.\"}],\"TransferToNonERC1155ReceiverImplementer()\":[{\"details\":\"Cannot safely transfer to a contract that does not implement the ERC1155Receiver interface.\"}],\"TransferToZeroAddress()\":[{\"details\":\"Cannot mint or transfer to the zero address.\"}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"details\":\"Emitted when `owner` enables or disables `operator` to manage all of their tokens.\"},\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this. _Available since v3.1._\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)\"},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"details\":\"Emitted when `amounts` of token `ids` are transferred from `from` to `to` by `operator`.\"},\"TransferSingle(address,address,address,uint256,uint256)\":{\"details\":\"Emitted when `amount` of token `id` is transferred from `from` to `to` by `operator`.\"},\"URI(string,uint256)\":{\"details\":\"Emitted when the Uniform Resource Identifier (URI) for token `id` is updated to `value`. This event is not used in the base contract. You may need to emit this event depending on your URI logic. See: https://eips.ethereum.org/EIPS/eip-1155#metadata\"}},\"kind\":\"dev\",\"methods\":{\"acceptImplicitRequest(address,(address,bytes4,bytes32,bytes32,bytes,(string,uint64)),(address,uint256,bytes,uint256,bool,bool,uint256))\":{\"params\":{\"attestation\":\"The attestation data\",\"call\":\"The call to validate\",\"wallet\":\"The wallet's address\"},\"returns\":{\"_0\":\"The hash of the implicit request if valid\"}},\"balanceOf(address,uint256)\":{\"details\":\"Returns the amount of `id` owned by `owner`.\"},\"balanceOfBatch(address[],uint256[])\":{\"details\":\"Returns the amounts of `ids` for `owners. Requirements: - `owners` and `ids` must have the same length.\"},\"batchBurn(uint256[],uint256[])\":{\"params\":{\"amounts\":\"Array of the amount to be burned\",\"tokenIds\":\"Array of token ids to burn\"}},\"burn(uint256,uint256)\":{\"params\":{\"amount\":\"Amount of tokens to burn\",\"tokenId\":\"Id of token to burn\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"getRoleMember(bytes32,uint256)\":{\"details\":\"Returns one of the accounts that have `role`. `index` must be a value between 0 and {getRoleMemberCount}, non-inclusive. Role bearers are not sorted in any particular way, and their ordering may change at any point. WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure you perform all queries on the same block. See the following https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] for more information.\"},\"getRoleMemberCount(bytes32)\":{\"details\":\"Returns the number of accounts that have `role`. Can be used together with {getRoleMember} to enumerate all bearers of a role.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"isApprovedForAll(address,address)\":{\"details\":\"Returns whether `operator` is approved to manage the tokens of `owner`.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"royaltyInfo(uint256,uint256)\":{\"details\":\"Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of exchange. The royalty amount is denominated and should be paid in that same unit of exchange.\"},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"details\":\"Transfers `amounts` of `ids` from `from` to `to`. Requirements: - `to` cannot be the zero address. - `from` must have at least `amount` of `id`. - `ids` and `amounts` must have the same length. - If the caller is not `from`, it must be approved to manage the tokens of `from`. - If `to` refers to a smart contract, it must implement {ERC1155-onERC1155BatchReceived}, which is called upon a batch transfer. Emits a {TransferBatch} event.\"},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"details\":\"Transfers `amount` of `id` from `from` to `to`. Requirements: - `to` cannot be the zero address. - `from` must have at least `amount` of `id`. - If the caller is not `from`, it must be approved to manage the tokens of `from`. - If `to` refers to a smart contract, it must implement {ERC1155-onERC1155Received}, which is called upon a batch transfer. Emits a {TransferSingle} event.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"Sets whether `operator` is approved to manage the tokens of the caller. Emits a {ApprovalForAll} event.\"},\"setBaseMetadataURI(string)\":{\"params\":{\"tokenBaseURI\":\"New base URI of token's URI\"}},\"setContractName(string)\":{\"params\":{\"tokenName\":\"New contract name\"}},\"setContractURI(string)\":{\"params\":{\"tokenContractURI\":\"New contract URI of token's URI\"}},\"setDefaultRoyalty(address,uint96)\":{\"params\":{\"feeNumerator\":\"The royalty fee numerator in basis points (e.g. 15% would be 1500)\",\"receiver\":\"Address of who should be sent the royalty payment\"}},\"setImplicitModeProjectId(bytes32)\":{\"params\":{\"projectId\":\"The project id.\"}},\"setImplicitModeValidator(address)\":{\"params\":{\"validator\":\"The validator address.\"}},\"setTokenRoyalty(uint256,address,uint96)\":{\"params\":{\"feeNumerator\":\"The royalty fee numerator in basis points (e.g. 15% would be 1500)\",\"receiver\":\"Address of who should be sent the royalty payment\",\"tokenId\":\"The token id to set the royalty information for\"}},\"supportsInterface(bytes4)\":{\"params\":{\"interfaceId\":\"Interface id\"},\"returns\":{\"_0\":\"True if supported\"}},\"uri(uint256)\":{\"details\":\"Returns the URI for token `id`. You can either return the same templated URI for all token IDs, (e.g. \\\"https://example.com/api/{id}.json\\\"), or return a unique URI for each `id`. See: https://eips.ethereum.org/EIPS/eip-1155#metadata\"}},\"version\":1},\"userdoc\":{\"errors\":{\"InvalidArrayLength()\":[{\"notice\":\"Invalid array input length.\"}]},\"kind\":\"user\",\"methods\":{\"acceptImplicitRequest(address,(address,bytes4,bytes32,bytes32,bytes,(string,uint64)),(address,uint256,bytes,uint256,bool,bool,uint256))\":{\"notice\":\"Determines if an implicit request is valid\"},\"batchBurn(uint256[],uint256[])\":{\"notice\":\"Burn tokens of given token id for each (tokenIds[i], amounts[i]) pair.\"},\"burn(uint256,uint256)\":{\"notice\":\"Allows the owner of the token to burn their tokens.\"},\"setBaseMetadataURI(string)\":{\"notice\":\"Update the base URI of token's URI.\"},\"setContractName(string)\":{\"notice\":\"Update the name of the contract.\"},\"setContractURI(string)\":{\"notice\":\"Update the contract URI of token's URI.Refer to https://docs.opensea.io/docs/contract-level-metadata\"},\"setDefaultRoyalty(address,uint96)\":{\"notice\":\"Sets the royalty information that all ids in this contract will default to.\"},\"setImplicitModeProjectId(bytes32)\":{\"notice\":\"Updates the settings for implicit mode validation.Only callable by an address with the project admin role.\"},\"setImplicitModeValidator(address)\":{\"notice\":\"Updates the validator for implicit mode validation.Only callable by an address with the project admin role.\"},\"setTokenRoyalty(uint256,address,uint96)\":{\"notice\":\"Sets the royalty information that a given token id in this contract will use.This overrides the default royalty information for this token id\"},\"supportsInterface(bytes4)\":{\"notice\":\"Check interface support.\"}},\"notice\":\"A standard base implementation of ERC-1155 for use in Sequence library contracts.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/tokens/ERC1155/ERC1155BaseToken.sol\":\"ERC1155BaseToken\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Strings.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```solidity\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```solidity\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}\\n * to enforce additional security measures for this role.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n * Overriding this function changes the behavior of the {onlyRole} modifier.\\n *\\n * Format of the revert message is described in {_checkRole}.\\n *\\n * _Available since v4.6._\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n Strings.toHexString(account),\\n \\\" is missing role \\\",\\n Strings.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * May emit a {RoleGranted} event.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n}\\n\",\"keccak256\":\"0x0dd6e52cb394d7f5abe5dca2d4908a6be40417914720932de757de34a99ab87f\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/access/AccessControlEnumerable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControlEnumerable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControlEnumerable.sol\\\";\\nimport \\\"./AccessControl.sol\\\";\\nimport \\\"../utils/structs/EnumerableSet.sol\\\";\\n\\n/**\\n * @dev Extension of {AccessControl} that allows enumerating the members of each role.\\n */\\nabstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl {\\n using EnumerableSet for EnumerableSet.AddressSet;\\n\\n mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers;\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns one of the accounts that have `role`. `index` must be a\\n * value between 0 and {getRoleMemberCount}, non-inclusive.\\n *\\n * Role bearers are not sorted in any particular way, and their ordering may\\n * change at any point.\\n *\\n * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure\\n * you perform all queries on the same block. See the following\\n * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]\\n * for more information.\\n */\\n function getRoleMember(bytes32 role, uint256 index) public view virtual override returns (address) {\\n return _roleMembers[role].at(index);\\n }\\n\\n /**\\n * @dev Returns the number of accounts that have `role`. Can be used\\n * together with {getRoleMember} to enumerate all bearers of a role.\\n */\\n function getRoleMemberCount(bytes32 role) public view virtual override returns (uint256) {\\n return _roleMembers[role].length();\\n }\\n\\n /**\\n * @dev Overload {_grantRole} to track enumerable memberships\\n */\\n function _grantRole(bytes32 role, address account) internal virtual override {\\n super._grantRole(role, account);\\n _roleMembers[role].add(account);\\n }\\n\\n /**\\n * @dev Overload {_revokeRole} to track enumerable memberships\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual override {\\n super._revokeRole(role, account);\\n _roleMembers[role].remove(account);\\n }\\n}\\n\",\"keccak256\":\"0x13f5e15f2a0650c0b6aaee2ef19e89eaf4870d6e79662d572a393334c1397247\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/access/IAccessControlEnumerable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControlEnumerable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\n\\n/**\\n * @dev External interface of AccessControlEnumerable declared to support ERC165 detection.\\n */\\ninterface IAccessControlEnumerable is IAccessControl {\\n /**\\n * @dev Returns one of the accounts that have `role`. `index` must be a\\n * value between 0 and {getRoleMemberCount}, non-inclusive.\\n *\\n * Role bearers are not sorted in any particular way, and their ordering may\\n * change at any point.\\n *\\n * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure\\n * you perform all queries on the same block. See the following\\n * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]\\n * for more information.\\n */\\n function getRoleMember(bytes32 role, uint256 index) external view returns (address);\\n\\n /**\\n * @dev Returns the number of accounts that have `role`. Can be used\\n * together with {getRoleMember} to enumerate all bearers of a role.\\n */\\n function getRoleMemberCount(bytes32 role) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0xba4459ab871dfa300f5212c6c30178b63898c03533a1ede28436f11546626676\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/interfaces/IERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC2981.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Interface for the NFT Royalty Standard.\\n *\\n * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal\\n * support for royalty payments across all NFT marketplaces and ecosystem participants.\\n *\\n * _Available since v4.5._\\n */\\ninterface IERC2981 is IERC165 {\\n /**\\n * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of\\n * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.\\n */\\n function royaltyInfo(\\n uint256 tokenId,\\n uint256 salePrice\\n ) external view returns (address receiver, uint256 royaltyAmount);\\n}\\n\",\"keccak256\":\"0x3976825a61df20457730b79ad0ac9c8908e3c7978ed9bf090c67137c91256b5c\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/token/common/ERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/common/ERC2981.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/IERC2981.sol\\\";\\nimport \\\"../../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.\\n *\\n * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for\\n * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.\\n *\\n * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the\\n * fee is specified in basis points by default.\\n *\\n * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See\\n * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to\\n * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.\\n *\\n * _Available since v4.5._\\n */\\nabstract contract ERC2981 is IERC2981, ERC165 {\\n struct RoyaltyInfo {\\n address receiver;\\n uint96 royaltyFraction;\\n }\\n\\n RoyaltyInfo private _defaultRoyaltyInfo;\\n mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\\n return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @inheritdoc IERC2981\\n */\\n function royaltyInfo(uint256 tokenId, uint256 salePrice) public view virtual override returns (address, uint256) {\\n RoyaltyInfo memory royalty = _tokenRoyaltyInfo[tokenId];\\n\\n if (royalty.receiver == address(0)) {\\n royalty = _defaultRoyaltyInfo;\\n }\\n\\n uint256 royaltyAmount = (salePrice * royalty.royaltyFraction) / _feeDenominator();\\n\\n return (royalty.receiver, royaltyAmount);\\n }\\n\\n /**\\n * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a\\n * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an\\n * override.\\n */\\n function _feeDenominator() internal pure virtual returns (uint96) {\\n return 10000;\\n }\\n\\n /**\\n * @dev Sets the royalty information that all ids in this contract will default to.\\n *\\n * Requirements:\\n *\\n * - `receiver` cannot be the zero address.\\n * - `feeNumerator` cannot be greater than the fee denominator.\\n */\\n function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {\\n require(feeNumerator <= _feeDenominator(), \\\"ERC2981: royalty fee will exceed salePrice\\\");\\n require(receiver != address(0), \\\"ERC2981: invalid receiver\\\");\\n\\n _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);\\n }\\n\\n /**\\n * @dev Removes default royalty information.\\n */\\n function _deleteDefaultRoyalty() internal virtual {\\n delete _defaultRoyaltyInfo;\\n }\\n\\n /**\\n * @dev Sets the royalty information for a specific token id, overriding the global default.\\n *\\n * Requirements:\\n *\\n * - `receiver` cannot be the zero address.\\n * - `feeNumerator` cannot be greater than the fee denominator.\\n */\\n function _setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal virtual {\\n require(feeNumerator <= _feeDenominator(), \\\"ERC2981: royalty fee will exceed salePrice\\\");\\n require(receiver != address(0), \\\"ERC2981: Invalid parameters\\\");\\n\\n _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);\\n }\\n\\n /**\\n * @dev Resets royalty information for the token id back to the global default.\\n */\\n function _resetTokenRoyalty(uint256 tokenId) internal virtual {\\n delete _tokenRoyaltyInfo[tokenId];\\n }\\n}\\n\",\"keccak256\":\"0x990a4133f88b07f92724903f42bb25cdaeca0cf255fb48df26568c40e7c919c6\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\nimport \\\"./math/SignedMath.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\\n */\\n function toString(int256 value) internal pure returns (string memory) {\\n return string(abi.encodePacked(value < 0 ? \\\"-\\\" : \\\"\\\", toString(SignedMath.abs(value))));\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n\\n /**\\n * @dev Returns true if the two strings are equal.\\n */\\n function equal(string memory a, string memory b) internal pure returns (bool) {\\n return keccak256(bytes(a)) == keccak256(bytes(b));\\n }\\n}\\n\",\"keccak256\":\"0x3088eb2868e8d13d89d16670b5f8612c4ab9ff8956272837d8e90106c59c14a0\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\\n // The surrounding unchecked block does not change this fact.\\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1, \\\"Math: mulDiv overflow\\\");\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10 ** 64) {\\n value /= 10 ** 64;\\n result += 64;\\n }\\n if (value >= 10 ** 32) {\\n value /= 10 ** 32;\\n result += 32;\\n }\\n if (value >= 10 ** 16) {\\n value /= 10 ** 16;\\n result += 16;\\n }\\n if (value >= 10 ** 8) {\\n value /= 10 ** 8;\\n result += 8;\\n }\\n if (value >= 10 ** 4) {\\n value /= 10 ** 4;\\n result += 4;\\n }\\n if (value >= 10 ** 2) {\\n value /= 10 ** 2;\\n result += 2;\\n }\\n if (value >= 10 ** 1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard signed math utilities missing in the Solidity language.\\n */\\nlibrary SignedMath {\\n /**\\n * @dev Returns the largest of two signed numbers.\\n */\\n function max(int256 a, int256 b) internal pure returns (int256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two signed numbers.\\n */\\n function min(int256 a, int256 b) internal pure returns (int256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two signed numbers without overflow.\\n * The result is rounded towards zero.\\n */\\n function average(int256 a, int256 b) internal pure returns (int256) {\\n // Formula from the book \\\"Hacker's Delight\\\"\\n int256 x = (a & b) + ((a ^ b) >> 1);\\n return x + (int256(uint256(x) >> 255) & (a ^ b));\\n }\\n\\n /**\\n * @dev Returns the absolute unsigned value of a signed value.\\n */\\n function abs(int256 n) internal pure returns (uint256) {\\n unchecked {\\n // must be unchecked in order to support `n = type(int256).min`\\n return uint256(n >= 0 ? n : -n);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/EnumerableSet.sol)\\n// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for managing\\n * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive\\n * types.\\n *\\n * Sets have the following properties:\\n *\\n * - Elements are added, removed, and checked for existence in constant time\\n * (O(1)).\\n * - Elements are enumerated in O(n). No guarantees are made on the ordering.\\n *\\n * ```solidity\\n * contract Example {\\n * // Add the library methods\\n * using EnumerableSet for EnumerableSet.AddressSet;\\n *\\n * // Declare a set state variable\\n * EnumerableSet.AddressSet private mySet;\\n * }\\n * ```\\n *\\n * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)\\n * and `uint256` (`UintSet`) are supported.\\n *\\n * [WARNING]\\n * ====\\n * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure\\n * unusable.\\n * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.\\n *\\n * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an\\n * array of EnumerableSet.\\n * ====\\n */\\nlibrary EnumerableSet {\\n // To implement this library for multiple types with as little code\\n // repetition as possible, we write it in terms of a generic Set type with\\n // bytes32 values.\\n // The Set implementation uses private functions, and user-facing\\n // implementations (such as AddressSet) are just wrappers around the\\n // underlying Set.\\n // This means that we can only create new EnumerableSets for types that fit\\n // in bytes32.\\n\\n struct Set {\\n // Storage of set values\\n bytes32[] _values;\\n // Position of the value in the `values` array, plus 1 because index 0\\n // means a value is not in the set.\\n mapping(bytes32 => uint256) _indexes;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function _add(Set storage set, bytes32 value) private returns (bool) {\\n if (!_contains(set, value)) {\\n set._values.push(value);\\n // The value is stored at length-1, but we add 1 to all indexes\\n // and use 0 as a sentinel value\\n set._indexes[value] = set._values.length;\\n return true;\\n } else {\\n return false;\\n }\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function _remove(Set storage set, bytes32 value) private returns (bool) {\\n // We read and store the value's index to prevent multiple reads from the same storage slot\\n uint256 valueIndex = set._indexes[value];\\n\\n if (valueIndex != 0) {\\n // Equivalent to contains(set, value)\\n // To delete an element from the _values array in O(1), we swap the element to delete with the last one in\\n // the array, and then remove the last element (sometimes called as 'swap and pop').\\n // This modifies the order of the array, as noted in {at}.\\n\\n uint256 toDeleteIndex = valueIndex - 1;\\n uint256 lastIndex = set._values.length - 1;\\n\\n if (lastIndex != toDeleteIndex) {\\n bytes32 lastValue = set._values[lastIndex];\\n\\n // Move the last value to the index where the value to delete is\\n set._values[toDeleteIndex] = lastValue;\\n // Update the index for the moved value\\n set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex\\n }\\n\\n // Delete the slot where the moved value was stored\\n set._values.pop();\\n\\n // Delete the index for the deleted slot\\n delete set._indexes[value];\\n\\n return true;\\n } else {\\n return false;\\n }\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function _contains(Set storage set, bytes32 value) private view returns (bool) {\\n return set._indexes[value] != 0;\\n }\\n\\n /**\\n * @dev Returns the number of values on the set. O(1).\\n */\\n function _length(Set storage set) private view returns (uint256) {\\n return set._values.length;\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function _at(Set storage set, uint256 index) private view returns (bytes32) {\\n return set._values[index];\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function _values(Set storage set) private view returns (bytes32[] memory) {\\n return set._values;\\n }\\n\\n // Bytes32Set\\n\\n struct Bytes32Set {\\n Set _inner;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {\\n return _add(set._inner, value);\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {\\n return _remove(set._inner, value);\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {\\n return _contains(set._inner, value);\\n }\\n\\n /**\\n * @dev Returns the number of values in the set. O(1).\\n */\\n function length(Bytes32Set storage set) internal view returns (uint256) {\\n return _length(set._inner);\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {\\n return _at(set._inner, index);\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {\\n bytes32[] memory store = _values(set._inner);\\n bytes32[] memory result;\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := store\\n }\\n\\n return result;\\n }\\n\\n // AddressSet\\n\\n struct AddressSet {\\n Set _inner;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function add(AddressSet storage set, address value) internal returns (bool) {\\n return _add(set._inner, bytes32(uint256(uint160(value))));\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function remove(AddressSet storage set, address value) internal returns (bool) {\\n return _remove(set._inner, bytes32(uint256(uint160(value))));\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function contains(AddressSet storage set, address value) internal view returns (bool) {\\n return _contains(set._inner, bytes32(uint256(uint160(value))));\\n }\\n\\n /**\\n * @dev Returns the number of values in the set. O(1).\\n */\\n function length(AddressSet storage set) internal view returns (uint256) {\\n return _length(set._inner);\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function at(AddressSet storage set, uint256 index) internal view returns (address) {\\n return address(uint160(uint256(_at(set._inner, index))));\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function values(AddressSet storage set) internal view returns (address[] memory) {\\n bytes32[] memory store = _values(set._inner);\\n address[] memory result;\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := store\\n }\\n\\n return result;\\n }\\n\\n // UintSet\\n\\n struct UintSet {\\n Set _inner;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function add(UintSet storage set, uint256 value) internal returns (bool) {\\n return _add(set._inner, bytes32(value));\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function remove(UintSet storage set, uint256 value) internal returns (bool) {\\n return _remove(set._inner, bytes32(value));\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function contains(UintSet storage set, uint256 value) internal view returns (bool) {\\n return _contains(set._inner, bytes32(value));\\n }\\n\\n /**\\n * @dev Returns the number of values in the set. O(1).\\n */\\n function length(UintSet storage set) internal view returns (uint256) {\\n return _length(set._inner);\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function at(UintSet storage set, uint256 index) internal view returns (uint256) {\\n return uint256(_at(set._inner, index));\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function values(UintSet storage set) internal view returns (uint256[] memory) {\\n bytes32[] memory store = _values(set._inner);\\n uint256[] memory result;\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := store\\n }\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0x9f4357008a8f7d8c8bf5d48902e789637538d8c016be5766610901b4bba81514\",\"license\":\"MIT\"},\"lib/signals-implicit-mode/lib/sequence-v3/src/extensions/sessions/implicit/Attestation.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.27;\\n\\nimport { LibBytes } from \\\"../../../utils/LibBytes.sol\\\";\\nimport { ACCEPT_IMPLICIT_REQUEST_MAGIC_PREFIX } from \\\"./ISignalsImplicitMode.sol\\\";\\n\\nusing LibBytes for bytes;\\n\\n/// @notice Attestation for a specific session\\n/// @param approvedSigner Address of the approved signer\\n/// @param identityType Identity type\\n/// @param issuerHash Hash of the issuer\\n/// @param audienceHash Hash of the audience\\n/// @param applicationData Unspecified application data\\n/// @param authData Auth data\\nstruct Attestation {\\n address approvedSigner;\\n bytes4 identityType;\\n bytes32 issuerHash;\\n bytes32 audienceHash;\\n bytes applicationData;\\n AuthData authData;\\n}\\n\\n/// @notice Auth data for an attestation\\n/// @param redirectUrl Authorization redirect URL\\n/// @param issuedAt Timestamp of the attestation issuance\\nstruct AuthData {\\n string redirectUrl;\\n uint64 issuedAt;\\n}\\n\\n/// @title LibAttestation\\n/// @author Michael Standen\\n/// @notice Library for attestation management\\nlibrary LibAttestation {\\n\\n /// @notice Hashes an attestation\\n function toHash(\\n Attestation memory attestation\\n ) internal pure returns (bytes32) {\\n return keccak256(toPacked(attestation));\\n }\\n\\n /// @notice Decodes an attestation from a packed bytes array\\n /// @param encoded The packed bytes array\\n /// @param pointer The pointer to the start of the attestation\\n /// @return attestation The decoded attestation\\n /// @return newPointer The new pointer to the end of the attestation\\n function fromPacked(\\n bytes calldata encoded,\\n uint256 pointer\\n ) internal pure returns (Attestation memory attestation, uint256 newPointer) {\\n newPointer = pointer;\\n (attestation.approvedSigner, newPointer) = encoded.readAddress(newPointer);\\n (attestation.identityType, newPointer) = encoded.readBytes4(newPointer);\\n (attestation.issuerHash, newPointer) = encoded.readBytes32(newPointer);\\n (attestation.audienceHash, newPointer) = encoded.readBytes32(newPointer);\\n // Application data (arbitrary bytes)\\n uint256 dataSize;\\n (dataSize, newPointer) = encoded.readUint24(newPointer);\\n attestation.applicationData = encoded[newPointer:newPointer + dataSize];\\n newPointer += dataSize;\\n // Auth data\\n (attestation.authData, newPointer) = fromPackedAuthData(encoded, newPointer);\\n return (attestation, newPointer);\\n }\\n\\n /// @notice Decodes the auth data from a packed bytes\\n /// @param encoded The packed bytes containing the auth data\\n /// @param pointer The pointer to the start of the auth data within the encoded data\\n /// @return authData The decoded auth data\\n /// @return newPointer The pointer to the end of the auth data within the encoded data\\n function fromPackedAuthData(\\n bytes calldata encoded,\\n uint256 pointer\\n ) internal pure returns (AuthData memory authData, uint256 newPointer) {\\n uint24 redirectUrlLength;\\n (redirectUrlLength, pointer) = encoded.readUint24(pointer);\\n authData.redirectUrl = string(encoded[pointer:pointer + redirectUrlLength]);\\n pointer += redirectUrlLength;\\n (authData.issuedAt, pointer) = encoded.readUint64(pointer);\\n return (authData, pointer);\\n }\\n\\n /// @notice Encodes an attestation into a packed bytes array\\n /// @param attestation The attestation to encode\\n /// @return encoded The packed bytes array\\n function toPacked(\\n Attestation memory attestation\\n ) internal pure returns (bytes memory encoded) {\\n return abi.encodePacked(\\n attestation.approvedSigner,\\n attestation.identityType,\\n attestation.issuerHash,\\n attestation.audienceHash,\\n uint24(attestation.applicationData.length),\\n attestation.applicationData,\\n toPackAuthData(attestation.authData)\\n );\\n }\\n\\n /// @notice Encodes the auth data into a packed bytes array\\n /// @param authData The auth data to encode\\n /// @return encoded The packed bytes array\\n function toPackAuthData(\\n AuthData memory authData\\n ) internal pure returns (bytes memory encoded) {\\n return abi.encodePacked(uint24(bytes(authData.redirectUrl).length), bytes(authData.redirectUrl), authData.issuedAt);\\n }\\n\\n /// @notice Generates the implicit request magic return value\\n /// @param attestation The attestation\\n /// @param wallet The wallet\\n /// @return magic The expected implicit request magic\\n function generateImplicitRequestMagic(Attestation memory attestation, address wallet) internal pure returns (bytes32) {\\n return keccak256(\\n abi.encodePacked(ACCEPT_IMPLICIT_REQUEST_MAGIC_PREFIX, wallet, attestation.audienceHash, attestation.issuerHash)\\n );\\n }\\n\\n}\\n\",\"keccak256\":\"0xcaa44022b5eb4bc7ab487b3b1a0125da67e2e891cee983ef6cdb6814f045efc8\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/lib/sequence-v3/src/extensions/sessions/implicit/ISignalsImplicitMode.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.27;\\n\\nimport { Payload } from \\\"../../../modules/Payload.sol\\\";\\nimport { Attestation } from \\\"./Attestation.sol\\\";\\n\\n/// @dev Magic prefix for the implicit request\\nbytes32 constant ACCEPT_IMPLICIT_REQUEST_MAGIC_PREFIX = keccak256(abi.encodePacked(\\\"acceptImplicitRequest\\\"));\\n\\n/// @title ISignalsImplicitMode\\n/// @author Agustin Aguilar, Michael Standen\\n/// @notice Interface for the contracts that support implicit mode validation\\ninterface ISignalsImplicitMode {\\n\\n /// @notice Determines if an implicit request is valid\\n /// @param wallet The wallet's address\\n /// @param attestation The attestation data\\n /// @param call The call to validate\\n /// @return magic The hash of the implicit request if valid\\n function acceptImplicitRequest(\\n address wallet,\\n Attestation calldata attestation,\\n Payload.Call calldata call\\n ) external view returns (bytes32 magic);\\n\\n}\\n\",\"keccak256\":\"0x6cb48f50c49bcb3c7071306fe9fac6c102bc9eabf73d9909e19ab3b9a835d0a8\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/lib/sequence-v3/src/modules/Payload.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.27;\\n\\nimport { LibBytes } from \\\"../utils/LibBytes.sol\\\";\\n\\nusing LibBytes for bytes;\\n\\n/// @title Payload\\n/// @author Agustin Aguilar, Michael Standen, William Hua\\n/// @notice Library for encoding and decoding payloads\\nlibrary Payload {\\n\\n /// @notice Error thrown when the kind is invalid\\n error InvalidKind(uint8 kind);\\n\\n /// @dev keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\")\\n bytes32 private constant EIP712_DOMAIN_TYPEHASH = 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f;\\n\\n /// @dev keccak256(\\\"Sequence Wallet\\\")\\n bytes32 private constant EIP712_DOMAIN_NAME_SEQUENCE =\\n 0x4aa45ca7ad825ceb1bf35643f0a58c295239df563b1b565c2485f96477c56318;\\n\\n /// @dev keccak256(\\\"3\\\")\\n bytes32 private constant EIP712_DOMAIN_VERSION_SEQUENCE =\\n 0x2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de;\\n\\n function domainSeparator(bool _noChainId, address _wallet) internal view returns (bytes32 _domainSeparator) {\\n return keccak256(\\n abi.encode(\\n EIP712_DOMAIN_TYPEHASH,\\n EIP712_DOMAIN_NAME_SEQUENCE,\\n EIP712_DOMAIN_VERSION_SEQUENCE,\\n _noChainId ? uint256(0) : uint256(block.chainid),\\n _wallet\\n )\\n );\\n }\\n\\n /// @dev keccak256(\\\"Call(address to,uint256 value,bytes data,uint256 gasLimit,bool delegateCall,bool onlyFallback,uint256 behaviorOnError)\\\")\\n bytes32 private constant CALL_TYPEHASH = 0x0603985259a953da1f65a522f589c17bd1d0117ec1d3abb7c0788aef251ef437;\\n\\n /// @dev keccak256(\\\"Calls(Call[] calls,uint256 space,uint256 nonce,address[] wallets)Call(address to,uint256 value,bytes data,uint256 gasLimit,bool delegateCall,bool onlyFallback,uint256 behaviorOnError)\\\")\\n bytes32 private constant CALLS_TYPEHASH = 0x11e1e4079a79a66e4ade50033cfe2678cdd5341d2dfe5ef9513edb1a0be147a2;\\n\\n /// @dev keccak256(\\\"Message(bytes message,address[] wallets)\\\")\\n bytes32 private constant MESSAGE_TYPEHASH = 0xe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d466;\\n\\n /// @dev keccak256(\\\"ConfigUpdate(bytes32 imageHash,address[] wallets)\\\")\\n bytes32 private constant CONFIG_UPDATE_TYPEHASH = 0x11fdeb7e8373a1aa96bfac8d0ea91526b2c5d15e5cee20e0543e780258f3e8e4;\\n\\n /// @notice Kind of transaction\\n uint8 public constant KIND_TRANSACTIONS = 0x00;\\n /// @notice Kind of digest\\n uint8 public constant KIND_MESSAGE = 0x01;\\n /// @notice Kind of config update\\n uint8 public constant KIND_CONFIG_UPDATE = 0x02;\\n /// @notice Kind of message\\n uint8 public constant KIND_DIGEST = 0x03;\\n\\n /// @notice Behavior on error: ignore error\\n uint8 public constant BEHAVIOR_IGNORE_ERROR = 0x00;\\n /// @notice Behavior on error: revert on error\\n uint8 public constant BEHAVIOR_REVERT_ON_ERROR = 0x01;\\n /// @notice Behavior on error: abort on error\\n uint8 public constant BEHAVIOR_ABORT_ON_ERROR = 0x02;\\n\\n /// @notice Payload call information\\n /// @param to Address of the target contract\\n /// @param value Value to send with the call\\n /// @param data Data to send with the call\\n /// @param gasLimit Gas limit for the call\\n /// @param delegateCall If the call is a delegate call\\n /// @param onlyFallback If the call should only be executed in an error scenario\\n /// @param behaviorOnError Behavior on error\\n struct Call {\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 gasLimit;\\n bool delegateCall;\\n bool onlyFallback;\\n uint256 behaviorOnError;\\n }\\n\\n /// @notice Decoded payload\\n /// @param kind Kind of payload\\n /// @param noChainId If the chain ID should be omitted\\n /// @param calls Array of calls (transaction kind)\\n /// @param space Nonce space for the calls (transaction kind)\\n /// @param nonce Nonce value for the calls (transaction kind)\\n /// @param message Message to validate (message kind)\\n /// @param imageHash Image hash to update to (config update kind)\\n /// @param digest Digest to validate (digest kind)\\n /// @param parentWallets Parent wallets\\n struct Decoded {\\n uint8 kind;\\n bool noChainId;\\n // Transaction kind\\n Call[] calls;\\n uint256 space;\\n uint256 nonce;\\n // Message kind\\n // TODO: Maybe native 721 ?\\n bytes message;\\n // Config update kind\\n bytes32 imageHash;\\n // Digest kind for 1271\\n bytes32 digest;\\n // Parent wallets\\n address[] parentWallets;\\n }\\n\\n function fromMessage(\\n bytes memory message\\n ) internal pure returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_MESSAGE;\\n _decoded.message = message;\\n }\\n\\n function fromConfigUpdate(\\n bytes32 imageHash\\n ) internal pure returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_CONFIG_UPDATE;\\n _decoded.imageHash = imageHash;\\n }\\n\\n function fromDigest(\\n bytes32 digest\\n ) internal pure returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_DIGEST;\\n _decoded.digest = digest;\\n }\\n\\n function fromPackedCalls(\\n bytes calldata packed\\n ) internal view returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_TRANSACTIONS;\\n\\n // Read the global flag\\n (uint256 globalFlag, uint256 pointer) = packed.readFirstUint8();\\n\\n // First bit determines if space is zero or not\\n if (globalFlag & 0x01 == 0x01) {\\n _decoded.space = 0;\\n } else {\\n (_decoded.space, pointer) = packed.readUint160(pointer);\\n }\\n\\n // Next 3 bits determine the size of the nonce\\n uint256 nonceSize = (globalFlag >> 1) & 0x07;\\n\\n if (nonceSize > 0) {\\n // Read the nonce\\n (_decoded.nonce, pointer) = packed.readUintX(pointer, nonceSize);\\n }\\n\\n uint256 numCalls;\\n\\n // Bit 5 determines if the batch contains a single call\\n if (globalFlag & 0x10 == 0x10) {\\n numCalls = 1;\\n } else {\\n // Bit 6 determines if the number of calls uses 1 byte or 2 bytes\\n if (globalFlag & 0x20 == 0x20) {\\n (numCalls, pointer) = packed.readUint16(pointer);\\n } else {\\n (numCalls, pointer) = packed.readUint8(pointer);\\n }\\n }\\n\\n // Read the calls\\n _decoded.calls = new Call[](numCalls);\\n\\n for (uint256 i = 0; i < numCalls; i++) {\\n uint8 flags;\\n (flags, pointer) = packed.readUint8(pointer);\\n\\n // First bit determines if this is a call to self\\n // or a call to another address\\n if (flags & 0x01 == 0x01) {\\n // Call to self\\n _decoded.calls[i].to = address(this);\\n } else {\\n // Call to another address\\n (_decoded.calls[i].to, pointer) = packed.readAddress(pointer);\\n }\\n\\n // Second bit determines if the call has value or not\\n if (flags & 0x02 == 0x02) {\\n (_decoded.calls[i].value, pointer) = packed.readUint256(pointer);\\n }\\n\\n // Third bit determines if the call has data or not\\n if (flags & 0x04 == 0x04) {\\n // 3 bytes determine the size of the calldata\\n uint256 calldataSize;\\n (calldataSize, pointer) = packed.readUint24(pointer);\\n _decoded.calls[i].data = packed[pointer:pointer + calldataSize];\\n pointer += calldataSize;\\n }\\n\\n // Fourth bit determines if the call has a gas limit or not\\n if (flags & 0x08 == 0x08) {\\n (_decoded.calls[i].gasLimit, pointer) = packed.readUint256(pointer);\\n }\\n\\n // Fifth bit determines if the call is a delegate call or not\\n _decoded.calls[i].delegateCall = (flags & 0x10 == 0x10);\\n\\n // Sixth bit determines if the call is fallback only\\n _decoded.calls[i].onlyFallback = (flags & 0x20 == 0x20);\\n\\n // Last 2 bits are directly mapped to the behavior on error\\n _decoded.calls[i].behaviorOnError = (flags & 0xC0) >> 6;\\n }\\n }\\n\\n function hashCall(\\n Call memory c\\n ) internal pure returns (bytes32) {\\n return keccak256(\\n abi.encode(\\n CALL_TYPEHASH, c.to, c.value, keccak256(c.data), c.gasLimit, c.delegateCall, c.onlyFallback, c.behaviorOnError\\n )\\n );\\n }\\n\\n function hashCalls(\\n Call[] memory calls\\n ) internal pure returns (bytes32) {\\n // In EIP712, an array is often hashed as the keccak256 of the concatenated\\n // hashes of each item. So we hash each Call, pack them, and hash again.\\n bytes32[] memory callHashes = new bytes32[](calls.length);\\n for (uint256 i = 0; i < calls.length; i++) {\\n callHashes[i] = hashCall(calls[i]);\\n }\\n return keccak256(abi.encodePacked(callHashes));\\n }\\n\\n function toEIP712(\\n Decoded memory _decoded\\n ) internal pure returns (bytes32) {\\n bytes32 walletsHash = keccak256(abi.encodePacked(_decoded.parentWallets));\\n\\n if (_decoded.kind == KIND_TRANSACTIONS) {\\n bytes32 callsHash = hashCalls(_decoded.calls);\\n // The top-level struct for Calls might be something like:\\n // Calls(bytes32 callsHash,uint256 space,uint256 nonce,bytes32 walletsHash)\\n return keccak256(abi.encode(CALLS_TYPEHASH, callsHash, _decoded.space, _decoded.nonce, walletsHash));\\n } else if (_decoded.kind == KIND_MESSAGE) {\\n // If you define your top-level as: Message(bytes32 messageHash,bytes32 walletsHash)\\n return keccak256(abi.encode(MESSAGE_TYPEHASH, keccak256(_decoded.message), walletsHash));\\n } else if (_decoded.kind == KIND_CONFIG_UPDATE) {\\n // Top-level: ConfigUpdate(bytes32 imageHash,bytes32 walletsHash)\\n return keccak256(abi.encode(CONFIG_UPDATE_TYPEHASH, _decoded.imageHash, walletsHash));\\n } else if (_decoded.kind == KIND_DIGEST) {\\n // Top-level: Use MESSAGE_TYPEHASH but assume the digest is already the hashed message\\n return keccak256(abi.encode(MESSAGE_TYPEHASH, _decoded.digest, walletsHash));\\n } else {\\n // Unknown kind\\n revert InvalidKind(_decoded.kind);\\n }\\n }\\n\\n function hash(\\n Decoded memory _decoded\\n ) internal view returns (bytes32) {\\n bytes32 domain = domainSeparator(_decoded.noChainId, address(this));\\n bytes32 structHash = toEIP712(_decoded);\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domain, structHash));\\n }\\n\\n function hashFor(Decoded memory _decoded, address _wallet) internal view returns (bytes32) {\\n bytes32 domain = domainSeparator(_decoded.noChainId, _wallet);\\n bytes32 structHash = toEIP712(_decoded);\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domain, structHash));\\n }\\n\\n}\\n\",\"keccak256\":\"0x25066fa78d12d0d73d463b97b37528291f3d4d60ca642247441538b83d6597d6\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/lib/sequence-v3/src/utils/LibBytes.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.18;\\n\\n/// @title Library for reading data from bytes arrays\\n/// @author Agustin Aguilar (aa@horizon.io), Michael Standen (mstan@horizon.io)\\n/// @notice This library contains functions for reading data from bytes arrays.\\n/// @dev These functions do not check if the input index is within the bounds of the data array.\\n/// @dev Reading out of bounds may return dirty values.\\nlibrary LibBytes {\\n\\n function readFirstUint8(\\n bytes calldata _data\\n ) internal pure returns (uint8 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(_data.offset)\\n a := shr(248, word)\\n newPointer := 1\\n }\\n }\\n\\n function readUint8(bytes calldata _data, uint256 _index) internal pure returns (uint8 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(248, word)\\n newPointer := add(_index, 1)\\n }\\n }\\n\\n function readUint16(bytes calldata _data, uint256 _index) internal pure returns (uint16 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(240, word)\\n newPointer := add(_index, 2)\\n }\\n }\\n\\n function readUint24(bytes calldata _data, uint256 _index) internal pure returns (uint24 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(232, word)\\n newPointer := add(_index, 3)\\n }\\n }\\n\\n function readUint64(bytes calldata _data, uint256 _index) internal pure returns (uint64 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(192, word)\\n newPointer := add(_index, 8)\\n }\\n }\\n\\n function readUint160(bytes calldata _data, uint256 _index) internal pure returns (uint160 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(96, word)\\n newPointer := add(_index, 20)\\n }\\n }\\n\\n function readUint256(bytes calldata _data, uint256 _index) internal pure returns (uint256 a, uint256 newPointer) {\\n assembly {\\n a := calldataload(add(_index, _data.offset))\\n newPointer := add(_index, 32)\\n }\\n }\\n\\n function readUintX(\\n bytes calldata _data,\\n uint256 _index,\\n uint256 _length\\n ) internal pure returns (uint256 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n let shift := sub(256, mul(_length, 8))\\n a := and(shr(shift, word), sub(shl(mul(8, _length), 1), 1))\\n newPointer := add(_index, _length)\\n }\\n }\\n\\n function readBytes4(bytes calldata _data, uint256 _pointer) internal pure returns (bytes4 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_pointer, _data.offset))\\n a := and(word, 0xffffffff00000000000000000000000000000000000000000000000000000000)\\n newPointer := add(_pointer, 4)\\n }\\n }\\n\\n function readBytes32(bytes calldata _data, uint256 _pointer) internal pure returns (bytes32 a, uint256 newPointer) {\\n assembly {\\n a := calldataload(add(_pointer, _data.offset))\\n newPointer := add(_pointer, 32)\\n }\\n }\\n\\n function readAddress(bytes calldata _data, uint256 _index) internal pure returns (address a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := and(shr(96, word), 0xffffffffffffffffffffffffffffffffffffffff)\\n newPointer := add(_index, 20)\\n }\\n }\\n\\n /// @dev ERC-2098 Compact Signature\\n function readRSVCompact(\\n bytes calldata _data,\\n uint256 _index\\n ) internal pure returns (bytes32 r, bytes32 s, uint8 v, uint256 newPointer) {\\n uint256 yParityAndS;\\n assembly {\\n r := calldataload(add(_index, _data.offset))\\n yParityAndS := calldataload(add(_index, add(_data.offset, 32)))\\n newPointer := add(_index, 64)\\n }\\n uint256 yParity = uint256(yParityAndS >> 255);\\n s = bytes32(uint256(yParityAndS) & ((1 << 255) - 1));\\n v = uint8(yParity) + 27;\\n }\\n\\n}\\n\",\"keccak256\":\"0x4fe0b4786b2157e12384b90ae9daa1009b74b2547a8a24b800a8b998278c874b\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/src/helper/SignalsImplicitMode.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.13;\\n\\nimport { IImplicitProjectValidation } from \\\"../registry/IImplicitProjectValidation.sol\\\";\\n\\nimport { ERC165, IERC165 } from \\\"openzeppelin-contracts/contracts/utils/introspection/ERC165.sol\\\";\\nimport { Attestation } from \\\"sequence-v3/src/extensions/sessions/implicit/Attestation.sol\\\";\\nimport { ISignalsImplicitMode } from \\\"sequence-v3/src/extensions/sessions/implicit/ISignalsImplicitMode.sol\\\";\\nimport { Payload } from \\\"sequence-v3/src/modules/Payload.sol\\\";\\n\\n/// @title SignalsImplicitMode\\n/// @author Michael Standen\\n/// @notice Base contract for implicit mode validation by project\\nabstract contract SignalsImplicitMode is ISignalsImplicitMode, ERC165 {\\n\\n IImplicitProjectValidation internal _validator;\\n bytes32 internal _projectId;\\n\\n /// @notice Initialize implicit mode validation\\n /// @param validator The IImplicitProjectValidation address\\n /// @param projectId The project id\\n function _initializeSignalsImplicitMode(address validator, bytes32 projectId) internal {\\n _validator = IImplicitProjectValidation(validator);\\n _projectId = projectId;\\n }\\n\\n /// @inheritdoc ISignalsImplicitMode\\n function acceptImplicitRequest(\\n address wallet,\\n Attestation calldata attestation,\\n Payload.Call calldata call\\n ) external view returns (bytes32) {\\n _validateImplicitRequest(wallet, attestation, call);\\n return _validator.validateAttestation(wallet, attestation, _projectId);\\n }\\n\\n /// @notice Validates an implicit request\\n /// @dev Optional hook for additional validation of the implicit requests\\n /// @param wallet The wallet's address\\n /// @param attestation The attestation data\\n /// @param call The call to validate\\n function _validateImplicitRequest(\\n address wallet,\\n Attestation calldata attestation,\\n Payload.Call calldata call\\n ) internal view virtual { }\\n\\n /// @inheritdoc IERC165\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view virtual override returns (bool) {\\n return interfaceId == type(ISignalsImplicitMode).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n}\\n\",\"keccak256\":\"0xd9107be2460f7f7ec4bdfefc3d10c79aa92b9285e1b12a75cb2a8d17b150a2ec\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/src/registry/IImplicitProjectValidation.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.13;\\n\\nimport { Attestation } from \\\"sequence-v3/src/extensions/sessions/implicit/Attestation.sol\\\";\\n\\n/// @title IImplicitProjectValidation\\n/// @author Michael Standen\\n/// @notice Interface for contracts supporting validation of implicit sessions for projects\\ninterface IImplicitProjectValidation {\\n\\n /// @notice Invalid redirect url error\\n error InvalidRedirectUrl();\\n\\n /// @notice Check if a project has a code\\n /// @param wallet The wallet address\\n /// @param attestation The attestation\\n /// @param projectId The project id\\n /// @return magic The attestation magic bytes for the wallet address\\n function validateAttestation(\\n address wallet,\\n Attestation calldata attestation,\\n bytes32 projectId\\n ) external view returns (bytes32);\\n\\n}\\n\",\"keccak256\":\"0x1e8c305e011aa13d774e0ff3cfd9286af3d8174c4e33ba5ef8f724ea2dd6e5b2\",\"license\":\"Apache-2.0\"},\"lib/solady/src/tokens/ERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\n/// @notice Simple ERC1155 implementation.\\n/// @author Solady (https://github.com/vectorized/solady/blob/main/src/tokens/ERC1155.sol)\\n/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC1155.sol)\\n/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC1155/ERC1155.sol)\\n///\\n/// @dev Note:\\n/// - The ERC1155 standard allows for self-approvals.\\n/// For performance, this implementation WILL NOT revert for such actions.\\n/// Please add any checks with overrides if desired.\\n/// - The transfer functions use the identity precompile (0x4)\\n/// to copy memory internally.\\n///\\n/// If you are overriding:\\n/// - Make sure all variables written to storage are properly cleaned\\n// (e.g. the bool value for `isApprovedForAll` MUST be either 1 or 0 under the hood).\\n/// - Check that the overridden function is actually used in the function you want to\\n/// change the behavior of. Much of the code has been manually inlined for performance.\\nabstract contract ERC1155 {\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* CUSTOM ERRORS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev The lengths of the input arrays are not the same.\\n error ArrayLengthsMismatch();\\n\\n /// @dev Cannot mint or transfer to the zero address.\\n error TransferToZeroAddress();\\n\\n /// @dev The recipient's balance has overflowed.\\n error AccountBalanceOverflow();\\n\\n /// @dev Insufficient balance.\\n error InsufficientBalance();\\n\\n /// @dev Only the token owner or an approved account can manage the tokens.\\n error NotOwnerNorApproved();\\n\\n /// @dev Cannot safely transfer to a contract that does not implement\\n /// the ERC1155Receiver interface.\\n error TransferToNonERC1155ReceiverImplementer();\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* EVENTS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Emitted when `amount` of token `id` is transferred\\n /// from `from` to `to` by `operator`.\\n event TransferSingle(\\n address indexed operator,\\n address indexed from,\\n address indexed to,\\n uint256 id,\\n uint256 amount\\n );\\n\\n /// @dev Emitted when `amounts` of token `ids` are transferred\\n /// from `from` to `to` by `operator`.\\n event TransferBatch(\\n address indexed operator,\\n address indexed from,\\n address indexed to,\\n uint256[] ids,\\n uint256[] amounts\\n );\\n\\n /// @dev Emitted when `owner` enables or disables `operator` to manage all of their tokens.\\n event ApprovalForAll(address indexed owner, address indexed operator, bool isApproved);\\n\\n /// @dev Emitted when the Uniform Resource Identifier (URI) for token `id`\\n /// is updated to `value`. This event is not used in the base contract.\\n /// You may need to emit this event depending on your URI logic.\\n ///\\n /// See: https://eips.ethereum.org/EIPS/eip-1155#metadata\\n event URI(string value, uint256 indexed id);\\n\\n /// @dev `keccak256(bytes(\\\"TransferSingle(address,address,address,uint256,uint256)\\\"))`.\\n uint256 private constant _TRANSFER_SINGLE_EVENT_SIGNATURE =\\n 0xc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62;\\n\\n /// @dev `keccak256(bytes(\\\"TransferBatch(address,address,address,uint256[],uint256[])\\\"))`.\\n uint256 private constant _TRANSFER_BATCH_EVENT_SIGNATURE =\\n 0x4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb;\\n\\n /// @dev `keccak256(bytes(\\\"ApprovalForAll(address,address,bool)\\\"))`.\\n uint256 private constant _APPROVAL_FOR_ALL_EVENT_SIGNATURE =\\n 0x17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31;\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* STORAGE */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev The `ownerSlotSeed` of a given owner is given by.\\n /// ```\\n /// let ownerSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, owner))\\n /// ```\\n ///\\n /// The balance slot of `owner` is given by.\\n /// ```\\n /// mstore(0x20, ownerSlotSeed)\\n /// mstore(0x00, id)\\n /// let balanceSlot := keccak256(0x00, 0x40)\\n /// ```\\n ///\\n /// The operator approval slot of `owner` is given by.\\n /// ```\\n /// mstore(0x20, ownerSlotSeed)\\n /// mstore(0x00, operator)\\n /// let operatorApprovalSlot := keccak256(0x0c, 0x34)\\n /// ```\\n uint256 private constant _ERC1155_MASTER_SLOT_SEED = 0x9a31110384e0b0c9;\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* ERC1155 METADATA */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns the URI for token `id`.\\n ///\\n /// You can either return the same templated URI for all token IDs,\\n /// (e.g. \\\"https://example.com/api/{id}.json\\\"),\\n /// or return a unique URI for each `id`.\\n ///\\n /// See: https://eips.ethereum.org/EIPS/eip-1155#metadata\\n function uri(uint256 id) public view virtual returns (string memory);\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* ERC1155 */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns the amount of `id` owned by `owner`.\\n function balanceOf(address owner, uint256 id) public view virtual returns (uint256 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x20, _ERC1155_MASTER_SLOT_SEED)\\n mstore(0x14, owner)\\n mstore(0x00, id)\\n result := sload(keccak256(0x00, 0x40))\\n }\\n }\\n\\n /// @dev Returns whether `operator` is approved to manage the tokens of `owner`.\\n function isApprovedForAll(address owner, address operator)\\n public\\n view\\n virtual\\n returns (bool result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x20, _ERC1155_MASTER_SLOT_SEED)\\n mstore(0x14, owner)\\n mstore(0x00, operator)\\n result := sload(keccak256(0x0c, 0x34))\\n }\\n }\\n\\n /// @dev Sets whether `operator` is approved to manage the tokens of the caller.\\n ///\\n /// Emits a {ApprovalForAll} event.\\n function setApprovalForAll(address operator, bool isApproved) public virtual {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Convert to 0 or 1.\\n isApproved := iszero(iszero(isApproved))\\n // Update the `isApproved` for (`msg.sender`, `operator`).\\n mstore(0x20, _ERC1155_MASTER_SLOT_SEED)\\n mstore(0x14, caller())\\n mstore(0x00, operator)\\n sstore(keccak256(0x0c, 0x34), isApproved)\\n // Emit the {ApprovalForAll} event.\\n mstore(0x00, isApproved)\\n // forgefmt: disable-next-line\\n log3(0x00, 0x20, _APPROVAL_FOR_ALL_EVENT_SIGNATURE, caller(), shr(96, shl(96, operator)))\\n }\\n }\\n\\n /// @dev Transfers `amount` of `id` from `from` to `to`.\\n ///\\n /// Requirements:\\n /// - `to` cannot be the zero address.\\n /// - `from` must have at least `amount` of `id`.\\n /// - If the caller is not `from`,\\n /// it must be approved to manage the tokens of `from`.\\n /// - If `to` refers to a smart contract, it must implement\\n /// {ERC1155-onERC1155Received}, which is called upon a batch transfer.\\n ///\\n /// Emits a {TransferSingle} event.\\n function safeTransferFrom(\\n address from,\\n address to,\\n uint256 id,\\n uint256 amount,\\n bytes calldata data\\n ) public virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(from, to, _single(id), _single(amount), data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n let fromSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, from))\\n let toSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, to))\\n mstore(0x20, fromSlotSeed)\\n // Clear the upper 96 bits.\\n from := shr(96, fromSlotSeed)\\n to := shr(96, toSlotSeed)\\n // Revert if `to` is the zero address.\\n if iszero(to) {\\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\\n revert(0x1c, 0x04)\\n }\\n // If the caller is not `from`, do the authorization check.\\n if iszero(eq(caller(), from)) {\\n mstore(0x00, caller())\\n if iszero(sload(keccak256(0x0c, 0x34))) {\\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n // Subtract and store the updated balance of `from`.\\n {\\n mstore(0x00, id)\\n let fromBalanceSlot := keccak256(0x00, 0x40)\\n let fromBalance := sload(fromBalanceSlot)\\n if gt(amount, fromBalance) {\\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(fromBalanceSlot, sub(fromBalance, amount))\\n }\\n // Increase and store the updated balance of `to`.\\n {\\n mstore(0x20, toSlotSeed)\\n let toBalanceSlot := keccak256(0x00, 0x40)\\n let toBalanceBefore := sload(toBalanceSlot)\\n let toBalanceAfter := add(toBalanceBefore, amount)\\n if lt(toBalanceAfter, toBalanceBefore) {\\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(toBalanceSlot, toBalanceAfter)\\n }\\n // Emit a {TransferSingle} event.\\n mstore(0x20, amount)\\n log4(0x00, 0x40, _TRANSFER_SINGLE_EVENT_SIGNATURE, caller(), from, to)\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(from, to, _single(id), _single(amount), data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Do the {onERC1155Received} check if `to` is a smart contract.\\n if extcodesize(to) {\\n // Prepare the calldata.\\n let m := mload(0x40)\\n // `onERC1155Received(address,address,uint256,uint256,bytes)`.\\n mstore(m, 0xf23a6e61)\\n mstore(add(m, 0x20), caller())\\n mstore(add(m, 0x40), from)\\n mstore(add(m, 0x60), id)\\n mstore(add(m, 0x80), amount)\\n mstore(add(m, 0xa0), 0xa0)\\n mstore(add(m, 0xc0), data.length)\\n calldatacopy(add(m, 0xe0), data.offset, data.length)\\n // Revert if the call reverts.\\n if iszero(call(gas(), to, 0, add(m, 0x1c), add(0xc4, data.length), m, 0x20)) {\\n if returndatasize() {\\n // Bubble up the revert if the call reverts.\\n returndatacopy(m, 0x00, returndatasize())\\n revert(m, returndatasize())\\n }\\n }\\n // Load the returndata and compare it with the function selector.\\n if iszero(eq(mload(m), shl(224, 0xf23a6e61))) {\\n mstore(0x00, 0x9c05499b) // `TransferToNonERC1155ReceiverImplementer()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n }\\n }\\n\\n /// @dev Transfers `amounts` of `ids` from `from` to `to`.\\n ///\\n /// Requirements:\\n /// - `to` cannot be the zero address.\\n /// - `from` must have at least `amount` of `id`.\\n /// - `ids` and `amounts` must have the same length.\\n /// - If the caller is not `from`,\\n /// it must be approved to manage the tokens of `from`.\\n /// - If `to` refers to a smart contract, it must implement\\n /// {ERC1155-onERC1155BatchReceived}, which is called upon a batch transfer.\\n ///\\n /// Emits a {TransferBatch} event.\\n function safeBatchTransferFrom(\\n address from,\\n address to,\\n uint256[] calldata ids,\\n uint256[] calldata amounts,\\n bytes calldata data\\n ) public virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(from, to, ids, amounts, data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n if iszero(eq(ids.length, amounts.length)) {\\n mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.\\n revert(0x1c, 0x04)\\n }\\n let fromSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, from))\\n let toSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, to))\\n mstore(0x20, fromSlotSeed)\\n // Clear the upper 96 bits.\\n from := shr(96, fromSlotSeed)\\n to := shr(96, toSlotSeed)\\n // Revert if `to` is the zero address.\\n if iszero(to) {\\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\\n revert(0x1c, 0x04)\\n }\\n // If the caller is not `from`, do the authorization check.\\n if iszero(eq(caller(), from)) {\\n mstore(0x00, caller())\\n if iszero(sload(keccak256(0x0c, 0x34))) {\\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n // Loop through all the `ids` and update the balances.\\n {\\n for { let i := shl(5, ids.length) } i {} {\\n i := sub(i, 0x20)\\n let amount := calldataload(add(amounts.offset, i))\\n // Subtract and store the updated balance of `from`.\\n {\\n mstore(0x20, fromSlotSeed)\\n mstore(0x00, calldataload(add(ids.offset, i)))\\n let fromBalanceSlot := keccak256(0x00, 0x40)\\n let fromBalance := sload(fromBalanceSlot)\\n if gt(amount, fromBalance) {\\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(fromBalanceSlot, sub(fromBalance, amount))\\n }\\n // Increase and store the updated balance of `to`.\\n {\\n mstore(0x20, toSlotSeed)\\n let toBalanceSlot := keccak256(0x00, 0x40)\\n let toBalanceBefore := sload(toBalanceSlot)\\n let toBalanceAfter := add(toBalanceBefore, amount)\\n if lt(toBalanceAfter, toBalanceBefore) {\\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(toBalanceSlot, toBalanceAfter)\\n }\\n }\\n }\\n // Emit a {TransferBatch} event.\\n {\\n let m := mload(0x40)\\n // Copy the `ids`.\\n mstore(m, 0x40)\\n let n := shl(5, ids.length)\\n mstore(add(m, 0x40), ids.length)\\n calldatacopy(add(m, 0x60), ids.offset, n)\\n // Copy the `amounts`.\\n mstore(add(m, 0x20), add(0x60, n))\\n let o := add(add(m, n), 0x60)\\n mstore(o, ids.length)\\n calldatacopy(add(o, 0x20), amounts.offset, n)\\n // Do the emit.\\n log4(m, add(add(n, n), 0x80), _TRANSFER_BATCH_EVENT_SIGNATURE, caller(), from, to)\\n }\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransferCalldata(from, to, ids, amounts, data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Do the {onERC1155BatchReceived} check if `to` is a smart contract.\\n if extcodesize(to) {\\n mstore(0x00, to) // Cache `to` to prevent stack too deep.\\n let m := mload(0x40)\\n // Prepare the calldata.\\n // `onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)`.\\n mstore(m, 0xbc197c81)\\n mstore(add(m, 0x20), caller())\\n mstore(add(m, 0x40), from)\\n // Copy the `ids`.\\n mstore(add(m, 0x60), 0xa0)\\n let n := shl(5, ids.length)\\n mstore(add(m, 0xc0), ids.length)\\n calldatacopy(add(m, 0xe0), ids.offset, n)\\n // Copy the `amounts`.\\n mstore(add(m, 0x80), add(0xc0, n))\\n let o := add(add(m, n), 0xe0)\\n mstore(o, ids.length)\\n calldatacopy(add(o, 0x20), amounts.offset, n)\\n // Copy the `data`.\\n mstore(add(m, 0xa0), add(add(0xe0, n), n))\\n o := add(add(o, n), 0x20)\\n mstore(o, data.length)\\n calldatacopy(add(o, 0x20), data.offset, data.length)\\n let nAll := add(0x104, add(data.length, add(n, n)))\\n // Revert if the call reverts.\\n if iszero(call(gas(), mload(0x00), 0, add(mload(0x40), 0x1c), nAll, m, 0x20)) {\\n if returndatasize() {\\n // Bubble up the revert if the call reverts.\\n returndatacopy(m, 0x00, returndatasize())\\n revert(m, returndatasize())\\n }\\n }\\n // Load the returndata and compare it with the function selector.\\n if iszero(eq(mload(m), shl(224, 0xbc197c81))) {\\n mstore(0x00, 0x9c05499b) // `TransferToNonERC1155ReceiverImplementer()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n }\\n }\\n\\n /// @dev Returns the amounts of `ids` for `owners.\\n ///\\n /// Requirements:\\n /// - `owners` and `ids` must have the same length.\\n function balanceOfBatch(address[] calldata owners, uint256[] calldata ids)\\n public\\n view\\n virtual\\n returns (uint256[] memory balances)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n if iszero(eq(ids.length, owners.length)) {\\n mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.\\n revert(0x1c, 0x04)\\n }\\n balances := mload(0x40)\\n mstore(balances, ids.length)\\n let o := add(balances, 0x20)\\n let i := shl(5, ids.length)\\n mstore(0x40, add(i, o))\\n // Loop through all the `ids` and load the balances.\\n for {} i {} {\\n i := sub(i, 0x20)\\n let owner := calldataload(add(owners.offset, i))\\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, shl(96, owner)))\\n mstore(0x00, calldataload(add(ids.offset, i)))\\n mstore(add(o, i), sload(keccak256(0x00, 0x40)))\\n }\\n }\\n }\\n\\n /// @dev Returns true if this contract implements the interface defined by `interfaceId`.\\n /// See: https://eips.ethereum.org/EIPS/eip-165\\n /// This function call must use less than 30000 gas.\\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let s := shr(224, interfaceId)\\n // ERC165: 0x01ffc9a7, ERC1155: 0xd9b67a26, ERC1155MetadataURI: 0x0e89341c.\\n result := or(or(eq(s, 0x01ffc9a7), eq(s, 0xd9b67a26)), eq(s, 0x0e89341c))\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* INTERNAL MINT FUNCTIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Mints `amount` of `id` to `to`.\\n ///\\n /// Requirements:\\n /// - `to` cannot be the zero address.\\n /// - If `to` refers to a smart contract, it must implement\\n /// {ERC1155-onERC1155Received}, which is called upon a batch transfer.\\n ///\\n /// Emits a {TransferSingle} event.\\n function _mint(address to, uint256 id, uint256 amount, bytes memory data) internal virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(address(0), to, _single(id), _single(amount), data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n let to_ := shl(96, to)\\n // Revert if `to` is the zero address.\\n if iszero(to_) {\\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\\n revert(0x1c, 0x04)\\n }\\n // Increase and store the updated balance of `to`.\\n {\\n mstore(0x20, _ERC1155_MASTER_SLOT_SEED)\\n mstore(0x14, to)\\n mstore(0x00, id)\\n let toBalanceSlot := keccak256(0x00, 0x40)\\n let toBalanceBefore := sload(toBalanceSlot)\\n let toBalanceAfter := add(toBalanceBefore, amount)\\n if lt(toBalanceAfter, toBalanceBefore) {\\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(toBalanceSlot, toBalanceAfter)\\n }\\n // Emit a {TransferSingle} event.\\n mstore(0x20, amount)\\n log4(0x00, 0x40, _TRANSFER_SINGLE_EVENT_SIGNATURE, caller(), 0, shr(96, to_))\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(address(0), to, _single(id), _single(amount), data);\\n }\\n if (_hasCode(to)) _checkOnERC1155Received(address(0), to, id, amount, data);\\n }\\n\\n /// @dev Mints `amounts` of `ids` to `to`.\\n ///\\n /// Requirements:\\n /// - `to` cannot be the zero address.\\n /// - `ids` and `amounts` must have the same length.\\n /// - If `to` refers to a smart contract, it must implement\\n /// {ERC1155-onERC1155BatchReceived}, which is called upon a batch transfer.\\n ///\\n /// Emits a {TransferBatch} event.\\n function _batchMint(\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) internal virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(address(0), to, ids, amounts, data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n if iszero(eq(mload(ids), mload(amounts))) {\\n mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.\\n revert(0x1c, 0x04)\\n }\\n let to_ := shl(96, to)\\n // Revert if `to` is the zero address.\\n if iszero(to_) {\\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\\n revert(0x1c, 0x04)\\n }\\n // Loop through all the `ids` and update the balances.\\n {\\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, to_))\\n for { let i := shl(5, mload(ids)) } i { i := sub(i, 0x20) } {\\n let amount := mload(add(amounts, i))\\n // Increase and store the updated balance of `to`.\\n {\\n mstore(0x00, mload(add(ids, i)))\\n let toBalanceSlot := keccak256(0x00, 0x40)\\n let toBalanceBefore := sload(toBalanceSlot)\\n let toBalanceAfter := add(toBalanceBefore, amount)\\n if lt(toBalanceAfter, toBalanceBefore) {\\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(toBalanceSlot, toBalanceAfter)\\n }\\n }\\n }\\n // Emit a {TransferBatch} event.\\n {\\n let m := mload(0x40)\\n // Copy the `ids`.\\n mstore(m, 0x40)\\n let n := add(0x20, shl(5, mload(ids)))\\n let o := add(m, 0x40)\\n pop(staticcall(gas(), 4, ids, n, o, n))\\n // Copy the `amounts`.\\n mstore(add(m, 0x20), add(0x40, returndatasize()))\\n o := add(o, returndatasize())\\n n := add(0x20, shl(5, mload(amounts)))\\n pop(staticcall(gas(), 4, amounts, n, o, n))\\n n := sub(add(o, returndatasize()), m)\\n // Do the emit.\\n log4(m, n, _TRANSFER_BATCH_EVENT_SIGNATURE, caller(), 0, shr(96, to_))\\n }\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(address(0), to, ids, amounts, data);\\n }\\n if (_hasCode(to)) _checkOnERC1155BatchReceived(address(0), to, ids, amounts, data);\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* INTERNAL BURN FUNCTIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Equivalent to `_burn(address(0), from, id, amount)`.\\n function _burn(address from, uint256 id, uint256 amount) internal virtual {\\n _burn(address(0), from, id, amount);\\n }\\n\\n /// @dev Destroys `amount` of `id` from `from`.\\n ///\\n /// Requirements:\\n /// - `from` must have at least `amount` of `id`.\\n /// - If `by` is not the zero address, it must be either `from`,\\n /// or approved to manage the tokens of `from`.\\n ///\\n /// Emits a {TransferSingle} event.\\n function _burn(address by, address from, uint256 id, uint256 amount) internal virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(from, address(0), _single(id), _single(amount), \\\"\\\");\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n let from_ := shl(96, from)\\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, from_))\\n // If `by` is not the zero address, and not equal to `from`,\\n // check if it is approved to manage all the tokens of `from`.\\n if iszero(or(iszero(shl(96, by)), eq(shl(96, by), from_))) {\\n mstore(0x00, by)\\n if iszero(sload(keccak256(0x0c, 0x34))) {\\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n // Decrease and store the updated balance of `from`.\\n {\\n mstore(0x00, id)\\n let fromBalanceSlot := keccak256(0x00, 0x40)\\n let fromBalance := sload(fromBalanceSlot)\\n if gt(amount, fromBalance) {\\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(fromBalanceSlot, sub(fromBalance, amount))\\n }\\n // Emit a {TransferSingle} event.\\n mstore(0x20, amount)\\n log4(0x00, 0x40, _TRANSFER_SINGLE_EVENT_SIGNATURE, caller(), shr(96, from_), 0)\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(from, address(0), _single(id), _single(amount), \\\"\\\");\\n }\\n }\\n\\n /// @dev Equivalent to `_batchBurn(address(0), from, ids, amounts)`.\\n function _batchBurn(address from, uint256[] memory ids, uint256[] memory amounts)\\n internal\\n virtual\\n {\\n _batchBurn(address(0), from, ids, amounts);\\n }\\n\\n /// @dev Destroys `amounts` of `ids` from `from`.\\n ///\\n /// Requirements:\\n /// - `ids` and `amounts` must have the same length.\\n /// - `from` must have at least `amounts` of `ids`.\\n /// - If `by` is not the zero address, it must be either `from`,\\n /// or approved to manage the tokens of `from`.\\n ///\\n /// Emits a {TransferBatch} event.\\n function _batchBurn(address by, address from, uint256[] memory ids, uint256[] memory amounts)\\n internal\\n virtual\\n {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(from, address(0), ids, amounts, \\\"\\\");\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n if iszero(eq(mload(ids), mload(amounts))) {\\n mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.\\n revert(0x1c, 0x04)\\n }\\n let from_ := shl(96, from)\\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, from_))\\n // If `by` is not the zero address, and not equal to `from`,\\n // check if it is approved to manage all the tokens of `from`.\\n let by_ := shl(96, by)\\n if iszero(or(iszero(by_), eq(by_, from_))) {\\n mstore(0x00, by)\\n if iszero(sload(keccak256(0x0c, 0x34))) {\\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n // Loop through all the `ids` and update the balances.\\n {\\n for { let i := shl(5, mload(ids)) } i { i := sub(i, 0x20) } {\\n let amount := mload(add(amounts, i))\\n // Decrease and store the updated balance of `from`.\\n {\\n mstore(0x00, mload(add(ids, i)))\\n let fromBalanceSlot := keccak256(0x00, 0x40)\\n let fromBalance := sload(fromBalanceSlot)\\n if gt(amount, fromBalance) {\\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(fromBalanceSlot, sub(fromBalance, amount))\\n }\\n }\\n }\\n // Emit a {TransferBatch} event.\\n {\\n let m := mload(0x40)\\n // Copy the `ids`.\\n mstore(m, 0x40)\\n let n := add(0x20, shl(5, mload(ids)))\\n let o := add(m, 0x40)\\n pop(staticcall(gas(), 4, ids, n, o, n))\\n // Copy the `amounts`.\\n mstore(add(m, 0x20), add(0x40, returndatasize()))\\n o := add(o, returndatasize())\\n n := add(0x20, shl(5, mload(amounts)))\\n pop(staticcall(gas(), 4, amounts, n, o, n))\\n n := sub(add(o, returndatasize()), m)\\n // Do the emit.\\n log4(m, n, _TRANSFER_BATCH_EVENT_SIGNATURE, caller(), shr(96, from_), 0)\\n }\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(from, address(0), ids, amounts, \\\"\\\");\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* INTERNAL APPROVAL FUNCTIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Approve or remove the `operator` as an operator for `by`,\\n /// without authorization checks.\\n ///\\n /// Emits a {ApprovalForAll} event.\\n function _setApprovalForAll(address by, address operator, bool isApproved) internal virtual {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Convert to 0 or 1.\\n isApproved := iszero(iszero(isApproved))\\n // Update the `isApproved` for (`by`, `operator`).\\n mstore(0x20, _ERC1155_MASTER_SLOT_SEED)\\n mstore(0x14, by)\\n mstore(0x00, operator)\\n sstore(keccak256(0x0c, 0x34), isApproved)\\n // Emit the {ApprovalForAll} event.\\n mstore(0x00, isApproved)\\n let m := shr(96, not(0))\\n log3(0x00, 0x20, _APPROVAL_FOR_ALL_EVENT_SIGNATURE, and(m, by), and(m, operator))\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* INTERNAL TRANSFER FUNCTIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Equivalent to `_safeTransfer(address(0), from, to, id, amount, data)`.\\n function _safeTransfer(address from, address to, uint256 id, uint256 amount, bytes memory data)\\n internal\\n virtual\\n {\\n _safeTransfer(address(0), from, to, id, amount, data);\\n }\\n\\n /// @dev Transfers `amount` of `id` from `from` to `to`.\\n ///\\n /// Requirements:\\n /// - `to` cannot be the zero address.\\n /// - `from` must have at least `amount` of `id`.\\n /// - If `by` is not the zero address, it must be either `from`,\\n /// or approved to manage the tokens of `from`.\\n /// - If `to` refers to a smart contract, it must implement\\n /// {ERC1155-onERC1155Received}, which is called upon a batch transfer.\\n ///\\n /// Emits a {TransferSingle} event.\\n function _safeTransfer(\\n address by,\\n address from,\\n address to,\\n uint256 id,\\n uint256 amount,\\n bytes memory data\\n ) internal virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(from, to, _single(id), _single(amount), data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n let from_ := shl(96, from)\\n let to_ := shl(96, to)\\n // Revert if `to` is the zero address.\\n if iszero(to_) {\\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\\n revert(0x1c, 0x04)\\n }\\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, from_))\\n // If `by` is not the zero address, and not equal to `from`,\\n // check if it is approved to manage all the tokens of `from`.\\n let by_ := shl(96, by)\\n if iszero(or(iszero(by_), eq(by_, from_))) {\\n mstore(0x00, by)\\n if iszero(sload(keccak256(0x0c, 0x34))) {\\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n // Subtract and store the updated balance of `from`.\\n {\\n mstore(0x00, id)\\n let fromBalanceSlot := keccak256(0x00, 0x40)\\n let fromBalance := sload(fromBalanceSlot)\\n if gt(amount, fromBalance) {\\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(fromBalanceSlot, sub(fromBalance, amount))\\n }\\n // Increase and store the updated balance of `to`.\\n {\\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, to_))\\n let toBalanceSlot := keccak256(0x00, 0x40)\\n let toBalanceBefore := sload(toBalanceSlot)\\n let toBalanceAfter := add(toBalanceBefore, amount)\\n if lt(toBalanceAfter, toBalanceBefore) {\\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(toBalanceSlot, toBalanceAfter)\\n }\\n // Emit a {TransferSingle} event.\\n mstore(0x20, amount)\\n // forgefmt: disable-next-line\\n log4(0x00, 0x40, _TRANSFER_SINGLE_EVENT_SIGNATURE, caller(), shr(96, from_), shr(96, to_))\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(from, to, _single(id), _single(amount), data);\\n }\\n if (_hasCode(to)) _checkOnERC1155Received(from, to, id, amount, data);\\n }\\n\\n /// @dev Equivalent to `_safeBatchTransfer(address(0), from, to, ids, amounts, data)`.\\n function _safeBatchTransfer(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) internal virtual {\\n _safeBatchTransfer(address(0), from, to, ids, amounts, data);\\n }\\n\\n /// @dev Transfers `amounts` of `ids` from `from` to `to`.\\n ///\\n /// Requirements:\\n /// - `to` cannot be the zero address.\\n /// - `ids` and `amounts` must have the same length.\\n /// - `from` must have at least `amounts` of `ids`.\\n /// - If `by` is not the zero address, it must be either `from`,\\n /// or approved to manage the tokens of `from`.\\n /// - If `to` refers to a smart contract, it must implement\\n /// {ERC1155-onERC1155BatchReceived}, which is called upon a batch transfer.\\n ///\\n /// Emits a {TransferBatch} event.\\n function _safeBatchTransfer(\\n address by,\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) internal virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(from, to, ids, amounts, data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n if iszero(eq(mload(ids), mload(amounts))) {\\n mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.\\n revert(0x1c, 0x04)\\n }\\n let from_ := shl(96, from)\\n let to_ := shl(96, to)\\n // Revert if `to` is the zero address.\\n if iszero(to_) {\\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\\n revert(0x1c, 0x04)\\n }\\n let fromSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, from_)\\n let toSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, to_)\\n mstore(0x20, fromSlotSeed)\\n // If `by` is not the zero address, and not equal to `from`,\\n // check if it is approved to manage all the tokens of `from`.\\n let by_ := shl(96, by)\\n if iszero(or(iszero(by_), eq(by_, from_))) {\\n mstore(0x00, by)\\n if iszero(sload(keccak256(0x0c, 0x34))) {\\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n // Loop through all the `ids` and update the balances.\\n {\\n for { let i := shl(5, mload(ids)) } i { i := sub(i, 0x20) } {\\n let amount := mload(add(amounts, i))\\n // Subtract and store the updated balance of `from`.\\n {\\n mstore(0x20, fromSlotSeed)\\n mstore(0x00, mload(add(ids, i)))\\n let fromBalanceSlot := keccak256(0x00, 0x40)\\n let fromBalance := sload(fromBalanceSlot)\\n if gt(amount, fromBalance) {\\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(fromBalanceSlot, sub(fromBalance, amount))\\n }\\n // Increase and store the updated balance of `to`.\\n {\\n mstore(0x20, toSlotSeed)\\n let toBalanceSlot := keccak256(0x00, 0x40)\\n let toBalanceBefore := sload(toBalanceSlot)\\n let toBalanceAfter := add(toBalanceBefore, amount)\\n if lt(toBalanceAfter, toBalanceBefore) {\\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(toBalanceSlot, toBalanceAfter)\\n }\\n }\\n }\\n // Emit a {TransferBatch} event.\\n {\\n let m := mload(0x40)\\n // Copy the `ids`.\\n mstore(m, 0x40)\\n let n := add(0x20, shl(5, mload(ids)))\\n let o := add(m, 0x40)\\n pop(staticcall(gas(), 4, ids, n, o, n))\\n // Copy the `amounts`.\\n mstore(add(m, 0x20), add(0x40, returndatasize()))\\n o := add(o, returndatasize())\\n n := add(0x20, shl(5, mload(amounts)))\\n pop(staticcall(gas(), 4, amounts, n, o, n))\\n n := sub(add(o, returndatasize()), m)\\n // Do the emit.\\n log4(m, n, _TRANSFER_BATCH_EVENT_SIGNATURE, caller(), shr(96, from_), shr(96, to_))\\n }\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(from, to, ids, amounts, data);\\n }\\n if (_hasCode(to)) _checkOnERC1155BatchReceived(from, to, ids, amounts, data);\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* HOOKS FOR OVERRIDING */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Override this function to return true if `_beforeTokenTransfer` is used.\\n /// This is to help the compiler avoid producing dead bytecode.\\n function _useBeforeTokenTransfer() internal view virtual returns (bool) {\\n return false;\\n }\\n\\n /// @dev Hook that is called before any token transfer.\\n /// This includes minting and burning, as well as batched variants.\\n ///\\n /// The same hook is called on both single and batched variants.\\n /// For single transfers, the length of the `id` and `amount` arrays are 1.\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) internal virtual {}\\n\\n /// @dev Override this function to return true if `_afterTokenTransfer` is used.\\n /// This is to help the compiler avoid producing dead bytecode.\\n function _useAfterTokenTransfer() internal view virtual returns (bool) {\\n return false;\\n }\\n\\n /// @dev Hook that is called after any token transfer.\\n /// This includes minting and burning, as well as batched variants.\\n ///\\n /// The same hook is called on both single and batched variants.\\n /// For single transfers, the length of the `id` and `amount` arrays are 1.\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) internal virtual {}\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* PRIVATE HELPERS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Helper for calling the `_afterTokenTransfer` hook.\\n /// This is to help the compiler avoid producing dead bytecode.\\n function _afterTokenTransferCalldata(\\n address from,\\n address to,\\n uint256[] calldata ids,\\n uint256[] calldata amounts,\\n bytes calldata data\\n ) private {\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(from, to, ids, amounts, data);\\n }\\n }\\n\\n /// @dev Returns if `a` has bytecode of non-zero length.\\n function _hasCode(address a) private view returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := extcodesize(a) // Can handle dirty upper bits.\\n }\\n }\\n\\n /// @dev Perform a call to invoke {IERC1155Receiver-onERC1155Received} on `to`.\\n /// Reverts if the target does not support the function correctly.\\n function _checkOnERC1155Received(\\n address from,\\n address to,\\n uint256 id,\\n uint256 amount,\\n bytes memory data\\n ) private {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Prepare the calldata.\\n let m := mload(0x40)\\n // `onERC1155Received(address,address,uint256,uint256,bytes)`.\\n mstore(m, 0xf23a6e61)\\n mstore(add(m, 0x20), caller())\\n mstore(add(m, 0x40), shr(96, shl(96, from)))\\n mstore(add(m, 0x60), id)\\n mstore(add(m, 0x80), amount)\\n mstore(add(m, 0xa0), 0xa0)\\n let n := mload(data)\\n mstore(add(m, 0xc0), n)\\n if n { pop(staticcall(gas(), 4, add(data, 0x20), n, add(m, 0xe0), n)) }\\n // Revert if the call reverts.\\n if iszero(call(gas(), to, 0, add(m, 0x1c), add(0xc4, n), m, 0x20)) {\\n if returndatasize() {\\n // Bubble up the revert if the call reverts.\\n returndatacopy(m, 0x00, returndatasize())\\n revert(m, returndatasize())\\n }\\n }\\n // Load the returndata and compare it with the function selector.\\n if iszero(eq(mload(m), shl(224, 0xf23a6e61))) {\\n mstore(0x00, 0x9c05499b) // `TransferToNonERC1155ReceiverImplementer()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n }\\n\\n /// @dev Perform a call to invoke {IERC1155Receiver-onERC1155BatchReceived} on `to`.\\n /// Reverts if the target does not support the function correctly.\\n function _checkOnERC1155BatchReceived(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) private {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Prepare the calldata.\\n let m := mload(0x40)\\n // `onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)`.\\n mstore(m, 0xbc197c81)\\n mstore(add(m, 0x20), caller())\\n mstore(add(m, 0x40), shr(96, shl(96, from)))\\n // Copy the `ids`.\\n mstore(add(m, 0x60), 0xa0)\\n let n := add(0x20, shl(5, mload(ids)))\\n let o := add(m, 0xc0)\\n pop(staticcall(gas(), 4, ids, n, o, n))\\n // Copy the `amounts`.\\n let s := add(0xa0, returndatasize())\\n mstore(add(m, 0x80), s)\\n o := add(o, returndatasize())\\n n := add(0x20, shl(5, mload(amounts)))\\n pop(staticcall(gas(), 4, amounts, n, o, n))\\n // Copy the `data`.\\n mstore(add(m, 0xa0), add(s, returndatasize()))\\n o := add(o, returndatasize())\\n n := add(0x20, mload(data))\\n pop(staticcall(gas(), 4, data, n, o, n))\\n n := sub(add(o, returndatasize()), add(m, 0x1c))\\n // Revert if the call reverts.\\n if iszero(call(gas(), to, 0, add(m, 0x1c), n, m, 0x20)) {\\n if returndatasize() {\\n // Bubble up the revert if the call reverts.\\n returndatacopy(m, 0x00, returndatasize())\\n revert(m, returndatasize())\\n }\\n }\\n // Load the returndata and compare it with the function selector.\\n if iszero(eq(mload(m), shl(224, 0xbc197c81))) {\\n mstore(0x00, 0x9c05499b) // `TransferToNonERC1155ReceiverImplementer()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n }\\n\\n /// @dev Returns `x` in an array with a single element.\\n function _single(uint256 x) private pure returns (uint256[] memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n mstore(0x40, add(result, 0x40))\\n mstore(result, 1)\\n mstore(add(result, 0x20), x)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x306249cc3611727ffa9e15ec816282a60fd9629e5ea03ab1c780d638d1537c68\",\"license\":\"MIT\"},\"lib/solady/src/utils/LibBytes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\n/// @notice Library for byte related operations.\\n/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibBytes.sol)\\nlibrary LibBytes {\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* STRUCTS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Goated bytes storage struct that totally MOGs, no cap, fr.\\n /// Uses less gas and bytecode than Solidity's native bytes storage. It's meta af.\\n /// Packs length with the first 31 bytes if <255 bytes, so it\\u2019s mad tight.\\n struct BytesStorage {\\n bytes32 _spacer;\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* CONSTANTS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev The constant returned when the `search` is not found in the bytes.\\n uint256 internal constant NOT_FOUND = type(uint256).max;\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* BYTE STORAGE OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Sets the value of the bytes storage `$` to `s`.\\n function set(BytesStorage storage $, bytes memory s) internal {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := mload(s)\\n let packed := or(0xff, shl(8, n))\\n for { let i := 0 } 1 {} {\\n if iszero(gt(n, 0xfe)) {\\n i := 0x1f\\n packed := or(n, shl(8, mload(add(s, i))))\\n if iszero(gt(n, i)) { break }\\n }\\n let o := add(s, 0x20)\\n mstore(0x00, $.slot)\\n for { let p := keccak256(0x00, 0x20) } 1 {} {\\n sstore(add(p, shr(5, i)), mload(add(o, i)))\\n i := add(i, 0x20)\\n if iszero(lt(i, n)) { break }\\n }\\n break\\n }\\n sstore($.slot, packed)\\n }\\n }\\n\\n /// @dev Sets the value of the bytes storage `$` to `s`.\\n function setCalldata(BytesStorage storage $, bytes calldata s) internal {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let packed := or(0xff, shl(8, s.length))\\n for { let i := 0 } 1 {} {\\n if iszero(gt(s.length, 0xfe)) {\\n i := 0x1f\\n packed := or(s.length, shl(8, shr(8, calldataload(s.offset))))\\n if iszero(gt(s.length, i)) { break }\\n }\\n mstore(0x00, $.slot)\\n for { let p := keccak256(0x00, 0x20) } 1 {} {\\n sstore(add(p, shr(5, i)), calldataload(add(s.offset, i)))\\n i := add(i, 0x20)\\n if iszero(lt(i, s.length)) { break }\\n }\\n break\\n }\\n sstore($.slot, packed)\\n }\\n }\\n\\n /// @dev Sets the value of the bytes storage `$` to the empty bytes.\\n function clear(BytesStorage storage $) internal {\\n delete $._spacer;\\n }\\n\\n /// @dev Returns whether the value stored is `$` is the empty bytes \\\"\\\".\\n function isEmpty(BytesStorage storage $) internal view returns (bool) {\\n return uint256($._spacer) & 0xff == uint256(0);\\n }\\n\\n /// @dev Returns the length of the value stored in `$`.\\n function length(BytesStorage storage $) internal view returns (uint256 result) {\\n result = uint256($._spacer);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := and(0xff, result)\\n result := or(mul(shr(8, result), eq(0xff, n)), mul(n, iszero(eq(0xff, n))))\\n }\\n }\\n\\n /// @dev Returns the value stored in `$`.\\n function get(BytesStorage storage $) internal view returns (bytes memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n let o := add(result, 0x20)\\n let packed := sload($.slot)\\n let n := shr(8, packed)\\n for { let i := 0 } 1 {} {\\n if iszero(eq(or(packed, 0xff), packed)) {\\n mstore(o, packed)\\n n := and(0xff, packed)\\n i := 0x1f\\n if iszero(gt(n, i)) { break }\\n }\\n mstore(0x00, $.slot)\\n for { let p := keccak256(0x00, 0x20) } 1 {} {\\n mstore(add(o, i), sload(add(p, shr(5, i))))\\n i := add(i, 0x20)\\n if iszero(lt(i, n)) { break }\\n }\\n break\\n }\\n mstore(result, n) // Store the length of the memory.\\n mstore(add(o, n), 0) // Zeroize the slot after the bytes.\\n mstore(0x40, add(add(o, n), 0x20)) // Allocate memory.\\n }\\n }\\n\\n /// @dev Returns the uint8 at index `i`. If out-of-bounds, returns 0.\\n function uint8At(BytesStorage storage $, uint256 i) internal view returns (uint8 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n for { let packed := sload($.slot) } 1 {} {\\n if iszero(eq(or(packed, 0xff), packed)) {\\n if iszero(gt(i, 0x1e)) {\\n result := byte(i, packed)\\n break\\n }\\n if iszero(gt(i, and(0xff, packed))) {\\n mstore(0x00, $.slot)\\n let j := sub(i, 0x1f)\\n result := byte(and(j, 0x1f), sload(add(keccak256(0x00, 0x20), shr(5, j))))\\n }\\n break\\n }\\n if iszero(gt(i, shr(8, packed))) {\\n mstore(0x00, $.slot)\\n result := byte(and(i, 0x1f), sload(add(keccak256(0x00, 0x20), shr(5, i))))\\n }\\n break\\n }\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* BYTES OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns `subject` all occurrences of `needle` replaced with `replacement`.\\n function replace(bytes memory subject, bytes memory needle, bytes memory replacement)\\n internal\\n pure\\n returns (bytes memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n let needleLen := mload(needle)\\n let replacementLen := mload(replacement)\\n let d := sub(result, subject) // Memory difference.\\n let i := add(subject, 0x20) // Subject bytes pointer.\\n mstore(0x00, add(i, mload(subject))) // End of subject.\\n if iszero(gt(needleLen, mload(subject))) {\\n let subjectSearchEnd := add(sub(mload(0x00), needleLen), 1)\\n let h := 0 // The hash of `needle`.\\n if iszero(lt(needleLen, 0x20)) { h := keccak256(add(needle, 0x20), needleLen) }\\n let s := mload(add(needle, 0x20))\\n for { let m := shl(3, sub(0x20, and(needleLen, 0x1f))) } 1 {} {\\n let t := mload(i)\\n // Whether the first `needleLen % 32` bytes of `subject` and `needle` matches.\\n if iszero(shr(m, xor(t, s))) {\\n if h {\\n if iszero(eq(keccak256(i, needleLen), h)) {\\n mstore(add(i, d), t)\\n i := add(i, 1)\\n if iszero(lt(i, subjectSearchEnd)) { break }\\n continue\\n }\\n }\\n // Copy the `replacement` one word at a time.\\n for { let j := 0 } 1 {} {\\n mstore(add(add(i, d), j), mload(add(add(replacement, 0x20), j)))\\n j := add(j, 0x20)\\n if iszero(lt(j, replacementLen)) { break }\\n }\\n d := sub(add(d, replacementLen), needleLen)\\n if needleLen {\\n i := add(i, needleLen)\\n if iszero(lt(i, subjectSearchEnd)) { break }\\n continue\\n }\\n }\\n mstore(add(i, d), t)\\n i := add(i, 1)\\n if iszero(lt(i, subjectSearchEnd)) { break }\\n }\\n }\\n let end := mload(0x00)\\n let n := add(sub(d, add(result, 0x20)), end)\\n // Copy the rest of the bytes one word at a time.\\n for {} lt(i, end) { i := add(i, 0x20) } { mstore(add(i, d), mload(i)) }\\n let o := add(i, d)\\n mstore(o, 0) // Zeroize the slot after the bytes.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from left to right, starting from `from`.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function indexOf(bytes memory subject, bytes memory needle, uint256 from)\\n internal\\n pure\\n returns (uint256 result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := not(0) // Initialize to `NOT_FOUND`.\\n for { let subjectLen := mload(subject) } 1 {} {\\n if iszero(mload(needle)) {\\n result := from\\n if iszero(gt(from, subjectLen)) { break }\\n result := subjectLen\\n break\\n }\\n let needleLen := mload(needle)\\n let subjectStart := add(subject, 0x20)\\n\\n subject := add(subjectStart, from)\\n let end := add(sub(add(subjectStart, subjectLen), needleLen), 1)\\n let m := shl(3, sub(0x20, and(needleLen, 0x1f)))\\n let s := mload(add(needle, 0x20))\\n\\n if iszero(and(lt(subject, end), lt(from, subjectLen))) { break }\\n\\n if iszero(lt(needleLen, 0x20)) {\\n for { let h := keccak256(add(needle, 0x20), needleLen) } 1 {} {\\n if iszero(shr(m, xor(mload(subject), s))) {\\n if eq(keccak256(subject, needleLen), h) {\\n result := sub(subject, subjectStart)\\n break\\n }\\n }\\n subject := add(subject, 1)\\n if iszero(lt(subject, end)) { break }\\n }\\n break\\n }\\n for {} 1 {} {\\n if iszero(shr(m, xor(mload(subject), s))) {\\n result := sub(subject, subjectStart)\\n break\\n }\\n subject := add(subject, 1)\\n if iszero(lt(subject, end)) { break }\\n }\\n break\\n }\\n }\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from left to right.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function indexOf(bytes memory subject, bytes memory needle) internal pure returns (uint256) {\\n return indexOf(subject, needle, 0);\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from right to left, starting from `from`.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function lastIndexOf(bytes memory subject, bytes memory needle, uint256 from)\\n internal\\n pure\\n returns (uint256 result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n for {} 1 {} {\\n result := not(0) // Initialize to `NOT_FOUND`.\\n let needleLen := mload(needle)\\n if gt(needleLen, mload(subject)) { break }\\n let w := result\\n\\n let fromMax := sub(mload(subject), needleLen)\\n if iszero(gt(fromMax, from)) { from := fromMax }\\n\\n let end := add(add(subject, 0x20), w)\\n subject := add(add(subject, 0x20), from)\\n if iszero(gt(subject, end)) { break }\\n // As this function is not too often used,\\n // we shall simply use keccak256 for smaller bytecode size.\\n for { let h := keccak256(add(needle, 0x20), needleLen) } 1 {} {\\n if eq(keccak256(subject, needleLen), h) {\\n result := sub(subject, add(end, 1))\\n break\\n }\\n subject := add(subject, w) // `sub(subject, 1)`.\\n if iszero(gt(subject, end)) { break }\\n }\\n break\\n }\\n }\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from right to left.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function lastIndexOf(bytes memory subject, bytes memory needle)\\n internal\\n pure\\n returns (uint256)\\n {\\n return lastIndexOf(subject, needle, type(uint256).max);\\n }\\n\\n /// @dev Returns true if `needle` is found in `subject`, false otherwise.\\n function contains(bytes memory subject, bytes memory needle) internal pure returns (bool) {\\n return indexOf(subject, needle) != NOT_FOUND;\\n }\\n\\n /// @dev Returns whether `subject` starts with `needle`.\\n function startsWith(bytes memory subject, bytes memory needle)\\n internal\\n pure\\n returns (bool result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := mload(needle)\\n // Just using keccak256 directly is actually cheaper.\\n let t := eq(keccak256(add(subject, 0x20), n), keccak256(add(needle, 0x20), n))\\n result := lt(gt(n, mload(subject)), t)\\n }\\n }\\n\\n /// @dev Returns whether `subject` ends with `needle`.\\n function endsWith(bytes memory subject, bytes memory needle)\\n internal\\n pure\\n returns (bool result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := mload(needle)\\n let notInRange := gt(n, mload(subject))\\n // `subject + 0x20 + max(subject.length - needle.length, 0)`.\\n let t := add(add(subject, 0x20), mul(iszero(notInRange), sub(mload(subject), n)))\\n // Just using keccak256 directly is actually cheaper.\\n result := gt(eq(keccak256(t, n), keccak256(add(needle, 0x20), n)), notInRange)\\n }\\n }\\n\\n /// @dev Returns `subject` repeated `times`.\\n function repeat(bytes memory subject, uint256 times)\\n internal\\n pure\\n returns (bytes memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let l := mload(subject) // Subject length.\\n if iszero(or(iszero(times), iszero(l))) {\\n result := mload(0x40)\\n subject := add(subject, 0x20)\\n let o := add(result, 0x20)\\n for {} 1 {} {\\n // Copy the `subject` one word at a time.\\n for { let j := 0 } 1 {} {\\n mstore(add(o, j), mload(add(subject, j)))\\n j := add(j, 0x20)\\n if iszero(lt(j, l)) { break }\\n }\\n o := add(o, l)\\n times := sub(times, 1)\\n if iszero(times) { break }\\n }\\n mstore(o, 0) // Zeroize the slot after the bytes.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n mstore(result, sub(o, add(result, 0x20))) // Store the length.\\n }\\n }\\n }\\n\\n /// @dev Returns a copy of `subject` sliced from `start` to `end` (exclusive).\\n /// `start` and `end` are byte offsets.\\n function slice(bytes memory subject, uint256 start, uint256 end)\\n internal\\n pure\\n returns (bytes memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let l := mload(subject) // Subject length.\\n if iszero(gt(l, end)) { end := l }\\n if iszero(gt(l, start)) { start := l }\\n if lt(start, end) {\\n result := mload(0x40)\\n let n := sub(end, start)\\n let i := add(subject, start)\\n let w := not(0x1f)\\n // Copy the `subject` one word at a time, backwards.\\n for { let j := and(add(n, 0x1f), w) } 1 {} {\\n mstore(add(result, j), mload(add(i, j)))\\n j := add(j, w) // `sub(j, 0x20)`.\\n if iszero(j) { break }\\n }\\n let o := add(add(result, 0x20), n)\\n mstore(o, 0) // Zeroize the slot after the bytes.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n mstore(result, n) // Store the length.\\n }\\n }\\n }\\n\\n /// @dev Returns a copy of `subject` sliced from `start` to the end of the bytes.\\n /// `start` is a byte offset.\\n function slice(bytes memory subject, uint256 start)\\n internal\\n pure\\n returns (bytes memory result)\\n {\\n result = slice(subject, start, type(uint256).max);\\n }\\n\\n /// @dev Returns a copy of `subject` sliced from `start` to `end` (exclusive).\\n /// `start` and `end` are byte offsets. Faster than Solidity's native slicing.\\n function sliceCalldata(bytes calldata subject, uint256 start, uint256 end)\\n internal\\n pure\\n returns (bytes calldata result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n end := xor(end, mul(xor(end, subject.length), lt(subject.length, end)))\\n start := xor(start, mul(xor(start, subject.length), lt(subject.length, start)))\\n result.offset := add(subject.offset, start)\\n result.length := mul(lt(start, end), sub(end, start))\\n }\\n }\\n\\n /// @dev Returns a copy of `subject` sliced from `start` to the end of the bytes.\\n /// `start` is a byte offset. Faster than Solidity's native slicing.\\n function sliceCalldata(bytes calldata subject, uint256 start)\\n internal\\n pure\\n returns (bytes calldata result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n start := xor(start, mul(xor(start, subject.length), lt(subject.length, start)))\\n result.offset := add(subject.offset, start)\\n result.length := mul(lt(start, subject.length), sub(subject.length, start))\\n }\\n }\\n\\n /// @dev Reduces the size of `subject` to `n`.\\n /// If `n` is greater than the size of `subject`, this will be a no-op.\\n function truncate(bytes memory subject, uint256 n)\\n internal\\n pure\\n returns (bytes memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := subject\\n mstore(mul(lt(n, mload(result)), result), n)\\n }\\n }\\n\\n /// @dev Returns a copy of `subject`, with the length reduced to `n`.\\n /// If `n` is greater than the size of `subject`, this will be a no-op.\\n function truncatedCalldata(bytes calldata subject, uint256 n)\\n internal\\n pure\\n returns (bytes calldata result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result.offset := subject.offset\\n result.length := xor(n, mul(xor(n, subject.length), lt(subject.length, n)))\\n }\\n }\\n\\n /// @dev Returns all the indices of `needle` in `subject`.\\n /// The indices are byte offsets.\\n function indicesOf(bytes memory subject, bytes memory needle)\\n internal\\n pure\\n returns (uint256[] memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let searchLen := mload(needle)\\n if iszero(gt(searchLen, mload(subject))) {\\n result := mload(0x40)\\n let i := add(subject, 0x20)\\n let o := add(result, 0x20)\\n let subjectSearchEnd := add(sub(add(i, mload(subject)), searchLen), 1)\\n let h := 0 // The hash of `needle`.\\n if iszero(lt(searchLen, 0x20)) { h := keccak256(add(needle, 0x20), searchLen) }\\n let s := mload(add(needle, 0x20))\\n for { let m := shl(3, sub(0x20, and(searchLen, 0x1f))) } 1 {} {\\n let t := mload(i)\\n // Whether the first `searchLen % 32` bytes of `subject` and `needle` matches.\\n if iszero(shr(m, xor(t, s))) {\\n if h {\\n if iszero(eq(keccak256(i, searchLen), h)) {\\n i := add(i, 1)\\n if iszero(lt(i, subjectSearchEnd)) { break }\\n continue\\n }\\n }\\n mstore(o, sub(i, add(subject, 0x20))) // Append to `result`.\\n o := add(o, 0x20)\\n i := add(i, searchLen) // Advance `i` by `searchLen`.\\n if searchLen {\\n if iszero(lt(i, subjectSearchEnd)) { break }\\n continue\\n }\\n }\\n i := add(i, 1)\\n if iszero(lt(i, subjectSearchEnd)) { break }\\n }\\n mstore(result, shr(5, sub(o, add(result, 0x20)))) // Store the length of `result`.\\n // Allocate memory for result.\\n // We allocate one more word, so this array can be recycled for {split}.\\n mstore(0x40, add(o, 0x20))\\n }\\n }\\n }\\n\\n /// @dev Returns an arrays of bytess based on the `delimiter` inside of the `subject` bytes.\\n function split(bytes memory subject, bytes memory delimiter)\\n internal\\n pure\\n returns (bytes[] memory result)\\n {\\n uint256[] memory indices = indicesOf(subject, delimiter);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let w := not(0x1f)\\n let indexPtr := add(indices, 0x20)\\n let indicesEnd := add(indexPtr, shl(5, add(mload(indices), 1)))\\n mstore(add(indicesEnd, w), mload(subject))\\n mstore(indices, add(mload(indices), 1))\\n for { let prevIndex := 0 } 1 {} {\\n let index := mload(indexPtr)\\n mstore(indexPtr, 0x60)\\n if iszero(eq(index, prevIndex)) {\\n let element := mload(0x40)\\n let l := sub(index, prevIndex)\\n mstore(element, l) // Store the length of the element.\\n // Copy the `subject` one word at a time, backwards.\\n for { let o := and(add(l, 0x1f), w) } 1 {} {\\n mstore(add(element, o), mload(add(add(subject, prevIndex), o)))\\n o := add(o, w) // `sub(o, 0x20)`.\\n if iszero(o) { break }\\n }\\n mstore(add(add(element, 0x20), l), 0) // Zeroize the slot after the bytes.\\n // Allocate memory for the length and the bytes, rounded up to a multiple of 32.\\n mstore(0x40, add(element, and(add(l, 0x3f), w)))\\n mstore(indexPtr, element) // Store the `element` into the array.\\n }\\n prevIndex := add(index, mload(delimiter))\\n indexPtr := add(indexPtr, 0x20)\\n if iszero(lt(indexPtr, indicesEnd)) { break }\\n }\\n result := indices\\n if iszero(mload(delimiter)) {\\n result := add(indices, 0x20)\\n mstore(result, sub(mload(indices), 2))\\n }\\n }\\n }\\n\\n /// @dev Returns a concatenated bytes of `a` and `b`.\\n /// Cheaper than `bytes.concat()` and does not de-align the free memory pointer.\\n function concat(bytes memory a, bytes memory b) internal pure returns (bytes memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n let w := not(0x1f)\\n let aLen := mload(a)\\n // Copy `a` one word at a time, backwards.\\n for { let o := and(add(aLen, 0x20), w) } 1 {} {\\n mstore(add(result, o), mload(add(a, o)))\\n o := add(o, w) // `sub(o, 0x20)`.\\n if iszero(o) { break }\\n }\\n let bLen := mload(b)\\n let output := add(result, aLen)\\n // Copy `b` one word at a time, backwards.\\n for { let o := and(add(bLen, 0x20), w) } 1 {} {\\n mstore(add(output, o), mload(add(b, o)))\\n o := add(o, w) // `sub(o, 0x20)`.\\n if iszero(o) { break }\\n }\\n let totalLen := add(aLen, bLen)\\n let last := add(add(result, 0x20), totalLen)\\n mstore(last, 0) // Zeroize the slot after the bytes.\\n mstore(result, totalLen) // Store the length.\\n mstore(0x40, add(last, 0x20)) // Allocate memory.\\n }\\n }\\n\\n /// @dev Returns whether `a` equals `b`.\\n function eq(bytes memory a, bytes memory b) internal pure returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := eq(keccak256(add(a, 0x20), mload(a)), keccak256(add(b, 0x20), mload(b)))\\n }\\n }\\n\\n /// @dev Returns whether `a` equals `b`, where `b` is a null-terminated small bytes.\\n function eqs(bytes memory a, bytes32 b) internal pure returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // These should be evaluated on compile time, as far as possible.\\n let m := not(shl(7, div(not(iszero(b)), 255))) // `0x7f7f ...`.\\n let x := not(or(m, or(b, add(m, and(b, m)))))\\n let r := shl(7, iszero(iszero(shr(128, x))))\\n r := or(r, shl(6, iszero(iszero(shr(64, shr(r, x))))))\\n r := or(r, shl(5, lt(0xffffffff, shr(r, x))))\\n r := or(r, shl(4, lt(0xffff, shr(r, x))))\\n r := or(r, shl(3, lt(0xff, shr(r, x))))\\n // forgefmt: disable-next-item\\n result := gt(eq(mload(a), add(iszero(x), xor(31, shr(3, r)))),\\n xor(shr(add(8, r), b), shr(add(8, r), mload(add(a, 0x20)))))\\n }\\n }\\n\\n /// @dev Returns 0 if `a == b`, -1 if `a < b`, +1 if `a > b`.\\n /// If `a` == b[:a.length]`, and `a.length < b.length`, returns -1.\\n function cmp(bytes memory a, bytes memory b) internal pure returns (int256 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let aLen := mload(a)\\n let bLen := mload(b)\\n let n := and(xor(aLen, mul(xor(aLen, bLen), lt(bLen, aLen))), not(0x1f))\\n if n {\\n for { let i := 0x20 } 1 {} {\\n let x := mload(add(a, i))\\n let y := mload(add(b, i))\\n if iszero(or(xor(x, y), eq(i, n))) {\\n i := add(i, 0x20)\\n continue\\n }\\n result := sub(gt(x, y), lt(x, y))\\n break\\n }\\n }\\n // forgefmt: disable-next-item\\n if iszero(result) {\\n let l := 0x201f1e1d1c1b1a191817161514131211100f0e0d0c0b0a090807060504030201\\n let x := and(mload(add(add(a, 0x20), n)), shl(shl(3, byte(sub(aLen, n), l)), not(0)))\\n let y := and(mload(add(add(b, 0x20), n)), shl(shl(3, byte(sub(bLen, n), l)), not(0)))\\n result := sub(gt(x, y), lt(x, y))\\n if iszero(result) { result := sub(gt(aLen, bLen), lt(aLen, bLen)) }\\n }\\n }\\n }\\n\\n /// @dev Directly returns `a` without copying.\\n function directReturn(bytes memory a) internal pure {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Assumes that the bytes does not start from the scratch space.\\n let retStart := sub(a, 0x20)\\n let retUnpaddedSize := add(mload(a), 0x40)\\n // Right pad with zeroes. Just in case the bytes is produced\\n // by a method that doesn't zero right pad.\\n mstore(add(retStart, retUnpaddedSize), 0)\\n mstore(retStart, 0x20) // Store the return offset.\\n // End the transaction, returning the bytes.\\n return(retStart, and(not(0x1f), add(0x1f, retUnpaddedSize)))\\n }\\n }\\n\\n /// @dev Directly returns `a` with minimal copying.\\n function directReturn(bytes[] memory a) internal pure {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := mload(a) // `a.length`.\\n let o := add(a, 0x20) // Start of elements in `a`.\\n let u := a // Highest memory slot.\\n let w := not(0x1f)\\n for { let i := 0 } iszero(eq(i, n)) { i := add(i, 1) } {\\n let c := add(o, shl(5, i)) // Location of pointer to `a[i]`.\\n let s := mload(c) // `a[i]`.\\n let l := mload(s) // `a[i].length`.\\n let r := and(l, 0x1f) // `a[i].length % 32`.\\n let z := add(0x20, and(l, w)) // Offset of last word in `a[i]` from `s`.\\n // If `s` comes before `o`, or `s` is not zero right padded.\\n if iszero(lt(lt(s, o), or(iszero(r), iszero(shl(shl(3, r), mload(add(s, z))))))) {\\n let m := mload(0x40)\\n mstore(m, l) // Copy `a[i].length`.\\n for {} 1 {} {\\n mstore(add(m, z), mload(add(s, z))) // Copy `a[i]`, backwards.\\n z := add(z, w) // `sub(z, 0x20)`.\\n if iszero(z) { break }\\n }\\n let e := add(add(m, 0x20), l)\\n mstore(e, 0) // Zeroize the slot after the copied bytes.\\n mstore(0x40, add(e, 0x20)) // Allocate memory.\\n s := m\\n }\\n mstore(c, sub(s, o)) // Convert to calldata offset.\\n let t := add(l, add(s, 0x20))\\n if iszero(lt(t, u)) { u := t }\\n }\\n let retStart := add(a, w) // Assumes `a` doesn't start from scratch space.\\n mstore(retStart, 0x20) // Store the return offset.\\n return(retStart, add(0x40, sub(u, retStart))) // End the transaction.\\n }\\n }\\n\\n /// @dev Returns the word at `offset`, without any bounds checks.\\n function load(bytes memory a, uint256 offset) internal pure returns (bytes32 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(add(add(a, 0x20), offset))\\n }\\n }\\n\\n /// @dev Returns the word at `offset`, without any bounds checks.\\n function loadCalldata(bytes calldata a, uint256 offset)\\n internal\\n pure\\n returns (bytes32 result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := calldataload(add(a.offset, offset))\\n }\\n }\\n\\n /// @dev Returns a slice representing a static struct in the calldata. Performs bounds checks.\\n function staticStructInCalldata(bytes calldata a, uint256 offset)\\n internal\\n pure\\n returns (bytes calldata result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let l := sub(a.length, 0x20)\\n result.offset := add(a.offset, offset)\\n result.length := sub(a.length, offset)\\n if or(shr(64, or(l, a.offset)), gt(offset, l)) { revert(l, 0x00) }\\n }\\n }\\n\\n /// @dev Returns a slice representing a dynamic struct in the calldata. Performs bounds checks.\\n function dynamicStructInCalldata(bytes calldata a, uint256 offset)\\n internal\\n pure\\n returns (bytes calldata result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let l := sub(a.length, 0x20)\\n let s := calldataload(add(a.offset, offset)) // Relative offset of `result` from `a.offset`.\\n result.offset := add(a.offset, s)\\n result.length := sub(a.length, s)\\n if or(shr(64, or(s, or(l, a.offset))), gt(offset, l)) { revert(l, 0x00) }\\n }\\n }\\n\\n /// @dev Returns bytes in calldata. Performs bounds checks.\\n function bytesInCalldata(bytes calldata a, uint256 offset)\\n internal\\n pure\\n returns (bytes calldata result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let l := sub(a.length, 0x20)\\n let s := calldataload(add(a.offset, offset)) // Relative offset of `result` from `a.offset`.\\n result.offset := add(add(a.offset, s), 0x20)\\n result.length := calldataload(add(a.offset, s))\\n // forgefmt: disable-next-item\\n if or(shr(64, or(result.length, or(s, or(l, a.offset)))),\\n or(gt(add(s, result.length), l), gt(offset, l))) { revert(l, 0x00) }\\n }\\n }\\n\\n /// @dev Returns empty calldata bytes. For silencing the compiler.\\n function emptyCalldata() internal pure returns (bytes calldata result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result.length := 0\\n }\\n }\\n}\\n\",\"keccak256\":\"0x320c3c933df51e8fd6f1fc96de721c8cc6f1be1d4c586c11f1c472a23b86eba5\",\"license\":\"MIT\"},\"lib/solady/src/utils/LibString.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport {LibBytes} from \\\"./LibBytes.sol\\\";\\n\\n/// @notice Library for converting numbers into strings and other string operations.\\n/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibString.sol)\\n/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/LibString.sol)\\n///\\n/// @dev Note:\\n/// For performance and bytecode compactness, most of the string operations are restricted to\\n/// byte strings (7-bit ASCII), except where otherwise specified.\\n/// Usage of byte string operations on charsets with runes spanning two or more bytes\\n/// can lead to undefined behavior.\\nlibrary LibString {\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* STRUCTS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Goated string storage struct that totally MOGs, no cap, fr.\\n /// Uses less gas and bytecode than Solidity's native string storage. It's meta af.\\n /// Packs length with the first 31 bytes if <255 bytes, so it\\u2019s mad tight.\\n struct StringStorage {\\n bytes32 _spacer;\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* CUSTOM ERRORS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev The length of the output is too small to contain all the hex digits.\\n error HexLengthInsufficient();\\n\\n /// @dev The length of the string is more than 32 bytes.\\n error TooBigForSmallString();\\n\\n /// @dev The input string must be a 7-bit ASCII.\\n error StringNot7BitASCII();\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* CONSTANTS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev The constant returned when the `search` is not found in the string.\\n uint256 internal constant NOT_FOUND = type(uint256).max;\\n\\n /// @dev Lookup for '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'.\\n uint128 internal constant ALPHANUMERIC_7_BIT_ASCII = 0x7fffffe07fffffe03ff000000000000;\\n\\n /// @dev Lookup for 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'.\\n uint128 internal constant LETTERS_7_BIT_ASCII = 0x7fffffe07fffffe0000000000000000;\\n\\n /// @dev Lookup for 'abcdefghijklmnopqrstuvwxyz'.\\n uint128 internal constant LOWERCASE_7_BIT_ASCII = 0x7fffffe000000000000000000000000;\\n\\n /// @dev Lookup for 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.\\n uint128 internal constant UPPERCASE_7_BIT_ASCII = 0x7fffffe0000000000000000;\\n\\n /// @dev Lookup for '0123456789'.\\n uint128 internal constant DIGITS_7_BIT_ASCII = 0x3ff000000000000;\\n\\n /// @dev Lookup for '0123456789abcdefABCDEF'.\\n uint128 internal constant HEXDIGITS_7_BIT_ASCII = 0x7e0000007e03ff000000000000;\\n\\n /// @dev Lookup for '01234567'.\\n uint128 internal constant OCTDIGITS_7_BIT_ASCII = 0xff000000000000;\\n\\n /// @dev Lookup for '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!\\\"#$%&\\\\'()*+,-./:;<=>?@[\\\\\\\\]^_`{|}~ \\\\t\\\\n\\\\r\\\\x0b\\\\x0c'.\\n uint128 internal constant PRINTABLE_7_BIT_ASCII = 0x7fffffffffffffffffffffff00003e00;\\n\\n /// @dev Lookup for '!\\\"#$%&\\\\'()*+,-./:;<=>?@[\\\\\\\\]^_`{|}~'.\\n uint128 internal constant PUNCTUATION_7_BIT_ASCII = 0x78000001f8000001fc00fffe00000000;\\n\\n /// @dev Lookup for ' \\\\t\\\\n\\\\r\\\\x0b\\\\x0c'.\\n uint128 internal constant WHITESPACE_7_BIT_ASCII = 0x100003e00;\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* STRING STORAGE OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Sets the value of the string storage `$` to `s`.\\n function set(StringStorage storage $, string memory s) internal {\\n LibBytes.set(bytesStorage($), bytes(s));\\n }\\n\\n /// @dev Sets the value of the string storage `$` to `s`.\\n function setCalldata(StringStorage storage $, string calldata s) internal {\\n LibBytes.setCalldata(bytesStorage($), bytes(s));\\n }\\n\\n /// @dev Sets the value of the string storage `$` to the empty string.\\n function clear(StringStorage storage $) internal {\\n delete $._spacer;\\n }\\n\\n /// @dev Returns whether the value stored is `$` is the empty string \\\"\\\".\\n function isEmpty(StringStorage storage $) internal view returns (bool) {\\n return uint256($._spacer) & 0xff == uint256(0);\\n }\\n\\n /// @dev Returns the length of the value stored in `$`.\\n function length(StringStorage storage $) internal view returns (uint256) {\\n return LibBytes.length(bytesStorage($));\\n }\\n\\n /// @dev Returns the value stored in `$`.\\n function get(StringStorage storage $) internal view returns (string memory) {\\n return string(LibBytes.get(bytesStorage($)));\\n }\\n\\n /// @dev Returns the uint8 at index `i`. If out-of-bounds, returns 0.\\n function uint8At(StringStorage storage $, uint256 i) internal view returns (uint8) {\\n return LibBytes.uint8At(bytesStorage($), i);\\n }\\n\\n /// @dev Helper to cast `$` to a `BytesStorage`.\\n function bytesStorage(StringStorage storage $)\\n internal\\n pure\\n returns (LibBytes.BytesStorage storage casted)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n casted.slot := $.slot\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* DECIMAL OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns the base 10 decimal representation of `value`.\\n function toString(uint256 value) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // The maximum value of a uint256 contains 78 digits (1 byte per digit), but\\n // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.\\n // We will need 1 word for the trailing zeros padding, 1 word for the length,\\n // and 3 words for a maximum of 78 digits.\\n result := add(mload(0x40), 0x80)\\n mstore(0x40, add(result, 0x20)) // Allocate memory.\\n mstore(result, 0) // Zeroize the slot after the string.\\n\\n let end := result // Cache the end of the memory to calculate the length later.\\n let w := not(0) // Tsk.\\n // We write the string from rightmost digit to leftmost digit.\\n // The following is essentially a do-while loop that also handles the zero case.\\n for { let temp := value } 1 {} {\\n result := add(result, w) // `sub(result, 1)`.\\n // Store the character to the pointer.\\n // The ASCII index of the '0' character is 48.\\n mstore8(result, add(48, mod(temp, 10)))\\n temp := div(temp, 10) // Keep dividing `temp` until zero.\\n if iszero(temp) { break }\\n }\\n let n := sub(end, result)\\n result := sub(result, 0x20) // Move the pointer 32 bytes back to make room for the length.\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the base 10 decimal representation of `value`.\\n function toString(int256 value) internal pure returns (string memory result) {\\n if (value >= 0) return toString(uint256(value));\\n unchecked {\\n result = toString(~uint256(value) + 1);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n // We still have some spare memory space on the left,\\n // as we have allocated 3 words (96 bytes) for up to 78 digits.\\n let n := mload(result) // Load the string length.\\n mstore(result, 0x2d) // Store the '-' character.\\n result := sub(result, 1) // Move back the string pointer by a byte.\\n mstore(result, add(n, 1)) // Update the string length.\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* HEXADECIMAL OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns the hexadecimal representation of `value`,\\n /// left-padded to an input length of `byteCount` bytes.\\n /// The output is prefixed with \\\"0x\\\" encoded using 2 hexadecimal digits per byte,\\n /// giving a total length of `byteCount * 2 + 2` bytes.\\n /// Reverts if `byteCount` is too small for the output to contain all the digits.\\n function toHexString(uint256 value, uint256 byteCount)\\n internal\\n pure\\n returns (string memory result)\\n {\\n result = toHexStringNoPrefix(value, byteCount);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := add(mload(result), 2) // Compute the length.\\n mstore(result, 0x3078) // Store the \\\"0x\\\" prefix.\\n result := sub(result, 2) // Move the pointer.\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`,\\n /// left-padded to an input length of `byteCount` bytes.\\n /// The output is not prefixed with \\\"0x\\\" and is encoded using 2 hexadecimal digits per byte,\\n /// giving a total length of `byteCount * 2` bytes.\\n /// Reverts if `byteCount` is too small for the output to contain all the digits.\\n function toHexStringNoPrefix(uint256 value, uint256 byteCount)\\n internal\\n pure\\n returns (string memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // We need 0x20 bytes for the trailing zeros padding, `byteCount * 2` bytes\\n // for the digits, 0x02 bytes for the prefix, and 0x20 bytes for the length.\\n // We add 0x20 to the total and round down to a multiple of 0x20.\\n // (0x20 + 0x20 + 0x02 + 0x20) = 0x62.\\n result := add(mload(0x40), and(add(shl(1, byteCount), 0x42), not(0x1f)))\\n mstore(0x40, add(result, 0x20)) // Allocate memory.\\n mstore(result, 0) // Zeroize the slot after the string.\\n\\n let end := result // Cache the end to calculate the length later.\\n // Store \\\"0123456789abcdef\\\" in scratch space.\\n mstore(0x0f, 0x30313233343536373839616263646566)\\n\\n let start := sub(result, add(byteCount, byteCount))\\n let w := not(1) // Tsk.\\n let temp := value\\n // We write the string from rightmost digit to leftmost digit.\\n // The following is essentially a do-while loop that also handles the zero case.\\n for {} 1 {} {\\n result := add(result, w) // `sub(result, 2)`.\\n mstore8(add(result, 1), mload(and(temp, 15)))\\n mstore8(result, mload(and(shr(4, temp), 15)))\\n temp := shr(8, temp)\\n if iszero(xor(result, start)) { break }\\n }\\n if temp {\\n mstore(0x00, 0x2194895a) // `HexLengthInsufficient()`.\\n revert(0x1c, 0x04)\\n }\\n let n := sub(end, result)\\n result := sub(result, 0x20)\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`.\\n /// The output is prefixed with \\\"0x\\\" and encoded using 2 hexadecimal digits per byte.\\n /// As address are 20 bytes long, the output will left-padded to have\\n /// a length of `20 * 2 + 2` bytes.\\n function toHexString(uint256 value) internal pure returns (string memory result) {\\n result = toHexStringNoPrefix(value);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := add(mload(result), 2) // Compute the length.\\n mstore(result, 0x3078) // Store the \\\"0x\\\" prefix.\\n result := sub(result, 2) // Move the pointer.\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`.\\n /// The output is prefixed with \\\"0x\\\".\\n /// The output excludes leading \\\"0\\\" from the `toHexString` output.\\n /// `0x00: \\\"0x0\\\", 0x01: \\\"0x1\\\", 0x12: \\\"0x12\\\", 0x123: \\\"0x123\\\"`.\\n function toMinimalHexString(uint256 value) internal pure returns (string memory result) {\\n result = toHexStringNoPrefix(value);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let o := eq(byte(0, mload(add(result, 0x20))), 0x30) // Whether leading zero is present.\\n let n := add(mload(result), 2) // Compute the length.\\n mstore(add(result, o), 0x3078) // Store the \\\"0x\\\" prefix, accounting for leading zero.\\n result := sub(add(result, o), 2) // Move the pointer, accounting for leading zero.\\n mstore(result, sub(n, o)) // Store the length, accounting for leading zero.\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`.\\n /// The output excludes leading \\\"0\\\" from the `toHexStringNoPrefix` output.\\n /// `0x00: \\\"0\\\", 0x01: \\\"1\\\", 0x12: \\\"12\\\", 0x123: \\\"123\\\"`.\\n function toMinimalHexStringNoPrefix(uint256 value)\\n internal\\n pure\\n returns (string memory result)\\n {\\n result = toHexStringNoPrefix(value);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let o := eq(byte(0, mload(add(result, 0x20))), 0x30) // Whether leading zero is present.\\n let n := mload(result) // Get the length.\\n result := add(result, o) // Move the pointer, accounting for leading zero.\\n mstore(result, sub(n, o)) // Store the length, accounting for leading zero.\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`.\\n /// The output is encoded using 2 hexadecimal digits per byte.\\n /// As address are 20 bytes long, the output will left-padded to have\\n /// a length of `20 * 2` bytes.\\n function toHexStringNoPrefix(uint256 value) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // We need 0x20 bytes for the trailing zeros padding, 0x20 bytes for the length,\\n // 0x02 bytes for the prefix, and 0x40 bytes for the digits.\\n // The next multiple of 0x20 above (0x20 + 0x20 + 0x02 + 0x40) is 0xa0.\\n result := add(mload(0x40), 0x80)\\n mstore(0x40, add(result, 0x20)) // Allocate memory.\\n mstore(result, 0) // Zeroize the slot after the string.\\n\\n let end := result // Cache the end to calculate the length later.\\n mstore(0x0f, 0x30313233343536373839616263646566) // Store the \\\"0123456789abcdef\\\" lookup.\\n\\n let w := not(1) // Tsk.\\n // We write the string from rightmost digit to leftmost digit.\\n // The following is essentially a do-while loop that also handles the zero case.\\n for { let temp := value } 1 {} {\\n result := add(result, w) // `sub(result, 2)`.\\n mstore8(add(result, 1), mload(and(temp, 15)))\\n mstore8(result, mload(and(shr(4, temp), 15)))\\n temp := shr(8, temp)\\n if iszero(temp) { break }\\n }\\n let n := sub(end, result)\\n result := sub(result, 0x20)\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`.\\n /// The output is prefixed with \\\"0x\\\", encoded using 2 hexadecimal digits per byte,\\n /// and the alphabets are capitalized conditionally according to\\n /// https://eips.ethereum.org/EIPS/eip-55\\n function toHexStringChecksummed(address value) internal pure returns (string memory result) {\\n result = toHexString(value);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let mask := shl(6, div(not(0), 255)) // `0b010000000100000000 ...`\\n let o := add(result, 0x22)\\n let hashed := and(keccak256(o, 40), mul(34, mask)) // `0b10001000 ... `\\n let t := shl(240, 136) // `0b10001000 << 240`\\n for { let i := 0 } 1 {} {\\n mstore(add(i, i), mul(t, byte(i, hashed)))\\n i := add(i, 1)\\n if eq(i, 20) { break }\\n }\\n mstore(o, xor(mload(o), shr(1, and(mload(0x00), and(mload(o), mask)))))\\n o := add(o, 0x20)\\n mstore(o, xor(mload(o), shr(1, and(mload(0x20), and(mload(o), mask)))))\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`.\\n /// The output is prefixed with \\\"0x\\\" and encoded using 2 hexadecimal digits per byte.\\n function toHexString(address value) internal pure returns (string memory result) {\\n result = toHexStringNoPrefix(value);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := add(mload(result), 2) // Compute the length.\\n mstore(result, 0x3078) // Store the \\\"0x\\\" prefix.\\n result := sub(result, 2) // Move the pointer.\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`.\\n /// The output is encoded using 2 hexadecimal digits per byte.\\n function toHexStringNoPrefix(address value) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n // Allocate memory.\\n // We need 0x20 bytes for the trailing zeros padding, 0x20 bytes for the length,\\n // 0x02 bytes for the prefix, and 0x28 bytes for the digits.\\n // The next multiple of 0x20 above (0x20 + 0x20 + 0x02 + 0x28) is 0x80.\\n mstore(0x40, add(result, 0x80))\\n mstore(0x0f, 0x30313233343536373839616263646566) // Store the \\\"0123456789abcdef\\\" lookup.\\n\\n result := add(result, 2)\\n mstore(result, 40) // Store the length.\\n let o := add(result, 0x20)\\n mstore(add(o, 40), 0) // Zeroize the slot after the string.\\n value := shl(96, value)\\n // We write the string from rightmost digit to leftmost digit.\\n // The following is essentially a do-while loop that also handles the zero case.\\n for { let i := 0 } 1 {} {\\n let p := add(o, add(i, i))\\n let temp := byte(i, value)\\n mstore8(add(p, 1), mload(and(temp, 15)))\\n mstore8(p, mload(shr(4, temp)))\\n i := add(i, 1)\\n if eq(i, 20) { break }\\n }\\n }\\n }\\n\\n /// @dev Returns the hex encoded string from the raw bytes.\\n /// The output is encoded using 2 hexadecimal digits per byte.\\n function toHexString(bytes memory raw) internal pure returns (string memory result) {\\n result = toHexStringNoPrefix(raw);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := add(mload(result), 2) // Compute the length.\\n mstore(result, 0x3078) // Store the \\\"0x\\\" prefix.\\n result := sub(result, 2) // Move the pointer.\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the hex encoded string from the raw bytes.\\n /// The output is encoded using 2 hexadecimal digits per byte.\\n function toHexStringNoPrefix(bytes memory raw) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := mload(raw)\\n result := add(mload(0x40), 2) // Skip 2 bytes for the optional prefix.\\n mstore(result, add(n, n)) // Store the length of the output.\\n\\n mstore(0x0f, 0x30313233343536373839616263646566) // Store the \\\"0123456789abcdef\\\" lookup.\\n let o := add(result, 0x20)\\n let end := add(raw, n)\\n for {} iszero(eq(raw, end)) {} {\\n raw := add(raw, 1)\\n mstore8(add(o, 1), mload(and(mload(raw), 15)))\\n mstore8(o, mload(and(shr(4, mload(raw)), 15)))\\n o := add(o, 2)\\n }\\n mstore(o, 0) // Zeroize the slot after the string.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* RUNE STRING OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns the number of UTF characters in the string.\\n function runeCount(string memory s) internal pure returns (uint256 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n if mload(s) {\\n mstore(0x00, div(not(0), 255))\\n mstore(0x20, 0x0202020202020202020202020202020202020202020202020303030304040506)\\n let o := add(s, 0x20)\\n let end := add(o, mload(s))\\n for { result := 1 } 1 { result := add(result, 1) } {\\n o := add(o, byte(0, mload(shr(250, mload(o)))))\\n if iszero(lt(o, end)) { break }\\n }\\n }\\n }\\n }\\n\\n /// @dev Returns if this string is a 7-bit ASCII string.\\n /// (i.e. all characters codes are in [0..127])\\n function is7BitASCII(string memory s) internal pure returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := 1\\n let mask := shl(7, div(not(0), 255))\\n let n := mload(s)\\n if n {\\n let o := add(s, 0x20)\\n let end := add(o, n)\\n let last := mload(end)\\n mstore(end, 0)\\n for {} 1 {} {\\n if and(mask, mload(o)) {\\n result := 0\\n break\\n }\\n o := add(o, 0x20)\\n if iszero(lt(o, end)) { break }\\n }\\n mstore(end, last)\\n }\\n }\\n }\\n\\n /// @dev Returns if this string is a 7-bit ASCII string,\\n /// AND all characters are in the `allowed` lookup.\\n /// Note: If `s` is empty, returns true regardless of `allowed`.\\n function is7BitASCII(string memory s, uint128 allowed) internal pure returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := 1\\n if mload(s) {\\n let allowed_ := shr(128, shl(128, allowed))\\n let o := add(s, 0x20)\\n for { let end := add(o, mload(s)) } 1 {} {\\n result := and(result, shr(byte(0, mload(o)), allowed_))\\n o := add(o, 1)\\n if iszero(and(result, lt(o, end))) { break }\\n }\\n }\\n }\\n }\\n\\n /// @dev Converts the bytes in the 7-bit ASCII string `s` to\\n /// an allowed lookup for use in `is7BitASCII(s, allowed)`.\\n /// To save runtime gas, you can cache the result in an immutable variable.\\n function to7BitASCIIAllowedLookup(string memory s) internal pure returns (uint128 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n if mload(s) {\\n let o := add(s, 0x20)\\n for { let end := add(o, mload(s)) } 1 {} {\\n result := or(result, shl(byte(0, mload(o)), 1))\\n o := add(o, 1)\\n if iszero(lt(o, end)) { break }\\n }\\n if shr(128, result) {\\n mstore(0x00, 0xc9807e0d) // `StringNot7BitASCII()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* BYTE STRING OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n // For performance and bytecode compactness, byte string operations are restricted\\n // to 7-bit ASCII strings. All offsets are byte offsets, not UTF character offsets.\\n // Usage of byte string operations on charsets with runes spanning two or more bytes\\n // can lead to undefined behavior.\\n\\n /// @dev Returns `subject` all occurrences of `needle` replaced with `replacement`.\\n function replace(string memory subject, string memory needle, string memory replacement)\\n internal\\n pure\\n returns (string memory)\\n {\\n return string(LibBytes.replace(bytes(subject), bytes(needle), bytes(replacement)));\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from left to right, starting from `from`.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function indexOf(string memory subject, string memory needle, uint256 from)\\n internal\\n pure\\n returns (uint256)\\n {\\n return LibBytes.indexOf(bytes(subject), bytes(needle), from);\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from left to right.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function indexOf(string memory subject, string memory needle) internal pure returns (uint256) {\\n return LibBytes.indexOf(bytes(subject), bytes(needle), 0);\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from right to left, starting from `from`.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function lastIndexOf(string memory subject, string memory needle, uint256 from)\\n internal\\n pure\\n returns (uint256)\\n {\\n return LibBytes.lastIndexOf(bytes(subject), bytes(needle), from);\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from right to left.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function lastIndexOf(string memory subject, string memory needle)\\n internal\\n pure\\n returns (uint256)\\n {\\n return LibBytes.lastIndexOf(bytes(subject), bytes(needle), type(uint256).max);\\n }\\n\\n /// @dev Returns true if `needle` is found in `subject`, false otherwise.\\n function contains(string memory subject, string memory needle) internal pure returns (bool) {\\n return LibBytes.contains(bytes(subject), bytes(needle));\\n }\\n\\n /// @dev Returns whether `subject` starts with `needle`.\\n function startsWith(string memory subject, string memory needle) internal pure returns (bool) {\\n return LibBytes.startsWith(bytes(subject), bytes(needle));\\n }\\n\\n /// @dev Returns whether `subject` ends with `needle`.\\n function endsWith(string memory subject, string memory needle) internal pure returns (bool) {\\n return LibBytes.endsWith(bytes(subject), bytes(needle));\\n }\\n\\n /// @dev Returns `subject` repeated `times`.\\n function repeat(string memory subject, uint256 times) internal pure returns (string memory) {\\n return string(LibBytes.repeat(bytes(subject), times));\\n }\\n\\n /// @dev Returns a copy of `subject` sliced from `start` to `end` (exclusive).\\n /// `start` and `end` are byte offsets.\\n function slice(string memory subject, uint256 start, uint256 end)\\n internal\\n pure\\n returns (string memory)\\n {\\n return string(LibBytes.slice(bytes(subject), start, end));\\n }\\n\\n /// @dev Returns a copy of `subject` sliced from `start` to the end of the string.\\n /// `start` is a byte offset.\\n function slice(string memory subject, uint256 start) internal pure returns (string memory) {\\n return string(LibBytes.slice(bytes(subject), start, type(uint256).max));\\n }\\n\\n /// @dev Returns all the indices of `needle` in `subject`.\\n /// The indices are byte offsets.\\n function indicesOf(string memory subject, string memory needle)\\n internal\\n pure\\n returns (uint256[] memory)\\n {\\n return LibBytes.indicesOf(bytes(subject), bytes(needle));\\n }\\n\\n /// @dev Returns an arrays of strings based on the `delimiter` inside of the `subject` string.\\n function split(string memory subject, string memory delimiter)\\n internal\\n pure\\n returns (string[] memory result)\\n {\\n bytes[] memory a = LibBytes.split(bytes(subject), bytes(delimiter));\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := a\\n }\\n }\\n\\n /// @dev Returns a concatenated string of `a` and `b`.\\n /// Cheaper than `string.concat()` and does not de-align the free memory pointer.\\n function concat(string memory a, string memory b) internal pure returns (string memory) {\\n return string(LibBytes.concat(bytes(a), bytes(b)));\\n }\\n\\n /// @dev Returns a copy of the string in either lowercase or UPPERCASE.\\n /// WARNING! This function is only compatible with 7-bit ASCII strings.\\n function toCase(string memory subject, bool toUpper)\\n internal\\n pure\\n returns (string memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := mload(subject)\\n if n {\\n result := mload(0x40)\\n let o := add(result, 0x20)\\n let d := sub(subject, result)\\n let flags := shl(add(70, shl(5, toUpper)), 0x3ffffff)\\n for { let end := add(o, n) } 1 {} {\\n let b := byte(0, mload(add(d, o)))\\n mstore8(o, xor(and(shr(b, flags), 0x20), b))\\n o := add(o, 1)\\n if eq(o, end) { break }\\n }\\n mstore(result, n) // Store the length.\\n mstore(o, 0) // Zeroize the slot after the string.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n }\\n }\\n }\\n\\n /// @dev Returns a string from a small bytes32 string.\\n /// `s` must be null-terminated, or behavior will be undefined.\\n function fromSmallString(bytes32 s) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n let n := 0\\n for {} byte(n, s) { n := add(n, 1) } {} // Scan for '\\\\0'.\\n mstore(result, n) // Store the length.\\n let o := add(result, 0x20)\\n mstore(o, s) // Store the bytes of the string.\\n mstore(add(o, n), 0) // Zeroize the slot after the string.\\n mstore(0x40, add(result, 0x40)) // Allocate memory.\\n }\\n }\\n\\n /// @dev Returns the small string, with all bytes after the first null byte zeroized.\\n function normalizeSmallString(bytes32 s) internal pure returns (bytes32 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n for {} byte(result, s) { result := add(result, 1) } {} // Scan for '\\\\0'.\\n mstore(0x00, s)\\n mstore(result, 0x00)\\n result := mload(0x00)\\n }\\n }\\n\\n /// @dev Returns the string as a normalized null-terminated small string.\\n function toSmallString(string memory s) internal pure returns (bytes32 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(s)\\n if iszero(lt(result, 33)) {\\n mstore(0x00, 0xec92f9a3) // `TooBigForSmallString()`.\\n revert(0x1c, 0x04)\\n }\\n result := shl(shl(3, sub(32, result)), mload(add(s, result)))\\n }\\n }\\n\\n /// @dev Returns a lowercased copy of the string.\\n /// WARNING! This function is only compatible with 7-bit ASCII strings.\\n function lower(string memory subject) internal pure returns (string memory result) {\\n result = toCase(subject, false);\\n }\\n\\n /// @dev Returns an UPPERCASED copy of the string.\\n /// WARNING! This function is only compatible with 7-bit ASCII strings.\\n function upper(string memory subject) internal pure returns (string memory result) {\\n result = toCase(subject, true);\\n }\\n\\n /// @dev Escapes the string to be used within HTML tags.\\n function escapeHTML(string memory s) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n let end := add(s, mload(s))\\n let o := add(result, 0x20)\\n // Store the bytes of the packed offsets and strides into the scratch space.\\n // `packed = (stride << 5) | offset`. Max offset is 20. Max stride is 6.\\n mstore(0x1f, 0x900094)\\n mstore(0x08, 0xc0000000a6ab)\\n // Store \\\""&'<>\\\" into the scratch space.\\n mstore(0x00, shl(64, 0x2671756f743b26616d703b262333393b266c743b2667743b))\\n for {} iszero(eq(s, end)) {} {\\n s := add(s, 1)\\n let c := and(mload(s), 0xff)\\n // Not in `[\\\"\\\\\\\"\\\",\\\"'\\\",\\\"&\\\",\\\"<\\\",\\\">\\\"]`.\\n if iszero(and(shl(c, 1), 0x500000c400000000)) {\\n mstore8(o, c)\\n o := add(o, 1)\\n continue\\n }\\n let t := shr(248, mload(c))\\n mstore(o, mload(and(t, 0x1f)))\\n o := add(o, shr(5, t))\\n }\\n mstore(o, 0) // Zeroize the slot after the string.\\n mstore(result, sub(o, add(result, 0x20))) // Store the length.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n }\\n }\\n\\n /// @dev Escapes the string to be used within double-quotes in a JSON.\\n /// If `addDoubleQuotes` is true, the result will be enclosed in double-quotes.\\n function escapeJSON(string memory s, bool addDoubleQuotes)\\n internal\\n pure\\n returns (string memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n let o := add(result, 0x20)\\n if addDoubleQuotes {\\n mstore8(o, 34)\\n o := add(1, o)\\n }\\n // Store \\\"\\\\\\\\u0000\\\" in scratch space.\\n // Store \\\"0123456789abcdef\\\" in scratch space.\\n // Also, store `{0x08:\\\"b\\\", 0x09:\\\"t\\\", 0x0a:\\\"n\\\", 0x0c:\\\"f\\\", 0x0d:\\\"r\\\"}`.\\n // into the scratch space.\\n mstore(0x15, 0x5c75303030303031323334353637383961626364656662746e006672)\\n // Bitmask for detecting `[\\\"\\\\\\\"\\\",\\\"\\\\\\\\\\\"]`.\\n let e := or(shl(0x22, 1), shl(0x5c, 1))\\n for { let end := add(s, mload(s)) } iszero(eq(s, end)) {} {\\n s := add(s, 1)\\n let c := and(mload(s), 0xff)\\n if iszero(lt(c, 0x20)) {\\n if iszero(and(shl(c, 1), e)) {\\n // Not in `[\\\"\\\\\\\"\\\",\\\"\\\\\\\\\\\"]`.\\n mstore8(o, c)\\n o := add(o, 1)\\n continue\\n }\\n mstore8(o, 0x5c) // \\\"\\\\\\\\\\\".\\n mstore8(add(o, 1), c)\\n o := add(o, 2)\\n continue\\n }\\n if iszero(and(shl(c, 1), 0x3700)) {\\n // Not in `[\\\"\\\\b\\\",\\\"\\\\t\\\",\\\"\\\\n\\\",\\\"\\\\f\\\",\\\"\\\\d\\\"]`.\\n mstore8(0x1d, mload(shr(4, c))) // Hex value.\\n mstore8(0x1e, mload(and(c, 15))) // Hex value.\\n mstore(o, mload(0x19)) // \\\"\\\\\\\\u00XX\\\".\\n o := add(o, 6)\\n continue\\n }\\n mstore8(o, 0x5c) // \\\"\\\\\\\\\\\".\\n mstore8(add(o, 1), mload(add(c, 8)))\\n o := add(o, 2)\\n }\\n if addDoubleQuotes {\\n mstore8(o, 34)\\n o := add(1, o)\\n }\\n mstore(o, 0) // Zeroize the slot after the string.\\n mstore(result, sub(o, add(result, 0x20))) // Store the length.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n }\\n }\\n\\n /// @dev Escapes the string to be used within double-quotes in a JSON.\\n function escapeJSON(string memory s) internal pure returns (string memory result) {\\n result = escapeJSON(s, false);\\n }\\n\\n /// @dev Encodes `s` so that it can be safely used in a URI,\\n /// just like `encodeURIComponent` in JavaScript.\\n /// See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent\\n /// See: https://datatracker.ietf.org/doc/html/rfc2396\\n /// See: https://datatracker.ietf.org/doc/html/rfc3986\\n function encodeURIComponent(string memory s) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n // Store \\\"0123456789ABCDEF\\\" in scratch space.\\n // Uppercased to be consistent with JavaScript's implementation.\\n mstore(0x0f, 0x30313233343536373839414243444546)\\n let o := add(result, 0x20)\\n for { let end := add(s, mload(s)) } iszero(eq(s, end)) {} {\\n s := add(s, 1)\\n let c := and(mload(s), 0xff)\\n // If not in `[0-9A-Z-a-z-_.!~*'()]`.\\n if iszero(and(1, shr(c, 0x47fffffe87fffffe03ff678200000000))) {\\n mstore8(o, 0x25) // '%'.\\n mstore8(add(o, 1), mload(and(shr(4, c), 15)))\\n mstore8(add(o, 2), mload(and(c, 15)))\\n o := add(o, 3)\\n continue\\n }\\n mstore8(o, c)\\n o := add(o, 1)\\n }\\n mstore(result, sub(o, add(result, 0x20))) // Store the length.\\n mstore(o, 0) // Zeroize the slot after the string.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n }\\n }\\n\\n /// @dev Returns whether `a` equals `b`.\\n function eq(string memory a, string memory b) internal pure returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := eq(keccak256(add(a, 0x20), mload(a)), keccak256(add(b, 0x20), mload(b)))\\n }\\n }\\n\\n /// @dev Returns whether `a` equals `b`, where `b` is a null-terminated small string.\\n function eqs(string memory a, bytes32 b) internal pure returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // These should be evaluated on compile time, as far as possible.\\n let m := not(shl(7, div(not(iszero(b)), 255))) // `0x7f7f ...`.\\n let x := not(or(m, or(b, add(m, and(b, m)))))\\n let r := shl(7, iszero(iszero(shr(128, x))))\\n r := or(r, shl(6, iszero(iszero(shr(64, shr(r, x))))))\\n r := or(r, shl(5, lt(0xffffffff, shr(r, x))))\\n r := or(r, shl(4, lt(0xffff, shr(r, x))))\\n r := or(r, shl(3, lt(0xff, shr(r, x))))\\n // forgefmt: disable-next-item\\n result := gt(eq(mload(a), add(iszero(x), xor(31, shr(3, r)))),\\n xor(shr(add(8, r), b), shr(add(8, r), mload(add(a, 0x20)))))\\n }\\n }\\n\\n /// @dev Returns 0 if `a == b`, -1 if `a < b`, +1 if `a > b`.\\n /// If `a` == b[:a.length]`, and `a.length < b.length`, returns -1.\\n function cmp(string memory a, string memory b) internal pure returns (int256) {\\n return LibBytes.cmp(bytes(a), bytes(b));\\n }\\n\\n /// @dev Packs a single string with its length into a single word.\\n /// Returns `bytes32(0)` if the length is zero or greater than 31.\\n function packOne(string memory a) internal pure returns (bytes32 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // We don't need to zero right pad the string,\\n // since this is our own custom non-standard packing scheme.\\n result :=\\n mul(\\n // Load the length and the bytes.\\n mload(add(a, 0x1f)),\\n // `length != 0 && length < 32`. Abuses underflow.\\n // Assumes that the length is valid and within the block gas limit.\\n lt(sub(mload(a), 1), 0x1f)\\n )\\n }\\n }\\n\\n /// @dev Unpacks a string packed using {packOne}.\\n /// Returns the empty string if `packed` is `bytes32(0)`.\\n /// If `packed` is not an output of {packOne}, the output behavior is undefined.\\n function unpackOne(bytes32 packed) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40) // Grab the free memory pointer.\\n mstore(0x40, add(result, 0x40)) // Allocate 2 words (1 for the length, 1 for the bytes).\\n mstore(result, 0) // Zeroize the length slot.\\n mstore(add(result, 0x1f), packed) // Store the length and bytes.\\n mstore(add(add(result, 0x20), mload(result)), 0) // Right pad with zeroes.\\n }\\n }\\n\\n /// @dev Packs two strings with their lengths into a single word.\\n /// Returns `bytes32(0)` if combined length is zero or greater than 30.\\n function packTwo(string memory a, string memory b) internal pure returns (bytes32 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let aLen := mload(a)\\n // We don't need to zero right pad the strings,\\n // since this is our own custom non-standard packing scheme.\\n result :=\\n mul(\\n or( // Load the length and the bytes of `a` and `b`.\\n shl(shl(3, sub(0x1f, aLen)), mload(add(a, aLen))), mload(sub(add(b, 0x1e), aLen))),\\n // `totalLen != 0 && totalLen < 31`. Abuses underflow.\\n // Assumes that the lengths are valid and within the block gas limit.\\n lt(sub(add(aLen, mload(b)), 1), 0x1e)\\n )\\n }\\n }\\n\\n /// @dev Unpacks strings packed using {packTwo}.\\n /// Returns the empty strings if `packed` is `bytes32(0)`.\\n /// If `packed` is not an output of {packTwo}, the output behavior is undefined.\\n function unpackTwo(bytes32 packed)\\n internal\\n pure\\n returns (string memory resultA, string memory resultB)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n resultA := mload(0x40) // Grab the free memory pointer.\\n resultB := add(resultA, 0x40)\\n // Allocate 2 words for each string (1 for the length, 1 for the byte). Total 4 words.\\n mstore(0x40, add(resultB, 0x40))\\n // Zeroize the length slots.\\n mstore(resultA, 0)\\n mstore(resultB, 0)\\n // Store the lengths and bytes.\\n mstore(add(resultA, 0x1f), packed)\\n mstore(add(resultB, 0x1f), mload(add(add(resultA, 0x20), mload(resultA))))\\n // Right pad with zeroes.\\n mstore(add(add(resultA, 0x20), mload(resultA)), 0)\\n mstore(add(add(resultB, 0x20), mload(resultB)), 0)\\n }\\n }\\n\\n /// @dev Directly returns `a` without copying.\\n function directReturn(string memory a) internal pure {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Assumes that the string does not start from the scratch space.\\n let retStart := sub(a, 0x20)\\n let retUnpaddedSize := add(mload(a), 0x40)\\n // Right pad with zeroes. Just in case the string is produced\\n // by a method that doesn't zero right pad.\\n mstore(add(retStart, retUnpaddedSize), 0)\\n mstore(retStart, 0x20) // Store the return offset.\\n // End the transaction, returning the string.\\n return(retStart, and(not(0x1f), add(0x1f, retUnpaddedSize)))\\n }\\n }\\n}\\n\",\"keccak256\":\"0x8a6b219f6ccda90c08e2debae62618d78d6f0cef086eb6c9503793d7f12815dd\",\"license\":\"MIT\"},\"src/tokens/ERC1155/ERC1155BaseToken.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\nimport { ERC2981Controlled } from \\\"../common/ERC2981Controlled.sol\\\";\\nimport { SignalsImplicitModeControlled } from \\\"../common/SignalsImplicitModeControlled.sol\\\";\\nimport { ERC1155, ERC1155Supply } from \\\"./extensions/supply/ERC1155Supply.sol\\\";\\n\\nimport { LibString } from \\\"solady/utils/LibString.sol\\\";\\n\\nerror InvalidInitialization();\\n\\n/**\\n * A standard base implementation of ERC-1155 for use in Sequence library contracts.\\n */\\nabstract contract ERC1155BaseToken is ERC1155Supply, ERC2981Controlled, SignalsImplicitModeControlled {\\n\\n bytes32 internal constant METADATA_ADMIN_ROLE = keccak256(\\\"METADATA_ADMIN_ROLE\\\");\\n\\n string public name;\\n string public baseURI;\\n string public contractURI;\\n\\n bool private _initialized;\\n\\n /**\\n * Initialize the contract.\\n * @param owner Owner address.\\n * @param tokenName Token name.\\n * @param tokenBaseURI Base URI for token metadata.\\n * @param tokenContractURI Contract URI for token metadata.\\n * @param implicitModeValidator Implicit session validator address.\\n * @param implicitModeProjectId Implicit session project id.\\n * @dev This should be called immediately after deployment.\\n */\\n function _initialize(\\n address owner,\\n string memory tokenName,\\n string memory tokenBaseURI,\\n string memory tokenContractURI,\\n address implicitModeValidator,\\n bytes32 implicitModeProjectId\\n ) internal {\\n if (_initialized) {\\n revert InvalidInitialization();\\n }\\n\\n name = tokenName;\\n baseURI = tokenBaseURI;\\n contractURI = tokenContractURI;\\n\\n _grantRole(DEFAULT_ADMIN_ROLE, owner);\\n _grantRole(ROYALTY_ADMIN_ROLE, owner);\\n _grantRole(METADATA_ADMIN_ROLE, owner);\\n\\n _initializeImplicitMode(owner, implicitModeValidator, implicitModeProjectId);\\n\\n _initialized = true;\\n }\\n\\n //\\n // Metadata\\n //\\n\\n /// @inheritdoc ERC1155\\n function uri(\\n uint256 _id\\n ) public view virtual override returns (string memory) {\\n return string(abi.encodePacked(baseURI, LibString.toString(_id), \\\".json\\\"));\\n }\\n\\n /**\\n * Update the base URI of token's URI.\\n * @param tokenBaseURI New base URI of token's URI\\n */\\n function setBaseMetadataURI(\\n string memory tokenBaseURI\\n ) external onlyRole(METADATA_ADMIN_ROLE) {\\n baseURI = tokenBaseURI;\\n }\\n\\n /**\\n * Update the name of the contract.\\n * @param tokenName New contract name\\n */\\n function setContractName(\\n string memory tokenName\\n ) external onlyRole(METADATA_ADMIN_ROLE) {\\n name = tokenName;\\n }\\n\\n /**\\n * Update the contract URI of token's URI.\\n * @param tokenContractURI New contract URI of token's URI\\n * @notice Refer to https://docs.opensea.io/docs/contract-level-metadata\\n */\\n function setContractURI(\\n string memory tokenContractURI\\n ) external onlyRole(METADATA_ADMIN_ROLE) {\\n contractURI = tokenContractURI;\\n }\\n\\n //\\n // Burn\\n //\\n\\n /**\\n * Allows the owner of the token to burn their tokens.\\n * @param tokenId Id of token to burn\\n * @param amount Amount of tokens to burn\\n */\\n function burn(uint256 tokenId, uint256 amount) public virtual {\\n _burn(msg.sender, tokenId, amount);\\n }\\n\\n /**\\n * Burn tokens of given token id for each (tokenIds[i], amounts[i]) pair.\\n * @param tokenIds Array of token ids to burn\\n * @param amounts Array of the amount to be burned\\n */\\n function batchBurn(uint256[] memory tokenIds, uint256[] memory amounts) public virtual {\\n super._batchBurn(msg.sender, tokenIds, amounts);\\n }\\n\\n //\\n // Views\\n //\\n\\n /**\\n * Check interface support.\\n * @param interfaceId Interface id\\n * @return True if supported\\n */\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view virtual override(ERC1155Supply, ERC2981Controlled, SignalsImplicitModeControlled) returns (bool) {\\n return ERC1155Supply.supportsInterface(interfaceId) || ERC2981Controlled.supportsInterface(interfaceId)\\n || SignalsImplicitModeControlled.supportsInterface(interfaceId);\\n }\\n\\n}\\n\",\"keccak256\":\"0x81e8abb54378967f6c8ebb4222d2c9a5c93e730535532fa6fe56de5ef1c56c56\",\"license\":\"Apache-2.0\"},\"src/tokens/ERC1155/extensions/supply/ERC1155Supply.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\nimport { IERC1155Supply, IERC1155SupplyFunctions } from \\\"./IERC1155Supply.sol\\\";\\n\\nimport { ERC1155 } from \\\"solady/tokens/ERC1155.sol\\\";\\n\\n/**\\n * An ERC-1155 extension that tracks token supply.\\n */\\nabstract contract ERC1155Supply is ERC1155, IERC1155Supply {\\n\\n // Current supply\\n uint256 public totalSupply;\\n mapping(uint256 => uint256) public tokenSupply;\\n\\n /**\\n * Mint _amount of tokens of a given id\\n * @param _to The address to mint tokens to\\n * @param _id Token id to mint\\n * @param _amount The amount to be minted\\n * @param _data Data to pass if receiver is contract\\n */\\n function _mint(address _to, uint256 _id, uint256 _amount, bytes memory _data) internal virtual override {\\n super._mint(_to, _id, _amount, _data);\\n\\n totalSupply += _amount;\\n tokenSupply[_id] += _amount;\\n }\\n\\n /**\\n * Mint tokens for each ids in _ids\\n * @param _to The address to mint tokens to\\n * @param _ids Array of ids to mint\\n * @param _amounts Array of amount of tokens to mint per id\\n * @param _data Data to pass if receiver is contract\\n */\\n function _batchMint(\\n address _to,\\n uint256[] memory _ids,\\n uint256[] memory _amounts,\\n bytes memory _data\\n ) internal virtual override {\\n super._batchMint(_to, _ids, _amounts, _data);\\n\\n uint256 nMint = _ids.length;\\n uint256 totalAmount = 0;\\n for (uint256 i; i < nMint;) {\\n uint256 amount = _amounts[i];\\n totalAmount += amount;\\n tokenSupply[_ids[i]] += amount;\\n unchecked {\\n // Already checked in super._batchMint\\n ++i;\\n }\\n }\\n totalSupply += totalAmount;\\n }\\n\\n /**\\n * Burn _amount of tokens of a given token id\\n * @param _from The address to burn tokens from\\n * @param _id Token id to burn\\n * @param _amount The amount to be burned\\n */\\n function _burn(address _from, uint256 _id, uint256 _amount) internal virtual override {\\n super._burn(_from, _id, _amount);\\n\\n totalSupply -= _amount;\\n tokenSupply[_id] -= _amount;\\n }\\n\\n /**\\n * Burn tokens of given token id for each (_ids[i], _amounts[i]) pair\\n * @param _from The address to burn tokens from\\n * @param _ids Array of token ids to burn\\n * @param _amounts Array of the amount to be burned\\n */\\n function _batchBurn(address _from, uint256[] memory _ids, uint256[] memory _amounts) internal virtual override {\\n super._batchBurn(_from, _ids, _amounts);\\n\\n uint256 nBurn = _ids.length;\\n uint256 totalAmount = 0;\\n for (uint256 i; i < nBurn;) {\\n uint256 amount = _amounts[i];\\n tokenSupply[_ids[i]] -= amount;\\n totalAmount += amount;\\n unchecked {\\n // Already checked in super._batchBurn\\n ++i;\\n }\\n }\\n totalSupply -= totalAmount;\\n }\\n\\n //\\n // Views\\n //\\n\\n /**\\n * Check interface support.\\n * @param interfaceId Interface id\\n * @return True if supported\\n */\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view virtual override(ERC1155) returns (bool) {\\n return type(IERC1155SupplyFunctions).interfaceId == interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n}\\n\",\"keccak256\":\"0xc2cf8d5479a9cafcc2e92e3c8e9f4afce7fa2416cc811acbb766cf45db3692f0\",\"license\":\"Apache-2.0\"},\"src/tokens/ERC1155/extensions/supply/IERC1155Supply.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\ninterface IERC1155SupplyFunctions {\\n\\n /**\\n * Returns the total supply of ERC1155 tokens.\\n */\\n function totalSupply() external returns (uint256);\\n\\n /**\\n * Returns the total supply of a given ERC1155 token.\\n * @param tokenId The ERC1155 token id.\\n */\\n function tokenSupply(\\n uint256 tokenId\\n ) external returns (uint256);\\n\\n}\\n\\ninterface IERC1155SupplySignals {\\n\\n /**\\n * Invalid array input length.\\n */\\n error InvalidArrayLength();\\n\\n}\\n\\ninterface IERC1155Supply is IERC1155SupplySignals { }\\n\",\"keccak256\":\"0x135a8948daebd1229d6bada5ada73f2b3496c9bd9f8cfc78d7a68a0f117e55b5\",\"license\":\"Apache-2.0\"},\"src/tokens/common/ERC2981Controlled.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\nimport { IERC2981Controlled } from \\\"./IERC2981Controlled.sol\\\";\\n\\nimport { AccessControlEnumerable } from \\\"openzeppelin-contracts/contracts/access/AccessControlEnumerable.sol\\\";\\nimport { ERC2981 } from \\\"openzeppelin-contracts/contracts/token/common/ERC2981.sol\\\";\\n\\n/**\\n * An implementation of ERC-2981 that allows updates by roles.\\n */\\nabstract contract ERC2981Controlled is ERC2981, AccessControlEnumerable, IERC2981Controlled {\\n\\n bytes32 internal constant ROYALTY_ADMIN_ROLE = keccak256(\\\"ROYALTY_ADMIN_ROLE\\\");\\n\\n //\\n // Royalty\\n //\\n\\n /**\\n * Sets the royalty information that all ids in this contract will default to.\\n * @param receiver Address of who should be sent the royalty payment\\n * @param feeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\\n */\\n function setDefaultRoyalty(address receiver, uint96 feeNumerator) external onlyRole(ROYALTY_ADMIN_ROLE) {\\n _setDefaultRoyalty(receiver, feeNumerator);\\n }\\n\\n /**\\n * Sets the royalty information that a given token id in this contract will use.\\n * @param tokenId The token id to set the royalty information for\\n * @param receiver Address of who should be sent the royalty payment\\n * @param feeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\\n * @notice This overrides the default royalty information for this token id\\n */\\n function setTokenRoyalty(\\n uint256 tokenId,\\n address receiver,\\n uint96 feeNumerator\\n ) external onlyRole(ROYALTY_ADMIN_ROLE) {\\n _setTokenRoyalty(tokenId, receiver, feeNumerator);\\n }\\n\\n //\\n // Views\\n //\\n\\n /**\\n * Check interface support.\\n * @param interfaceId Interface id\\n * @return True if supported\\n */\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view virtual override(ERC2981, AccessControlEnumerable) returns (bool) {\\n return ERC2981.supportsInterface(interfaceId) || AccessControlEnumerable.supportsInterface(interfaceId)\\n || type(IERC2981Controlled).interfaceId == interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n}\\n\",\"keccak256\":\"0xf02124d449f7dc76b4b1a26d9b1728d42facfc5f84771e73352e2b0c4b6c566b\",\"license\":\"Apache-2.0\"},\"src/tokens/common/IERC2981Controlled.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\ninterface IERC2981ControlledFunctions {\\n\\n /**\\n * Sets the royalty information that all ids in this contract will default to.\\n * @param receiver Address of who should be sent the royalty payment\\n * @param feeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\\n */\\n function setDefaultRoyalty(address receiver, uint96 feeNumerator) external;\\n\\n /**\\n * Sets the royalty information that a given token id in this contract will use.\\n * @param tokenId The token id to set the royalty information for\\n * @param receiver Address of who should be sent the royalty payment\\n * @param feeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\\n * @notice This overrides the default royalty information for this token id\\n */\\n function setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) external;\\n\\n}\\n\\ninterface IERC2981Controlled is IERC2981ControlledFunctions { }\\n\",\"keccak256\":\"0x65d66b30719fb4161fc4ef666794f8dcb7660528bdff9bf126b12999fac79ee0\",\"license\":\"Apache-2.0\"},\"src/tokens/common/SignalsImplicitModeControlled.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\nimport { AccessControlEnumerable } from \\\"openzeppelin-contracts/contracts/access/AccessControlEnumerable.sol\\\";\\nimport {\\n IERC165,\\n IImplicitProjectValidation,\\n SignalsImplicitMode\\n} from \\\"signals-implicit-mode/src/helper/SignalsImplicitMode.sol\\\";\\n\\n/**\\n * An abstract contract that allows implicit session access for a given project.\\n */\\nabstract contract SignalsImplicitModeControlled is AccessControlEnumerable, SignalsImplicitMode {\\n\\n bytes32 internal constant _IMPLICIT_MODE_ADMIN_ROLE = keccak256(\\\"IMPLICIT_MODE_ADMIN_ROLE\\\");\\n\\n function _initializeImplicitMode(address owner, address validator, bytes32 projectId) internal {\\n _grantRole(_IMPLICIT_MODE_ADMIN_ROLE, owner);\\n _initializeSignalsImplicitMode(validator, projectId);\\n }\\n\\n /**\\n * Updates the validator for implicit mode validation.\\n * @param validator The validator address.\\n * @notice Only callable by an address with the project admin role.\\n */\\n function setImplicitModeValidator(\\n address validator\\n ) external onlyRole(_IMPLICIT_MODE_ADMIN_ROLE) {\\n _validator = IImplicitProjectValidation(validator);\\n }\\n\\n /**\\n * Updates the settings for implicit mode validation.\\n * @param projectId The project id.\\n * @notice Only callable by an address with the project admin role.\\n */\\n function setImplicitModeProjectId(\\n bytes32 projectId\\n ) external onlyRole(_IMPLICIT_MODE_ADMIN_ROLE) {\\n _projectId = projectId;\\n }\\n\\n /// @inheritdoc IERC165\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view virtual override(AccessControlEnumerable, SignalsImplicitMode) returns (bool) {\\n return\\n AccessControlEnumerable.supportsInterface(interfaceId) || SignalsImplicitMode.supportsInterface(interfaceId);\\n }\\n\\n}\\n\",\"keccak256\":\"0xb1a20575f188af254f90ec7df7f70415610ba5f41f7966ce383b50063220b860\",\"license\":\"Apache-2.0\"}},\"version\":1}", + "userdoc": { + "errors": { + "InvalidArrayLength()": [ + { + "notice": "Invalid array input length." + } + ] + }, + "kind": "user", + "methods": { + "acceptImplicitRequest(address,(address,bytes4,bytes32,bytes32,bytes,(string,uint64)),(address,uint256,bytes,uint256,bool,bool,uint256))": { + "notice": "Determines if an implicit request is valid" + }, + "batchBurn(uint256[],uint256[])": { + "notice": "Burn tokens of given token id for each (tokenIds[i], amounts[i]) pair." + }, + "burn(uint256,uint256)": { + "notice": "Allows the owner of the token to burn their tokens." + }, + "setBaseMetadataURI(string)": { + "notice": "Update the base URI of token's URI." + }, + "setContractName(string)": { + "notice": "Update the name of the contract." + }, + "setContractURI(string)": { + "notice": "Update the contract URI of token's URI.Refer to https://docs.opensea.io/docs/contract-level-metadata" + }, + "setDefaultRoyalty(address,uint96)": { + "notice": "Sets the royalty information that all ids in this contract will default to." + }, + "setImplicitModeProjectId(bytes32)": { + "notice": "Updates the settings for implicit mode validation.Only callable by an address with the project admin role." + }, + "setImplicitModeValidator(address)": { + "notice": "Updates the validator for implicit mode validation.Only callable by an address with the project admin role." + }, + "setTokenRoyalty(uint256,address,uint96)": { + "notice": "Sets the royalty information that a given token id in this contract will use.This overrides the default royalty information for this token id" + }, + "supportsInterface(bytes4)": { + "notice": "Check interface support." + } + }, + "notice": "A standard base implementation of ERC-1155 for use in Sequence library contracts.", + "version": 1 + } + } + }, + "src/tokens/ERC1155/extensions/supply/ERC1155Supply.sol": { + "ERC1155Supply": { + "abi": [ + { + "inputs": [], + "name": "AccountBalanceOverflow", + "type": "error" + }, + { + "inputs": [], + "name": "ArrayLengthsMismatch", + "type": "error" + }, + { + "inputs": [], + "name": "InsufficientBalance", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidArrayLength", + "type": "error" + }, + { + "inputs": [], + "name": "NotOwnerNorApproved", + "type": "error" + }, + { + "inputs": [], + "name": "TransferToNonERC1155ReceiverImplementer", + "type": "error" + }, + { + "inputs": [], + "name": "TransferToZeroAddress", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "isApproved", + "type": "bool" + } + ], + "name": "ApprovalForAll", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "ids", + "type": "uint256[]" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "name": "TransferBatch", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "TransferSingle", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "value", + "type": "string" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "URI", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "owners", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "ids", + "type": "uint256[]" + } + ], + "name": "balanceOfBatch", + "outputs": [ + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "result", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "ids", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "safeBatchTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "isApproved", + "type": "bool" + } + ], + "name": "setApprovalForAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "tokenSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "uri", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "errors": { + "AccountBalanceOverflow()": [ + { + "details": "The recipient's balance has overflowed." + } + ], + "ArrayLengthsMismatch()": [ + { + "details": "The lengths of the input arrays are not the same." + } + ], + "InsufficientBalance()": [ + { + "details": "Insufficient balance." + } + ], + "NotOwnerNorApproved()": [ + { + "details": "Only the token owner or an approved account can manage the tokens." + } + ], + "TransferToNonERC1155ReceiverImplementer()": [ + { + "details": "Cannot safely transfer to a contract that does not implement the ERC1155Receiver interface." + } + ], + "TransferToZeroAddress()": [ + { + "details": "Cannot mint or transfer to the zero address." + } + ] + }, + "events": { + "ApprovalForAll(address,address,bool)": { + "details": "Emitted when `owner` enables or disables `operator` to manage all of their tokens." + }, + "TransferBatch(address,address,address,uint256[],uint256[])": { + "details": "Emitted when `amounts` of token `ids` are transferred from `from` to `to` by `operator`." + }, + "TransferSingle(address,address,address,uint256,uint256)": { + "details": "Emitted when `amount` of token `id` is transferred from `from` to `to` by `operator`." + }, + "URI(string,uint256)": { + "details": "Emitted when the Uniform Resource Identifier (URI) for token `id` is updated to `value`. This event is not used in the base contract. You may need to emit this event depending on your URI logic. See: https://eips.ethereum.org/EIPS/eip-1155#metadata" + } + }, + "kind": "dev", + "methods": { + "balanceOf(address,uint256)": { + "details": "Returns the amount of `id` owned by `owner`." + }, + "balanceOfBatch(address[],uint256[])": { + "details": "Returns the amounts of `ids` for `owners. Requirements: - `owners` and `ids` must have the same length." + }, + "isApprovedForAll(address,address)": { + "details": "Returns whether `operator` is approved to manage the tokens of `owner`." + }, + "safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)": { + "details": "Transfers `amounts` of `ids` from `from` to `to`. Requirements: - `to` cannot be the zero address. - `from` must have at least `amount` of `id`. - `ids` and `amounts` must have the same length. - If the caller is not `from`, it must be approved to manage the tokens of `from`. - If `to` refers to a smart contract, it must implement {ERC1155-onERC1155BatchReceived}, which is called upon a batch transfer. Emits a {TransferBatch} event." + }, + "safeTransferFrom(address,address,uint256,uint256,bytes)": { + "details": "Transfers `amount` of `id` from `from` to `to`. Requirements: - `to` cannot be the zero address. - `from` must have at least `amount` of `id`. - If the caller is not `from`, it must be approved to manage the tokens of `from`. - If `to` refers to a smart contract, it must implement {ERC1155-onERC1155Received}, which is called upon a batch transfer. Emits a {TransferSingle} event." + }, + "setApprovalForAll(address,bool)": { + "details": "Sets whether `operator` is approved to manage the tokens of the caller. Emits a {ApprovalForAll} event." + }, + "supportsInterface(bytes4)": { + "params": { + "interfaceId": "Interface id" + }, + "returns": { + "_0": "True if supported" + } + }, + "uri(uint256)": { + "details": "Returns the URI for token `id`. You can either return the same templated URI for all token IDs, (e.g. \"https://example.com/api/{id}.json\"), or return a unique URI for each `id`. See: https://eips.ethereum.org/EIPS/eip-1155#metadata" + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "balanceOf(address,uint256)": "00fdd58e", + "balanceOfBatch(address[],uint256[])": "4e1273f4", + "isApprovedForAll(address,address)": "e985e9c5", + "safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)": "2eb2c2d6", + "safeTransferFrom(address,address,uint256,uint256,bytes)": "f242432a", + "setApprovalForAll(address,bool)": "a22cb465", + "supportsInterface(bytes4)": "01ffc9a7", + "tokenSupply(uint256)": "2693ebf2", + "totalSupply()": "18160ddd", + "uri(uint256)": "0e89341c" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"AccountBalanceOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ArrayLengthsMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidArrayLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotOwnerNorApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToNonERC1155ReceiverImplementer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isApproved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"TransferBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TransferSingle\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"value\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"URI\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"result\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"owners\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"}],\"name\":\"balanceOfBatch\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"balances\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeBatchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isApproved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"tokenSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"uri\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AccountBalanceOverflow()\":[{\"details\":\"The recipient's balance has overflowed.\"}],\"ArrayLengthsMismatch()\":[{\"details\":\"The lengths of the input arrays are not the same.\"}],\"InsufficientBalance()\":[{\"details\":\"Insufficient balance.\"}],\"NotOwnerNorApproved()\":[{\"details\":\"Only the token owner or an approved account can manage the tokens.\"}],\"TransferToNonERC1155ReceiverImplementer()\":[{\"details\":\"Cannot safely transfer to a contract that does not implement the ERC1155Receiver interface.\"}],\"TransferToZeroAddress()\":[{\"details\":\"Cannot mint or transfer to the zero address.\"}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"details\":\"Emitted when `owner` enables or disables `operator` to manage all of their tokens.\"},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"details\":\"Emitted when `amounts` of token `ids` are transferred from `from` to `to` by `operator`.\"},\"TransferSingle(address,address,address,uint256,uint256)\":{\"details\":\"Emitted when `amount` of token `id` is transferred from `from` to `to` by `operator`.\"},\"URI(string,uint256)\":{\"details\":\"Emitted when the Uniform Resource Identifier (URI) for token `id` is updated to `value`. This event is not used in the base contract. You may need to emit this event depending on your URI logic. See: https://eips.ethereum.org/EIPS/eip-1155#metadata\"}},\"kind\":\"dev\",\"methods\":{\"balanceOf(address,uint256)\":{\"details\":\"Returns the amount of `id` owned by `owner`.\"},\"balanceOfBatch(address[],uint256[])\":{\"details\":\"Returns the amounts of `ids` for `owners. Requirements: - `owners` and `ids` must have the same length.\"},\"isApprovedForAll(address,address)\":{\"details\":\"Returns whether `operator` is approved to manage the tokens of `owner`.\"},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"details\":\"Transfers `amounts` of `ids` from `from` to `to`. Requirements: - `to` cannot be the zero address. - `from` must have at least `amount` of `id`. - `ids` and `amounts` must have the same length. - If the caller is not `from`, it must be approved to manage the tokens of `from`. - If `to` refers to a smart contract, it must implement {ERC1155-onERC1155BatchReceived}, which is called upon a batch transfer. Emits a {TransferBatch} event.\"},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"details\":\"Transfers `amount` of `id` from `from` to `to`. Requirements: - `to` cannot be the zero address. - `from` must have at least `amount` of `id`. - If the caller is not `from`, it must be approved to manage the tokens of `from`. - If `to` refers to a smart contract, it must implement {ERC1155-onERC1155Received}, which is called upon a batch transfer. Emits a {TransferSingle} event.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"Sets whether `operator` is approved to manage the tokens of the caller. Emits a {ApprovalForAll} event.\"},\"supportsInterface(bytes4)\":{\"params\":{\"interfaceId\":\"Interface id\"},\"returns\":{\"_0\":\"True if supported\"}},\"uri(uint256)\":{\"details\":\"Returns the URI for token `id`. You can either return the same templated URI for all token IDs, (e.g. \\\"https://example.com/api/{id}.json\\\"), or return a unique URI for each `id`. See: https://eips.ethereum.org/EIPS/eip-1155#metadata\"}},\"version\":1},\"userdoc\":{\"errors\":{\"InvalidArrayLength()\":[{\"notice\":\"Invalid array input length.\"}]},\"kind\":\"user\",\"methods\":{\"supportsInterface(bytes4)\":{\"notice\":\"Check interface support.\"}},\"notice\":\"An ERC-1155 extension that tracks token supply.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/tokens/ERC1155/extensions/supply/ERC1155Supply.sol\":\"ERC1155Supply\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/solady/src/tokens/ERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\n/// @notice Simple ERC1155 implementation.\\n/// @author Solady (https://github.com/vectorized/solady/blob/main/src/tokens/ERC1155.sol)\\n/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC1155.sol)\\n/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC1155/ERC1155.sol)\\n///\\n/// @dev Note:\\n/// - The ERC1155 standard allows for self-approvals.\\n/// For performance, this implementation WILL NOT revert for such actions.\\n/// Please add any checks with overrides if desired.\\n/// - The transfer functions use the identity precompile (0x4)\\n/// to copy memory internally.\\n///\\n/// If you are overriding:\\n/// - Make sure all variables written to storage are properly cleaned\\n// (e.g. the bool value for `isApprovedForAll` MUST be either 1 or 0 under the hood).\\n/// - Check that the overridden function is actually used in the function you want to\\n/// change the behavior of. Much of the code has been manually inlined for performance.\\nabstract contract ERC1155 {\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* CUSTOM ERRORS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev The lengths of the input arrays are not the same.\\n error ArrayLengthsMismatch();\\n\\n /// @dev Cannot mint or transfer to the zero address.\\n error TransferToZeroAddress();\\n\\n /// @dev The recipient's balance has overflowed.\\n error AccountBalanceOverflow();\\n\\n /// @dev Insufficient balance.\\n error InsufficientBalance();\\n\\n /// @dev Only the token owner or an approved account can manage the tokens.\\n error NotOwnerNorApproved();\\n\\n /// @dev Cannot safely transfer to a contract that does not implement\\n /// the ERC1155Receiver interface.\\n error TransferToNonERC1155ReceiverImplementer();\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* EVENTS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Emitted when `amount` of token `id` is transferred\\n /// from `from` to `to` by `operator`.\\n event TransferSingle(\\n address indexed operator,\\n address indexed from,\\n address indexed to,\\n uint256 id,\\n uint256 amount\\n );\\n\\n /// @dev Emitted when `amounts` of token `ids` are transferred\\n /// from `from` to `to` by `operator`.\\n event TransferBatch(\\n address indexed operator,\\n address indexed from,\\n address indexed to,\\n uint256[] ids,\\n uint256[] amounts\\n );\\n\\n /// @dev Emitted when `owner` enables or disables `operator` to manage all of their tokens.\\n event ApprovalForAll(address indexed owner, address indexed operator, bool isApproved);\\n\\n /// @dev Emitted when the Uniform Resource Identifier (URI) for token `id`\\n /// is updated to `value`. This event is not used in the base contract.\\n /// You may need to emit this event depending on your URI logic.\\n ///\\n /// See: https://eips.ethereum.org/EIPS/eip-1155#metadata\\n event URI(string value, uint256 indexed id);\\n\\n /// @dev `keccak256(bytes(\\\"TransferSingle(address,address,address,uint256,uint256)\\\"))`.\\n uint256 private constant _TRANSFER_SINGLE_EVENT_SIGNATURE =\\n 0xc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62;\\n\\n /// @dev `keccak256(bytes(\\\"TransferBatch(address,address,address,uint256[],uint256[])\\\"))`.\\n uint256 private constant _TRANSFER_BATCH_EVENT_SIGNATURE =\\n 0x4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb;\\n\\n /// @dev `keccak256(bytes(\\\"ApprovalForAll(address,address,bool)\\\"))`.\\n uint256 private constant _APPROVAL_FOR_ALL_EVENT_SIGNATURE =\\n 0x17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31;\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* STORAGE */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev The `ownerSlotSeed` of a given owner is given by.\\n /// ```\\n /// let ownerSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, owner))\\n /// ```\\n ///\\n /// The balance slot of `owner` is given by.\\n /// ```\\n /// mstore(0x20, ownerSlotSeed)\\n /// mstore(0x00, id)\\n /// let balanceSlot := keccak256(0x00, 0x40)\\n /// ```\\n ///\\n /// The operator approval slot of `owner` is given by.\\n /// ```\\n /// mstore(0x20, ownerSlotSeed)\\n /// mstore(0x00, operator)\\n /// let operatorApprovalSlot := keccak256(0x0c, 0x34)\\n /// ```\\n uint256 private constant _ERC1155_MASTER_SLOT_SEED = 0x9a31110384e0b0c9;\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* ERC1155 METADATA */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns the URI for token `id`.\\n ///\\n /// You can either return the same templated URI for all token IDs,\\n /// (e.g. \\\"https://example.com/api/{id}.json\\\"),\\n /// or return a unique URI for each `id`.\\n ///\\n /// See: https://eips.ethereum.org/EIPS/eip-1155#metadata\\n function uri(uint256 id) public view virtual returns (string memory);\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* ERC1155 */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns the amount of `id` owned by `owner`.\\n function balanceOf(address owner, uint256 id) public view virtual returns (uint256 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x20, _ERC1155_MASTER_SLOT_SEED)\\n mstore(0x14, owner)\\n mstore(0x00, id)\\n result := sload(keccak256(0x00, 0x40))\\n }\\n }\\n\\n /// @dev Returns whether `operator` is approved to manage the tokens of `owner`.\\n function isApprovedForAll(address owner, address operator)\\n public\\n view\\n virtual\\n returns (bool result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x20, _ERC1155_MASTER_SLOT_SEED)\\n mstore(0x14, owner)\\n mstore(0x00, operator)\\n result := sload(keccak256(0x0c, 0x34))\\n }\\n }\\n\\n /// @dev Sets whether `operator` is approved to manage the tokens of the caller.\\n ///\\n /// Emits a {ApprovalForAll} event.\\n function setApprovalForAll(address operator, bool isApproved) public virtual {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Convert to 0 or 1.\\n isApproved := iszero(iszero(isApproved))\\n // Update the `isApproved` for (`msg.sender`, `operator`).\\n mstore(0x20, _ERC1155_MASTER_SLOT_SEED)\\n mstore(0x14, caller())\\n mstore(0x00, operator)\\n sstore(keccak256(0x0c, 0x34), isApproved)\\n // Emit the {ApprovalForAll} event.\\n mstore(0x00, isApproved)\\n // forgefmt: disable-next-line\\n log3(0x00, 0x20, _APPROVAL_FOR_ALL_EVENT_SIGNATURE, caller(), shr(96, shl(96, operator)))\\n }\\n }\\n\\n /// @dev Transfers `amount` of `id` from `from` to `to`.\\n ///\\n /// Requirements:\\n /// - `to` cannot be the zero address.\\n /// - `from` must have at least `amount` of `id`.\\n /// - If the caller is not `from`,\\n /// it must be approved to manage the tokens of `from`.\\n /// - If `to` refers to a smart contract, it must implement\\n /// {ERC1155-onERC1155Received}, which is called upon a batch transfer.\\n ///\\n /// Emits a {TransferSingle} event.\\n function safeTransferFrom(\\n address from,\\n address to,\\n uint256 id,\\n uint256 amount,\\n bytes calldata data\\n ) public virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(from, to, _single(id), _single(amount), data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n let fromSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, from))\\n let toSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, to))\\n mstore(0x20, fromSlotSeed)\\n // Clear the upper 96 bits.\\n from := shr(96, fromSlotSeed)\\n to := shr(96, toSlotSeed)\\n // Revert if `to` is the zero address.\\n if iszero(to) {\\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\\n revert(0x1c, 0x04)\\n }\\n // If the caller is not `from`, do the authorization check.\\n if iszero(eq(caller(), from)) {\\n mstore(0x00, caller())\\n if iszero(sload(keccak256(0x0c, 0x34))) {\\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n // Subtract and store the updated balance of `from`.\\n {\\n mstore(0x00, id)\\n let fromBalanceSlot := keccak256(0x00, 0x40)\\n let fromBalance := sload(fromBalanceSlot)\\n if gt(amount, fromBalance) {\\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(fromBalanceSlot, sub(fromBalance, amount))\\n }\\n // Increase and store the updated balance of `to`.\\n {\\n mstore(0x20, toSlotSeed)\\n let toBalanceSlot := keccak256(0x00, 0x40)\\n let toBalanceBefore := sload(toBalanceSlot)\\n let toBalanceAfter := add(toBalanceBefore, amount)\\n if lt(toBalanceAfter, toBalanceBefore) {\\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(toBalanceSlot, toBalanceAfter)\\n }\\n // Emit a {TransferSingle} event.\\n mstore(0x20, amount)\\n log4(0x00, 0x40, _TRANSFER_SINGLE_EVENT_SIGNATURE, caller(), from, to)\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(from, to, _single(id), _single(amount), data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Do the {onERC1155Received} check if `to` is a smart contract.\\n if extcodesize(to) {\\n // Prepare the calldata.\\n let m := mload(0x40)\\n // `onERC1155Received(address,address,uint256,uint256,bytes)`.\\n mstore(m, 0xf23a6e61)\\n mstore(add(m, 0x20), caller())\\n mstore(add(m, 0x40), from)\\n mstore(add(m, 0x60), id)\\n mstore(add(m, 0x80), amount)\\n mstore(add(m, 0xa0), 0xa0)\\n mstore(add(m, 0xc0), data.length)\\n calldatacopy(add(m, 0xe0), data.offset, data.length)\\n // Revert if the call reverts.\\n if iszero(call(gas(), to, 0, add(m, 0x1c), add(0xc4, data.length), m, 0x20)) {\\n if returndatasize() {\\n // Bubble up the revert if the call reverts.\\n returndatacopy(m, 0x00, returndatasize())\\n revert(m, returndatasize())\\n }\\n }\\n // Load the returndata and compare it with the function selector.\\n if iszero(eq(mload(m), shl(224, 0xf23a6e61))) {\\n mstore(0x00, 0x9c05499b) // `TransferToNonERC1155ReceiverImplementer()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n }\\n }\\n\\n /// @dev Transfers `amounts` of `ids` from `from` to `to`.\\n ///\\n /// Requirements:\\n /// - `to` cannot be the zero address.\\n /// - `from` must have at least `amount` of `id`.\\n /// - `ids` and `amounts` must have the same length.\\n /// - If the caller is not `from`,\\n /// it must be approved to manage the tokens of `from`.\\n /// - If `to` refers to a smart contract, it must implement\\n /// {ERC1155-onERC1155BatchReceived}, which is called upon a batch transfer.\\n ///\\n /// Emits a {TransferBatch} event.\\n function safeBatchTransferFrom(\\n address from,\\n address to,\\n uint256[] calldata ids,\\n uint256[] calldata amounts,\\n bytes calldata data\\n ) public virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(from, to, ids, amounts, data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n if iszero(eq(ids.length, amounts.length)) {\\n mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.\\n revert(0x1c, 0x04)\\n }\\n let fromSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, from))\\n let toSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, to))\\n mstore(0x20, fromSlotSeed)\\n // Clear the upper 96 bits.\\n from := shr(96, fromSlotSeed)\\n to := shr(96, toSlotSeed)\\n // Revert if `to` is the zero address.\\n if iszero(to) {\\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\\n revert(0x1c, 0x04)\\n }\\n // If the caller is not `from`, do the authorization check.\\n if iszero(eq(caller(), from)) {\\n mstore(0x00, caller())\\n if iszero(sload(keccak256(0x0c, 0x34))) {\\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n // Loop through all the `ids` and update the balances.\\n {\\n for { let i := shl(5, ids.length) } i {} {\\n i := sub(i, 0x20)\\n let amount := calldataload(add(amounts.offset, i))\\n // Subtract and store the updated balance of `from`.\\n {\\n mstore(0x20, fromSlotSeed)\\n mstore(0x00, calldataload(add(ids.offset, i)))\\n let fromBalanceSlot := keccak256(0x00, 0x40)\\n let fromBalance := sload(fromBalanceSlot)\\n if gt(amount, fromBalance) {\\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(fromBalanceSlot, sub(fromBalance, amount))\\n }\\n // Increase and store the updated balance of `to`.\\n {\\n mstore(0x20, toSlotSeed)\\n let toBalanceSlot := keccak256(0x00, 0x40)\\n let toBalanceBefore := sload(toBalanceSlot)\\n let toBalanceAfter := add(toBalanceBefore, amount)\\n if lt(toBalanceAfter, toBalanceBefore) {\\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(toBalanceSlot, toBalanceAfter)\\n }\\n }\\n }\\n // Emit a {TransferBatch} event.\\n {\\n let m := mload(0x40)\\n // Copy the `ids`.\\n mstore(m, 0x40)\\n let n := shl(5, ids.length)\\n mstore(add(m, 0x40), ids.length)\\n calldatacopy(add(m, 0x60), ids.offset, n)\\n // Copy the `amounts`.\\n mstore(add(m, 0x20), add(0x60, n))\\n let o := add(add(m, n), 0x60)\\n mstore(o, ids.length)\\n calldatacopy(add(o, 0x20), amounts.offset, n)\\n // Do the emit.\\n log4(m, add(add(n, n), 0x80), _TRANSFER_BATCH_EVENT_SIGNATURE, caller(), from, to)\\n }\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransferCalldata(from, to, ids, amounts, data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Do the {onERC1155BatchReceived} check if `to` is a smart contract.\\n if extcodesize(to) {\\n mstore(0x00, to) // Cache `to` to prevent stack too deep.\\n let m := mload(0x40)\\n // Prepare the calldata.\\n // `onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)`.\\n mstore(m, 0xbc197c81)\\n mstore(add(m, 0x20), caller())\\n mstore(add(m, 0x40), from)\\n // Copy the `ids`.\\n mstore(add(m, 0x60), 0xa0)\\n let n := shl(5, ids.length)\\n mstore(add(m, 0xc0), ids.length)\\n calldatacopy(add(m, 0xe0), ids.offset, n)\\n // Copy the `amounts`.\\n mstore(add(m, 0x80), add(0xc0, n))\\n let o := add(add(m, n), 0xe0)\\n mstore(o, ids.length)\\n calldatacopy(add(o, 0x20), amounts.offset, n)\\n // Copy the `data`.\\n mstore(add(m, 0xa0), add(add(0xe0, n), n))\\n o := add(add(o, n), 0x20)\\n mstore(o, data.length)\\n calldatacopy(add(o, 0x20), data.offset, data.length)\\n let nAll := add(0x104, add(data.length, add(n, n)))\\n // Revert if the call reverts.\\n if iszero(call(gas(), mload(0x00), 0, add(mload(0x40), 0x1c), nAll, m, 0x20)) {\\n if returndatasize() {\\n // Bubble up the revert if the call reverts.\\n returndatacopy(m, 0x00, returndatasize())\\n revert(m, returndatasize())\\n }\\n }\\n // Load the returndata and compare it with the function selector.\\n if iszero(eq(mload(m), shl(224, 0xbc197c81))) {\\n mstore(0x00, 0x9c05499b) // `TransferToNonERC1155ReceiverImplementer()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n }\\n }\\n\\n /// @dev Returns the amounts of `ids` for `owners.\\n ///\\n /// Requirements:\\n /// - `owners` and `ids` must have the same length.\\n function balanceOfBatch(address[] calldata owners, uint256[] calldata ids)\\n public\\n view\\n virtual\\n returns (uint256[] memory balances)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n if iszero(eq(ids.length, owners.length)) {\\n mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.\\n revert(0x1c, 0x04)\\n }\\n balances := mload(0x40)\\n mstore(balances, ids.length)\\n let o := add(balances, 0x20)\\n let i := shl(5, ids.length)\\n mstore(0x40, add(i, o))\\n // Loop through all the `ids` and load the balances.\\n for {} i {} {\\n i := sub(i, 0x20)\\n let owner := calldataload(add(owners.offset, i))\\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, shl(96, owner)))\\n mstore(0x00, calldataload(add(ids.offset, i)))\\n mstore(add(o, i), sload(keccak256(0x00, 0x40)))\\n }\\n }\\n }\\n\\n /// @dev Returns true if this contract implements the interface defined by `interfaceId`.\\n /// See: https://eips.ethereum.org/EIPS/eip-165\\n /// This function call must use less than 30000 gas.\\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let s := shr(224, interfaceId)\\n // ERC165: 0x01ffc9a7, ERC1155: 0xd9b67a26, ERC1155MetadataURI: 0x0e89341c.\\n result := or(or(eq(s, 0x01ffc9a7), eq(s, 0xd9b67a26)), eq(s, 0x0e89341c))\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* INTERNAL MINT FUNCTIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Mints `amount` of `id` to `to`.\\n ///\\n /// Requirements:\\n /// - `to` cannot be the zero address.\\n /// - If `to` refers to a smart contract, it must implement\\n /// {ERC1155-onERC1155Received}, which is called upon a batch transfer.\\n ///\\n /// Emits a {TransferSingle} event.\\n function _mint(address to, uint256 id, uint256 amount, bytes memory data) internal virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(address(0), to, _single(id), _single(amount), data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n let to_ := shl(96, to)\\n // Revert if `to` is the zero address.\\n if iszero(to_) {\\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\\n revert(0x1c, 0x04)\\n }\\n // Increase and store the updated balance of `to`.\\n {\\n mstore(0x20, _ERC1155_MASTER_SLOT_SEED)\\n mstore(0x14, to)\\n mstore(0x00, id)\\n let toBalanceSlot := keccak256(0x00, 0x40)\\n let toBalanceBefore := sload(toBalanceSlot)\\n let toBalanceAfter := add(toBalanceBefore, amount)\\n if lt(toBalanceAfter, toBalanceBefore) {\\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(toBalanceSlot, toBalanceAfter)\\n }\\n // Emit a {TransferSingle} event.\\n mstore(0x20, amount)\\n log4(0x00, 0x40, _TRANSFER_SINGLE_EVENT_SIGNATURE, caller(), 0, shr(96, to_))\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(address(0), to, _single(id), _single(amount), data);\\n }\\n if (_hasCode(to)) _checkOnERC1155Received(address(0), to, id, amount, data);\\n }\\n\\n /// @dev Mints `amounts` of `ids` to `to`.\\n ///\\n /// Requirements:\\n /// - `to` cannot be the zero address.\\n /// - `ids` and `amounts` must have the same length.\\n /// - If `to` refers to a smart contract, it must implement\\n /// {ERC1155-onERC1155BatchReceived}, which is called upon a batch transfer.\\n ///\\n /// Emits a {TransferBatch} event.\\n function _batchMint(\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) internal virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(address(0), to, ids, amounts, data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n if iszero(eq(mload(ids), mload(amounts))) {\\n mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.\\n revert(0x1c, 0x04)\\n }\\n let to_ := shl(96, to)\\n // Revert if `to` is the zero address.\\n if iszero(to_) {\\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\\n revert(0x1c, 0x04)\\n }\\n // Loop through all the `ids` and update the balances.\\n {\\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, to_))\\n for { let i := shl(5, mload(ids)) } i { i := sub(i, 0x20) } {\\n let amount := mload(add(amounts, i))\\n // Increase and store the updated balance of `to`.\\n {\\n mstore(0x00, mload(add(ids, i)))\\n let toBalanceSlot := keccak256(0x00, 0x40)\\n let toBalanceBefore := sload(toBalanceSlot)\\n let toBalanceAfter := add(toBalanceBefore, amount)\\n if lt(toBalanceAfter, toBalanceBefore) {\\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(toBalanceSlot, toBalanceAfter)\\n }\\n }\\n }\\n // Emit a {TransferBatch} event.\\n {\\n let m := mload(0x40)\\n // Copy the `ids`.\\n mstore(m, 0x40)\\n let n := add(0x20, shl(5, mload(ids)))\\n let o := add(m, 0x40)\\n pop(staticcall(gas(), 4, ids, n, o, n))\\n // Copy the `amounts`.\\n mstore(add(m, 0x20), add(0x40, returndatasize()))\\n o := add(o, returndatasize())\\n n := add(0x20, shl(5, mload(amounts)))\\n pop(staticcall(gas(), 4, amounts, n, o, n))\\n n := sub(add(o, returndatasize()), m)\\n // Do the emit.\\n log4(m, n, _TRANSFER_BATCH_EVENT_SIGNATURE, caller(), 0, shr(96, to_))\\n }\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(address(0), to, ids, amounts, data);\\n }\\n if (_hasCode(to)) _checkOnERC1155BatchReceived(address(0), to, ids, amounts, data);\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* INTERNAL BURN FUNCTIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Equivalent to `_burn(address(0), from, id, amount)`.\\n function _burn(address from, uint256 id, uint256 amount) internal virtual {\\n _burn(address(0), from, id, amount);\\n }\\n\\n /// @dev Destroys `amount` of `id` from `from`.\\n ///\\n /// Requirements:\\n /// - `from` must have at least `amount` of `id`.\\n /// - If `by` is not the zero address, it must be either `from`,\\n /// or approved to manage the tokens of `from`.\\n ///\\n /// Emits a {TransferSingle} event.\\n function _burn(address by, address from, uint256 id, uint256 amount) internal virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(from, address(0), _single(id), _single(amount), \\\"\\\");\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n let from_ := shl(96, from)\\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, from_))\\n // If `by` is not the zero address, and not equal to `from`,\\n // check if it is approved to manage all the tokens of `from`.\\n if iszero(or(iszero(shl(96, by)), eq(shl(96, by), from_))) {\\n mstore(0x00, by)\\n if iszero(sload(keccak256(0x0c, 0x34))) {\\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n // Decrease and store the updated balance of `from`.\\n {\\n mstore(0x00, id)\\n let fromBalanceSlot := keccak256(0x00, 0x40)\\n let fromBalance := sload(fromBalanceSlot)\\n if gt(amount, fromBalance) {\\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(fromBalanceSlot, sub(fromBalance, amount))\\n }\\n // Emit a {TransferSingle} event.\\n mstore(0x20, amount)\\n log4(0x00, 0x40, _TRANSFER_SINGLE_EVENT_SIGNATURE, caller(), shr(96, from_), 0)\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(from, address(0), _single(id), _single(amount), \\\"\\\");\\n }\\n }\\n\\n /// @dev Equivalent to `_batchBurn(address(0), from, ids, amounts)`.\\n function _batchBurn(address from, uint256[] memory ids, uint256[] memory amounts)\\n internal\\n virtual\\n {\\n _batchBurn(address(0), from, ids, amounts);\\n }\\n\\n /// @dev Destroys `amounts` of `ids` from `from`.\\n ///\\n /// Requirements:\\n /// - `ids` and `amounts` must have the same length.\\n /// - `from` must have at least `amounts` of `ids`.\\n /// - If `by` is not the zero address, it must be either `from`,\\n /// or approved to manage the tokens of `from`.\\n ///\\n /// Emits a {TransferBatch} event.\\n function _batchBurn(address by, address from, uint256[] memory ids, uint256[] memory amounts)\\n internal\\n virtual\\n {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(from, address(0), ids, amounts, \\\"\\\");\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n if iszero(eq(mload(ids), mload(amounts))) {\\n mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.\\n revert(0x1c, 0x04)\\n }\\n let from_ := shl(96, from)\\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, from_))\\n // If `by` is not the zero address, and not equal to `from`,\\n // check if it is approved to manage all the tokens of `from`.\\n let by_ := shl(96, by)\\n if iszero(or(iszero(by_), eq(by_, from_))) {\\n mstore(0x00, by)\\n if iszero(sload(keccak256(0x0c, 0x34))) {\\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n // Loop through all the `ids` and update the balances.\\n {\\n for { let i := shl(5, mload(ids)) } i { i := sub(i, 0x20) } {\\n let amount := mload(add(amounts, i))\\n // Decrease and store the updated balance of `from`.\\n {\\n mstore(0x00, mload(add(ids, i)))\\n let fromBalanceSlot := keccak256(0x00, 0x40)\\n let fromBalance := sload(fromBalanceSlot)\\n if gt(amount, fromBalance) {\\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(fromBalanceSlot, sub(fromBalance, amount))\\n }\\n }\\n }\\n // Emit a {TransferBatch} event.\\n {\\n let m := mload(0x40)\\n // Copy the `ids`.\\n mstore(m, 0x40)\\n let n := add(0x20, shl(5, mload(ids)))\\n let o := add(m, 0x40)\\n pop(staticcall(gas(), 4, ids, n, o, n))\\n // Copy the `amounts`.\\n mstore(add(m, 0x20), add(0x40, returndatasize()))\\n o := add(o, returndatasize())\\n n := add(0x20, shl(5, mload(amounts)))\\n pop(staticcall(gas(), 4, amounts, n, o, n))\\n n := sub(add(o, returndatasize()), m)\\n // Do the emit.\\n log4(m, n, _TRANSFER_BATCH_EVENT_SIGNATURE, caller(), shr(96, from_), 0)\\n }\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(from, address(0), ids, amounts, \\\"\\\");\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* INTERNAL APPROVAL FUNCTIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Approve or remove the `operator` as an operator for `by`,\\n /// without authorization checks.\\n ///\\n /// Emits a {ApprovalForAll} event.\\n function _setApprovalForAll(address by, address operator, bool isApproved) internal virtual {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Convert to 0 or 1.\\n isApproved := iszero(iszero(isApproved))\\n // Update the `isApproved` for (`by`, `operator`).\\n mstore(0x20, _ERC1155_MASTER_SLOT_SEED)\\n mstore(0x14, by)\\n mstore(0x00, operator)\\n sstore(keccak256(0x0c, 0x34), isApproved)\\n // Emit the {ApprovalForAll} event.\\n mstore(0x00, isApproved)\\n let m := shr(96, not(0))\\n log3(0x00, 0x20, _APPROVAL_FOR_ALL_EVENT_SIGNATURE, and(m, by), and(m, operator))\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* INTERNAL TRANSFER FUNCTIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Equivalent to `_safeTransfer(address(0), from, to, id, amount, data)`.\\n function _safeTransfer(address from, address to, uint256 id, uint256 amount, bytes memory data)\\n internal\\n virtual\\n {\\n _safeTransfer(address(0), from, to, id, amount, data);\\n }\\n\\n /// @dev Transfers `amount` of `id` from `from` to `to`.\\n ///\\n /// Requirements:\\n /// - `to` cannot be the zero address.\\n /// - `from` must have at least `amount` of `id`.\\n /// - If `by` is not the zero address, it must be either `from`,\\n /// or approved to manage the tokens of `from`.\\n /// - If `to` refers to a smart contract, it must implement\\n /// {ERC1155-onERC1155Received}, which is called upon a batch transfer.\\n ///\\n /// Emits a {TransferSingle} event.\\n function _safeTransfer(\\n address by,\\n address from,\\n address to,\\n uint256 id,\\n uint256 amount,\\n bytes memory data\\n ) internal virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(from, to, _single(id), _single(amount), data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n let from_ := shl(96, from)\\n let to_ := shl(96, to)\\n // Revert if `to` is the zero address.\\n if iszero(to_) {\\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\\n revert(0x1c, 0x04)\\n }\\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, from_))\\n // If `by` is not the zero address, and not equal to `from`,\\n // check if it is approved to manage all the tokens of `from`.\\n let by_ := shl(96, by)\\n if iszero(or(iszero(by_), eq(by_, from_))) {\\n mstore(0x00, by)\\n if iszero(sload(keccak256(0x0c, 0x34))) {\\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n // Subtract and store the updated balance of `from`.\\n {\\n mstore(0x00, id)\\n let fromBalanceSlot := keccak256(0x00, 0x40)\\n let fromBalance := sload(fromBalanceSlot)\\n if gt(amount, fromBalance) {\\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(fromBalanceSlot, sub(fromBalance, amount))\\n }\\n // Increase and store the updated balance of `to`.\\n {\\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, to_))\\n let toBalanceSlot := keccak256(0x00, 0x40)\\n let toBalanceBefore := sload(toBalanceSlot)\\n let toBalanceAfter := add(toBalanceBefore, amount)\\n if lt(toBalanceAfter, toBalanceBefore) {\\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(toBalanceSlot, toBalanceAfter)\\n }\\n // Emit a {TransferSingle} event.\\n mstore(0x20, amount)\\n // forgefmt: disable-next-line\\n log4(0x00, 0x40, _TRANSFER_SINGLE_EVENT_SIGNATURE, caller(), shr(96, from_), shr(96, to_))\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(from, to, _single(id), _single(amount), data);\\n }\\n if (_hasCode(to)) _checkOnERC1155Received(from, to, id, amount, data);\\n }\\n\\n /// @dev Equivalent to `_safeBatchTransfer(address(0), from, to, ids, amounts, data)`.\\n function _safeBatchTransfer(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) internal virtual {\\n _safeBatchTransfer(address(0), from, to, ids, amounts, data);\\n }\\n\\n /// @dev Transfers `amounts` of `ids` from `from` to `to`.\\n ///\\n /// Requirements:\\n /// - `to` cannot be the zero address.\\n /// - `ids` and `amounts` must have the same length.\\n /// - `from` must have at least `amounts` of `ids`.\\n /// - If `by` is not the zero address, it must be either `from`,\\n /// or approved to manage the tokens of `from`.\\n /// - If `to` refers to a smart contract, it must implement\\n /// {ERC1155-onERC1155BatchReceived}, which is called upon a batch transfer.\\n ///\\n /// Emits a {TransferBatch} event.\\n function _safeBatchTransfer(\\n address by,\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) internal virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(from, to, ids, amounts, data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n if iszero(eq(mload(ids), mload(amounts))) {\\n mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.\\n revert(0x1c, 0x04)\\n }\\n let from_ := shl(96, from)\\n let to_ := shl(96, to)\\n // Revert if `to` is the zero address.\\n if iszero(to_) {\\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\\n revert(0x1c, 0x04)\\n }\\n let fromSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, from_)\\n let toSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, to_)\\n mstore(0x20, fromSlotSeed)\\n // If `by` is not the zero address, and not equal to `from`,\\n // check if it is approved to manage all the tokens of `from`.\\n let by_ := shl(96, by)\\n if iszero(or(iszero(by_), eq(by_, from_))) {\\n mstore(0x00, by)\\n if iszero(sload(keccak256(0x0c, 0x34))) {\\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n // Loop through all the `ids` and update the balances.\\n {\\n for { let i := shl(5, mload(ids)) } i { i := sub(i, 0x20) } {\\n let amount := mload(add(amounts, i))\\n // Subtract and store the updated balance of `from`.\\n {\\n mstore(0x20, fromSlotSeed)\\n mstore(0x00, mload(add(ids, i)))\\n let fromBalanceSlot := keccak256(0x00, 0x40)\\n let fromBalance := sload(fromBalanceSlot)\\n if gt(amount, fromBalance) {\\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(fromBalanceSlot, sub(fromBalance, amount))\\n }\\n // Increase and store the updated balance of `to`.\\n {\\n mstore(0x20, toSlotSeed)\\n let toBalanceSlot := keccak256(0x00, 0x40)\\n let toBalanceBefore := sload(toBalanceSlot)\\n let toBalanceAfter := add(toBalanceBefore, amount)\\n if lt(toBalanceAfter, toBalanceBefore) {\\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(toBalanceSlot, toBalanceAfter)\\n }\\n }\\n }\\n // Emit a {TransferBatch} event.\\n {\\n let m := mload(0x40)\\n // Copy the `ids`.\\n mstore(m, 0x40)\\n let n := add(0x20, shl(5, mload(ids)))\\n let o := add(m, 0x40)\\n pop(staticcall(gas(), 4, ids, n, o, n))\\n // Copy the `amounts`.\\n mstore(add(m, 0x20), add(0x40, returndatasize()))\\n o := add(o, returndatasize())\\n n := add(0x20, shl(5, mload(amounts)))\\n pop(staticcall(gas(), 4, amounts, n, o, n))\\n n := sub(add(o, returndatasize()), m)\\n // Do the emit.\\n log4(m, n, _TRANSFER_BATCH_EVENT_SIGNATURE, caller(), shr(96, from_), shr(96, to_))\\n }\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(from, to, ids, amounts, data);\\n }\\n if (_hasCode(to)) _checkOnERC1155BatchReceived(from, to, ids, amounts, data);\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* HOOKS FOR OVERRIDING */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Override this function to return true if `_beforeTokenTransfer` is used.\\n /// This is to help the compiler avoid producing dead bytecode.\\n function _useBeforeTokenTransfer() internal view virtual returns (bool) {\\n return false;\\n }\\n\\n /// @dev Hook that is called before any token transfer.\\n /// This includes minting and burning, as well as batched variants.\\n ///\\n /// The same hook is called on both single and batched variants.\\n /// For single transfers, the length of the `id` and `amount` arrays are 1.\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) internal virtual {}\\n\\n /// @dev Override this function to return true if `_afterTokenTransfer` is used.\\n /// This is to help the compiler avoid producing dead bytecode.\\n function _useAfterTokenTransfer() internal view virtual returns (bool) {\\n return false;\\n }\\n\\n /// @dev Hook that is called after any token transfer.\\n /// This includes minting and burning, as well as batched variants.\\n ///\\n /// The same hook is called on both single and batched variants.\\n /// For single transfers, the length of the `id` and `amount` arrays are 1.\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) internal virtual {}\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* PRIVATE HELPERS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Helper for calling the `_afterTokenTransfer` hook.\\n /// This is to help the compiler avoid producing dead bytecode.\\n function _afterTokenTransferCalldata(\\n address from,\\n address to,\\n uint256[] calldata ids,\\n uint256[] calldata amounts,\\n bytes calldata data\\n ) private {\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(from, to, ids, amounts, data);\\n }\\n }\\n\\n /// @dev Returns if `a` has bytecode of non-zero length.\\n function _hasCode(address a) private view returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := extcodesize(a) // Can handle dirty upper bits.\\n }\\n }\\n\\n /// @dev Perform a call to invoke {IERC1155Receiver-onERC1155Received} on `to`.\\n /// Reverts if the target does not support the function correctly.\\n function _checkOnERC1155Received(\\n address from,\\n address to,\\n uint256 id,\\n uint256 amount,\\n bytes memory data\\n ) private {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Prepare the calldata.\\n let m := mload(0x40)\\n // `onERC1155Received(address,address,uint256,uint256,bytes)`.\\n mstore(m, 0xf23a6e61)\\n mstore(add(m, 0x20), caller())\\n mstore(add(m, 0x40), shr(96, shl(96, from)))\\n mstore(add(m, 0x60), id)\\n mstore(add(m, 0x80), amount)\\n mstore(add(m, 0xa0), 0xa0)\\n let n := mload(data)\\n mstore(add(m, 0xc0), n)\\n if n { pop(staticcall(gas(), 4, add(data, 0x20), n, add(m, 0xe0), n)) }\\n // Revert if the call reverts.\\n if iszero(call(gas(), to, 0, add(m, 0x1c), add(0xc4, n), m, 0x20)) {\\n if returndatasize() {\\n // Bubble up the revert if the call reverts.\\n returndatacopy(m, 0x00, returndatasize())\\n revert(m, returndatasize())\\n }\\n }\\n // Load the returndata and compare it with the function selector.\\n if iszero(eq(mload(m), shl(224, 0xf23a6e61))) {\\n mstore(0x00, 0x9c05499b) // `TransferToNonERC1155ReceiverImplementer()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n }\\n\\n /// @dev Perform a call to invoke {IERC1155Receiver-onERC1155BatchReceived} on `to`.\\n /// Reverts if the target does not support the function correctly.\\n function _checkOnERC1155BatchReceived(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) private {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Prepare the calldata.\\n let m := mload(0x40)\\n // `onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)`.\\n mstore(m, 0xbc197c81)\\n mstore(add(m, 0x20), caller())\\n mstore(add(m, 0x40), shr(96, shl(96, from)))\\n // Copy the `ids`.\\n mstore(add(m, 0x60), 0xa0)\\n let n := add(0x20, shl(5, mload(ids)))\\n let o := add(m, 0xc0)\\n pop(staticcall(gas(), 4, ids, n, o, n))\\n // Copy the `amounts`.\\n let s := add(0xa0, returndatasize())\\n mstore(add(m, 0x80), s)\\n o := add(o, returndatasize())\\n n := add(0x20, shl(5, mload(amounts)))\\n pop(staticcall(gas(), 4, amounts, n, o, n))\\n // Copy the `data`.\\n mstore(add(m, 0xa0), add(s, returndatasize()))\\n o := add(o, returndatasize())\\n n := add(0x20, mload(data))\\n pop(staticcall(gas(), 4, data, n, o, n))\\n n := sub(add(o, returndatasize()), add(m, 0x1c))\\n // Revert if the call reverts.\\n if iszero(call(gas(), to, 0, add(m, 0x1c), n, m, 0x20)) {\\n if returndatasize() {\\n // Bubble up the revert if the call reverts.\\n returndatacopy(m, 0x00, returndatasize())\\n revert(m, returndatasize())\\n }\\n }\\n // Load the returndata and compare it with the function selector.\\n if iszero(eq(mload(m), shl(224, 0xbc197c81))) {\\n mstore(0x00, 0x9c05499b) // `TransferToNonERC1155ReceiverImplementer()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n }\\n\\n /// @dev Returns `x` in an array with a single element.\\n function _single(uint256 x) private pure returns (uint256[] memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n mstore(0x40, add(result, 0x40))\\n mstore(result, 1)\\n mstore(add(result, 0x20), x)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x306249cc3611727ffa9e15ec816282a60fd9629e5ea03ab1c780d638d1537c68\",\"license\":\"MIT\"},\"src/tokens/ERC1155/extensions/supply/ERC1155Supply.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\nimport { IERC1155Supply, IERC1155SupplyFunctions } from \\\"./IERC1155Supply.sol\\\";\\n\\nimport { ERC1155 } from \\\"solady/tokens/ERC1155.sol\\\";\\n\\n/**\\n * An ERC-1155 extension that tracks token supply.\\n */\\nabstract contract ERC1155Supply is ERC1155, IERC1155Supply {\\n\\n // Current supply\\n uint256 public totalSupply;\\n mapping(uint256 => uint256) public tokenSupply;\\n\\n /**\\n * Mint _amount of tokens of a given id\\n * @param _to The address to mint tokens to\\n * @param _id Token id to mint\\n * @param _amount The amount to be minted\\n * @param _data Data to pass if receiver is contract\\n */\\n function _mint(address _to, uint256 _id, uint256 _amount, bytes memory _data) internal virtual override {\\n super._mint(_to, _id, _amount, _data);\\n\\n totalSupply += _amount;\\n tokenSupply[_id] += _amount;\\n }\\n\\n /**\\n * Mint tokens for each ids in _ids\\n * @param _to The address to mint tokens to\\n * @param _ids Array of ids to mint\\n * @param _amounts Array of amount of tokens to mint per id\\n * @param _data Data to pass if receiver is contract\\n */\\n function _batchMint(\\n address _to,\\n uint256[] memory _ids,\\n uint256[] memory _amounts,\\n bytes memory _data\\n ) internal virtual override {\\n super._batchMint(_to, _ids, _amounts, _data);\\n\\n uint256 nMint = _ids.length;\\n uint256 totalAmount = 0;\\n for (uint256 i; i < nMint;) {\\n uint256 amount = _amounts[i];\\n totalAmount += amount;\\n tokenSupply[_ids[i]] += amount;\\n unchecked {\\n // Already checked in super._batchMint\\n ++i;\\n }\\n }\\n totalSupply += totalAmount;\\n }\\n\\n /**\\n * Burn _amount of tokens of a given token id\\n * @param _from The address to burn tokens from\\n * @param _id Token id to burn\\n * @param _amount The amount to be burned\\n */\\n function _burn(address _from, uint256 _id, uint256 _amount) internal virtual override {\\n super._burn(_from, _id, _amount);\\n\\n totalSupply -= _amount;\\n tokenSupply[_id] -= _amount;\\n }\\n\\n /**\\n * Burn tokens of given token id for each (_ids[i], _amounts[i]) pair\\n * @param _from The address to burn tokens from\\n * @param _ids Array of token ids to burn\\n * @param _amounts Array of the amount to be burned\\n */\\n function _batchBurn(address _from, uint256[] memory _ids, uint256[] memory _amounts) internal virtual override {\\n super._batchBurn(_from, _ids, _amounts);\\n\\n uint256 nBurn = _ids.length;\\n uint256 totalAmount = 0;\\n for (uint256 i; i < nBurn;) {\\n uint256 amount = _amounts[i];\\n tokenSupply[_ids[i]] -= amount;\\n totalAmount += amount;\\n unchecked {\\n // Already checked in super._batchBurn\\n ++i;\\n }\\n }\\n totalSupply -= totalAmount;\\n }\\n\\n //\\n // Views\\n //\\n\\n /**\\n * Check interface support.\\n * @param interfaceId Interface id\\n * @return True if supported\\n */\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view virtual override(ERC1155) returns (bool) {\\n return type(IERC1155SupplyFunctions).interfaceId == interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n}\\n\",\"keccak256\":\"0xc2cf8d5479a9cafcc2e92e3c8e9f4afce7fa2416cc811acbb766cf45db3692f0\",\"license\":\"Apache-2.0\"},\"src/tokens/ERC1155/extensions/supply/IERC1155Supply.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\ninterface IERC1155SupplyFunctions {\\n\\n /**\\n * Returns the total supply of ERC1155 tokens.\\n */\\n function totalSupply() external returns (uint256);\\n\\n /**\\n * Returns the total supply of a given ERC1155 token.\\n * @param tokenId The ERC1155 token id.\\n */\\n function tokenSupply(\\n uint256 tokenId\\n ) external returns (uint256);\\n\\n}\\n\\ninterface IERC1155SupplySignals {\\n\\n /**\\n * Invalid array input length.\\n */\\n error InvalidArrayLength();\\n\\n}\\n\\ninterface IERC1155Supply is IERC1155SupplySignals { }\\n\",\"keccak256\":\"0x135a8948daebd1229d6bada5ada73f2b3496c9bd9f8cfc78d7a68a0f117e55b5\",\"license\":\"Apache-2.0\"}},\"version\":1}", + "userdoc": { + "errors": { + "InvalidArrayLength()": [ + { + "notice": "Invalid array input length." + } + ] + }, + "kind": "user", + "methods": { + "supportsInterface(bytes4)": { + "notice": "Check interface support." + } + }, + "notice": "An ERC-1155 extension that tracks token supply.", + "version": 1 + } + } + }, + "src/tokens/ERC1155/extensions/supply/IERC1155Supply.sol": { + "IERC1155Supply": { + "abi": [ + { + "inputs": [], + "name": "InvalidArrayLength", + "type": "error" + } + ], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidArrayLength\",\"type\":\"error\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"errors\":{\"InvalidArrayLength()\":[{\"notice\":\"Invalid array input length.\"}]},\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/tokens/ERC1155/extensions/supply/IERC1155Supply.sol\":\"IERC1155Supply\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"src/tokens/ERC1155/extensions/supply/IERC1155Supply.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\ninterface IERC1155SupplyFunctions {\\n\\n /**\\n * Returns the total supply of ERC1155 tokens.\\n */\\n function totalSupply() external returns (uint256);\\n\\n /**\\n * Returns the total supply of a given ERC1155 token.\\n * @param tokenId The ERC1155 token id.\\n */\\n function tokenSupply(\\n uint256 tokenId\\n ) external returns (uint256);\\n\\n}\\n\\ninterface IERC1155SupplySignals {\\n\\n /**\\n * Invalid array input length.\\n */\\n error InvalidArrayLength();\\n\\n}\\n\\ninterface IERC1155Supply is IERC1155SupplySignals { }\\n\",\"keccak256\":\"0x135a8948daebd1229d6bada5ada73f2b3496c9bd9f8cfc78d7a68a0f117e55b5\",\"license\":\"Apache-2.0\"}},\"version\":1}", + "userdoc": { + "errors": { + "InvalidArrayLength()": [ + { + "notice": "Invalid array input length." + } + ] + }, + "kind": "user", + "methods": {}, + "version": 1 + } + }, + "IERC1155SupplyFunctions": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "tokenSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "tokenSupply(uint256)": { + "params": { + "tokenId": "The ERC1155 token id." + } + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "tokenSupply(uint256)": "2693ebf2", + "totalSupply()": "18160ddd" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"tokenSupply(uint256)\":{\"params\":{\"tokenId\":\"The ERC1155 token id.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"tokenSupply(uint256)\":{\"notice\":\"Returns the total supply of a given ERC1155 token.\"},\"totalSupply()\":{\"notice\":\"Returns the total supply of ERC1155 tokens.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/tokens/ERC1155/extensions/supply/IERC1155Supply.sol\":\"IERC1155SupplyFunctions\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"src/tokens/ERC1155/extensions/supply/IERC1155Supply.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\ninterface IERC1155SupplyFunctions {\\n\\n /**\\n * Returns the total supply of ERC1155 tokens.\\n */\\n function totalSupply() external returns (uint256);\\n\\n /**\\n * Returns the total supply of a given ERC1155 token.\\n * @param tokenId The ERC1155 token id.\\n */\\n function tokenSupply(\\n uint256 tokenId\\n ) external returns (uint256);\\n\\n}\\n\\ninterface IERC1155SupplySignals {\\n\\n /**\\n * Invalid array input length.\\n */\\n error InvalidArrayLength();\\n\\n}\\n\\ninterface IERC1155Supply is IERC1155SupplySignals { }\\n\",\"keccak256\":\"0x135a8948daebd1229d6bada5ada73f2b3496c9bd9f8cfc78d7a68a0f117e55b5\",\"license\":\"Apache-2.0\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": { + "tokenSupply(uint256)": { + "notice": "Returns the total supply of a given ERC1155 token." + }, + "totalSupply()": { + "notice": "Returns the total supply of ERC1155 tokens." + } + }, + "version": 1 + } + }, + "IERC1155SupplySignals": { + "abi": [ + { + "inputs": [], + "name": "InvalidArrayLength", + "type": "error" + } + ], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidArrayLength\",\"type\":\"error\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"errors\":{\"InvalidArrayLength()\":[{\"notice\":\"Invalid array input length.\"}]},\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/tokens/ERC1155/extensions/supply/IERC1155Supply.sol\":\"IERC1155SupplySignals\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"src/tokens/ERC1155/extensions/supply/IERC1155Supply.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\ninterface IERC1155SupplyFunctions {\\n\\n /**\\n * Returns the total supply of ERC1155 tokens.\\n */\\n function totalSupply() external returns (uint256);\\n\\n /**\\n * Returns the total supply of a given ERC1155 token.\\n * @param tokenId The ERC1155 token id.\\n */\\n function tokenSupply(\\n uint256 tokenId\\n ) external returns (uint256);\\n\\n}\\n\\ninterface IERC1155SupplySignals {\\n\\n /**\\n * Invalid array input length.\\n */\\n error InvalidArrayLength();\\n\\n}\\n\\ninterface IERC1155Supply is IERC1155SupplySignals { }\\n\",\"keccak256\":\"0x135a8948daebd1229d6bada5ada73f2b3496c9bd9f8cfc78d7a68a0f117e55b5\",\"license\":\"Apache-2.0\"}},\"version\":1}", + "userdoc": { + "errors": { + "InvalidArrayLength()": [ + { + "notice": "Invalid array input length." + } + ] + }, + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "src/tokens/ERC1155/presets/items/ERC1155Items.sol": { + "ERC1155Items": { + "abi": [ + { + "inputs": [], + "name": "AccountBalanceOverflow", + "type": "error" + }, + { + "inputs": [], + "name": "ArrayLengthsMismatch", + "type": "error" + }, + { + "inputs": [], + "name": "InsufficientBalance", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidArrayLength", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [], + "name": "NotOwnerNorApproved", + "type": "error" + }, + { + "inputs": [], + "name": "TransferToNonERC1155ReceiverImplementer", + "type": "error" + }, + { + "inputs": [], + "name": "TransferToZeroAddress", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "isApproved", + "type": "bool" + } + ], + "name": "ApprovalForAll", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "ids", + "type": "uint256[]" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "name": "TransferBatch", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "TransferSingle", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "value", + "type": "string" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "URI", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "wallet", + "type": "address" + }, + { + "components": [ + { + "internalType": "address", + "name": "approvedSigner", + "type": "address" + }, + { + "internalType": "bytes4", + "name": "identityType", + "type": "bytes4" + }, + { + "internalType": "bytes32", + "name": "issuerHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "audienceHash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "applicationData", + "type": "bytes" + }, + { + "components": [ + { + "internalType": "string", + "name": "redirectUrl", + "type": "string" + }, + { + "internalType": "uint64", + "name": "issuedAt", + "type": "uint64" + } + ], + "internalType": "struct AuthData", + "name": "authData", + "type": "tuple" + } + ], + "internalType": "struct Attestation", + "name": "attestation", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call", + "name": "call", + "type": "tuple" + } + ], + "name": "acceptImplicitRequest", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "owners", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "ids", + "type": "uint256[]" + } + ], + "name": "balanceOfBatch", + "outputs": [ + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "baseURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "name": "batchBurn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "batchMint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "contractURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "string", + "name": "tokenName", + "type": "string" + }, + { + "internalType": "string", + "name": "tokenBaseURI", + "type": "string" + }, + { + "internalType": "string", + "name": "tokenContractURI", + "type": "string" + }, + { + "internalType": "address", + "name": "royaltyReceiver", + "type": "address" + }, + { + "internalType": "uint96", + "name": "royaltyFeeNumerator", + "type": "uint96" + }, + { + "internalType": "address", + "name": "implicitModeValidator", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "implicitModeProjectId", + "type": "bytes32" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "result", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "salePrice", + "type": "uint256" + } + ], + "name": "royaltyInfo", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "ids", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "safeBatchTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "isApproved", + "type": "bool" + } + ], + "name": "setApprovalForAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "tokenBaseURI", + "type": "string" + } + ], + "name": "setBaseMetadataURI", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "tokenName", + "type": "string" + } + ], + "name": "setContractName", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "tokenContractURI", + "type": "string" + } + ], + "name": "setContractURI", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "uint96", + "name": "feeNumerator", + "type": "uint96" + } + ], + "name": "setDefaultRoyalty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "projectId", + "type": "bytes32" + } + ], + "name": "setImplicitModeProjectId", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "validator", + "type": "address" + } + ], + "name": "setImplicitModeValidator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "uint96", + "name": "feeNumerator", + "type": "uint96" + } + ], + "name": "setTokenRoyalty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "tokenSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "uri", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "errors": { + "AccountBalanceOverflow()": [ + { + "details": "The recipient's balance has overflowed." + } + ], + "ArrayLengthsMismatch()": [ + { + "details": "The lengths of the input arrays are not the same." + } + ], + "InsufficientBalance()": [ + { + "details": "Insufficient balance." + } + ], + "NotOwnerNorApproved()": [ + { + "details": "Only the token owner or an approved account can manage the tokens." + } + ], + "TransferToNonERC1155ReceiverImplementer()": [ + { + "details": "Cannot safely transfer to a contract that does not implement the ERC1155Receiver interface." + } + ], + "TransferToZeroAddress()": [ + { + "details": "Cannot mint or transfer to the zero address." + } + ] + }, + "events": { + "ApprovalForAll(address,address,bool)": { + "details": "Emitted when `owner` enables or disables `operator` to manage all of their tokens." + }, + "RoleAdminChanged(bytes32,bytes32,bytes32)": { + "details": "Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this. _Available since v3.1._" + }, + "RoleGranted(bytes32,address,address)": { + "details": "Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}." + }, + "RoleRevoked(bytes32,address,address)": { + "details": "Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)" + }, + "TransferBatch(address,address,address,uint256[],uint256[])": { + "details": "Emitted when `amounts` of token `ids` are transferred from `from` to `to` by `operator`." + }, + "TransferSingle(address,address,address,uint256,uint256)": { + "details": "Emitted when `amount` of token `id` is transferred from `from` to `to` by `operator`." + }, + "URI(string,uint256)": { + "details": "Emitted when the Uniform Resource Identifier (URI) for token `id` is updated to `value`. This event is not used in the base contract. You may need to emit this event depending on your URI logic. See: https://eips.ethereum.org/EIPS/eip-1155#metadata" + } + }, + "kind": "dev", + "methods": { + "acceptImplicitRequest(address,(address,bytes4,bytes32,bytes32,bytes,(string,uint64)),(address,uint256,bytes,uint256,bool,bool,uint256))": { + "params": { + "attestation": "The attestation data", + "call": "The call to validate", + "wallet": "The wallet's address" + }, + "returns": { + "_0": "The hash of the implicit request if valid" + } + }, + "balanceOf(address,uint256)": { + "details": "Returns the amount of `id` owned by `owner`." + }, + "balanceOfBatch(address[],uint256[])": { + "details": "Returns the amounts of `ids` for `owners. Requirements: - `owners` and `ids` must have the same length." + }, + "batchBurn(uint256[],uint256[])": { + "params": { + "amounts": "Array of the amount to be burned", + "tokenIds": "Array of token ids to burn" + } + }, + "batchMint(address,uint256[],uint256[],bytes)": { + "params": { + "amounts": "Amounts of tokens to mint.", + "data": "Data to pass if receiver is contract.", + "to": "Address to mint tokens to.", + "tokenIds": "Token IDs to mint." + } + }, + "burn(uint256,uint256)": { + "params": { + "amount": "Amount of tokens to burn", + "tokenId": "Id of token to burn" + } + }, + "getRoleAdmin(bytes32)": { + "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}." + }, + "getRoleMember(bytes32,uint256)": { + "details": "Returns one of the accounts that have `role`. `index` must be a value between 0 and {getRoleMemberCount}, non-inclusive. Role bearers are not sorted in any particular way, and their ordering may change at any point. WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure you perform all queries on the same block. See the following https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] for more information." + }, + "getRoleMemberCount(bytes32)": { + "details": "Returns the number of accounts that have `role`. Can be used together with {getRoleMember} to enumerate all bearers of a role." + }, + "grantRole(bytes32,address)": { + "details": "Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event." + }, + "hasRole(bytes32,address)": { + "details": "Returns `true` if `account` has been granted `role`." + }, + "initialize(address,string,string,string,address,uint96,address,bytes32)": { + "details": "This should be called immediately after deployment.", + "params": { + "implicitModeProjectId": "The implicit mode project id", + "implicitModeValidator": "The implicit mode validator address", + "owner": "Owner address", + "royaltyFeeNumerator": "The royalty fee numerator in basis points (e.g. 15% would be 1500)", + "royaltyReceiver": "Address of who should be sent the royalty payment", + "tokenBaseURI": "Base URI for token metadata", + "tokenContractURI": "Contract URI for token metadata", + "tokenName": "Token name" + } + }, + "isApprovedForAll(address,address)": { + "details": "Returns whether `operator` is approved to manage the tokens of `owner`." + }, + "mint(address,uint256,uint256,bytes)": { + "params": { + "amount": "Amount of tokens to mint.", + "data": "Data to pass if receiver is contract.", + "to": "Address to mint tokens to.", + "tokenId": "Token ID to mint." + } + }, + "renounceRole(bytes32,address)": { + "details": "Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event." + }, + "revokeRole(bytes32,address)": { + "details": "Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event." + }, + "royaltyInfo(uint256,uint256)": { + "details": "Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of exchange. The royalty amount is denominated and should be paid in that same unit of exchange." + }, + "safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)": { + "details": "Transfers `amounts` of `ids` from `from` to `to`. Requirements: - `to` cannot be the zero address. - `from` must have at least `amount` of `id`. - `ids` and `amounts` must have the same length. - If the caller is not `from`, it must be approved to manage the tokens of `from`. - If `to` refers to a smart contract, it must implement {ERC1155-onERC1155BatchReceived}, which is called upon a batch transfer. Emits a {TransferBatch} event." + }, + "safeTransferFrom(address,address,uint256,uint256,bytes)": { + "details": "Transfers `amount` of `id` from `from` to `to`. Requirements: - `to` cannot be the zero address. - `from` must have at least `amount` of `id`. - If the caller is not `from`, it must be approved to manage the tokens of `from`. - If `to` refers to a smart contract, it must implement {ERC1155-onERC1155Received}, which is called upon a batch transfer. Emits a {TransferSingle} event." + }, + "setApprovalForAll(address,bool)": { + "details": "Sets whether `operator` is approved to manage the tokens of the caller. Emits a {ApprovalForAll} event." + }, + "setBaseMetadataURI(string)": { + "params": { + "tokenBaseURI": "New base URI of token's URI" + } + }, + "setContractName(string)": { + "params": { + "tokenName": "New contract name" + } + }, + "setContractURI(string)": { + "params": { + "tokenContractURI": "New contract URI of token's URI" + } + }, + "setDefaultRoyalty(address,uint96)": { + "params": { + "feeNumerator": "The royalty fee numerator in basis points (e.g. 15% would be 1500)", + "receiver": "Address of who should be sent the royalty payment" + } + }, + "setImplicitModeProjectId(bytes32)": { + "params": { + "projectId": "The project id." + } + }, + "setImplicitModeValidator(address)": { + "params": { + "validator": "The validator address." + } + }, + "setTokenRoyalty(uint256,address,uint96)": { + "params": { + "feeNumerator": "The royalty fee numerator in basis points (e.g. 15% would be 1500)", + "receiver": "Address of who should be sent the royalty payment", + "tokenId": "The token id to set the royalty information for" + } + }, + "supportsInterface(bytes4)": { + "params": { + "interfaceId": "Interface id" + }, + "returns": { + "_0": "True if supported" + } + }, + "uri(uint256)": { + "details": "Returns the URI for token `id`. You can either return the same templated URI for all token IDs, (e.g. \"https://example.com/api/{id}.json\"), or return a unique URI for each `id`. See: https://eips.ethereum.org/EIPS/eip-1155#metadata" + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": { + "allocate_unbounded": { + "entryPoint": 32, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb": { + "entryPoint": 38, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + } + }, + "generatedSources": [], + "linkReferences": {}, + "object": "608060405234601c57600e6020565b614b1b61002c8239614b1b90f35b6026565b60405190565b600080fdfe60806040526004361015610013575b611806565b61001e60003561024c565b8062fdd58e1461024757806301ffc9a71461024257806304634d8d1461023d57806306fdde03146102385780630b5ee006146102335780630bb310de1461022e5780630e89341c1461022957806318160ddd1461022457806320ec271b1461021f578063248a9ca31461021a5780632693ebf2146102155780632a55205a146102105780632eb2c2d61461020b5780632f2ff15d1461020657806336568abe146102015780634e1273f4146101fc5780635944c753146101f75780636c0360eb146101f2578063731133e9146101ed5780637e518ec8146101e85780638ff83ac1146101e35780639010d07c146101de57806391d14854146101d9578063938e3d7b146101d45780639d043a66146101cf578063a217fddf146101ca578063a22cb465146101c5578063b390c0ab146101c0578063b48ab8b6146101bb578063ca15c873146101b6578063d547741f146101b1578063e8a3d485146101ac578063e985e9c5146101a7578063ed4c2ac7146101a25763f242432a0361000e576117cc565b611728565b6116f2565b61168f565b61164b565b611616565b6115df565b61151b565b6114e7565b611460565b6113ed565b611325565b6112ef565b6112b9565b611238565b61113b565b611104565b610ff3565b610faf565b610f3b565b610dc7565b610d93565b610d28565b610bcb565b610b37565b610ab1565b610a14565b6108e5565b610875565b610823565b6107d1565b6106bf565b610465565b6103c7565b61031a565b60e01c90565b60405190565b600080fd5b600080fd5b600080fd5b60018060a01b031690565b61027b90610267565b90565b61028781610272565b0361028e57565b600080fd5b905035906102a08261027e565b565b90565b6102ae816102a2565b036102b557565b600080fd5b905035906102c7826102a5565b565b91906040838203126102f257806102e66102ef9260008601610293565b936020016102ba565b90565b61025d565b610300906102a2565b9052565b9190610318906000602085019401906102f7565b565b3461034b576103476103366103303660046102c9565b90611810565b61033e610252565b91829182610304565b0390f35b610258565b63ffffffff60e01b1690565b61036581610350565b0361036c57565b600080fd5b9050359061037e8261035c565b565b9060208282031261039a5761039791600001610371565b90565b61025d565b151590565b6103ad9061039f565b9052565b91906103c5906000602085019401906103a4565b565b346103f7576103f36103e26103dd366004610380565b611839565b6103ea610252565b918291826103b1565b0390f35b610258565b6bffffffffffffffffffffffff1690565b610416816103fc565b0361041d57565b600080fd5b9050359061042f8261040d565b565b919060408382031261045a578061044e6104579260008601610293565b93602001610422565b90565b61025d565b60000190565b346104945761047e610478366004610431565b906118db565b610486610252565b806104908161045f565b0390f35b610258565b60009103126104a457565b61025d565b634e487b7160e01b600052600060045260246000fd5b634e487b7160e01b600052602260045260246000fd5b90600160028304921680156104f5575b60208310146104f057565b6104bf565b91607f16916104e5565b60209181520190565b600052602060002090565b906000929180549061052e610527836104d5565b80946104ff565b91600181169081600014610587575060011461054a575b505050565b6105579192939450610508565b916000925b81841061056f5750500190388080610545565b6001816020929593955484860152019101929061055c565b92949550505060ff1916825215156020020190388080610545565b906105ac91610513565b90565b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b906105d9906105af565b810190811067ffffffffffffffff8211176105f357604052565b6105b9565b9061061861061192610608610252565b938480926105a2565b03836105cf565b565b9060001061062e5761062b906105f8565b90565b6104a9565b610640600860009061061a565b90565b5190565b60209181520190565b60005b838110610664575050906000910152565b806020918301518185015201610653565b61069461069d6020936106a29361068b81610643565b93848093610647565b95869101610650565b6105af565b0190565b6106bc9160208201916000818403910152610675565b90565b346106ef576106cf366004610499565b6106eb6106da610633565b6106e2610252565b918291826106a6565b0390f35b610258565b600080fd5b600080fd5b9061071161070a610252565b92836105cf565b565b67ffffffffffffffff81116107315761072d6020916105af565b0190565b6105b9565b90826000939282370152565b9092919261075761075282610713565b6106fe565b938185526020850190828401116107735761077192610736565b565b6106f9565b9080601f830112156107965781602061079393359101610742565b90565b6106f4565b906020828203126107cc57600082013567ffffffffffffffff81116107c7576107c49201610778565b90565b610262565b61025d565b346107ff576107e96107e436600461079b565b611b1c565b6107f1610252565b806107fb8161045f565b0390f35b610258565b9060208282031261081e5761081b91600001610293565b90565b61025d565b346108515761083b610836366004610804565b611bf9565b610843610252565b8061084d8161045f565b0390f35b610258565b906020828203126108705761086d916000016102ba565b90565b61025d565b346108a5576108a161089061088b366004610856565b611d23565b610898610252565b918291826106a6565b0390f35b610258565b1c90565b90565b6108c19060086108c693026108aa565b6108ae565b90565b906108d491546108b1565b90565b6108e26000806108c9565b90565b34610915576108f5366004610499565b6109116109006108d7565b610908610252565b91829182610304565b0390f35b610258565b67ffffffffffffffff81116109325760208091020190565b6105b9565b600080fd5b9092919261095161094c8261091a565b6106fe565b938185526020808601920283019281841161098e57915b8383106109755750505050565b6020809161098384866102ba565b815201920191610968565b610937565b9080601f830112156109b1578160206109ae9335910161093c565b90565b6106f4565b919091604081840312610a0f57600081013567ffffffffffffffff8111610a0a57836109e3918301610993565b92602082013567ffffffffffffffff8111610a0557610a029201610993565b90565b610262565b610262565b61025d565b34610a4357610a2d610a273660046109b6565b90611d6d565b610a35610252565b80610a3f8161045f565b0390f35b610258565b90565b610a5481610a48565b03610a5b57565b600080fd5b90503590610a6d82610a4b565b565b90602082820312610a8957610a8691600001610a60565b90565b61025d565b610a9790610a48565b9052565b9190610aaf90600060208501940190610a8e565b565b34610ae157610add610acc610ac7366004610a6f565b611dcf565b610ad4610252565b91829182610a9b565b0390f35b610258565b90565b610afd610af8610b02926102a2565b610ae6565b6102a2565b90565b90610b0f90610ae9565b600052602052604060002090565b610b3490610b2f600191600092610b05565b6108c9565b90565b34610b6757610b63610b52610b4d366004610856565b610b1d565b610b5a610252565b91829182610304565b0390f35b610258565b9190604083820312610b955780610b89610b9292600086016102ba565b936020016102ba565b90565b61025d565b610ba390610272565b9052565b916020610bc9929493610bc260408201966000830190610b9a565b01906102f7565b565b34610bfd57610be4610bde366004610b6c565b90611fc1565b90610bf9610bf0610252565b92839283610ba7565b0390f35b610258565b600080fd5b909182601f83011215610c415781359167ffffffffffffffff8311610c3c576020019260208302840111610c3757565b610937565b610c02565b6106f4565b909182601f83011215610c805781359167ffffffffffffffff8311610c7b576020019260018302840111610c7657565b610937565b610c02565b6106f4565b9160a083830312610d2357610c9d8260008501610293565b92610cab8360208301610293565b92604082013567ffffffffffffffff8111610d1e5781610ccc918401610c07565b929093606082013567ffffffffffffffff8111610d195783610cef918401610c07565b929093608082013567ffffffffffffffff8111610d1457610d109201610c46565b9091565b610262565b610262565b610262565b61025d565b34610d6057610d4a610d3b366004610c85565b9695909594919493929361209c565b610d52610252565b80610d5c8161045f565b0390f35b610258565b9190604083820312610d8e5780610d82610d8b9260008601610a60565b93602001610293565b90565b61025d565b34610dc257610dac610da6366004610d65565b90612338565b610db4610252565b80610dbe8161045f565b0390f35b610258565b34610df657610de0610dda366004610d65565b906123ee565b610de8610252565b80610df28161045f565b0390f35b610258565b909182601f83011215610e355781359167ffffffffffffffff8311610e30576020019260208302840111610e2b57565b610937565b610c02565b6106f4565b9091604082840312610e9557600082013567ffffffffffffffff8111610e905783610e66918401610dfb565b929093602082013567ffffffffffffffff8111610e8b57610e879201610c07565b9091565b610262565b610262565b61025d565b5190565b60209181520190565b60200190565b610eb6906102a2565b9052565b90610ec781602093610ead565b0190565b60200190565b90610eee610ee8610ee184610e9a565b8093610e9e565b92610ea7565b9060005b818110610eff5750505090565b909192610f18610f126001928651610eba565b94610ecb565b9101919091610ef2565b610f389160208201916000818403910152610ed1565b90565b34610f6f57610f6b610f5a610f51366004610e3a565b92919091612422565b610f62610252565b91829182610f22565b0390f35b610258565b9091606082840312610faa57610fa7610f9084600085016102ba565b93610f9e8160208601610293565b93604001610422565b90565b61025d565b34610fde57610fc8610fc2366004610f74565b916124bf565b610fd0610252565b80610fda8161045f565b0390f35b610258565b610ff0600960009061061a565b90565b3461102357611003366004610499565b61101f61100e610fe3565b611016610252565b918291826106a6565b0390f35b610258565b67ffffffffffffffff8111611046576110426020916105af565b0190565b6105b9565b9092919261106061105b82611028565b6106fe565b9381855260208501908284011161107c5761107a92610736565b565b6106f9565b9080601f8301121561109f5781602061109c9335910161104b565b90565b6106f4565b906080828203126110ff576110bc8160008401610293565b926110ca82602085016102ba565b926110d883604083016102ba565b92606082013567ffffffffffffffff81116110fa576110f79201611081565b90565b610262565b61025d565b34611136576111206111173660046110a4565b9291909161251e565b611128610252565b806111328161045f565b0390f35b610258565b346111695761115361114e36600461079b565b612554565b61115b610252565b806111658161045f565b0390f35b610258565b919061010083820312611233576111888160008501610293565b92602081013567ffffffffffffffff811161122e57826111a9918301610778565b92604082013567ffffffffffffffff811161122957836111ca918401610778565b92606083013567ffffffffffffffff811161122457816111eb918501610778565b926111f98260808301610293565b9261122161120a8460a08501610422565b936112188160c08601610293565b9360e001610a60565b90565b610262565b610262565b610262565b61025d565b346112705761125a61124b36600461116e565b9695909594919493929361255f565b611262610252565b8061126c8161045f565b0390f35b610258565b919060408382031261129e578061129261129b9260008601610a60565b936020016102ba565b90565b61025d565b91906112b790600060208501940190610b9a565b565b346112ea576112e66112d56112cf366004611275565b906125aa565b6112dd610252565b918291826112a3565b0390f35b610258565b346113205761131c61130b611305366004610d65565b90612629565b611313610252565b918291826103b1565b0390f35b610258565b346113535761133d61133836600461079b565b61267c565b611345610252565b8061134f8161045f565b0390f35b610258565b600080fd5b908160c091031261136b5790565b611358565b908160e091031261137e5790565b611358565b916060838303126113e85761139b8260008501610293565b92602081013567ffffffffffffffff81116113e357836113bc91830161135d565b92604082013567ffffffffffffffff81116113de576113db9201611370565b90565b610262565b610262565b61025d565b3461141e5761141a611409611403366004611383565b916129da565b611411610252565b91829182610a9b565b0390f35b610258565b90565b60001b90565b61144061143b61144592611423565b611426565b610a48565b90565b611452600061142c565b90565b61145d611448565b90565b3461149057611470366004610499565b61148c61147b611455565b611483610252565b91829182610a9b565b0390f35b610258565b61149e8161039f565b036114a557565b600080fd5b905035906114b782611495565b565b91906040838203126114e257806114d66114df9260008601610293565b936020016114aa565b90565b61025d565b34611516576115006114fa3660046114b9565b90612a7b565b611508610252565b806115128161045f565b0390f35b610258565b3461154a5761153461152e366004610b6c565b90612acb565b61153c610252565b806115468161045f565b0390f35b610258565b906080828203126115da576115678160008401610293565b92602083013567ffffffffffffffff81116115d55782611588918501610993565b92604081013567ffffffffffffffff81116115d057836115a9918301610993565b92606082013567ffffffffffffffff81116115cb576115c89201611081565b90565b610262565b610262565b610262565b61025d565b34611611576115fb6115f236600461154f565b92919091612b08565b611603610252565b8061160d8161045f565b0390f35b610258565b346116465761164261163161162c366004610a6f565b612b16565b611639610252565b91829182610304565b0390f35b610258565b3461167a5761166461165e366004610d65565b90612b66565b61166c610252565b806116768161045f565b0390f35b610258565b61168c600a60009061061a565b90565b346116bf5761169f366004610499565b6116bb6116aa61167f565b6116b2610252565b918291826106a6565b0390f35b610258565b91906040838203126116ed57806116e16116ea9260008601610293565b93602001610293565b90565b61025d565b346117235761171f61170e6117083660046116c4565b90612b72565b611716610252565b918291826103b1565b0390f35b610258565b346117565761174061173b366004610a6f565b612c01565b611748610252565b806117528161045f565b0390f35b610258565b91909160a0818403126117c7576117758360008301610293565b926117838160208401610293565b9261179182604085016102ba565b9261179f83606083016102ba565b92608082013567ffffffffffffffff81116117c2576117be9201610c46565b9091565b610262565b61025d565b34611801576117eb6117df36600461175b565b94939093929192612c0c565b6117f3610252565b806117fd8161045f565b0390f35b610258565b600080fd5b600090565b61181861180b565b50679a31110384e0b0c960205260145260005260406000205490565b600090565b611841611834565b5063c79b8b5f60e01b61185c61185683610350565b91610350565b148015611880575b908115611870575b5090565b61187a9150612ddb565b3861186c565b5061188a81612ddb565b611864565b7f6db4061a20ca83a3be756ee172bd37a029093ac5afe4ce968c6d5435b43cb01190565b906118cd916118c86118c361188f565b612e1f565b6118cf565b565b906118d991613039565b565b906118e5916118b3565b565b7fe02a0315b383857ac496e9d2b2546a699afaeb4e5e83a1fdef64376d0b74e5a590565b6119249061191f61191a6118e7565b612e1f565b611b0f565b565b601f602091010490565b1b90565b9190600861195091029161194a60001984611930565b92611930565b9181191691161790565b90565b919061197361196e61197b93610ae9565b61195a565b908354611934565b9055565b6119919161198b61180b565b9161195d565b565b5b81811061199f575050565b806119ad600060019361197f565b01611994565b9190601f81116119c3575b505050565b6119cf6119f493610508565b9060206119db84611926565b830193106119fc575b6119ed90611926565b0190611993565b3880806119be565b91506119ed819290506119e4565b90611a1b90600019906008026108aa565b191690565b81611a2a91611a0a565b906002021790565b90611a3c81610643565b9067ffffffffffffffff8211611afe57611a6082611a5a85546104d5565b856119b3565b602090601f8311600114611a9557918091611a8493600092611a89575b5050611a20565b90555b565b90915001513880611a7d565b601f19831691611aa485610508565b9260005b818110611ae657509160029391856001969410611acc575b50505002019055611a87565b611adc910151601f841690611a0a565b9055388080611ac0565b91936020600181928787015181550195019201611aa8565b6105b9565b90611b0d91611a32565b565b611b1a906008611b03565b565b611b259061190b565b565b7f70649ec320b507febad3e8ef750e5f580b9ae32f9f50d4c7b121332c8197153090565b611b6490611b5f611b5a611b27565b612e1f565b611be4565b565b611b7a611b75611b7f92610267565b610ae6565b610267565b90565b611b8b90611b66565b90565b611b9790611b82565b90565b90611bab60018060a01b0391611426565b9181191691161790565b611bbe90611b82565b90565b90565b90611bd9611bd4611be092611bb5565b611bc1565b8254611b9a565b9055565b611bf0611bf791611b8e565b6006611bc4565b565b611c0290611b4b565b565b606090565b905090565b9060009291805490611c29611c22836104d5565b8094611c09565b91600181169081600014611c7d5750600114611c45575b505050565b611c529192939450610508565b6000905b838210611c695750500190388080611c40565b600181602092548486015201910190611c56565b92949550505060ff19168252801515020190388080611c40565b611cbc611cb392602092611caa81610643565b94858093611c09565b93849101610650565b0190565b60007f2e6a736f6e000000000000000000000000000000000000000000000000000000910152565b611cf460058092611c09565b611cfd81611cc0565b0190565b91611d12611d1d93611d1893611c0e565b90611c97565b611ce8565b90565b90565b611d6a90611d2f611c04565b50611d65611d3e6009926130b3565b91611d56611d4a610252565b93849260208401611d01565b602082018103825203826105cf565b611d20565b90565b611d7a9133919091613201565b565b600090565b611d8a90610a48565b90565b90611d9790611d81565b600052602052604060002090565b60001c90565b90565b611dba611dbf91611da5565b611dab565b90565b611dcc9054611dae565b90565b6001611de8611dee92611de0611d7c565b506004611d8d565b01611dc2565b90565b600090565b90611e0090610ae9565b600052602052604060002090565b60018060a01b031690565b611e25611e2a91611da5565b611e0e565b90565b611e379054611e19565b90565b90611e4490610272565b9052565b60a01c90565b6bffffffffffffffffffffffff1690565b611e6b611e7091611e48565b611e4e565b90565b611e7d9054611e5f565b90565b90611e8a906103fc565b9052565b611e9860406106fe565b90565b90611ed2611ec96000611eac611e8e565b94611ec3611ebb838301611e2d565b838801611e3a565b01611e73565b60208401611e80565b565b611edd90611e9b565b90565b611eea9051610272565b90565b611f01611efc611f0692611423565b610ae6565b610267565b90565b611f1290611eed565b90565b611f1f90516103fc565b90565b611f36611f31611f3b926103fc565b610ae6565b6102a2565b90565b634e487b7160e01b600052601160045260246000fd5b611f63611f69919392936102a2565b926102a2565b91611f758382026102a2565b928184041490151715611f8457565b611f3e565b634e487b7160e01b600052601260045260246000fd5b611fab611fb1916102a2565b916102a2565b908115611fbc570490565b611f89565b611fe4611fe991939293611fd3611df1565b50611fdc61180b565b506003611df6565b611ed4565b91611ff660008401611ee0565b61201161200b6120066000611f09565b610272565b91610272565b1461205e575b600061205361203d61205a9361203761203260208901611f15565b611f22565b90611f54565b61204d6120486132f9565b611f22565b90611f9f565b9301611ee0565b9190565b915061205a600061205361203d6120756002611ed4565b959350505050612017565b61208b91369161093c565b90565b61209991369161104b565b90565b9693969590949192956120ad613310565b6122e6575b8287036122d85760601b679a31110384e0b0c9179460601b679a31110384e0b0c91791856020528560601c958360601c9384156122ca578733036122ae575b8860051b805b61224e57505050828660207f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb604051604081528b8d8160051b948286936040860152838d6060870137836060018286015260608486010190815201376080339380010190a461216461331e565b612231575b50813b61217a575b50505050505050565b602080809786946000528060c06040519b8c9a63bc197c818c5233868d015260408c015260a060608c01528a8360051b998a9586948593015260e08d01378160c00160808c015260e0828c010192835284830137818060e0010160a08a01520101838152013780010161010401601c60405101600080515af115612222575b63bc197c8160e01b9051036122145738808080808080612171565b639c05499b6000526004601cfd5b3d156121f9573d6000823e3d90fd5b612248908690849086908a8c919287948b9661332c565b38612169565b60209003808b01358360205281880135600052604060002080548083116122a0578290039055826020526040600020908154908101908110612292578291556120f7565b6301336cea6000526004601cfd5b63f4d678b86000526004601cfd5b336000526034600c20546120f157634b6e7f186000526004601cfd5b63ea553b346000526004601cfd5b633b800a466000526004601cfd5b61230984886123038b87906122fd88948c96612080565b50612080565b5061208e565b506120b2565b9061232a9161232561232082611dcf565b612e1f565b61232c565b565b9061233691613376565b565b906123429161230f565b565b60207f20726f6c657320666f722073656c660000000000000000000000000000000000917f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201520152565b61239f602f604092610647565b6123a881612344565b0190565b6123c29060208101906000818303910152612392565b90565b156123cc57565b6123d4610252565b62461bcd60e51b8152806123ea600482016123ac565b0390fd5b9061241b916124168261241061240a6124056133a0565b610272565b91610272565b146123c5565b6133ad565b565b606090565b9392919061242e61241d565b5082036124855760405193828552602085019260051b808481016040525b6124565750505050565b602090038082013560601b679a31110384e0b0c91760205280830135600052806040600020548186015261244c565b633b800a466000526004601cfd5b906124ae92916124a96124a461188f565b612e1f565b6124b0565b565b916124bd9291909161345b565b565b906124ca9291612493565b565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a690565b9061250c9392916125076125026124cc565b612e1f565b61250e565b565b9161251c93919091926134de565b565b9061252a9392916124f0565b565b6125459061254061253b6118e7565b612e1f565b612547565b565b612552906009611b03565b565b61255d9061252c565b565b959661258d9761258096959461257b9489949091929394613579565b613039565b6125886124cc565b613376565b565b9061259990611d81565b600052602052604060002090565b90565b906125ca6125c56125cf936125bd611df1565b50600561258f565b6125a7565b61364a565b90565b6125db90611b66565b90565b6125e7906125d2565b90565b906125f4906125de565b600052602052604060002090565b60ff1690565b61261461261991611da5565b612602565b90565b6126269054612608565b90565b61265191600061264661264c9361263e611834565b506004611d8d565b016125ea565b61261c565b90565b61266d906126686126636118e7565b612e1f565b61266f565b565b61267a90600a611b03565b565b61268590612654565b565b60018060a01b031690565b61269e6126a391611da5565b612687565b90565b6126b09054612692565b90565b6126bc906125d2565b90565b60e01b90565b905051906126d282610a4b565b565b906020828203126126ee576126eb916000016126c5565b90565b61025d565b50612702906020810190610293565b90565b61270e90610272565b9052565b50612721906020810190610371565b90565b61272d90610350565b9052565b50612740906020810190610a60565b90565b61274c90610a48565b9052565b600080fd5b600080fd5b600080fd5b90356001602003823603038112156127a057016020813591019167ffffffffffffffff821161279b57600182023603831361279657565b612755565b612750565b61275a565b60209181520190565b91906127c8816127c1816127cd956127a5565b8095610736565b6105af565b0190565b90356001604003823603038112156127e7570190565b61275a565b903560016020038236030381121561282d57016020813591019167ffffffffffffffff821161282857600182023603831361282357565b612755565b612750565b61275a565b919061284c8161284581612851956104ff565b8095610736565b6105af565b0190565b67ffffffffffffffff1690565b61286b81612855565b0361287257565b600080fd5b9050359061288482612862565b565b50612895906020810190612877565b90565b6128a190612855565b9052565b906128e39060206128db6128d1604084016128c360008801886127ec565b908683036000880152612832565b9482810190612886565b910190612898565b90565b6129909161298261297760c0830161290e61290460008701876126f3565b6000860190612705565b61292861291e6020870187612712565b6020860190612724565b6129426129386040870187612731565b6040860190612743565b61295c6129526060870187612731565b6060860190612743565b612969608086018661275f565b9085830360808701526127ae565b9260a08101906127d1565b9060a08184039101526128a5565b90565b9392906129bf6040916129c7946129b2606089019260008a0190610b9a565b87820360208901526128e6565b940190610a8e565b565b6129d1610252565b3d6000823e3d90fd5b91506020906129e7611d7c565b506129fa6129f560066126a6565b6126b3565b612a26633808a90b949294612a31612a126007611dc2565b612a1a610252565b978896879586956126bf565b855260048501612993565b03915afa908115612a7657600091612a48575b5090565b612a69915060203d8111612a6f575b612a6181836105cf565b8101906126d4565b38612a44565b503d612a57565b6129c9565b901515679a31110384e0b0c96020523360145281600052806034600c205560005260601b60601c337f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160206000a3565b612ad89133919091613683565b565b90612af6939291612af1612aec6124cc565b612e1f565b612af8565b565b91612b0693919091926136d5565b565b90612b14939291612ada565b565b612b35612b30612b3a92612b2861180b565b50600561258f565b6125a7565b6137a9565b90565b90612b5891612b53612b4e82611dcf565b612e1f565b612b5a565b565b90612b64916133ad565b565b90612b7091612b3d565b565b612b7a611834565b50679a31110384e0b0c96020526014526000526034600c205490565b612baf90612baa612ba5611b27565b612e1f565b612bf4565b565b90612bbe60001991611426565b9181191691161790565b612bd190611da5565b90565b90612be9612be4612bf092611d81565b612bc8565b8254612bb1565b9055565b612bff906007612bd4565b565b612c0a90612b96565b565b94909194612c18613310565b612db6575b60601b679a31110384e0b0c9179160601b679a31110384e0b0c917918060205260601c928260601c928315612da857843303612d8c575b8660005260406000208054808411612d7e5783900390556020526040600020805490828201918210612d705755806020528284337fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6260406000a4612cb661331e565b612d4b575b823b612cca575b505050505050565b602094829160405197889663f23a6e618852338989015260408801526060870152608086015260a0808601528160c086015260e085013760c401906000601c8401915af115612d3c575b63f23a6e6160e01b905103612d2e57388080808080612cc2565b639c05499b6000526004601cfd5b3d15612d14573d6000823e3d90fd5b612d54866137c9565b50612d5e816137c9565b50612d6a85839061208e565b50612cbb565b6301336cea6000526004601cfd5b63f4d678b86000526004601cfd5b336000526034600c2054612c5457634b6e7f186000526004601cfd5b63ea553b346000526004601cfd5b612dbf866137c9565b50612dc9846137c9565b50612dd585839061208e565b50612c1d565b612de3611834565b50612ded816137e9565b8015612e10575b908115612e00575b5090565b612e0a915061388f565b38612dfc565b50612e1a81613829565b612df4565b612e3190612e2b6133a0565b90613986565b565b60207f2073616c65507269636500000000000000000000000000000000000000000000917f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201520152565b612e8e602a604092610647565b612e9781612e33565b0190565b612eb19060208101906000818303910152612e81565b90565b15612ebb57565b612ec3610252565b62461bcd60e51b815280612ed960048201612e9b565b0390fd5b60007f455243323938313a20696e76616c696420726563656976657200000000000000910152565b612f126019602092610647565b612f1b81612edd565b0190565b612f359060208101906000818303910152612f05565b90565b15612f3f57565b612f47610252565b62461bcd60e51b815280612f5d60048201612f1f565b0390fd5b612f6b60406106fe565b90565b90565b90612f86612f81612f8d926125de565b612f6e565b8254611b9a565b9055565b60a01b90565b90612fb16bffffffffffffffffffffffff60a01b91612f91565b9181191691161790565b612fcf612fca612fd4926103fc565b610ae6565b6103fc565b90565b90565b90612fef612fea612ff692612fbb565b612fd7565b8254612f97565b9055565b906130256020600061302b9461301d828201613017848801611ee0565b90612f71565b019201611f15565b90612fda565b565b9061303791612ffa565b565b906130aa6130b1926130658361305e6130586130536132f9565b6103fc565b916103fc565b1115612eb4565b61308b8161308461307e6130796000611f09565b610272565b91610272565b1415612f38565b916130a1613097612f61565b9360008501611e3a565b60208301611e80565b600261302d565b565b906130bc611c04565b506080604051019160208301604052600083528290600a6000198092955b01948181066030018653049384156130f95790600a91908092916130da565b93505082602091039203918252565b61311c61311761312192611423565b610ae6565b6102a2565b90565b634e487b7160e01b600052603260045260246000fd5b9061314482610e9a565b811015613155576020809102010190565b613124565b61316490516102a2565b90565b61317361317891611da5565b6108ae565b90565b6131859054613167565b90565b61319761319d919392936102a2565b926102a2565b82039182116131a857565b611f3e565b906131c26131bd6131c992610ae9565b61195a565b8254612bb1565b9055565b6131dc6131e2919392936102a2565b926102a2565b82018092116131ed57565b611f3e565b60016131fe91016102a2565b90565b61321090939293828591613a1f565b61321981610e9a565b926132246000613108565b9261322d61180b565b935b8461324261323c886102a2565b916102a2565b10156132af576132a36132a99161326261325d86899061313a565b61315a565b61329d886132976132888a61328261327d879560019361313a565b61315a565b90610b05565b916132928361317b565b613188565b906131ad565b906131cd565b946131f2565b9361322f565b915093506132d392506132cc91506132c7600061317b565b613188565b60006131ad565b565b600090565b90565b6132f16132ec6132f6926132da565b610ae6565b6103fc565b90565b6133016132d5565b5061330d6127106132dd565b90565b613318611834565b50600090565b613326611834565b50600090565b5050949293909361333b61331e565b613348575b505050505050565b61335e6133649361336a97969092939596612080565b50612080565b5061208e565b50388080808080613340565b9061339861339361339d9361338c818590613a3a565b600561258f565b6125a7565b613b21565b50565b6133a8611df1565b503390565b906133cf6133ca6133d4936133c3818590613b5c565b600561258f565b6125a7565b613bf6565b50565b60007f455243323938313a20496e76616c696420706172616d65746572730000000000910152565b61340c601b602092610647565b613415816133d7565b0190565b61342f90602081019060008183039101526133ff565b90565b1561343957565b613441610252565b62461bcd60e51b81528061345760048201613419565b0390fd5b6134d7906134d06134dc949361348b8561348461347e6134796132f9565b6103fc565b916103fc565b1115612eb4565b6134b1816134aa6134a461349f6000611f09565b610272565b91610272565b1415613432565b936134c76134bd612f61565b9560008701611e3a565b60208501611e80565b6003611df6565b61302d565b565b61352c91926134f86135329561351d939086849192613c31565b61351561350e82613509600061317b565b6131cd565b60006131ad565b926001610b05565b916135278361317b565b6131cd565b906131ad565b565b9061354060ff91611426565b9181191691161790565b6135539061039f565b90565b90565b9061356e6135696135759261354a565b613556565b8254613534565b9055565b91909492613587600b61261c565b6135fa576135a76135ae926135a06135ec986008611b03565b6009611b03565b600a611b03565b6135c06135b9611448565b8290613376565b6135d26135cb61188f565b8290613376565b6135e46135dd6118e7565b8290613376565b919091613d32565b6135f86001600b613559565b565b600063f92ee8a960e01b8152806136136004820161045f565b0390fd5b90565b61362661362b91611da5565b610ae9565b90565b61364261363d613647926102a2565b610ae6565b610267565b90565b6136766136716136809361366c600061367b95613665611df1565b5001613617565b613dad565b61361a565b61362e565b6125d2565b90565b6136be6136d3936136996136cd93858391613dcf565b6136b66136af826136aa600061317b565b613188565b60006131ad565b926001610b05565b916136c88361317b565b613188565b906131ad565b565b926136e7919492939085859192613dea565b6136f083610e9a565b916136fb6000613108565b9161370461180b565b5b80613718613712876102a2565b916102a2565b10156137845761377f9061377a61374361373b61373687859061313a565b61315a565b9687906131cd565b95613774613765600161375f61375a8d889061313a565b61315a565b90610b05565b9161376f8361317b565b6131cd565b906131ad565b6131f2565b613705565b509350506137a791506137a09061379b600061317b565b6131cd565b60006131ad565b565b6137c160006137c6926137ba61180b565b5001613617565b613f2d565b90565b906137d261241d565b506040519160408301604052600183526020830152565b6137f1611834565b50633e85e62f60e01b61380c61380683610350565b91610350565b14908115613819575b5090565b6138239150613f45565b38613815565b613831611834565b5061383b81613f6c565b8015613880575b8015613865575b908115613855575b5090565b61385f9150613fac565b38613851565b50600061387a61387483610350565b91610350565b14613849565b5061388a81613fac565b613842565b613897611834565b506138a181613fac565b9081156138ad575b5090565b6138b79150613fec565b386138a9565b90565b6138d46138cf6138d9926138bd565b610ae6565b6102a2565b90565b60007f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000910152565b61391060178092611c09565b613919816138dc565b0190565b60007f206973206d697373696e6720726f6c6520000000000000000000000000000000910152565b61395160118092611c09565b61395a8161391d565b0190565b613978613983939261397261397d93613904565b90611c97565b613945565b90611c97565b90565b9061399b613995838390612629565b1561039f565b6139a3575050565b613a1b916139f96139d26139c26139bc6139fe9561407a565b9361361a565b6139cc60206138c0565b90614293565b916139ea6139de610252565b9384926020840161395e565b602082018103825203826105cf565b611d20565b613a06610252565b91829162461bcd60e51b8352600483016106a6565b0390fd5b9091613a3892613a2f6000611f09565b9290919261440e565b565b613a4e613a48828490612629565b1561039f565b613a57575b5050565b613a7a6001613a756000613a6d60048690611d8d565b0185906125ea565b613559565b90613a836133a0565b90613ac0613aba613ab47f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d95611d81565b926125de565b926125de565b92613ac9610252565b80613ad38161045f565b0390a43880613a53565b613ae690611b66565b90565b613afd613af8613b0292610267565b610ae6565b6102a2565b90565b613b19613b14613b1e926102a2565b611426565b610a48565b90565b90613b54613b4e613b49613b446000613b5996613b3c611834565b500194613add565b613ae9565b613b05565b91613617565b6145fe565b90565b613b67818390612629565b613b70575b5050565b613b936000613b8e6000613b8660048690611d8d565b0185906125ea565b613559565b90613b9c6133a0565b90613bd9613bd3613bcd7ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b95611d81565b926125de565b926125de565b92613be2610252565b80613bec8161045f565b0390a43880613b6c565b90613c29613c23613c1e613c196000613c2e96613c11611834565b500194613add565b613ae9565b613b05565b91613617565b6146be565b90565b91929092613c3d613310565b613d19575b8260601b8015613d0b57679a31110384e0b0c960205283601452846000526040600020805490838201918210613cfd57558160205260601c6000337fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604083a4613caa61331e565b613ce4575b613cb8836147c8565b613cc3575b50505050565b613cdb93613cd16000611f09565b93909192936147d5565b38808080613cbd565b613ced846137c9565b50613cf7816137c9565b50613caf565b6301336cea6000526004601cfd5b63ea553b346000526004601cfd5b613d22846137c9565b50613d2c816137c9565b50613c42565b90613d48613d4d9392613d43611b27565b613376565b61486e565b565b5490565b600052602060002090565b613d6781613d4f565b821015613d8257613d79600191613d53565b91020190600090565b613124565b613d97906008613d9c93026108aa565b611dab565b90565b90613daa9154613d87565b90565b613dcc916000613dc692613dbf611d7c565b5001613d5e565b90613d9f565b90565b9091613de892613ddf6000611f09565b9290919261488e565b565b91929092613df6613310565b613f28575b8051845103613f1a578260601b8015613f0c5780679a31110384e0b0c917602052845160051b805b613ed557506000604051604081527f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb81885160051b602001604082019081818c60045afa503d60400160208301523d01865160051b60200181818960045afa503d01039360601c933392a4613e9661331e565b613ed0575b613ea4836147c8565b613eaf575b50505050565b613ec793613ebd6000611f09565b9390919293614992565b38808080613ea9565b613e9b565b8083015190808701516000526040600020918254908101908110613efe57602092550380613e23565b6301336cea6000526004601cfd5b63ea553b346000526004601cfd5b633b800a466000526004601cfd5b613dfb565b6000613f4291613f3b61180b565b5001613d4f565b90565b613f4d611834565b5060e01c630e89341c8114906301ffc9a763d9b67a2682149114171790565b613f74611834565b5080613f8f613f8963152a902d60e11b610350565b91610350565b14908115613f9c575b5090565b613fa69150614a49565b38613f98565b613fb4611834565b5080613fcf613fc9635a05180f60e01b610350565b91610350565b14908115613fdc575b5090565b613fe69150614a6f565b38613fd8565b613ff4611834565b508061400f614009634e821d3360e11b610350565b91610350565b1490811561401c575b5090565b6140269150613829565b38614018565b90565b60ff1690565b61404961404461404e9261402c565b610ae6565b61402f565b90565b61405b6014614035565b90565b61407261406d6140779261402f565b610ae6565b6102a2565b90565b6140976140926140ad9261408c611c04565b50613add565b613ae9565b6140a76140a2614051565b61405e565b90614293565b90565b90565b6140c76140c26140cc926140b0565b610ae6565b6102a2565b90565b906140e16140dc83611028565b6106fe565b918252565b369037565b906141106140f8836140cf565b926020806141068693611028565b92019103906140e6565b565b600360fc1b90565b5190565b906141288261411a565b81101561413a57600160209102010190565b613124565b600f60fb1b90565b90565b61415e61415961416392614147565b610ae6565b6102a2565b90565b61416f906102a2565b6000811461417e576001900390565b611f3e565b6f181899199a1a9b1b9c1cb0b131b232b360811b90565b6141a2614183565b90565b90565b6141bc6141b76141c1926141a5565b610ae6565b6102a2565b90565b60f81b90565b90565b6141e16141dc6141e6926141ca565b610ae6565b61402f565b90565b614208906142026141fc61420d9461402f565b916102a2565b906108aa565b6102a2565b90565b60007f537472696e67733a20686578206c656e67746820696e73756666696369656e74910152565b61424460208092610647565b61424d81614210565b0190565b6142679060208101906000818303910152614238565b90565b1561427157565b614279610252565b62461bcd60e51b81528061428f60048201614251565b0390fd5b919061429d611c04565b506143376143276142d36142ce6142be60026142b987916140b3565b611f54565b6142c860026140b3565b906131cd565b6140eb565b926142dc614112565b6142f5856142ef60009360001a93613108565b9061411e565b536142fe61413f565b6143178561431160019360001a9361414a565b9061411e565b5361432260026140b3565b611f54565b614331600161414a565b906131cd565b925b8361434d614347600161414a565b916102a2565b11156143b45761435b61419a565b81614366600f6141a8565b169160108310156143af576143826143a3926143a9941a6141c4565b6143928591889060001a9261411e565b5361439d60046141cd565b906141e9565b93614166565b92614339565b613124565b6143dc9293506143d7906143d16143cb6000613108565b916102a2565b1461426a565b611d20565b90565b906143f16143ec83610713565b6106fe565b918252565b61440060006143df565b90565b61440b6143f6565b90565b9193929061441a613310565b614546575b81518551036145385760601b9182679a31110384e0b0c9176020528060601b83811490151715614516575b50835160051b805b6144e057507f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb6000939460405192839160408352805160051b60200180916040850192839160045afa503d60400160208401523d019081815160051b602001809260045afa503d01039260601c923392a46144cb61331e565b6144d2575b565b6144da614403565b506144d0565b8082015190808601516000526040600020805492838111614508576020930390550380614452565b63f4d678b86000526004601cfd5b6000526034600c20541561452a573861444a565b634b6e7f186000526004601cfd5b633b800a466000526004601cfd5b61454e614403565b5061441f565b90565b600052602060002090565b5490565b61456f81614562565b82101561458a57614581600191614557565b91020190600090565b613124565b91906145a56145a06145ad93611d81565b612bc8565b908354611934565b9055565b90815491680100000000000000008310156145e157826145d99160016145df95018155614566565b9061458f565b565b6105b9565b906145f090611d81565b600052602052604060002090565b614606611834565b5061461b614615828490614aaf565b1561039f565b60001461465e576146546146599261463f61463860008501614554565b82906145b1565b600161464d60008501613d4f565b93016145e6565b6131ad565b600190565b5050600090565b634e487b7160e01b600052603160045260246000fd5b61468d91614687611d7c565b9161458f565b565b61469881614562565b80156146b95760019003906146b66146b08383614566565b9061467b565b55565b614665565b6146c6611834565b506146dd6146d86001830184906145e6565b61317b565b90816146f26146ec6000613108565b916102a2565b14156000146147c05761477292600161476d928461471b6000966147158561414a565b90613188565b614738614729888501613d4f565b6147328661414a565b90613188565b8061474b614745846102a2565b916102a2565b03614777575b505050614767614762868301614554565b61468f565b016145e6565b61197f565b600190565b6147b8926147aa6147966147906147b3948c8901613d5e565b90613d9f565b936147a485918c8901613d5e565b9061458f565b918585016145e6565b6131ad565b388080614751565b505050600090565b6147d0611834565b503b90565b919360209360405195869463f23a6e618652338787015260601b60601c60408601526060850152608084015260a08084015280518091818060c087015261485a575b505060c401906000601c8401915af11561484b575b63f23a6e6160e01b90510361483d57565b639c05499b6000526004601cfd5b3d1561482c573d6000823e3d90fd5b818660e08701920160045afa508038614817565b9061488561487e61488c93611b8e565b6006611bc4565b6007612bd4565b565b9092919261489a613310565b614970575b60601b9081679a31110384e0b0c917602052818160601b148160601b15171561494e575b508260005260406000209081549182841161494057836000930390558260205260601c337fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604084a461491461331e565b61491d575b5050565b61492961492f926137c9565b506137c9565b50614938614403565b503880614919565b63f4d678b86000526004601cfd5b6000526034600c20541561496257386148c3565b634b6e7f186000526004601cfd5b614979846137c9565b50614983836137c9565b5061498c614403565b5061489f565b919360209360405195869463bc197c818652338787015260601b60601c604086015260a06060860152805160051b8601809160c0870192839160045afa503d60a001908160808701523d019182815160051b8801809260045afa503d0160a08501523d01908181518601809260045afa50601c8301903d0103906000601c8401915af115614a3a575b63bc197c8160e01b905103614a2c57565b639c05499b6000526004601cfd5b3d15614a1b573d6000823e3d90fd5b614a51611834565b50614a6b614a656301ffc9a760e01b610350565b91610350565b1490565b614a77611834565b5080614a92614a8c637965db0b60e01b610350565b91610350565b14908115614a9f575b5090565b614aa99150613f6c565b38614a9b565b614acd916001614ac892614ac1611834565b50016145e6565b61317b565b614ae0614ada6000613108565b916102a2565b14159056fea2646970667358221220b829e62cbd4291156fd8e41f29314ac27b4f688a516435044f66a0ad587e708064736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x1C JUMPI PUSH1 0xE PUSH1 0x20 JUMP JUMPDEST PUSH2 0x4B1B PUSH2 0x2C DUP3 CODECOPY PUSH2 0x4B1B SWAP1 RETURN JUMPDEST PUSH1 0x26 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x13 JUMPI JUMPDEST PUSH2 0x1806 JUMP JUMPDEST PUSH2 0x1E PUSH1 0x0 CALLDATALOAD PUSH2 0x24C JUMP JUMPDEST DUP1 PUSH3 0xFDD58E EQ PUSH2 0x247 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x242 JUMPI DUP1 PUSH4 0x4634D8D EQ PUSH2 0x23D JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x238 JUMPI DUP1 PUSH4 0xB5EE006 EQ PUSH2 0x233 JUMPI DUP1 PUSH4 0xBB310DE EQ PUSH2 0x22E JUMPI DUP1 PUSH4 0xE89341C EQ PUSH2 0x229 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x224 JUMPI DUP1 PUSH4 0x20EC271B EQ PUSH2 0x21F JUMPI DUP1 PUSH4 0x248A9CA3 EQ PUSH2 0x21A JUMPI DUP1 PUSH4 0x2693EBF2 EQ PUSH2 0x215 JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x210 JUMPI DUP1 PUSH4 0x2EB2C2D6 EQ PUSH2 0x20B JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x206 JUMPI DUP1 PUSH4 0x36568ABE EQ PUSH2 0x201 JUMPI DUP1 PUSH4 0x4E1273F4 EQ PUSH2 0x1FC JUMPI DUP1 PUSH4 0x5944C753 EQ PUSH2 0x1F7 JUMPI DUP1 PUSH4 0x6C0360EB EQ PUSH2 0x1F2 JUMPI DUP1 PUSH4 0x731133E9 EQ PUSH2 0x1ED JUMPI DUP1 PUSH4 0x7E518EC8 EQ PUSH2 0x1E8 JUMPI DUP1 PUSH4 0x8FF83AC1 EQ PUSH2 0x1E3 JUMPI DUP1 PUSH4 0x9010D07C EQ PUSH2 0x1DE JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x1D9 JUMPI DUP1 PUSH4 0x938E3D7B EQ PUSH2 0x1D4 JUMPI DUP1 PUSH4 0x9D043A66 EQ PUSH2 0x1CF JUMPI DUP1 PUSH4 0xA217FDDF EQ PUSH2 0x1CA JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x1C5 JUMPI DUP1 PUSH4 0xB390C0AB EQ PUSH2 0x1C0 JUMPI DUP1 PUSH4 0xB48AB8B6 EQ PUSH2 0x1BB JUMPI DUP1 PUSH4 0xCA15C873 EQ PUSH2 0x1B6 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x1B1 JUMPI DUP1 PUSH4 0xE8A3D485 EQ PUSH2 0x1AC JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x1A7 JUMPI DUP1 PUSH4 0xED4C2AC7 EQ PUSH2 0x1A2 JUMPI PUSH4 0xF242432A SUB PUSH2 0xE JUMPI PUSH2 0x17CC JUMP JUMPDEST PUSH2 0x1728 JUMP JUMPDEST PUSH2 0x16F2 JUMP JUMPDEST PUSH2 0x168F JUMP JUMPDEST PUSH2 0x164B JUMP JUMPDEST PUSH2 0x1616 JUMP JUMPDEST PUSH2 0x15DF JUMP JUMPDEST PUSH2 0x151B JUMP JUMPDEST PUSH2 0x14E7 JUMP JUMPDEST PUSH2 0x1460 JUMP JUMPDEST PUSH2 0x13ED JUMP JUMPDEST PUSH2 0x1325 JUMP JUMPDEST PUSH2 0x12EF JUMP JUMPDEST PUSH2 0x12B9 JUMP JUMPDEST PUSH2 0x1238 JUMP JUMPDEST PUSH2 0x113B JUMP JUMPDEST PUSH2 0x1104 JUMP JUMPDEST PUSH2 0xFF3 JUMP JUMPDEST PUSH2 0xFAF JUMP JUMPDEST PUSH2 0xF3B JUMP JUMPDEST PUSH2 0xDC7 JUMP JUMPDEST PUSH2 0xD93 JUMP JUMPDEST PUSH2 0xD28 JUMP JUMPDEST PUSH2 0xBCB JUMP JUMPDEST PUSH2 0xB37 JUMP JUMPDEST PUSH2 0xAB1 JUMP JUMPDEST PUSH2 0xA14 JUMP JUMPDEST PUSH2 0x8E5 JUMP JUMPDEST PUSH2 0x875 JUMP JUMPDEST PUSH2 0x823 JUMP JUMPDEST PUSH2 0x7D1 JUMP JUMPDEST PUSH2 0x6BF JUMP JUMPDEST PUSH2 0x465 JUMP JUMPDEST PUSH2 0x3C7 JUMP JUMPDEST PUSH2 0x31A JUMP JUMPDEST PUSH1 0xE0 SHR SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x27B SWAP1 PUSH2 0x267 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x287 DUP2 PUSH2 0x272 JUMP JUMPDEST SUB PUSH2 0x28E JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x2A0 DUP3 PUSH2 0x27E JUMP JUMPDEST JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2AE DUP2 PUSH2 0x2A2 JUMP JUMPDEST SUB PUSH2 0x2B5 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x2C7 DUP3 PUSH2 0x2A5 JUMP JUMPDEST JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0x2F2 JUMPI DUP1 PUSH2 0x2E6 PUSH2 0x2EF SWAP3 PUSH1 0x0 DUP7 ADD PUSH2 0x293 JUMP JUMPDEST SWAP4 PUSH1 0x20 ADD PUSH2 0x2BA JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST PUSH2 0x300 SWAP1 PUSH2 0x2A2 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x318 SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0x2F7 JUMP JUMPDEST JUMP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH2 0x347 PUSH2 0x336 PUSH2 0x330 CALLDATASIZE PUSH1 0x4 PUSH2 0x2C9 JUMP JUMPDEST SWAP1 PUSH2 0x1810 JUMP JUMPDEST PUSH2 0x33E PUSH2 0x252 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x304 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL AND SWAP1 JUMP JUMPDEST PUSH2 0x365 DUP2 PUSH2 0x350 JUMP JUMPDEST SUB PUSH2 0x36C JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x37E DUP3 PUSH2 0x35C JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x39A JUMPI PUSH2 0x397 SWAP2 PUSH1 0x0 ADD PUSH2 0x371 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH2 0x3AD SWAP1 PUSH2 0x39F JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x3C5 SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0x3A4 JUMP JUMPDEST JUMP JUMPDEST CALLVALUE PUSH2 0x3F7 JUMPI PUSH2 0x3F3 PUSH2 0x3E2 PUSH2 0x3DD CALLDATASIZE PUSH1 0x4 PUSH2 0x380 JUMP JUMPDEST PUSH2 0x1839 JUMP JUMPDEST PUSH2 0x3EA PUSH2 0x252 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x3B1 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0x416 DUP2 PUSH2 0x3FC JUMP JUMPDEST SUB PUSH2 0x41D JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x42F DUP3 PUSH2 0x40D JUMP JUMPDEST JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0x45A JUMPI DUP1 PUSH2 0x44E PUSH2 0x457 SWAP3 PUSH1 0x0 DUP7 ADD PUSH2 0x293 JUMP JUMPDEST SWAP4 PUSH1 0x20 ADD PUSH2 0x422 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST PUSH1 0x0 ADD SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x494 JUMPI PUSH2 0x47E PUSH2 0x478 CALLDATASIZE PUSH1 0x4 PUSH2 0x431 JUMP JUMPDEST SWAP1 PUSH2 0x18DB JUMP JUMPDEST PUSH2 0x486 PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0x490 DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST PUSH1 0x0 SWAP2 SUB SLT PUSH2 0x4A4 JUMPI JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x1 PUSH1 0x2 DUP4 DIV SWAP3 AND DUP1 ISZERO PUSH2 0x4F5 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x4F0 JUMPI JUMP JUMPDEST PUSH2 0x4BF JUMP JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x4E5 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x0 SWAP3 SWAP2 DUP1 SLOAD SWAP1 PUSH2 0x52E PUSH2 0x527 DUP4 PUSH2 0x4D5 JUMP JUMPDEST DUP1 SWAP5 PUSH2 0x4FF JUMP JUMPDEST SWAP2 PUSH1 0x1 DUP2 AND SWAP1 DUP2 PUSH1 0x0 EQ PUSH2 0x587 JUMPI POP PUSH1 0x1 EQ PUSH2 0x54A JUMPI JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x557 SWAP2 SWAP3 SWAP4 SWAP5 POP PUSH2 0x508 JUMP JUMPDEST SWAP2 PUSH1 0x0 SWAP3 JUMPDEST DUP2 DUP5 LT PUSH2 0x56F JUMPI POP POP ADD SWAP1 CODESIZE DUP1 DUP1 PUSH2 0x545 JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x20 SWAP3 SWAP6 SWAP4 SWAP6 SLOAD DUP5 DUP7 ADD MSTORE ADD SWAP2 ADD SWAP3 SWAP1 PUSH2 0x55C JUMP JUMPDEST SWAP3 SWAP5 SWAP6 POP POP POP PUSH1 0xFF NOT AND DUP3 MSTORE ISZERO ISZERO PUSH1 0x20 MUL ADD SWAP1 CODESIZE DUP1 DUP1 PUSH2 0x545 JUMP JUMPDEST SWAP1 PUSH2 0x5AC SWAP2 PUSH2 0x513 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1F DUP1 NOT SWAP2 ADD AND SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH2 0x5D9 SWAP1 PUSH2 0x5AF JUMP JUMPDEST DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x5F3 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH2 0x5B9 JUMP JUMPDEST SWAP1 PUSH2 0x618 PUSH2 0x611 SWAP3 PUSH2 0x608 PUSH2 0x252 JUMP JUMPDEST SWAP4 DUP5 DUP1 SWAP3 PUSH2 0x5A2 JUMP JUMPDEST SUB DUP4 PUSH2 0x5CF JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x0 LT PUSH2 0x62E JUMPI PUSH2 0x62B SWAP1 PUSH2 0x5F8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x4A9 JUMP JUMPDEST PUSH2 0x640 PUSH1 0x8 PUSH1 0x0 SWAP1 PUSH2 0x61A JUMP JUMPDEST SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x664 JUMPI POP POP SWAP1 PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP1 PUSH1 0x20 SWAP2 DUP4 ADD MLOAD DUP2 DUP6 ADD MSTORE ADD PUSH2 0x653 JUMP JUMPDEST PUSH2 0x694 PUSH2 0x69D PUSH1 0x20 SWAP4 PUSH2 0x6A2 SWAP4 PUSH2 0x68B DUP2 PUSH2 0x643 JUMP JUMPDEST SWAP4 DUP5 DUP1 SWAP4 PUSH2 0x647 JUMP JUMPDEST SWAP6 DUP7 SWAP2 ADD PUSH2 0x650 JUMP JUMPDEST PUSH2 0x5AF JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x6BC SWAP2 PUSH1 0x20 DUP3 ADD SWAP2 PUSH1 0x0 DUP2 DUP5 SUB SWAP2 ADD MSTORE PUSH2 0x675 JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x6EF JUMPI PUSH2 0x6CF CALLDATASIZE PUSH1 0x4 PUSH2 0x499 JUMP JUMPDEST PUSH2 0x6EB PUSH2 0x6DA PUSH2 0x633 JUMP JUMPDEST PUSH2 0x6E2 PUSH2 0x252 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x6A6 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 PUSH2 0x711 PUSH2 0x70A PUSH2 0x252 JUMP JUMPDEST SWAP3 DUP4 PUSH2 0x5CF JUMP JUMPDEST JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x731 JUMPI PUSH2 0x72D PUSH1 0x20 SWAP2 PUSH2 0x5AF JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x5B9 JUMP JUMPDEST SWAP1 DUP3 PUSH1 0x0 SWAP4 SWAP3 DUP3 CALLDATACOPY ADD MSTORE JUMP JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x757 PUSH2 0x752 DUP3 PUSH2 0x713 JUMP JUMPDEST PUSH2 0x6FE JUMP JUMPDEST SWAP4 DUP2 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP1 DUP3 DUP5 ADD GT PUSH2 0x773 JUMPI PUSH2 0x771 SWAP3 PUSH2 0x736 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x6F9 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x796 JUMPI DUP2 PUSH1 0x20 PUSH2 0x793 SWAP4 CALLDATALOAD SWAP2 ADD PUSH2 0x742 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x6F4 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x7CC JUMPI PUSH1 0x0 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x7C7 JUMPI PUSH2 0x7C4 SWAP3 ADD PUSH2 0x778 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x262 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST CALLVALUE PUSH2 0x7FF JUMPI PUSH2 0x7E9 PUSH2 0x7E4 CALLDATASIZE PUSH1 0x4 PUSH2 0x79B JUMP JUMPDEST PUSH2 0x1B1C JUMP JUMPDEST PUSH2 0x7F1 PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0x7FB DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x81E JUMPI PUSH2 0x81B SWAP2 PUSH1 0x0 ADD PUSH2 0x293 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST CALLVALUE PUSH2 0x851 JUMPI PUSH2 0x83B PUSH2 0x836 CALLDATASIZE PUSH1 0x4 PUSH2 0x804 JUMP JUMPDEST PUSH2 0x1BF9 JUMP JUMPDEST PUSH2 0x843 PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0x84D DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x870 JUMPI PUSH2 0x86D SWAP2 PUSH1 0x0 ADD PUSH2 0x2BA JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST CALLVALUE PUSH2 0x8A5 JUMPI PUSH2 0x8A1 PUSH2 0x890 PUSH2 0x88B CALLDATASIZE PUSH1 0x4 PUSH2 0x856 JUMP JUMPDEST PUSH2 0x1D23 JUMP JUMPDEST PUSH2 0x898 PUSH2 0x252 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x6A6 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST SHR SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x8C1 SWAP1 PUSH1 0x8 PUSH2 0x8C6 SWAP4 MUL PUSH2 0x8AA JUMP JUMPDEST PUSH2 0x8AE JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x8D4 SWAP2 SLOAD PUSH2 0x8B1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x8E2 PUSH1 0x0 DUP1 PUSH2 0x8C9 JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x915 JUMPI PUSH2 0x8F5 CALLDATASIZE PUSH1 0x4 PUSH2 0x499 JUMP JUMPDEST PUSH2 0x911 PUSH2 0x900 PUSH2 0x8D7 JUMP JUMPDEST PUSH2 0x908 PUSH2 0x252 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x304 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x932 JUMPI PUSH1 0x20 DUP1 SWAP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH2 0x5B9 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x951 PUSH2 0x94C DUP3 PUSH2 0x91A JUMP JUMPDEST PUSH2 0x6FE JUMP JUMPDEST SWAP4 DUP2 DUP6 MSTORE PUSH1 0x20 DUP1 DUP7 ADD SWAP3 MUL DUP4 ADD SWAP3 DUP2 DUP5 GT PUSH2 0x98E JUMPI SWAP2 JUMPDEST DUP4 DUP4 LT PUSH2 0x975 JUMPI POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 SWAP2 PUSH2 0x983 DUP5 DUP7 PUSH2 0x2BA JUMP JUMPDEST DUP2 MSTORE ADD SWAP3 ADD SWAP2 PUSH2 0x968 JUMP JUMPDEST PUSH2 0x937 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x9B1 JUMPI DUP2 PUSH1 0x20 PUSH2 0x9AE SWAP4 CALLDATALOAD SWAP2 ADD PUSH2 0x93C JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x6F4 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH1 0x40 DUP2 DUP5 SUB SLT PUSH2 0xA0F JUMPI PUSH1 0x0 DUP2 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xA0A JUMPI DUP4 PUSH2 0x9E3 SWAP2 DUP4 ADD PUSH2 0x993 JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xA05 JUMPI PUSH2 0xA02 SWAP3 ADD PUSH2 0x993 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x262 JUMP JUMPDEST PUSH2 0x262 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST CALLVALUE PUSH2 0xA43 JUMPI PUSH2 0xA2D PUSH2 0xA27 CALLDATASIZE PUSH1 0x4 PUSH2 0x9B6 JUMP JUMPDEST SWAP1 PUSH2 0x1D6D JUMP JUMPDEST PUSH2 0xA35 PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0xA3F DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xA54 DUP2 PUSH2 0xA48 JUMP JUMPDEST SUB PUSH2 0xA5B JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0xA6D DUP3 PUSH2 0xA4B JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0xA89 JUMPI PUSH2 0xA86 SWAP2 PUSH1 0x0 ADD PUSH2 0xA60 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST PUSH2 0xA97 SWAP1 PUSH2 0xA48 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0xAAF SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0xA8E JUMP JUMPDEST JUMP JUMPDEST CALLVALUE PUSH2 0xAE1 JUMPI PUSH2 0xADD PUSH2 0xACC PUSH2 0xAC7 CALLDATASIZE PUSH1 0x4 PUSH2 0xA6F JUMP JUMPDEST PUSH2 0x1DCF JUMP JUMPDEST PUSH2 0xAD4 PUSH2 0x252 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xA9B JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xAFD PUSH2 0xAF8 PUSH2 0xB02 SWAP3 PUSH2 0x2A2 JUMP JUMPDEST PUSH2 0xAE6 JUMP JUMPDEST PUSH2 0x2A2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0xB0F SWAP1 PUSH2 0xAE9 JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH2 0xB34 SWAP1 PUSH2 0xB2F PUSH1 0x1 SWAP2 PUSH1 0x0 SWAP3 PUSH2 0xB05 JUMP JUMPDEST PUSH2 0x8C9 JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0xB67 JUMPI PUSH2 0xB63 PUSH2 0xB52 PUSH2 0xB4D CALLDATASIZE PUSH1 0x4 PUSH2 0x856 JUMP JUMPDEST PUSH2 0xB1D JUMP JUMPDEST PUSH2 0xB5A PUSH2 0x252 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x304 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0xB95 JUMPI DUP1 PUSH2 0xB89 PUSH2 0xB92 SWAP3 PUSH1 0x0 DUP7 ADD PUSH2 0x2BA JUMP JUMPDEST SWAP4 PUSH1 0x20 ADD PUSH2 0x2BA JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST PUSH2 0xBA3 SWAP1 PUSH2 0x272 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 PUSH1 0x20 PUSH2 0xBC9 SWAP3 SWAP5 SWAP4 PUSH2 0xBC2 PUSH1 0x40 DUP3 ADD SWAP7 PUSH1 0x0 DUP4 ADD SWAP1 PUSH2 0xB9A JUMP JUMPDEST ADD SWAP1 PUSH2 0x2F7 JUMP JUMPDEST JUMP JUMPDEST CALLVALUE PUSH2 0xBFD JUMPI PUSH2 0xBE4 PUSH2 0xBDE CALLDATASIZE PUSH1 0x4 PUSH2 0xB6C JUMP JUMPDEST SWAP1 PUSH2 0x1FC1 JUMP JUMPDEST SWAP1 PUSH2 0xBF9 PUSH2 0xBF0 PUSH2 0x252 JUMP JUMPDEST SWAP3 DUP4 SWAP3 DUP4 PUSH2 0xBA7 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP2 DUP3 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0xC41 JUMPI DUP2 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xC3C JUMPI PUSH1 0x20 ADD SWAP3 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH2 0xC37 JUMPI JUMP JUMPDEST PUSH2 0x937 JUMP JUMPDEST PUSH2 0xC02 JUMP JUMPDEST PUSH2 0x6F4 JUMP JUMPDEST SWAP1 SWAP2 DUP3 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0xC80 JUMPI DUP2 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xC7B JUMPI PUSH1 0x20 ADD SWAP3 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH2 0xC76 JUMPI JUMP JUMPDEST PUSH2 0x937 JUMP JUMPDEST PUSH2 0xC02 JUMP JUMPDEST PUSH2 0x6F4 JUMP JUMPDEST SWAP2 PUSH1 0xA0 DUP4 DUP4 SUB SLT PUSH2 0xD23 JUMPI PUSH2 0xC9D DUP3 PUSH1 0x0 DUP6 ADD PUSH2 0x293 JUMP JUMPDEST SWAP3 PUSH2 0xCAB DUP4 PUSH1 0x20 DUP4 ADD PUSH2 0x293 JUMP JUMPDEST SWAP3 PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xD1E JUMPI DUP2 PUSH2 0xCCC SWAP2 DUP5 ADD PUSH2 0xC07 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xD19 JUMPI DUP4 PUSH2 0xCEF SWAP2 DUP5 ADD PUSH2 0xC07 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH1 0x80 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xD14 JUMPI PUSH2 0xD10 SWAP3 ADD PUSH2 0xC46 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH2 0x262 JUMP JUMPDEST PUSH2 0x262 JUMP JUMPDEST PUSH2 0x262 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST CALLVALUE PUSH2 0xD60 JUMPI PUSH2 0xD4A PUSH2 0xD3B CALLDATASIZE PUSH1 0x4 PUSH2 0xC85 JUMP JUMPDEST SWAP7 SWAP6 SWAP1 SWAP6 SWAP5 SWAP2 SWAP5 SWAP4 SWAP3 SWAP4 PUSH2 0x209C JUMP JUMPDEST PUSH2 0xD52 PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0xD5C DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0xD8E JUMPI DUP1 PUSH2 0xD82 PUSH2 0xD8B SWAP3 PUSH1 0x0 DUP7 ADD PUSH2 0xA60 JUMP JUMPDEST SWAP4 PUSH1 0x20 ADD PUSH2 0x293 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST CALLVALUE PUSH2 0xDC2 JUMPI PUSH2 0xDAC PUSH2 0xDA6 CALLDATASIZE PUSH1 0x4 PUSH2 0xD65 JUMP JUMPDEST SWAP1 PUSH2 0x2338 JUMP JUMPDEST PUSH2 0xDB4 PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0xDBE DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST CALLVALUE PUSH2 0xDF6 JUMPI PUSH2 0xDE0 PUSH2 0xDDA CALLDATASIZE PUSH1 0x4 PUSH2 0xD65 JUMP JUMPDEST SWAP1 PUSH2 0x23EE JUMP JUMPDEST PUSH2 0xDE8 PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0xDF2 DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST SWAP1 SWAP2 DUP3 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0xE35 JUMPI DUP2 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xE30 JUMPI PUSH1 0x20 ADD SWAP3 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH2 0xE2B JUMPI JUMP JUMPDEST PUSH2 0x937 JUMP JUMPDEST PUSH2 0xC02 JUMP JUMPDEST PUSH2 0x6F4 JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x40 DUP3 DUP5 SUB SLT PUSH2 0xE95 JUMPI PUSH1 0x0 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xE90 JUMPI DUP4 PUSH2 0xE66 SWAP2 DUP5 ADD PUSH2 0xDFB JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xE8B JUMPI PUSH2 0xE87 SWAP3 ADD PUSH2 0xC07 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH2 0x262 JUMP JUMPDEST PUSH2 0x262 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH2 0xEB6 SWAP1 PUSH2 0x2A2 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP1 PUSH2 0xEC7 DUP2 PUSH1 0x20 SWAP4 PUSH2 0xEAD JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0xEEE PUSH2 0xEE8 PUSH2 0xEE1 DUP5 PUSH2 0xE9A JUMP JUMPDEST DUP1 SWAP4 PUSH2 0xE9E JUMP JUMPDEST SWAP3 PUSH2 0xEA7 JUMP JUMPDEST SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0xEFF JUMPI POP POP POP SWAP1 JUMP JUMPDEST SWAP1 SWAP2 SWAP3 PUSH2 0xF18 PUSH2 0xF12 PUSH1 0x1 SWAP3 DUP7 MLOAD PUSH2 0xEBA JUMP JUMPDEST SWAP5 PUSH2 0xECB JUMP JUMPDEST SWAP2 ADD SWAP2 SWAP1 SWAP2 PUSH2 0xEF2 JUMP JUMPDEST PUSH2 0xF38 SWAP2 PUSH1 0x20 DUP3 ADD SWAP2 PUSH1 0x0 DUP2 DUP5 SUB SWAP2 ADD MSTORE PUSH2 0xED1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0xF6F JUMPI PUSH2 0xF6B PUSH2 0xF5A PUSH2 0xF51 CALLDATASIZE PUSH1 0x4 PUSH2 0xE3A JUMP JUMPDEST SWAP3 SWAP2 SWAP1 SWAP2 PUSH2 0x2422 JUMP JUMPDEST PUSH2 0xF62 PUSH2 0x252 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xF22 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x60 DUP3 DUP5 SUB SLT PUSH2 0xFAA JUMPI PUSH2 0xFA7 PUSH2 0xF90 DUP5 PUSH1 0x0 DUP6 ADD PUSH2 0x2BA JUMP JUMPDEST SWAP4 PUSH2 0xF9E DUP2 PUSH1 0x20 DUP7 ADD PUSH2 0x293 JUMP JUMPDEST SWAP4 PUSH1 0x40 ADD PUSH2 0x422 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST CALLVALUE PUSH2 0xFDE JUMPI PUSH2 0xFC8 PUSH2 0xFC2 CALLDATASIZE PUSH1 0x4 PUSH2 0xF74 JUMP JUMPDEST SWAP2 PUSH2 0x24BF JUMP JUMPDEST PUSH2 0xFD0 PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0xFDA DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST PUSH2 0xFF0 PUSH1 0x9 PUSH1 0x0 SWAP1 PUSH2 0x61A JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x1023 JUMPI PUSH2 0x1003 CALLDATASIZE PUSH1 0x4 PUSH2 0x499 JUMP JUMPDEST PUSH2 0x101F PUSH2 0x100E PUSH2 0xFE3 JUMP JUMPDEST PUSH2 0x1016 PUSH2 0x252 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x6A6 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1046 JUMPI PUSH2 0x1042 PUSH1 0x20 SWAP2 PUSH2 0x5AF JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x5B9 JUMP JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x1060 PUSH2 0x105B DUP3 PUSH2 0x1028 JUMP JUMPDEST PUSH2 0x6FE JUMP JUMPDEST SWAP4 DUP2 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP1 DUP3 DUP5 ADD GT PUSH2 0x107C JUMPI PUSH2 0x107A SWAP3 PUSH2 0x736 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x6F9 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x109F JUMPI DUP2 PUSH1 0x20 PUSH2 0x109C SWAP4 CALLDATALOAD SWAP2 ADD PUSH2 0x104B JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x6F4 JUMP JUMPDEST SWAP1 PUSH1 0x80 DUP3 DUP3 SUB SLT PUSH2 0x10FF JUMPI PUSH2 0x10BC DUP2 PUSH1 0x0 DUP5 ADD PUSH2 0x293 JUMP JUMPDEST SWAP3 PUSH2 0x10CA DUP3 PUSH1 0x20 DUP6 ADD PUSH2 0x2BA JUMP JUMPDEST SWAP3 PUSH2 0x10D8 DUP4 PUSH1 0x40 DUP4 ADD PUSH2 0x2BA JUMP JUMPDEST SWAP3 PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x10FA JUMPI PUSH2 0x10F7 SWAP3 ADD PUSH2 0x1081 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x262 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST CALLVALUE PUSH2 0x1136 JUMPI PUSH2 0x1120 PUSH2 0x1117 CALLDATASIZE PUSH1 0x4 PUSH2 0x10A4 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 SWAP2 PUSH2 0x251E JUMP JUMPDEST PUSH2 0x1128 PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0x1132 DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST CALLVALUE PUSH2 0x1169 JUMPI PUSH2 0x1153 PUSH2 0x114E CALLDATASIZE PUSH1 0x4 PUSH2 0x79B JUMP JUMPDEST PUSH2 0x2554 JUMP JUMPDEST PUSH2 0x115B PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0x1165 DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x100 DUP4 DUP3 SUB SLT PUSH2 0x1233 JUMPI PUSH2 0x1188 DUP2 PUSH1 0x0 DUP6 ADD PUSH2 0x293 JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x122E JUMPI DUP3 PUSH2 0x11A9 SWAP2 DUP4 ADD PUSH2 0x778 JUMP JUMPDEST SWAP3 PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1229 JUMPI DUP4 PUSH2 0x11CA SWAP2 DUP5 ADD PUSH2 0x778 JUMP JUMPDEST SWAP3 PUSH1 0x60 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1224 JUMPI DUP2 PUSH2 0x11EB SWAP2 DUP6 ADD PUSH2 0x778 JUMP JUMPDEST SWAP3 PUSH2 0x11F9 DUP3 PUSH1 0x80 DUP4 ADD PUSH2 0x293 JUMP JUMPDEST SWAP3 PUSH2 0x1221 PUSH2 0x120A DUP5 PUSH1 0xA0 DUP6 ADD PUSH2 0x422 JUMP JUMPDEST SWAP4 PUSH2 0x1218 DUP2 PUSH1 0xC0 DUP7 ADD PUSH2 0x293 JUMP JUMPDEST SWAP4 PUSH1 0xE0 ADD PUSH2 0xA60 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x262 JUMP JUMPDEST PUSH2 0x262 JUMP JUMPDEST PUSH2 0x262 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST CALLVALUE PUSH2 0x1270 JUMPI PUSH2 0x125A PUSH2 0x124B CALLDATASIZE PUSH1 0x4 PUSH2 0x116E JUMP JUMPDEST SWAP7 SWAP6 SWAP1 SWAP6 SWAP5 SWAP2 SWAP5 SWAP4 SWAP3 SWAP4 PUSH2 0x255F JUMP JUMPDEST PUSH2 0x1262 PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0x126C DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0x129E JUMPI DUP1 PUSH2 0x1292 PUSH2 0x129B SWAP3 PUSH1 0x0 DUP7 ADD PUSH2 0xA60 JUMP JUMPDEST SWAP4 PUSH1 0x20 ADD PUSH2 0x2BA JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x12B7 SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0xB9A JUMP JUMPDEST JUMP JUMPDEST CALLVALUE PUSH2 0x12EA JUMPI PUSH2 0x12E6 PUSH2 0x12D5 PUSH2 0x12CF CALLDATASIZE PUSH1 0x4 PUSH2 0x1275 JUMP JUMPDEST SWAP1 PUSH2 0x25AA JUMP JUMPDEST PUSH2 0x12DD PUSH2 0x252 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x12A3 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST CALLVALUE PUSH2 0x1320 JUMPI PUSH2 0x131C PUSH2 0x130B PUSH2 0x1305 CALLDATASIZE PUSH1 0x4 PUSH2 0xD65 JUMP JUMPDEST SWAP1 PUSH2 0x2629 JUMP JUMPDEST PUSH2 0x1313 PUSH2 0x252 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x3B1 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST CALLVALUE PUSH2 0x1353 JUMPI PUSH2 0x133D PUSH2 0x1338 CALLDATASIZE PUSH1 0x4 PUSH2 0x79B JUMP JUMPDEST PUSH2 0x267C JUMP JUMPDEST PUSH2 0x1345 PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0x134F DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0xC0 SWAP2 SUB SLT PUSH2 0x136B JUMPI SWAP1 JUMP JUMPDEST PUSH2 0x1358 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0xE0 SWAP2 SUB SLT PUSH2 0x137E JUMPI SWAP1 JUMP JUMPDEST PUSH2 0x1358 JUMP JUMPDEST SWAP2 PUSH1 0x60 DUP4 DUP4 SUB SLT PUSH2 0x13E8 JUMPI PUSH2 0x139B DUP3 PUSH1 0x0 DUP6 ADD PUSH2 0x293 JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x13E3 JUMPI DUP4 PUSH2 0x13BC SWAP2 DUP4 ADD PUSH2 0x135D JUMP JUMPDEST SWAP3 PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x13DE JUMPI PUSH2 0x13DB SWAP3 ADD PUSH2 0x1370 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x262 JUMP JUMPDEST PUSH2 0x262 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST CALLVALUE PUSH2 0x141E JUMPI PUSH2 0x141A PUSH2 0x1409 PUSH2 0x1403 CALLDATASIZE PUSH1 0x4 PUSH2 0x1383 JUMP JUMPDEST SWAP2 PUSH2 0x29DA JUMP JUMPDEST PUSH2 0x1411 PUSH2 0x252 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xA9B JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SHL SWAP1 JUMP JUMPDEST PUSH2 0x1440 PUSH2 0x143B PUSH2 0x1445 SWAP3 PUSH2 0x1423 JUMP JUMPDEST PUSH2 0x1426 JUMP JUMPDEST PUSH2 0xA48 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1452 PUSH1 0x0 PUSH2 0x142C JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x145D PUSH2 0x1448 JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x1490 JUMPI PUSH2 0x1470 CALLDATASIZE PUSH1 0x4 PUSH2 0x499 JUMP JUMPDEST PUSH2 0x148C PUSH2 0x147B PUSH2 0x1455 JUMP JUMPDEST PUSH2 0x1483 PUSH2 0x252 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xA9B JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST PUSH2 0x149E DUP2 PUSH2 0x39F JUMP JUMPDEST SUB PUSH2 0x14A5 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x14B7 DUP3 PUSH2 0x1495 JUMP JUMPDEST JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0x14E2 JUMPI DUP1 PUSH2 0x14D6 PUSH2 0x14DF SWAP3 PUSH1 0x0 DUP7 ADD PUSH2 0x293 JUMP JUMPDEST SWAP4 PUSH1 0x20 ADD PUSH2 0x14AA JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST CALLVALUE PUSH2 0x1516 JUMPI PUSH2 0x1500 PUSH2 0x14FA CALLDATASIZE PUSH1 0x4 PUSH2 0x14B9 JUMP JUMPDEST SWAP1 PUSH2 0x2A7B JUMP JUMPDEST PUSH2 0x1508 PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0x1512 DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST CALLVALUE PUSH2 0x154A JUMPI PUSH2 0x1534 PUSH2 0x152E CALLDATASIZE PUSH1 0x4 PUSH2 0xB6C JUMP JUMPDEST SWAP1 PUSH2 0x2ACB JUMP JUMPDEST PUSH2 0x153C PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0x1546 DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST SWAP1 PUSH1 0x80 DUP3 DUP3 SUB SLT PUSH2 0x15DA JUMPI PUSH2 0x1567 DUP2 PUSH1 0x0 DUP5 ADD PUSH2 0x293 JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x15D5 JUMPI DUP3 PUSH2 0x1588 SWAP2 DUP6 ADD PUSH2 0x993 JUMP JUMPDEST SWAP3 PUSH1 0x40 DUP2 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x15D0 JUMPI DUP4 PUSH2 0x15A9 SWAP2 DUP4 ADD PUSH2 0x993 JUMP JUMPDEST SWAP3 PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x15CB JUMPI PUSH2 0x15C8 SWAP3 ADD PUSH2 0x1081 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x262 JUMP JUMPDEST PUSH2 0x262 JUMP JUMPDEST PUSH2 0x262 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST CALLVALUE PUSH2 0x1611 JUMPI PUSH2 0x15FB PUSH2 0x15F2 CALLDATASIZE PUSH1 0x4 PUSH2 0x154F JUMP JUMPDEST SWAP3 SWAP2 SWAP1 SWAP2 PUSH2 0x2B08 JUMP JUMPDEST PUSH2 0x1603 PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0x160D DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST CALLVALUE PUSH2 0x1646 JUMPI PUSH2 0x1642 PUSH2 0x1631 PUSH2 0x162C CALLDATASIZE PUSH1 0x4 PUSH2 0xA6F JUMP JUMPDEST PUSH2 0x2B16 JUMP JUMPDEST PUSH2 0x1639 PUSH2 0x252 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x304 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST CALLVALUE PUSH2 0x167A JUMPI PUSH2 0x1664 PUSH2 0x165E CALLDATASIZE PUSH1 0x4 PUSH2 0xD65 JUMP JUMPDEST SWAP1 PUSH2 0x2B66 JUMP JUMPDEST PUSH2 0x166C PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0x1676 DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST PUSH2 0x168C PUSH1 0xA PUSH1 0x0 SWAP1 PUSH2 0x61A JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x16BF JUMPI PUSH2 0x169F CALLDATASIZE PUSH1 0x4 PUSH2 0x499 JUMP JUMPDEST PUSH2 0x16BB PUSH2 0x16AA PUSH2 0x167F JUMP JUMPDEST PUSH2 0x16B2 PUSH2 0x252 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x6A6 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0x16ED JUMPI DUP1 PUSH2 0x16E1 PUSH2 0x16EA SWAP3 PUSH1 0x0 DUP7 ADD PUSH2 0x293 JUMP JUMPDEST SWAP4 PUSH1 0x20 ADD PUSH2 0x293 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST CALLVALUE PUSH2 0x1723 JUMPI PUSH2 0x171F PUSH2 0x170E PUSH2 0x1708 CALLDATASIZE PUSH1 0x4 PUSH2 0x16C4 JUMP JUMPDEST SWAP1 PUSH2 0x2B72 JUMP JUMPDEST PUSH2 0x1716 PUSH2 0x252 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x3B1 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST CALLVALUE PUSH2 0x1756 JUMPI PUSH2 0x1740 PUSH2 0x173B CALLDATASIZE PUSH1 0x4 PUSH2 0xA6F JUMP JUMPDEST PUSH2 0x2C01 JUMP JUMPDEST PUSH2 0x1748 PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0x1752 DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH1 0xA0 DUP2 DUP5 SUB SLT PUSH2 0x17C7 JUMPI PUSH2 0x1775 DUP4 PUSH1 0x0 DUP4 ADD PUSH2 0x293 JUMP JUMPDEST SWAP3 PUSH2 0x1783 DUP2 PUSH1 0x20 DUP5 ADD PUSH2 0x293 JUMP JUMPDEST SWAP3 PUSH2 0x1791 DUP3 PUSH1 0x40 DUP6 ADD PUSH2 0x2BA JUMP JUMPDEST SWAP3 PUSH2 0x179F DUP4 PUSH1 0x60 DUP4 ADD PUSH2 0x2BA JUMP JUMPDEST SWAP3 PUSH1 0x80 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x17C2 JUMPI PUSH2 0x17BE SWAP3 ADD PUSH2 0xC46 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH2 0x262 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST CALLVALUE PUSH2 0x1801 JUMPI PUSH2 0x17EB PUSH2 0x17DF CALLDATASIZE PUSH1 0x4 PUSH2 0x175B JUMP JUMPDEST SWAP5 SWAP4 SWAP1 SWAP4 SWAP3 SWAP2 SWAP3 PUSH2 0x2C0C JUMP JUMPDEST PUSH2 0x17F3 PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0x17FD DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x1818 PUSH2 0x180B JUMP JUMPDEST POP PUSH8 0x9A31110384E0B0C9 PUSH1 0x20 MSTORE PUSH1 0x14 MSTORE PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x1841 PUSH2 0x1834 JUMP JUMPDEST POP PUSH4 0xC79B8B5F PUSH1 0xE0 SHL PUSH2 0x185C PUSH2 0x1856 DUP4 PUSH2 0x350 JUMP JUMPDEST SWAP2 PUSH2 0x350 JUMP JUMPDEST EQ DUP1 ISZERO PUSH2 0x1880 JUMPI JUMPDEST SWAP1 DUP2 ISZERO PUSH2 0x1870 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x187A SWAP2 POP PUSH2 0x2DDB JUMP JUMPDEST CODESIZE PUSH2 0x186C JUMP JUMPDEST POP PUSH2 0x188A DUP2 PUSH2 0x2DDB JUMP JUMPDEST PUSH2 0x1864 JUMP JUMPDEST PUSH32 0x6DB4061A20CA83A3BE756EE172BD37A029093AC5AFE4CE968C6D5435B43CB011 SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x18CD SWAP2 PUSH2 0x18C8 PUSH2 0x18C3 PUSH2 0x188F JUMP JUMPDEST PUSH2 0x2E1F JUMP JUMPDEST PUSH2 0x18CF JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x18D9 SWAP2 PUSH2 0x3039 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x18E5 SWAP2 PUSH2 0x18B3 JUMP JUMPDEST JUMP JUMPDEST PUSH32 0xE02A0315B383857AC496E9D2B2546A699AFAEB4E5E83A1FDEF64376D0B74E5A5 SWAP1 JUMP JUMPDEST PUSH2 0x1924 SWAP1 PUSH2 0x191F PUSH2 0x191A PUSH2 0x18E7 JUMP JUMPDEST PUSH2 0x2E1F JUMP JUMPDEST PUSH2 0x1B0F JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x1F PUSH1 0x20 SWAP2 ADD DIV SWAP1 JUMP JUMPDEST SHL SWAP1 JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x8 PUSH2 0x1950 SWAP2 MUL SWAP2 PUSH2 0x194A PUSH1 0x0 NOT DUP5 PUSH2 0x1930 JUMP JUMPDEST SWAP3 PUSH2 0x1930 JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x1973 PUSH2 0x196E PUSH2 0x197B SWAP4 PUSH2 0xAE9 JUMP JUMPDEST PUSH2 0x195A JUMP JUMPDEST SWAP1 DUP4 SLOAD PUSH2 0x1934 JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x1991 SWAP2 PUSH2 0x198B PUSH2 0x180B JUMP JUMPDEST SWAP2 PUSH2 0x195D JUMP JUMPDEST JUMP JUMPDEST JUMPDEST DUP2 DUP2 LT PUSH2 0x199F JUMPI POP POP JUMP JUMPDEST DUP1 PUSH2 0x19AD PUSH1 0x0 PUSH1 0x1 SWAP4 PUSH2 0x197F JUMP JUMPDEST ADD PUSH2 0x1994 JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x1F DUP2 GT PUSH2 0x19C3 JUMPI JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x19CF PUSH2 0x19F4 SWAP4 PUSH2 0x508 JUMP JUMPDEST SWAP1 PUSH1 0x20 PUSH2 0x19DB DUP5 PUSH2 0x1926 JUMP JUMPDEST DUP4 ADD SWAP4 LT PUSH2 0x19FC JUMPI JUMPDEST PUSH2 0x19ED SWAP1 PUSH2 0x1926 JUMP JUMPDEST ADD SWAP1 PUSH2 0x1993 JUMP JUMPDEST CODESIZE DUP1 DUP1 PUSH2 0x19BE JUMP JUMPDEST SWAP2 POP PUSH2 0x19ED DUP2 SWAP3 SWAP1 POP PUSH2 0x19E4 JUMP JUMPDEST SWAP1 PUSH2 0x1A1B SWAP1 PUSH1 0x0 NOT SWAP1 PUSH1 0x8 MUL PUSH2 0x8AA JUMP JUMPDEST NOT AND SWAP1 JUMP JUMPDEST DUP2 PUSH2 0x1A2A SWAP2 PUSH2 0x1A0A JUMP JUMPDEST SWAP1 PUSH1 0x2 MUL OR SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x1A3C DUP2 PUSH2 0x643 JUMP JUMPDEST SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x1AFE JUMPI PUSH2 0x1A60 DUP3 PUSH2 0x1A5A DUP6 SLOAD PUSH2 0x4D5 JUMP JUMPDEST DUP6 PUSH2 0x19B3 JUMP JUMPDEST PUSH1 0x20 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x1A95 JUMPI SWAP2 DUP1 SWAP2 PUSH2 0x1A84 SWAP4 PUSH1 0x0 SWAP3 PUSH2 0x1A89 JUMPI JUMPDEST POP POP PUSH2 0x1A20 JUMP JUMPDEST SWAP1 SSTORE JUMPDEST JUMP JUMPDEST SWAP1 SWAP2 POP ADD MLOAD CODESIZE DUP1 PUSH2 0x1A7D JUMP JUMPDEST PUSH1 0x1F NOT DUP4 AND SWAP2 PUSH2 0x1AA4 DUP6 PUSH2 0x508 JUMP JUMPDEST SWAP3 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x1AE6 JUMPI POP SWAP2 PUSH1 0x2 SWAP4 SWAP2 DUP6 PUSH1 0x1 SWAP7 SWAP5 LT PUSH2 0x1ACC JUMPI JUMPDEST POP POP POP MUL ADD SWAP1 SSTORE PUSH2 0x1A87 JUMP JUMPDEST PUSH2 0x1ADC SWAP2 ADD MLOAD PUSH1 0x1F DUP5 AND SWAP1 PUSH2 0x1A0A JUMP JUMPDEST SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x1AC0 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD MLOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x1AA8 JUMP JUMPDEST PUSH2 0x5B9 JUMP JUMPDEST SWAP1 PUSH2 0x1B0D SWAP2 PUSH2 0x1A32 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x1B1A SWAP1 PUSH1 0x8 PUSH2 0x1B03 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x1B25 SWAP1 PUSH2 0x190B JUMP JUMPDEST JUMP JUMPDEST PUSH32 0x70649EC320B507FEBAD3E8EF750E5F580B9AE32F9F50D4C7B121332C81971530 SWAP1 JUMP JUMPDEST PUSH2 0x1B64 SWAP1 PUSH2 0x1B5F PUSH2 0x1B5A PUSH2 0x1B27 JUMP JUMPDEST PUSH2 0x2E1F JUMP JUMPDEST PUSH2 0x1BE4 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x1B7A PUSH2 0x1B75 PUSH2 0x1B7F SWAP3 PUSH2 0x267 JUMP JUMPDEST PUSH2 0xAE6 JUMP JUMPDEST PUSH2 0x267 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1B8B SWAP1 PUSH2 0x1B66 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1B97 SWAP1 PUSH2 0x1B82 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x1BAB PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB SWAP2 PUSH2 0x1426 JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST PUSH2 0x1BBE SWAP1 PUSH2 0x1B82 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x1BD9 PUSH2 0x1BD4 PUSH2 0x1BE0 SWAP3 PUSH2 0x1BB5 JUMP JUMPDEST PUSH2 0x1BC1 JUMP JUMPDEST DUP3 SLOAD PUSH2 0x1B9A JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x1BF0 PUSH2 0x1BF7 SWAP2 PUSH2 0x1B8E JUMP JUMPDEST PUSH1 0x6 PUSH2 0x1BC4 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x1C02 SWAP1 PUSH2 0x1B4B JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x60 SWAP1 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x0 SWAP3 SWAP2 DUP1 SLOAD SWAP1 PUSH2 0x1C29 PUSH2 0x1C22 DUP4 PUSH2 0x4D5 JUMP JUMPDEST DUP1 SWAP5 PUSH2 0x1C09 JUMP JUMPDEST SWAP2 PUSH1 0x1 DUP2 AND SWAP1 DUP2 PUSH1 0x0 EQ PUSH2 0x1C7D JUMPI POP PUSH1 0x1 EQ PUSH2 0x1C45 JUMPI JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x1C52 SWAP2 SWAP3 SWAP4 SWAP5 POP PUSH2 0x508 JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMPDEST DUP4 DUP3 LT PUSH2 0x1C69 JUMPI POP POP ADD SWAP1 CODESIZE DUP1 DUP1 PUSH2 0x1C40 JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x20 SWAP3 SLOAD DUP5 DUP7 ADD MSTORE ADD SWAP2 ADD SWAP1 PUSH2 0x1C56 JUMP JUMPDEST SWAP3 SWAP5 SWAP6 POP POP POP PUSH1 0xFF NOT AND DUP3 MSTORE DUP1 ISZERO ISZERO MUL ADD SWAP1 CODESIZE DUP1 DUP1 PUSH2 0x1C40 JUMP JUMPDEST PUSH2 0x1CBC PUSH2 0x1CB3 SWAP3 PUSH1 0x20 SWAP3 PUSH2 0x1CAA DUP2 PUSH2 0x643 JUMP JUMPDEST SWAP5 DUP6 DUP1 SWAP4 PUSH2 0x1C09 JUMP JUMPDEST SWAP4 DUP5 SWAP2 ADD PUSH2 0x650 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x2E6A736F6E000000000000000000000000000000000000000000000000000000 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x1CF4 PUSH1 0x5 DUP1 SWAP3 PUSH2 0x1C09 JUMP JUMPDEST PUSH2 0x1CFD DUP2 PUSH2 0x1CC0 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST SWAP2 PUSH2 0x1D12 PUSH2 0x1D1D SWAP4 PUSH2 0x1D18 SWAP4 PUSH2 0x1C0E JUMP JUMPDEST SWAP1 PUSH2 0x1C97 JUMP JUMPDEST PUSH2 0x1CE8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1D6A SWAP1 PUSH2 0x1D2F PUSH2 0x1C04 JUMP JUMPDEST POP PUSH2 0x1D65 PUSH2 0x1D3E PUSH1 0x9 SWAP3 PUSH2 0x30B3 JUMP JUMPDEST SWAP2 PUSH2 0x1D56 PUSH2 0x1D4A PUSH2 0x252 JUMP JUMPDEST SWAP4 DUP5 SWAP3 PUSH1 0x20 DUP5 ADD PUSH2 0x1D01 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE SUB DUP3 PUSH2 0x5CF JUMP JUMPDEST PUSH2 0x1D20 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1D7A SWAP2 CALLER SWAP2 SWAP1 SWAP2 PUSH2 0x3201 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x1D8A SWAP1 PUSH2 0xA48 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x1D97 SWAP1 PUSH2 0x1D81 JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x0 SHR SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1DBA PUSH2 0x1DBF SWAP2 PUSH2 0x1DA5 JUMP JUMPDEST PUSH2 0x1DAB JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1DCC SWAP1 SLOAD PUSH2 0x1DAE JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH2 0x1DE8 PUSH2 0x1DEE SWAP3 PUSH2 0x1DE0 PUSH2 0x1D7C JUMP JUMPDEST POP PUSH1 0x4 PUSH2 0x1D8D JUMP JUMPDEST ADD PUSH2 0x1DC2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x1E00 SWAP1 PUSH2 0xAE9 JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x1E25 PUSH2 0x1E2A SWAP2 PUSH2 0x1DA5 JUMP JUMPDEST PUSH2 0x1E0E JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1E37 SWAP1 SLOAD PUSH2 0x1E19 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x1E44 SWAP1 PUSH2 0x272 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST PUSH1 0xA0 SHR SWAP1 JUMP JUMPDEST PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0x1E6B PUSH2 0x1E70 SWAP2 PUSH2 0x1E48 JUMP JUMPDEST PUSH2 0x1E4E JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1E7D SWAP1 SLOAD PUSH2 0x1E5F JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x1E8A SWAP1 PUSH2 0x3FC JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST PUSH2 0x1E98 PUSH1 0x40 PUSH2 0x6FE JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x1ED2 PUSH2 0x1EC9 PUSH1 0x0 PUSH2 0x1EAC PUSH2 0x1E8E JUMP JUMPDEST SWAP5 PUSH2 0x1EC3 PUSH2 0x1EBB DUP4 DUP4 ADD PUSH2 0x1E2D JUMP JUMPDEST DUP4 DUP9 ADD PUSH2 0x1E3A JUMP JUMPDEST ADD PUSH2 0x1E73 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD PUSH2 0x1E80 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x1EDD SWAP1 PUSH2 0x1E9B JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1EEA SWAP1 MLOAD PUSH2 0x272 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1F01 PUSH2 0x1EFC PUSH2 0x1F06 SWAP3 PUSH2 0x1423 JUMP JUMPDEST PUSH2 0xAE6 JUMP JUMPDEST PUSH2 0x267 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1F12 SWAP1 PUSH2 0x1EED JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1F1F SWAP1 MLOAD PUSH2 0x3FC JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1F36 PUSH2 0x1F31 PUSH2 0x1F3B SWAP3 PUSH2 0x3FC JUMP JUMPDEST PUSH2 0xAE6 JUMP JUMPDEST PUSH2 0x2A2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x1F63 PUSH2 0x1F69 SWAP2 SWAP4 SWAP3 SWAP4 PUSH2 0x2A2 JUMP JUMPDEST SWAP3 PUSH2 0x2A2 JUMP JUMPDEST SWAP2 PUSH2 0x1F75 DUP4 DUP3 MUL PUSH2 0x2A2 JUMP JUMPDEST SWAP3 DUP2 DUP5 DIV EQ SWAP1 ISZERO OR ISZERO PUSH2 0x1F84 JUMPI JUMP JUMPDEST PUSH2 0x1F3E JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x1FAB PUSH2 0x1FB1 SWAP2 PUSH2 0x2A2 JUMP JUMPDEST SWAP2 PUSH2 0x2A2 JUMP JUMPDEST SWAP1 DUP2 ISZERO PUSH2 0x1FBC JUMPI DIV SWAP1 JUMP JUMPDEST PUSH2 0x1F89 JUMP JUMPDEST PUSH2 0x1FE4 PUSH2 0x1FE9 SWAP2 SWAP4 SWAP3 SWAP4 PUSH2 0x1FD3 PUSH2 0x1DF1 JUMP JUMPDEST POP PUSH2 0x1FDC PUSH2 0x180B JUMP JUMPDEST POP PUSH1 0x3 PUSH2 0x1DF6 JUMP JUMPDEST PUSH2 0x1ED4 JUMP JUMPDEST SWAP2 PUSH2 0x1FF6 PUSH1 0x0 DUP5 ADD PUSH2 0x1EE0 JUMP JUMPDEST PUSH2 0x2011 PUSH2 0x200B PUSH2 0x2006 PUSH1 0x0 PUSH2 0x1F09 JUMP JUMPDEST PUSH2 0x272 JUMP JUMPDEST SWAP2 PUSH2 0x272 JUMP JUMPDEST EQ PUSH2 0x205E JUMPI JUMPDEST PUSH1 0x0 PUSH2 0x2053 PUSH2 0x203D PUSH2 0x205A SWAP4 PUSH2 0x2037 PUSH2 0x2032 PUSH1 0x20 DUP10 ADD PUSH2 0x1F15 JUMP JUMPDEST PUSH2 0x1F22 JUMP JUMPDEST SWAP1 PUSH2 0x1F54 JUMP JUMPDEST PUSH2 0x204D PUSH2 0x2048 PUSH2 0x32F9 JUMP JUMPDEST PUSH2 0x1F22 JUMP JUMPDEST SWAP1 PUSH2 0x1F9F JUMP JUMPDEST SWAP4 ADD PUSH2 0x1EE0 JUMP JUMPDEST SWAP2 SWAP1 JUMP JUMPDEST SWAP2 POP PUSH2 0x205A PUSH1 0x0 PUSH2 0x2053 PUSH2 0x203D PUSH2 0x2075 PUSH1 0x2 PUSH2 0x1ED4 JUMP JUMPDEST SWAP6 SWAP4 POP POP POP POP PUSH2 0x2017 JUMP JUMPDEST PUSH2 0x208B SWAP2 CALLDATASIZE SWAP2 PUSH2 0x93C JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2099 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x104B JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP7 SWAP4 SWAP7 SWAP6 SWAP1 SWAP5 SWAP2 SWAP3 SWAP6 PUSH2 0x20AD PUSH2 0x3310 JUMP JUMPDEST PUSH2 0x22E6 JUMPI JUMPDEST DUP3 DUP8 SUB PUSH2 0x22D8 JUMPI PUSH1 0x60 SHL PUSH8 0x9A31110384E0B0C9 OR SWAP5 PUSH1 0x60 SHL PUSH8 0x9A31110384E0B0C9 OR SWAP2 DUP6 PUSH1 0x20 MSTORE DUP6 PUSH1 0x60 SHR SWAP6 DUP4 PUSH1 0x60 SHR SWAP4 DUP5 ISZERO PUSH2 0x22CA JUMPI DUP8 CALLER SUB PUSH2 0x22AE JUMPI JUMPDEST DUP9 PUSH1 0x5 SHL DUP1 JUMPDEST PUSH2 0x224E JUMPI POP POP POP DUP3 DUP7 PUSH1 0x20 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH1 0x40 MLOAD PUSH1 0x40 DUP2 MSTORE DUP12 DUP14 DUP2 PUSH1 0x5 SHL SWAP5 DUP3 DUP7 SWAP4 PUSH1 0x40 DUP7 ADD MSTORE DUP4 DUP14 PUSH1 0x60 DUP8 ADD CALLDATACOPY DUP4 PUSH1 0x60 ADD DUP3 DUP7 ADD MSTORE PUSH1 0x60 DUP5 DUP7 ADD ADD SWAP1 DUP2 MSTORE ADD CALLDATACOPY PUSH1 0x80 CALLER SWAP4 DUP1 ADD ADD SWAP1 LOG4 PUSH2 0x2164 PUSH2 0x331E JUMP JUMPDEST PUSH2 0x2231 JUMPI JUMPDEST POP DUP2 EXTCODESIZE PUSH2 0x217A JUMPI JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP1 SWAP8 DUP7 SWAP5 PUSH1 0x0 MSTORE DUP1 PUSH1 0xC0 PUSH1 0x40 MLOAD SWAP12 DUP13 SWAP11 PUSH4 0xBC197C81 DUP13 MSTORE CALLER DUP7 DUP14 ADD MSTORE PUSH1 0x40 DUP13 ADD MSTORE PUSH1 0xA0 PUSH1 0x60 DUP13 ADD MSTORE DUP11 DUP4 PUSH1 0x5 SHL SWAP10 DUP11 SWAP6 DUP7 SWAP5 DUP6 SWAP4 ADD MSTORE PUSH1 0xE0 DUP14 ADD CALLDATACOPY DUP2 PUSH1 0xC0 ADD PUSH1 0x80 DUP13 ADD MSTORE PUSH1 0xE0 DUP3 DUP13 ADD ADD SWAP3 DUP4 MSTORE DUP5 DUP4 ADD CALLDATACOPY DUP2 DUP1 PUSH1 0xE0 ADD ADD PUSH1 0xA0 DUP11 ADD MSTORE ADD ADD DUP4 DUP2 MSTORE ADD CALLDATACOPY DUP1 ADD ADD PUSH2 0x104 ADD PUSH1 0x1C PUSH1 0x40 MLOAD ADD PUSH1 0x0 DUP1 MLOAD GAS CALL ISZERO PUSH2 0x2222 JUMPI JUMPDEST PUSH4 0xBC197C81 PUSH1 0xE0 SHL SWAP1 MLOAD SUB PUSH2 0x2214 JUMPI CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x2171 JUMP JUMPDEST PUSH4 0x9C05499B PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x21F9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH2 0x2248 SWAP1 DUP7 SWAP1 DUP5 SWAP1 DUP7 SWAP1 DUP11 DUP13 SWAP2 SWAP3 DUP8 SWAP5 DUP12 SWAP7 PUSH2 0x332C JUMP JUMPDEST CODESIZE PUSH2 0x2169 JUMP JUMPDEST PUSH1 0x20 SWAP1 SUB DUP1 DUP12 ADD CALLDATALOAD DUP4 PUSH1 0x20 MSTORE DUP2 DUP9 ADD CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP1 SLOAD DUP1 DUP4 GT PUSH2 0x22A0 JUMPI DUP3 SWAP1 SUB SWAP1 SSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD SWAP1 DUP2 ADD SWAP1 DUP2 LT PUSH2 0x2292 JUMPI DUP3 SWAP2 SSTORE PUSH2 0x20F7 JUMP JUMPDEST PUSH4 0x1336CEA PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0xF4D678B8 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST CALLER PUSH1 0x0 MSTORE PUSH1 0x34 PUSH1 0xC KECCAK256 SLOAD PUSH2 0x20F1 JUMPI PUSH4 0x4B6E7F18 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0xEA553B34 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0x3B800A46 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH2 0x2309 DUP5 DUP9 PUSH2 0x2303 DUP12 DUP8 SWAP1 PUSH2 0x22FD DUP9 SWAP5 DUP13 SWAP7 PUSH2 0x2080 JUMP JUMPDEST POP PUSH2 0x2080 JUMP JUMPDEST POP PUSH2 0x208E JUMP JUMPDEST POP PUSH2 0x20B2 JUMP JUMPDEST SWAP1 PUSH2 0x232A SWAP2 PUSH2 0x2325 PUSH2 0x2320 DUP3 PUSH2 0x1DCF JUMP JUMPDEST PUSH2 0x2E1F JUMP JUMPDEST PUSH2 0x232C JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x2336 SWAP2 PUSH2 0x3376 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x2342 SWAP2 PUSH2 0x230F JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x20 PUSH32 0x20726F6C657320666F722073656C660000000000000000000000000000000000 SWAP2 PUSH32 0x416363657373436F6E74726F6C3A2063616E206F6E6C792072656E6F756E6365 PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x239F PUSH1 0x2F PUSH1 0x40 SWAP3 PUSH2 0x647 JUMP JUMPDEST PUSH2 0x23A8 DUP2 PUSH2 0x2344 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x23C2 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x2392 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x23CC JUMPI JUMP JUMPDEST PUSH2 0x23D4 PUSH2 0x252 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x23EA PUSH1 0x4 DUP3 ADD PUSH2 0x23AC JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP1 PUSH2 0x241B SWAP2 PUSH2 0x2416 DUP3 PUSH2 0x2410 PUSH2 0x240A PUSH2 0x2405 PUSH2 0x33A0 JUMP JUMPDEST PUSH2 0x272 JUMP JUMPDEST SWAP2 PUSH2 0x272 JUMP JUMPDEST EQ PUSH2 0x23C5 JUMP JUMPDEST PUSH2 0x33AD JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x60 SWAP1 JUMP JUMPDEST SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x242E PUSH2 0x241D JUMP JUMPDEST POP DUP3 SUB PUSH2 0x2485 JUMPI PUSH1 0x40 MLOAD SWAP4 DUP3 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP3 PUSH1 0x5 SHL DUP1 DUP5 DUP2 ADD PUSH1 0x40 MSTORE JUMPDEST PUSH2 0x2456 JUMPI POP POP POP POP JUMP JUMPDEST PUSH1 0x20 SWAP1 SUB DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x60 SHL PUSH8 0x9A31110384E0B0C9 OR PUSH1 0x20 MSTORE DUP1 DUP4 ADD CALLDATALOAD PUSH1 0x0 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP2 DUP7 ADD MSTORE PUSH2 0x244C JUMP JUMPDEST PUSH4 0x3B800A46 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST SWAP1 PUSH2 0x24AE SWAP3 SWAP2 PUSH2 0x24A9 PUSH2 0x24A4 PUSH2 0x188F JUMP JUMPDEST PUSH2 0x2E1F JUMP JUMPDEST PUSH2 0x24B0 JUMP JUMPDEST JUMP JUMPDEST SWAP2 PUSH2 0x24BD SWAP3 SWAP2 SWAP1 SWAP2 PUSH2 0x345B JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x24CA SWAP3 SWAP2 PUSH2 0x2493 JUMP JUMPDEST JUMP JUMPDEST PUSH32 0x9F2DF0FED2C77648DE5860A4CC508CD0818C85B8B8A1AB4CEEEF8D981C8956A6 SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x250C SWAP4 SWAP3 SWAP2 PUSH2 0x2507 PUSH2 0x2502 PUSH2 0x24CC JUMP JUMPDEST PUSH2 0x2E1F JUMP JUMPDEST PUSH2 0x250E JUMP JUMPDEST JUMP JUMPDEST SWAP2 PUSH2 0x251C SWAP4 SWAP2 SWAP1 SWAP2 SWAP3 PUSH2 0x34DE JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x252A SWAP4 SWAP3 SWAP2 PUSH2 0x24F0 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x2545 SWAP1 PUSH2 0x2540 PUSH2 0x253B PUSH2 0x18E7 JUMP JUMPDEST PUSH2 0x2E1F JUMP JUMPDEST PUSH2 0x2547 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x2552 SWAP1 PUSH1 0x9 PUSH2 0x1B03 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x255D SWAP1 PUSH2 0x252C JUMP JUMPDEST JUMP JUMPDEST SWAP6 SWAP7 PUSH2 0x258D SWAP8 PUSH2 0x2580 SWAP7 SWAP6 SWAP5 PUSH2 0x257B SWAP5 DUP10 SWAP5 SWAP1 SWAP2 SWAP3 SWAP4 SWAP5 PUSH2 0x3579 JUMP JUMPDEST PUSH2 0x3039 JUMP JUMPDEST PUSH2 0x2588 PUSH2 0x24CC JUMP JUMPDEST PUSH2 0x3376 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x2599 SWAP1 PUSH2 0x1D81 JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x25CA PUSH2 0x25C5 PUSH2 0x25CF SWAP4 PUSH2 0x25BD PUSH2 0x1DF1 JUMP JUMPDEST POP PUSH1 0x5 PUSH2 0x258F JUMP JUMPDEST PUSH2 0x25A7 JUMP JUMPDEST PUSH2 0x364A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x25DB SWAP1 PUSH2 0x1B66 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x25E7 SWAP1 PUSH2 0x25D2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x25F4 SWAP1 PUSH2 0x25DE JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH2 0x2614 PUSH2 0x2619 SWAP2 PUSH2 0x1DA5 JUMP JUMPDEST PUSH2 0x2602 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2626 SWAP1 SLOAD PUSH2 0x2608 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2651 SWAP2 PUSH1 0x0 PUSH2 0x2646 PUSH2 0x264C SWAP4 PUSH2 0x263E PUSH2 0x1834 JUMP JUMPDEST POP PUSH1 0x4 PUSH2 0x1D8D JUMP JUMPDEST ADD PUSH2 0x25EA JUMP JUMPDEST PUSH2 0x261C JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x266D SWAP1 PUSH2 0x2668 PUSH2 0x2663 PUSH2 0x18E7 JUMP JUMPDEST PUSH2 0x2E1F JUMP JUMPDEST PUSH2 0x266F JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x267A SWAP1 PUSH1 0xA PUSH2 0x1B03 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x2685 SWAP1 PUSH2 0x2654 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x269E PUSH2 0x26A3 SWAP2 PUSH2 0x1DA5 JUMP JUMPDEST PUSH2 0x2687 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x26B0 SWAP1 SLOAD PUSH2 0x2692 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x26BC SWAP1 PUSH2 0x25D2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xE0 SHL SWAP1 JUMP JUMPDEST SWAP1 POP MLOAD SWAP1 PUSH2 0x26D2 DUP3 PUSH2 0xA4B JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x26EE JUMPI PUSH2 0x26EB SWAP2 PUSH1 0x0 ADD PUSH2 0x26C5 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST POP PUSH2 0x2702 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x293 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x270E SWAP1 PUSH2 0x272 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST POP PUSH2 0x2721 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x371 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x272D SWAP1 PUSH2 0x350 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST POP PUSH2 0x2740 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0xA60 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x274C SWAP1 PUSH2 0xA48 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SUB DUP3 CALLDATASIZE SUB SUB DUP2 SLT ISZERO PUSH2 0x27A0 JUMPI ADD PUSH1 0x20 DUP2 CALLDATALOAD SWAP2 ADD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x279B JUMPI PUSH1 0x1 DUP3 MUL CALLDATASIZE SUB DUP4 SGT PUSH2 0x2796 JUMPI JUMP JUMPDEST PUSH2 0x2755 JUMP JUMPDEST PUSH2 0x2750 JUMP JUMPDEST PUSH2 0x275A JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x27C8 DUP2 PUSH2 0x27C1 DUP2 PUSH2 0x27CD SWAP6 PUSH2 0x27A5 JUMP JUMPDEST DUP1 SWAP6 PUSH2 0x736 JUMP JUMPDEST PUSH2 0x5AF JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST SWAP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x40 SUB DUP3 CALLDATASIZE SUB SUB DUP2 SLT ISZERO PUSH2 0x27E7 JUMPI ADD SWAP1 JUMP JUMPDEST PUSH2 0x275A JUMP JUMPDEST SWAP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SUB DUP3 CALLDATASIZE SUB SUB DUP2 SLT ISZERO PUSH2 0x282D JUMPI ADD PUSH1 0x20 DUP2 CALLDATALOAD SWAP2 ADD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2828 JUMPI PUSH1 0x1 DUP3 MUL CALLDATASIZE SUB DUP4 SGT PUSH2 0x2823 JUMPI JUMP JUMPDEST PUSH2 0x2755 JUMP JUMPDEST PUSH2 0x2750 JUMP JUMPDEST PUSH2 0x275A JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x284C DUP2 PUSH2 0x2845 DUP2 PUSH2 0x2851 SWAP6 PUSH2 0x4FF JUMP JUMPDEST DUP1 SWAP6 PUSH2 0x736 JUMP JUMPDEST PUSH2 0x5AF JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0x286B DUP2 PUSH2 0x2855 JUMP JUMPDEST SUB PUSH2 0x2872 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x2884 DUP3 PUSH2 0x2862 JUMP JUMPDEST JUMP JUMPDEST POP PUSH2 0x2895 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x2877 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x28A1 SWAP1 PUSH2 0x2855 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP1 PUSH2 0x28E3 SWAP1 PUSH1 0x20 PUSH2 0x28DB PUSH2 0x28D1 PUSH1 0x40 DUP5 ADD PUSH2 0x28C3 PUSH1 0x0 DUP9 ADD DUP9 PUSH2 0x27EC JUMP JUMPDEST SWAP1 DUP7 DUP4 SUB PUSH1 0x0 DUP9 ADD MSTORE PUSH2 0x2832 JUMP JUMPDEST SWAP5 DUP3 DUP2 ADD SWAP1 PUSH2 0x2886 JUMP JUMPDEST SWAP2 ADD SWAP1 PUSH2 0x2898 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2990 SWAP2 PUSH2 0x2982 PUSH2 0x2977 PUSH1 0xC0 DUP4 ADD PUSH2 0x290E PUSH2 0x2904 PUSH1 0x0 DUP8 ADD DUP8 PUSH2 0x26F3 JUMP JUMPDEST PUSH1 0x0 DUP7 ADD SWAP1 PUSH2 0x2705 JUMP JUMPDEST PUSH2 0x2928 PUSH2 0x291E PUSH1 0x20 DUP8 ADD DUP8 PUSH2 0x2712 JUMP JUMPDEST PUSH1 0x20 DUP7 ADD SWAP1 PUSH2 0x2724 JUMP JUMPDEST PUSH2 0x2942 PUSH2 0x2938 PUSH1 0x40 DUP8 ADD DUP8 PUSH2 0x2731 JUMP JUMPDEST PUSH1 0x40 DUP7 ADD SWAP1 PUSH2 0x2743 JUMP JUMPDEST PUSH2 0x295C PUSH2 0x2952 PUSH1 0x60 DUP8 ADD DUP8 PUSH2 0x2731 JUMP JUMPDEST PUSH1 0x60 DUP7 ADD SWAP1 PUSH2 0x2743 JUMP JUMPDEST PUSH2 0x2969 PUSH1 0x80 DUP7 ADD DUP7 PUSH2 0x275F JUMP JUMPDEST SWAP1 DUP6 DUP4 SUB PUSH1 0x80 DUP8 ADD MSTORE PUSH2 0x27AE JUMP JUMPDEST SWAP3 PUSH1 0xA0 DUP2 ADD SWAP1 PUSH2 0x27D1 JUMP JUMPDEST SWAP1 PUSH1 0xA0 DUP2 DUP5 SUB SWAP2 ADD MSTORE PUSH2 0x28A5 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP4 SWAP3 SWAP1 PUSH2 0x29BF PUSH1 0x40 SWAP2 PUSH2 0x29C7 SWAP5 PUSH2 0x29B2 PUSH1 0x60 DUP10 ADD SWAP3 PUSH1 0x0 DUP11 ADD SWAP1 PUSH2 0xB9A JUMP JUMPDEST DUP8 DUP3 SUB PUSH1 0x20 DUP10 ADD MSTORE PUSH2 0x28E6 JUMP JUMPDEST SWAP5 ADD SWAP1 PUSH2 0xA8E JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x29D1 PUSH2 0x252 JUMP JUMPDEST RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST SWAP2 POP PUSH1 0x20 SWAP1 PUSH2 0x29E7 PUSH2 0x1D7C JUMP JUMPDEST POP PUSH2 0x29FA PUSH2 0x29F5 PUSH1 0x6 PUSH2 0x26A6 JUMP JUMPDEST PUSH2 0x26B3 JUMP JUMPDEST PUSH2 0x2A26 PUSH4 0x3808A90B SWAP5 SWAP3 SWAP5 PUSH2 0x2A31 PUSH2 0x2A12 PUSH1 0x7 PUSH2 0x1DC2 JUMP JUMPDEST PUSH2 0x2A1A PUSH2 0x252 JUMP JUMPDEST SWAP8 DUP9 SWAP7 DUP8 SWAP6 DUP7 SWAP6 PUSH2 0x26BF JUMP JUMPDEST DUP6 MSTORE PUSH1 0x4 DUP6 ADD PUSH2 0x2993 JUMP JUMPDEST SUB SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x2A76 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x2A48 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x2A69 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x2A6F JUMPI JUMPDEST PUSH2 0x2A61 DUP2 DUP4 PUSH2 0x5CF JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x26D4 JUMP JUMPDEST CODESIZE PUSH2 0x2A44 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x2A57 JUMP JUMPDEST PUSH2 0x29C9 JUMP JUMPDEST SWAP1 ISZERO ISZERO PUSH8 0x9A31110384E0B0C9 PUSH1 0x20 MSTORE CALLER PUSH1 0x14 MSTORE DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x34 PUSH1 0xC KECCAK256 SSTORE PUSH1 0x0 MSTORE PUSH1 0x60 SHL PUSH1 0x60 SHR CALLER PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 PUSH1 0x20 PUSH1 0x0 LOG3 JUMP JUMPDEST PUSH2 0x2AD8 SWAP2 CALLER SWAP2 SWAP1 SWAP2 PUSH2 0x3683 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x2AF6 SWAP4 SWAP3 SWAP2 PUSH2 0x2AF1 PUSH2 0x2AEC PUSH2 0x24CC JUMP JUMPDEST PUSH2 0x2E1F JUMP JUMPDEST PUSH2 0x2AF8 JUMP JUMPDEST JUMP JUMPDEST SWAP2 PUSH2 0x2B06 SWAP4 SWAP2 SWAP1 SWAP2 SWAP3 PUSH2 0x36D5 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x2B14 SWAP4 SWAP3 SWAP2 PUSH2 0x2ADA JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x2B35 PUSH2 0x2B30 PUSH2 0x2B3A SWAP3 PUSH2 0x2B28 PUSH2 0x180B JUMP JUMPDEST POP PUSH1 0x5 PUSH2 0x258F JUMP JUMPDEST PUSH2 0x25A7 JUMP JUMPDEST PUSH2 0x37A9 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2B58 SWAP2 PUSH2 0x2B53 PUSH2 0x2B4E DUP3 PUSH2 0x1DCF JUMP JUMPDEST PUSH2 0x2E1F JUMP JUMPDEST PUSH2 0x2B5A JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x2B64 SWAP2 PUSH2 0x33AD JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x2B70 SWAP2 PUSH2 0x2B3D JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x2B7A PUSH2 0x1834 JUMP JUMPDEST POP PUSH8 0x9A31110384E0B0C9 PUSH1 0x20 MSTORE PUSH1 0x14 MSTORE PUSH1 0x0 MSTORE PUSH1 0x34 PUSH1 0xC KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH2 0x2BAF SWAP1 PUSH2 0x2BAA PUSH2 0x2BA5 PUSH2 0x1B27 JUMP JUMPDEST PUSH2 0x2E1F JUMP JUMPDEST PUSH2 0x2BF4 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x2BBE PUSH1 0x0 NOT SWAP2 PUSH2 0x1426 JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST PUSH2 0x2BD1 SWAP1 PUSH2 0x1DA5 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2BE9 PUSH2 0x2BE4 PUSH2 0x2BF0 SWAP3 PUSH2 0x1D81 JUMP JUMPDEST PUSH2 0x2BC8 JUMP JUMPDEST DUP3 SLOAD PUSH2 0x2BB1 JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x2BFF SWAP1 PUSH1 0x7 PUSH2 0x2BD4 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x2C0A SWAP1 PUSH2 0x2B96 JUMP JUMPDEST JUMP JUMPDEST SWAP5 SWAP1 SWAP2 SWAP5 PUSH2 0x2C18 PUSH2 0x3310 JUMP JUMPDEST PUSH2 0x2DB6 JUMPI JUMPDEST PUSH1 0x60 SHL PUSH8 0x9A31110384E0B0C9 OR SWAP2 PUSH1 0x60 SHL PUSH8 0x9A31110384E0B0C9 OR SWAP2 DUP1 PUSH1 0x20 MSTORE PUSH1 0x60 SHR SWAP3 DUP3 PUSH1 0x60 SHR SWAP3 DUP4 ISZERO PUSH2 0x2DA8 JUMPI DUP5 CALLER SUB PUSH2 0x2D8C JUMPI JUMPDEST DUP7 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP1 SLOAD DUP1 DUP5 GT PUSH2 0x2D7E JUMPI DUP4 SWAP1 SUB SWAP1 SSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP1 SLOAD SWAP1 DUP3 DUP3 ADD SWAP2 DUP3 LT PUSH2 0x2D70 JUMPI SSTORE DUP1 PUSH1 0x20 MSTORE DUP3 DUP5 CALLER PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 PUSH1 0x0 LOG4 PUSH2 0x2CB6 PUSH2 0x331E JUMP JUMPDEST PUSH2 0x2D4B JUMPI JUMPDEST DUP3 EXTCODESIZE PUSH2 0x2CCA JUMPI JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 SWAP5 DUP3 SWAP2 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP7 PUSH4 0xF23A6E61 DUP9 MSTORE CALLER DUP10 DUP10 ADD MSTORE PUSH1 0x40 DUP9 ADD MSTORE PUSH1 0x60 DUP8 ADD MSTORE PUSH1 0x80 DUP7 ADD MSTORE PUSH1 0xA0 DUP1 DUP7 ADD MSTORE DUP2 PUSH1 0xC0 DUP7 ADD MSTORE PUSH1 0xE0 DUP6 ADD CALLDATACOPY PUSH1 0xC4 ADD SWAP1 PUSH1 0x0 PUSH1 0x1C DUP5 ADD SWAP2 GAS CALL ISZERO PUSH2 0x2D3C JUMPI JUMPDEST PUSH4 0xF23A6E61 PUSH1 0xE0 SHL SWAP1 MLOAD SUB PUSH2 0x2D2E JUMPI CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x2CC2 JUMP JUMPDEST PUSH4 0x9C05499B PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x2D14 JUMPI RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH2 0x2D54 DUP7 PUSH2 0x37C9 JUMP JUMPDEST POP PUSH2 0x2D5E DUP2 PUSH2 0x37C9 JUMP JUMPDEST POP PUSH2 0x2D6A DUP6 DUP4 SWAP1 PUSH2 0x208E JUMP JUMPDEST POP PUSH2 0x2CBB JUMP JUMPDEST PUSH4 0x1336CEA PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0xF4D678B8 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST CALLER PUSH1 0x0 MSTORE PUSH1 0x34 PUSH1 0xC KECCAK256 SLOAD PUSH2 0x2C54 JUMPI PUSH4 0x4B6E7F18 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0xEA553B34 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH2 0x2DBF DUP7 PUSH2 0x37C9 JUMP JUMPDEST POP PUSH2 0x2DC9 DUP5 PUSH2 0x37C9 JUMP JUMPDEST POP PUSH2 0x2DD5 DUP6 DUP4 SWAP1 PUSH2 0x208E JUMP JUMPDEST POP PUSH2 0x2C1D JUMP JUMPDEST PUSH2 0x2DE3 PUSH2 0x1834 JUMP JUMPDEST POP PUSH2 0x2DED DUP2 PUSH2 0x37E9 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x2E10 JUMPI JUMPDEST SWAP1 DUP2 ISZERO PUSH2 0x2E00 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x2E0A SWAP2 POP PUSH2 0x388F JUMP JUMPDEST CODESIZE PUSH2 0x2DFC JUMP JUMPDEST POP PUSH2 0x2E1A DUP2 PUSH2 0x3829 JUMP JUMPDEST PUSH2 0x2DF4 JUMP JUMPDEST PUSH2 0x2E31 SWAP1 PUSH2 0x2E2B PUSH2 0x33A0 JUMP JUMPDEST SWAP1 PUSH2 0x3986 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x20 PUSH32 0x2073616C65507269636500000000000000000000000000000000000000000000 SWAP2 PUSH32 0x455243323938313A20726F79616C7479206665652077696C6C20657863656564 PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x2E8E PUSH1 0x2A PUSH1 0x40 SWAP3 PUSH2 0x647 JUMP JUMPDEST PUSH2 0x2E97 DUP2 PUSH2 0x2E33 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x2EB1 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x2E81 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x2EBB JUMPI JUMP JUMPDEST PUSH2 0x2EC3 PUSH2 0x252 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x2ED9 PUSH1 0x4 DUP3 ADD PUSH2 0x2E9B JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH32 0x455243323938313A20696E76616C696420726563656976657200000000000000 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x2F12 PUSH1 0x19 PUSH1 0x20 SWAP3 PUSH2 0x647 JUMP JUMPDEST PUSH2 0x2F1B DUP2 PUSH2 0x2EDD JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x2F35 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x2F05 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x2F3F JUMPI JUMP JUMPDEST PUSH2 0x2F47 PUSH2 0x252 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x2F5D PUSH1 0x4 DUP3 ADD PUSH2 0x2F1F JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x2F6B PUSH1 0x40 PUSH2 0x6FE JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2F86 PUSH2 0x2F81 PUSH2 0x2F8D SWAP3 PUSH2 0x25DE JUMP JUMPDEST PUSH2 0x2F6E JUMP JUMPDEST DUP3 SLOAD PUSH2 0x1B9A JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH1 0xA0 SHL SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2FB1 PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xA0 SHL SWAP2 PUSH2 0x2F91 JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST PUSH2 0x2FCF PUSH2 0x2FCA PUSH2 0x2FD4 SWAP3 PUSH2 0x3FC JUMP JUMPDEST PUSH2 0xAE6 JUMP JUMPDEST PUSH2 0x3FC JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2FEF PUSH2 0x2FEA PUSH2 0x2FF6 SWAP3 PUSH2 0x2FBB JUMP JUMPDEST PUSH2 0x2FD7 JUMP JUMPDEST DUP3 SLOAD PUSH2 0x2F97 JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST SWAP1 PUSH2 0x3025 PUSH1 0x20 PUSH1 0x0 PUSH2 0x302B SWAP5 PUSH2 0x301D DUP3 DUP3 ADD PUSH2 0x3017 DUP5 DUP9 ADD PUSH2 0x1EE0 JUMP JUMPDEST SWAP1 PUSH2 0x2F71 JUMP JUMPDEST ADD SWAP3 ADD PUSH2 0x1F15 JUMP JUMPDEST SWAP1 PUSH2 0x2FDA JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x3037 SWAP2 PUSH2 0x2FFA JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x30AA PUSH2 0x30B1 SWAP3 PUSH2 0x3065 DUP4 PUSH2 0x305E PUSH2 0x3058 PUSH2 0x3053 PUSH2 0x32F9 JUMP JUMPDEST PUSH2 0x3FC JUMP JUMPDEST SWAP2 PUSH2 0x3FC JUMP JUMPDEST GT ISZERO PUSH2 0x2EB4 JUMP JUMPDEST PUSH2 0x308B DUP2 PUSH2 0x3084 PUSH2 0x307E PUSH2 0x3079 PUSH1 0x0 PUSH2 0x1F09 JUMP JUMPDEST PUSH2 0x272 JUMP JUMPDEST SWAP2 PUSH2 0x272 JUMP JUMPDEST EQ ISZERO PUSH2 0x2F38 JUMP JUMPDEST SWAP2 PUSH2 0x30A1 PUSH2 0x3097 PUSH2 0x2F61 JUMP JUMPDEST SWAP4 PUSH1 0x0 DUP6 ADD PUSH2 0x1E3A JUMP JUMPDEST PUSH1 0x20 DUP4 ADD PUSH2 0x1E80 JUMP JUMPDEST PUSH1 0x2 PUSH2 0x302D JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x30BC PUSH2 0x1C04 JUMP JUMPDEST POP PUSH1 0x80 PUSH1 0x40 MLOAD ADD SWAP2 PUSH1 0x20 DUP4 ADD PUSH1 0x40 MSTORE PUSH1 0x0 DUP4 MSTORE DUP3 SWAP1 PUSH1 0xA PUSH1 0x0 NOT DUP1 SWAP3 SWAP6 JUMPDEST ADD SWAP5 DUP2 DUP2 MOD PUSH1 0x30 ADD DUP7 MSTORE8 DIV SWAP4 DUP5 ISZERO PUSH2 0x30F9 JUMPI SWAP1 PUSH1 0xA SWAP2 SWAP1 DUP1 SWAP3 SWAP2 PUSH2 0x30DA JUMP JUMPDEST SWAP4 POP POP DUP3 PUSH1 0x20 SWAP2 SUB SWAP3 SUB SWAP2 DUP3 MSTORE JUMP JUMPDEST PUSH2 0x311C PUSH2 0x3117 PUSH2 0x3121 SWAP3 PUSH2 0x1423 JUMP JUMPDEST PUSH2 0xAE6 JUMP JUMPDEST PUSH2 0x2A2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH2 0x3144 DUP3 PUSH2 0xE9A JUMP JUMPDEST DUP2 LT ISZERO PUSH2 0x3155 JUMPI PUSH1 0x20 DUP1 SWAP2 MUL ADD ADD SWAP1 JUMP JUMPDEST PUSH2 0x3124 JUMP JUMPDEST PUSH2 0x3164 SWAP1 MLOAD PUSH2 0x2A2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3173 PUSH2 0x3178 SWAP2 PUSH2 0x1DA5 JUMP JUMPDEST PUSH2 0x8AE JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3185 SWAP1 SLOAD PUSH2 0x3167 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3197 PUSH2 0x319D SWAP2 SWAP4 SWAP3 SWAP4 PUSH2 0x2A2 JUMP JUMPDEST SWAP3 PUSH2 0x2A2 JUMP JUMPDEST DUP3 SUB SWAP2 DUP3 GT PUSH2 0x31A8 JUMPI JUMP JUMPDEST PUSH2 0x1F3E JUMP JUMPDEST SWAP1 PUSH2 0x31C2 PUSH2 0x31BD PUSH2 0x31C9 SWAP3 PUSH2 0xAE9 JUMP JUMPDEST PUSH2 0x195A JUMP JUMPDEST DUP3 SLOAD PUSH2 0x2BB1 JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x31DC PUSH2 0x31E2 SWAP2 SWAP4 SWAP3 SWAP4 PUSH2 0x2A2 JUMP JUMPDEST SWAP3 PUSH2 0x2A2 JUMP JUMPDEST DUP3 ADD DUP1 SWAP3 GT PUSH2 0x31ED JUMPI JUMP JUMPDEST PUSH2 0x1F3E JUMP JUMPDEST PUSH1 0x1 PUSH2 0x31FE SWAP2 ADD PUSH2 0x2A2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3210 SWAP1 SWAP4 SWAP3 SWAP4 DUP3 DUP6 SWAP2 PUSH2 0x3A1F JUMP JUMPDEST PUSH2 0x3219 DUP2 PUSH2 0xE9A JUMP JUMPDEST SWAP3 PUSH2 0x3224 PUSH1 0x0 PUSH2 0x3108 JUMP JUMPDEST SWAP3 PUSH2 0x322D PUSH2 0x180B JUMP JUMPDEST SWAP4 JUMPDEST DUP5 PUSH2 0x3242 PUSH2 0x323C DUP9 PUSH2 0x2A2 JUMP JUMPDEST SWAP2 PUSH2 0x2A2 JUMP JUMPDEST LT ISZERO PUSH2 0x32AF JUMPI PUSH2 0x32A3 PUSH2 0x32A9 SWAP2 PUSH2 0x3262 PUSH2 0x325D DUP7 DUP10 SWAP1 PUSH2 0x313A JUMP JUMPDEST PUSH2 0x315A JUMP JUMPDEST PUSH2 0x329D DUP9 PUSH2 0x3297 PUSH2 0x3288 DUP11 PUSH2 0x3282 PUSH2 0x327D DUP8 SWAP6 PUSH1 0x1 SWAP4 PUSH2 0x313A JUMP JUMPDEST PUSH2 0x315A JUMP JUMPDEST SWAP1 PUSH2 0xB05 JUMP JUMPDEST SWAP2 PUSH2 0x3292 DUP4 PUSH2 0x317B JUMP JUMPDEST PUSH2 0x3188 JUMP JUMPDEST SWAP1 PUSH2 0x31AD JUMP JUMPDEST SWAP1 PUSH2 0x31CD JUMP JUMPDEST SWAP5 PUSH2 0x31F2 JUMP JUMPDEST SWAP4 PUSH2 0x322F JUMP JUMPDEST SWAP2 POP SWAP4 POP PUSH2 0x32D3 SWAP3 POP PUSH2 0x32CC SWAP2 POP PUSH2 0x32C7 PUSH1 0x0 PUSH2 0x317B JUMP JUMPDEST PUSH2 0x3188 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x31AD JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x32F1 PUSH2 0x32EC PUSH2 0x32F6 SWAP3 PUSH2 0x32DA JUMP JUMPDEST PUSH2 0xAE6 JUMP JUMPDEST PUSH2 0x3FC JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3301 PUSH2 0x32D5 JUMP JUMPDEST POP PUSH2 0x330D PUSH2 0x2710 PUSH2 0x32DD JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3318 PUSH2 0x1834 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x3326 PUSH2 0x1834 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST POP POP SWAP5 SWAP3 SWAP4 SWAP1 SWAP4 PUSH2 0x333B PUSH2 0x331E JUMP JUMPDEST PUSH2 0x3348 JUMPI JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x335E PUSH2 0x3364 SWAP4 PUSH2 0x336A SWAP8 SWAP7 SWAP1 SWAP3 SWAP4 SWAP6 SWAP7 PUSH2 0x2080 JUMP JUMPDEST POP PUSH2 0x2080 JUMP JUMPDEST POP PUSH2 0x208E JUMP JUMPDEST POP CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x3340 JUMP JUMPDEST SWAP1 PUSH2 0x3398 PUSH2 0x3393 PUSH2 0x339D SWAP4 PUSH2 0x338C DUP2 DUP6 SWAP1 PUSH2 0x3A3A JUMP JUMPDEST PUSH1 0x5 PUSH2 0x258F JUMP JUMPDEST PUSH2 0x25A7 JUMP JUMPDEST PUSH2 0x3B21 JUMP JUMPDEST POP JUMP JUMPDEST PUSH2 0x33A8 PUSH2 0x1DF1 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x33CF PUSH2 0x33CA PUSH2 0x33D4 SWAP4 PUSH2 0x33C3 DUP2 DUP6 SWAP1 PUSH2 0x3B5C JUMP JUMPDEST PUSH1 0x5 PUSH2 0x258F JUMP JUMPDEST PUSH2 0x25A7 JUMP JUMPDEST PUSH2 0x3BF6 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0x455243323938313A20496E76616C696420706172616D65746572730000000000 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x340C PUSH1 0x1B PUSH1 0x20 SWAP3 PUSH2 0x647 JUMP JUMPDEST PUSH2 0x3415 DUP2 PUSH2 0x33D7 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x342F SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x33FF JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x3439 JUMPI JUMP JUMPDEST PUSH2 0x3441 PUSH2 0x252 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x3457 PUSH1 0x4 DUP3 ADD PUSH2 0x3419 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x34D7 SWAP1 PUSH2 0x34D0 PUSH2 0x34DC SWAP5 SWAP4 PUSH2 0x348B DUP6 PUSH2 0x3484 PUSH2 0x347E PUSH2 0x3479 PUSH2 0x32F9 JUMP JUMPDEST PUSH2 0x3FC JUMP JUMPDEST SWAP2 PUSH2 0x3FC JUMP JUMPDEST GT ISZERO PUSH2 0x2EB4 JUMP JUMPDEST PUSH2 0x34B1 DUP2 PUSH2 0x34AA PUSH2 0x34A4 PUSH2 0x349F PUSH1 0x0 PUSH2 0x1F09 JUMP JUMPDEST PUSH2 0x272 JUMP JUMPDEST SWAP2 PUSH2 0x272 JUMP JUMPDEST EQ ISZERO PUSH2 0x3432 JUMP JUMPDEST SWAP4 PUSH2 0x34C7 PUSH2 0x34BD PUSH2 0x2F61 JUMP JUMPDEST SWAP6 PUSH1 0x0 DUP8 ADD PUSH2 0x1E3A JUMP JUMPDEST PUSH1 0x20 DUP6 ADD PUSH2 0x1E80 JUMP JUMPDEST PUSH1 0x3 PUSH2 0x1DF6 JUMP JUMPDEST PUSH2 0x302D JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x352C SWAP2 SWAP3 PUSH2 0x34F8 PUSH2 0x3532 SWAP6 PUSH2 0x351D SWAP4 SWAP1 DUP7 DUP5 SWAP2 SWAP3 PUSH2 0x3C31 JUMP JUMPDEST PUSH2 0x3515 PUSH2 0x350E DUP3 PUSH2 0x3509 PUSH1 0x0 PUSH2 0x317B JUMP JUMPDEST PUSH2 0x31CD JUMP JUMPDEST PUSH1 0x0 PUSH2 0x31AD JUMP JUMPDEST SWAP3 PUSH1 0x1 PUSH2 0xB05 JUMP JUMPDEST SWAP2 PUSH2 0x3527 DUP4 PUSH2 0x317B JUMP JUMPDEST PUSH2 0x31CD JUMP JUMPDEST SWAP1 PUSH2 0x31AD JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x3540 PUSH1 0xFF SWAP2 PUSH2 0x1426 JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST PUSH2 0x3553 SWAP1 PUSH2 0x39F JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x356E PUSH2 0x3569 PUSH2 0x3575 SWAP3 PUSH2 0x354A JUMP JUMPDEST PUSH2 0x3556 JUMP JUMPDEST DUP3 SLOAD PUSH2 0x3534 JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST SWAP2 SWAP1 SWAP5 SWAP3 PUSH2 0x3587 PUSH1 0xB PUSH2 0x261C JUMP JUMPDEST PUSH2 0x35FA JUMPI PUSH2 0x35A7 PUSH2 0x35AE SWAP3 PUSH2 0x35A0 PUSH2 0x35EC SWAP9 PUSH1 0x8 PUSH2 0x1B03 JUMP JUMPDEST PUSH1 0x9 PUSH2 0x1B03 JUMP JUMPDEST PUSH1 0xA PUSH2 0x1B03 JUMP JUMPDEST PUSH2 0x35C0 PUSH2 0x35B9 PUSH2 0x1448 JUMP JUMPDEST DUP3 SWAP1 PUSH2 0x3376 JUMP JUMPDEST PUSH2 0x35D2 PUSH2 0x35CB PUSH2 0x188F JUMP JUMPDEST DUP3 SWAP1 PUSH2 0x3376 JUMP JUMPDEST PUSH2 0x35E4 PUSH2 0x35DD PUSH2 0x18E7 JUMP JUMPDEST DUP3 SWAP1 PUSH2 0x3376 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH2 0x3D32 JUMP JUMPDEST PUSH2 0x35F8 PUSH1 0x1 PUSH1 0xB PUSH2 0x3559 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 PUSH4 0xF92EE8A9 PUSH1 0xE0 SHL DUP2 MSTORE DUP1 PUSH2 0x3613 PUSH1 0x4 DUP3 ADD PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3626 PUSH2 0x362B SWAP2 PUSH2 0x1DA5 JUMP JUMPDEST PUSH2 0xAE9 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3642 PUSH2 0x363D PUSH2 0x3647 SWAP3 PUSH2 0x2A2 JUMP JUMPDEST PUSH2 0xAE6 JUMP JUMPDEST PUSH2 0x267 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3676 PUSH2 0x3671 PUSH2 0x3680 SWAP4 PUSH2 0x366C PUSH1 0x0 PUSH2 0x367B SWAP6 PUSH2 0x3665 PUSH2 0x1DF1 JUMP JUMPDEST POP ADD PUSH2 0x3617 JUMP JUMPDEST PUSH2 0x3DAD JUMP JUMPDEST PUSH2 0x361A JUMP JUMPDEST PUSH2 0x362E JUMP JUMPDEST PUSH2 0x25D2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x36BE PUSH2 0x36D3 SWAP4 PUSH2 0x3699 PUSH2 0x36CD SWAP4 DUP6 DUP4 SWAP2 PUSH2 0x3DCF JUMP JUMPDEST PUSH2 0x36B6 PUSH2 0x36AF DUP3 PUSH2 0x36AA PUSH1 0x0 PUSH2 0x317B JUMP JUMPDEST PUSH2 0x3188 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x31AD JUMP JUMPDEST SWAP3 PUSH1 0x1 PUSH2 0xB05 JUMP JUMPDEST SWAP2 PUSH2 0x36C8 DUP4 PUSH2 0x317B JUMP JUMPDEST PUSH2 0x3188 JUMP JUMPDEST SWAP1 PUSH2 0x31AD JUMP JUMPDEST JUMP JUMPDEST SWAP3 PUSH2 0x36E7 SWAP2 SWAP5 SWAP3 SWAP4 SWAP1 DUP6 DUP6 SWAP2 SWAP3 PUSH2 0x3DEA JUMP JUMPDEST PUSH2 0x36F0 DUP4 PUSH2 0xE9A JUMP JUMPDEST SWAP2 PUSH2 0x36FB PUSH1 0x0 PUSH2 0x3108 JUMP JUMPDEST SWAP2 PUSH2 0x3704 PUSH2 0x180B JUMP JUMPDEST JUMPDEST DUP1 PUSH2 0x3718 PUSH2 0x3712 DUP8 PUSH2 0x2A2 JUMP JUMPDEST SWAP2 PUSH2 0x2A2 JUMP JUMPDEST LT ISZERO PUSH2 0x3784 JUMPI PUSH2 0x377F SWAP1 PUSH2 0x377A PUSH2 0x3743 PUSH2 0x373B PUSH2 0x3736 DUP8 DUP6 SWAP1 PUSH2 0x313A JUMP JUMPDEST PUSH2 0x315A JUMP JUMPDEST SWAP7 DUP8 SWAP1 PUSH2 0x31CD JUMP JUMPDEST SWAP6 PUSH2 0x3774 PUSH2 0x3765 PUSH1 0x1 PUSH2 0x375F PUSH2 0x375A DUP14 DUP9 SWAP1 PUSH2 0x313A JUMP JUMPDEST PUSH2 0x315A JUMP JUMPDEST SWAP1 PUSH2 0xB05 JUMP JUMPDEST SWAP2 PUSH2 0x376F DUP4 PUSH2 0x317B JUMP JUMPDEST PUSH2 0x31CD JUMP JUMPDEST SWAP1 PUSH2 0x31AD JUMP JUMPDEST PUSH2 0x31F2 JUMP JUMPDEST PUSH2 0x3705 JUMP JUMPDEST POP SWAP4 POP POP PUSH2 0x37A7 SWAP2 POP PUSH2 0x37A0 SWAP1 PUSH2 0x379B PUSH1 0x0 PUSH2 0x317B JUMP JUMPDEST PUSH2 0x31CD JUMP JUMPDEST PUSH1 0x0 PUSH2 0x31AD JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x37C1 PUSH1 0x0 PUSH2 0x37C6 SWAP3 PUSH2 0x37BA PUSH2 0x180B JUMP JUMPDEST POP ADD PUSH2 0x3617 JUMP JUMPDEST PUSH2 0x3F2D JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x37D2 PUSH2 0x241D JUMP JUMPDEST POP PUSH1 0x40 MLOAD SWAP2 PUSH1 0x40 DUP4 ADD PUSH1 0x40 MSTORE PUSH1 0x1 DUP4 MSTORE PUSH1 0x20 DUP4 ADD MSTORE JUMP JUMPDEST PUSH2 0x37F1 PUSH2 0x1834 JUMP JUMPDEST POP PUSH4 0x3E85E62F PUSH1 0xE0 SHL PUSH2 0x380C PUSH2 0x3806 DUP4 PUSH2 0x350 JUMP JUMPDEST SWAP2 PUSH2 0x350 JUMP JUMPDEST EQ SWAP1 DUP2 ISZERO PUSH2 0x3819 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x3823 SWAP2 POP PUSH2 0x3F45 JUMP JUMPDEST CODESIZE PUSH2 0x3815 JUMP JUMPDEST PUSH2 0x3831 PUSH2 0x1834 JUMP JUMPDEST POP PUSH2 0x383B DUP2 PUSH2 0x3F6C JUMP JUMPDEST DUP1 ISZERO PUSH2 0x3880 JUMPI JUMPDEST DUP1 ISZERO PUSH2 0x3865 JUMPI JUMPDEST SWAP1 DUP2 ISZERO PUSH2 0x3855 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x385F SWAP2 POP PUSH2 0x3FAC JUMP JUMPDEST CODESIZE PUSH2 0x3851 JUMP JUMPDEST POP PUSH1 0x0 PUSH2 0x387A PUSH2 0x3874 DUP4 PUSH2 0x350 JUMP JUMPDEST SWAP2 PUSH2 0x350 JUMP JUMPDEST EQ PUSH2 0x3849 JUMP JUMPDEST POP PUSH2 0x388A DUP2 PUSH2 0x3FAC JUMP JUMPDEST PUSH2 0x3842 JUMP JUMPDEST PUSH2 0x3897 PUSH2 0x1834 JUMP JUMPDEST POP PUSH2 0x38A1 DUP2 PUSH2 0x3FAC JUMP JUMPDEST SWAP1 DUP2 ISZERO PUSH2 0x38AD JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x38B7 SWAP2 POP PUSH2 0x3FEC JUMP JUMPDEST CODESIZE PUSH2 0x38A9 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x38D4 PUSH2 0x38CF PUSH2 0x38D9 SWAP3 PUSH2 0x38BD JUMP JUMPDEST PUSH2 0xAE6 JUMP JUMPDEST PUSH2 0x2A2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x416363657373436F6E74726F6C3A206163636F756E7420000000000000000000 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x3910 PUSH1 0x17 DUP1 SWAP3 PUSH2 0x1C09 JUMP JUMPDEST PUSH2 0x3919 DUP2 PUSH2 0x38DC JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x206973206D697373696E6720726F6C6520000000000000000000000000000000 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x3951 PUSH1 0x11 DUP1 SWAP3 PUSH2 0x1C09 JUMP JUMPDEST PUSH2 0x395A DUP2 PUSH2 0x391D JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x3978 PUSH2 0x3983 SWAP4 SWAP3 PUSH2 0x3972 PUSH2 0x397D SWAP4 PUSH2 0x3904 JUMP JUMPDEST SWAP1 PUSH2 0x1C97 JUMP JUMPDEST PUSH2 0x3945 JUMP JUMPDEST SWAP1 PUSH2 0x1C97 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x399B PUSH2 0x3995 DUP4 DUP4 SWAP1 PUSH2 0x2629 JUMP JUMPDEST ISZERO PUSH2 0x39F JUMP JUMPDEST PUSH2 0x39A3 JUMPI POP POP JUMP JUMPDEST PUSH2 0x3A1B SWAP2 PUSH2 0x39F9 PUSH2 0x39D2 PUSH2 0x39C2 PUSH2 0x39BC PUSH2 0x39FE SWAP6 PUSH2 0x407A JUMP JUMPDEST SWAP4 PUSH2 0x361A JUMP JUMPDEST PUSH2 0x39CC PUSH1 0x20 PUSH2 0x38C0 JUMP JUMPDEST SWAP1 PUSH2 0x4293 JUMP JUMPDEST SWAP2 PUSH2 0x39EA PUSH2 0x39DE PUSH2 0x252 JUMP JUMPDEST SWAP4 DUP5 SWAP3 PUSH1 0x20 DUP5 ADD PUSH2 0x395E JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE SUB DUP3 PUSH2 0x5CF JUMP JUMPDEST PUSH2 0x1D20 JUMP JUMPDEST PUSH2 0x3A06 PUSH2 0x252 JUMP JUMPDEST SWAP2 DUP3 SWAP2 PUSH3 0x461BCD PUSH1 0xE5 SHL DUP4 MSTORE PUSH1 0x4 DUP4 ADD PUSH2 0x6A6 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP1 SWAP2 PUSH2 0x3A38 SWAP3 PUSH2 0x3A2F PUSH1 0x0 PUSH2 0x1F09 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 SWAP3 PUSH2 0x440E JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x3A4E PUSH2 0x3A48 DUP3 DUP5 SWAP1 PUSH2 0x2629 JUMP JUMPDEST ISZERO PUSH2 0x39F JUMP JUMPDEST PUSH2 0x3A57 JUMPI JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x3A7A PUSH1 0x1 PUSH2 0x3A75 PUSH1 0x0 PUSH2 0x3A6D PUSH1 0x4 DUP7 SWAP1 PUSH2 0x1D8D JUMP JUMPDEST ADD DUP6 SWAP1 PUSH2 0x25EA JUMP JUMPDEST PUSH2 0x3559 JUMP JUMPDEST SWAP1 PUSH2 0x3A83 PUSH2 0x33A0 JUMP JUMPDEST SWAP1 PUSH2 0x3AC0 PUSH2 0x3ABA PUSH2 0x3AB4 PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP6 PUSH2 0x1D81 JUMP JUMPDEST SWAP3 PUSH2 0x25DE JUMP JUMPDEST SWAP3 PUSH2 0x25DE JUMP JUMPDEST SWAP3 PUSH2 0x3AC9 PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0x3AD3 DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 LOG4 CODESIZE DUP1 PUSH2 0x3A53 JUMP JUMPDEST PUSH2 0x3AE6 SWAP1 PUSH2 0x1B66 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3AFD PUSH2 0x3AF8 PUSH2 0x3B02 SWAP3 PUSH2 0x267 JUMP JUMPDEST PUSH2 0xAE6 JUMP JUMPDEST PUSH2 0x2A2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3B19 PUSH2 0x3B14 PUSH2 0x3B1E SWAP3 PUSH2 0x2A2 JUMP JUMPDEST PUSH2 0x1426 JUMP JUMPDEST PUSH2 0xA48 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x3B54 PUSH2 0x3B4E PUSH2 0x3B49 PUSH2 0x3B44 PUSH1 0x0 PUSH2 0x3B59 SWAP7 PUSH2 0x3B3C PUSH2 0x1834 JUMP JUMPDEST POP ADD SWAP5 PUSH2 0x3ADD JUMP JUMPDEST PUSH2 0x3AE9 JUMP JUMPDEST PUSH2 0x3B05 JUMP JUMPDEST SWAP2 PUSH2 0x3617 JUMP JUMPDEST PUSH2 0x45FE JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3B67 DUP2 DUP4 SWAP1 PUSH2 0x2629 JUMP JUMPDEST PUSH2 0x3B70 JUMPI JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x3B93 PUSH1 0x0 PUSH2 0x3B8E PUSH1 0x0 PUSH2 0x3B86 PUSH1 0x4 DUP7 SWAP1 PUSH2 0x1D8D JUMP JUMPDEST ADD DUP6 SWAP1 PUSH2 0x25EA JUMP JUMPDEST PUSH2 0x3559 JUMP JUMPDEST SWAP1 PUSH2 0x3B9C PUSH2 0x33A0 JUMP JUMPDEST SWAP1 PUSH2 0x3BD9 PUSH2 0x3BD3 PUSH2 0x3BCD PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP6 PUSH2 0x1D81 JUMP JUMPDEST SWAP3 PUSH2 0x25DE JUMP JUMPDEST SWAP3 PUSH2 0x25DE JUMP JUMPDEST SWAP3 PUSH2 0x3BE2 PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0x3BEC DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 LOG4 CODESIZE DUP1 PUSH2 0x3B6C JUMP JUMPDEST SWAP1 PUSH2 0x3C29 PUSH2 0x3C23 PUSH2 0x3C1E PUSH2 0x3C19 PUSH1 0x0 PUSH2 0x3C2E SWAP7 PUSH2 0x3C11 PUSH2 0x1834 JUMP JUMPDEST POP ADD SWAP5 PUSH2 0x3ADD JUMP JUMPDEST PUSH2 0x3AE9 JUMP JUMPDEST PUSH2 0x3B05 JUMP JUMPDEST SWAP2 PUSH2 0x3617 JUMP JUMPDEST PUSH2 0x46BE JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP2 SWAP3 SWAP1 SWAP3 PUSH2 0x3C3D PUSH2 0x3310 JUMP JUMPDEST PUSH2 0x3D19 JUMPI JUMPDEST DUP3 PUSH1 0x60 SHL DUP1 ISZERO PUSH2 0x3D0B JUMPI PUSH8 0x9A31110384E0B0C9 PUSH1 0x20 MSTORE DUP4 PUSH1 0x14 MSTORE DUP5 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP1 SLOAD SWAP1 DUP4 DUP3 ADD SWAP2 DUP3 LT PUSH2 0x3CFD JUMPI SSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x60 SHR PUSH1 0x0 CALLER PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP4 LOG4 PUSH2 0x3CAA PUSH2 0x331E JUMP JUMPDEST PUSH2 0x3CE4 JUMPI JUMPDEST PUSH2 0x3CB8 DUP4 PUSH2 0x47C8 JUMP JUMPDEST PUSH2 0x3CC3 JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x3CDB SWAP4 PUSH2 0x3CD1 PUSH1 0x0 PUSH2 0x1F09 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 SWAP3 SWAP4 PUSH2 0x47D5 JUMP JUMPDEST CODESIZE DUP1 DUP1 DUP1 PUSH2 0x3CBD JUMP JUMPDEST PUSH2 0x3CED DUP5 PUSH2 0x37C9 JUMP JUMPDEST POP PUSH2 0x3CF7 DUP2 PUSH2 0x37C9 JUMP JUMPDEST POP PUSH2 0x3CAF JUMP JUMPDEST PUSH4 0x1336CEA PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0xEA553B34 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH2 0x3D22 DUP5 PUSH2 0x37C9 JUMP JUMPDEST POP PUSH2 0x3D2C DUP2 PUSH2 0x37C9 JUMP JUMPDEST POP PUSH2 0x3C42 JUMP JUMPDEST SWAP1 PUSH2 0x3D48 PUSH2 0x3D4D SWAP4 SWAP3 PUSH2 0x3D43 PUSH2 0x1B27 JUMP JUMPDEST PUSH2 0x3376 JUMP JUMPDEST PUSH2 0x486E JUMP JUMPDEST JUMP JUMPDEST SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH2 0x3D67 DUP2 PUSH2 0x3D4F JUMP JUMPDEST DUP3 LT ISZERO PUSH2 0x3D82 JUMPI PUSH2 0x3D79 PUSH1 0x1 SWAP2 PUSH2 0x3D53 JUMP JUMPDEST SWAP2 MUL ADD SWAP1 PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x3124 JUMP JUMPDEST PUSH2 0x3D97 SWAP1 PUSH1 0x8 PUSH2 0x3D9C SWAP4 MUL PUSH2 0x8AA JUMP JUMPDEST PUSH2 0x1DAB JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x3DAA SWAP2 SLOAD PUSH2 0x3D87 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3DCC SWAP2 PUSH1 0x0 PUSH2 0x3DC6 SWAP3 PUSH2 0x3DBF PUSH2 0x1D7C JUMP JUMPDEST POP ADD PUSH2 0x3D5E JUMP JUMPDEST SWAP1 PUSH2 0x3D9F JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 SWAP2 PUSH2 0x3DE8 SWAP3 PUSH2 0x3DDF PUSH1 0x0 PUSH2 0x1F09 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 SWAP3 PUSH2 0x488E JUMP JUMPDEST JUMP JUMPDEST SWAP2 SWAP3 SWAP1 SWAP3 PUSH2 0x3DF6 PUSH2 0x3310 JUMP JUMPDEST PUSH2 0x3F28 JUMPI JUMPDEST DUP1 MLOAD DUP5 MLOAD SUB PUSH2 0x3F1A JUMPI DUP3 PUSH1 0x60 SHL DUP1 ISZERO PUSH2 0x3F0C JUMPI DUP1 PUSH8 0x9A31110384E0B0C9 OR PUSH1 0x20 MSTORE DUP5 MLOAD PUSH1 0x5 SHL DUP1 JUMPDEST PUSH2 0x3ED5 JUMPI POP PUSH1 0x0 PUSH1 0x40 MLOAD PUSH1 0x40 DUP2 MSTORE PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB DUP2 DUP9 MLOAD PUSH1 0x5 SHL PUSH1 0x20 ADD PUSH1 0x40 DUP3 ADD SWAP1 DUP2 DUP2 DUP13 PUSH1 0x4 GAS STATICCALL POP RETURNDATASIZE PUSH1 0x40 ADD PUSH1 0x20 DUP4 ADD MSTORE RETURNDATASIZE ADD DUP7 MLOAD PUSH1 0x5 SHL PUSH1 0x20 ADD DUP2 DUP2 DUP10 PUSH1 0x4 GAS STATICCALL POP RETURNDATASIZE ADD SUB SWAP4 PUSH1 0x60 SHR SWAP4 CALLER SWAP3 LOG4 PUSH2 0x3E96 PUSH2 0x331E JUMP JUMPDEST PUSH2 0x3ED0 JUMPI JUMPDEST PUSH2 0x3EA4 DUP4 PUSH2 0x47C8 JUMP JUMPDEST PUSH2 0x3EAF JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x3EC7 SWAP4 PUSH2 0x3EBD PUSH1 0x0 PUSH2 0x1F09 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 SWAP3 SWAP4 PUSH2 0x4992 JUMP JUMPDEST CODESIZE DUP1 DUP1 DUP1 PUSH2 0x3EA9 JUMP JUMPDEST PUSH2 0x3E9B JUMP JUMPDEST DUP1 DUP4 ADD MLOAD SWAP1 DUP1 DUP8 ADD MLOAD PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 DUP3 SLOAD SWAP1 DUP2 ADD SWAP1 DUP2 LT PUSH2 0x3EFE JUMPI PUSH1 0x20 SWAP3 SSTORE SUB DUP1 PUSH2 0x3E23 JUMP JUMPDEST PUSH4 0x1336CEA PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0xEA553B34 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0x3B800A46 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH2 0x3DFB JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3F42 SWAP2 PUSH2 0x3F3B PUSH2 0x180B JUMP JUMPDEST POP ADD PUSH2 0x3D4F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3F4D PUSH2 0x1834 JUMP JUMPDEST POP PUSH1 0xE0 SHR PUSH4 0xE89341C DUP2 EQ SWAP1 PUSH4 0x1FFC9A7 PUSH4 0xD9B67A26 DUP3 EQ SWAP2 EQ OR OR SWAP1 JUMP JUMPDEST PUSH2 0x3F74 PUSH2 0x1834 JUMP JUMPDEST POP DUP1 PUSH2 0x3F8F PUSH2 0x3F89 PUSH4 0x152A902D PUSH1 0xE1 SHL PUSH2 0x350 JUMP JUMPDEST SWAP2 PUSH2 0x350 JUMP JUMPDEST EQ SWAP1 DUP2 ISZERO PUSH2 0x3F9C JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x3FA6 SWAP2 POP PUSH2 0x4A49 JUMP JUMPDEST CODESIZE PUSH2 0x3F98 JUMP JUMPDEST PUSH2 0x3FB4 PUSH2 0x1834 JUMP JUMPDEST POP DUP1 PUSH2 0x3FCF PUSH2 0x3FC9 PUSH4 0x5A05180F PUSH1 0xE0 SHL PUSH2 0x350 JUMP JUMPDEST SWAP2 PUSH2 0x350 JUMP JUMPDEST EQ SWAP1 DUP2 ISZERO PUSH2 0x3FDC JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x3FE6 SWAP2 POP PUSH2 0x4A6F JUMP JUMPDEST CODESIZE PUSH2 0x3FD8 JUMP JUMPDEST PUSH2 0x3FF4 PUSH2 0x1834 JUMP JUMPDEST POP DUP1 PUSH2 0x400F PUSH2 0x4009 PUSH4 0x4E821D33 PUSH1 0xE1 SHL PUSH2 0x350 JUMP JUMPDEST SWAP2 PUSH2 0x350 JUMP JUMPDEST EQ SWAP1 DUP2 ISZERO PUSH2 0x401C JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x4026 SWAP2 POP PUSH2 0x3829 JUMP JUMPDEST CODESIZE PUSH2 0x4018 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH2 0x4049 PUSH2 0x4044 PUSH2 0x404E SWAP3 PUSH2 0x402C JUMP JUMPDEST PUSH2 0xAE6 JUMP JUMPDEST PUSH2 0x402F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x405B PUSH1 0x14 PUSH2 0x4035 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x4072 PUSH2 0x406D PUSH2 0x4077 SWAP3 PUSH2 0x402F JUMP JUMPDEST PUSH2 0xAE6 JUMP JUMPDEST PUSH2 0x2A2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x4097 PUSH2 0x4092 PUSH2 0x40AD SWAP3 PUSH2 0x408C PUSH2 0x1C04 JUMP JUMPDEST POP PUSH2 0x3ADD JUMP JUMPDEST PUSH2 0x3AE9 JUMP JUMPDEST PUSH2 0x40A7 PUSH2 0x40A2 PUSH2 0x4051 JUMP JUMPDEST PUSH2 0x405E JUMP JUMPDEST SWAP1 PUSH2 0x4293 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x40C7 PUSH2 0x40C2 PUSH2 0x40CC SWAP3 PUSH2 0x40B0 JUMP JUMPDEST PUSH2 0xAE6 JUMP JUMPDEST PUSH2 0x2A2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x40E1 PUSH2 0x40DC DUP4 PUSH2 0x1028 JUMP JUMPDEST PUSH2 0x6FE JUMP JUMPDEST SWAP2 DUP3 MSTORE JUMP JUMPDEST CALLDATASIZE SWAP1 CALLDATACOPY JUMP JUMPDEST SWAP1 PUSH2 0x4110 PUSH2 0x40F8 DUP4 PUSH2 0x40CF JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP1 PUSH2 0x4106 DUP7 SWAP4 PUSH2 0x1028 JUMP JUMPDEST SWAP3 ADD SWAP2 SUB SWAP1 PUSH2 0x40E6 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x3 PUSH1 0xFC SHL SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x4128 DUP3 PUSH2 0x411A JUMP JUMPDEST DUP2 LT ISZERO PUSH2 0x413A JUMPI PUSH1 0x1 PUSH1 0x20 SWAP2 MUL ADD ADD SWAP1 JUMP JUMPDEST PUSH2 0x3124 JUMP JUMPDEST PUSH1 0xF PUSH1 0xFB SHL SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x415E PUSH2 0x4159 PUSH2 0x4163 SWAP3 PUSH2 0x4147 JUMP JUMPDEST PUSH2 0xAE6 JUMP JUMPDEST PUSH2 0x2A2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x416F SWAP1 PUSH2 0x2A2 JUMP JUMPDEST PUSH1 0x0 DUP2 EQ PUSH2 0x417E JUMPI PUSH1 0x1 SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH2 0x1F3E JUMP JUMPDEST PUSH16 0x181899199A1A9B1B9C1CB0B131B232B3 PUSH1 0x81 SHL SWAP1 JUMP JUMPDEST PUSH2 0x41A2 PUSH2 0x4183 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x41BC PUSH2 0x41B7 PUSH2 0x41C1 SWAP3 PUSH2 0x41A5 JUMP JUMPDEST PUSH2 0xAE6 JUMP JUMPDEST PUSH2 0x2A2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xF8 SHL SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x41E1 PUSH2 0x41DC PUSH2 0x41E6 SWAP3 PUSH2 0x41CA JUMP JUMPDEST PUSH2 0xAE6 JUMP JUMPDEST PUSH2 0x402F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x4208 SWAP1 PUSH2 0x4202 PUSH2 0x41FC PUSH2 0x420D SWAP5 PUSH2 0x402F JUMP JUMPDEST SWAP2 PUSH2 0x2A2 JUMP JUMPDEST SWAP1 PUSH2 0x8AA JUMP JUMPDEST PUSH2 0x2A2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x537472696E67733A20686578206C656E67746820696E73756666696369656E74 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x4244 PUSH1 0x20 DUP1 SWAP3 PUSH2 0x647 JUMP JUMPDEST PUSH2 0x424D DUP2 PUSH2 0x4210 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x4267 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x4238 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x4271 JUMPI JUMP JUMPDEST PUSH2 0x4279 PUSH2 0x252 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x428F PUSH1 0x4 DUP3 ADD PUSH2 0x4251 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP2 SWAP1 PUSH2 0x429D PUSH2 0x1C04 JUMP JUMPDEST POP PUSH2 0x4337 PUSH2 0x4327 PUSH2 0x42D3 PUSH2 0x42CE PUSH2 0x42BE PUSH1 0x2 PUSH2 0x42B9 DUP8 SWAP2 PUSH2 0x40B3 JUMP JUMPDEST PUSH2 0x1F54 JUMP JUMPDEST PUSH2 0x42C8 PUSH1 0x2 PUSH2 0x40B3 JUMP JUMPDEST SWAP1 PUSH2 0x31CD JUMP JUMPDEST PUSH2 0x40EB JUMP JUMPDEST SWAP3 PUSH2 0x42DC PUSH2 0x4112 JUMP JUMPDEST PUSH2 0x42F5 DUP6 PUSH2 0x42EF PUSH1 0x0 SWAP4 PUSH1 0x0 BYTE SWAP4 PUSH2 0x3108 JUMP JUMPDEST SWAP1 PUSH2 0x411E JUMP JUMPDEST MSTORE8 PUSH2 0x42FE PUSH2 0x413F JUMP JUMPDEST PUSH2 0x4317 DUP6 PUSH2 0x4311 PUSH1 0x1 SWAP4 PUSH1 0x0 BYTE SWAP4 PUSH2 0x414A JUMP JUMPDEST SWAP1 PUSH2 0x411E JUMP JUMPDEST MSTORE8 PUSH2 0x4322 PUSH1 0x2 PUSH2 0x40B3 JUMP JUMPDEST PUSH2 0x1F54 JUMP JUMPDEST PUSH2 0x4331 PUSH1 0x1 PUSH2 0x414A JUMP JUMPDEST SWAP1 PUSH2 0x31CD JUMP JUMPDEST SWAP3 JUMPDEST DUP4 PUSH2 0x434D PUSH2 0x4347 PUSH1 0x1 PUSH2 0x414A JUMP JUMPDEST SWAP2 PUSH2 0x2A2 JUMP JUMPDEST GT ISZERO PUSH2 0x43B4 JUMPI PUSH2 0x435B PUSH2 0x419A JUMP JUMPDEST DUP2 PUSH2 0x4366 PUSH1 0xF PUSH2 0x41A8 JUMP JUMPDEST AND SWAP2 PUSH1 0x10 DUP4 LT ISZERO PUSH2 0x43AF JUMPI PUSH2 0x4382 PUSH2 0x43A3 SWAP3 PUSH2 0x43A9 SWAP5 BYTE PUSH2 0x41C4 JUMP JUMPDEST PUSH2 0x4392 DUP6 SWAP2 DUP9 SWAP1 PUSH1 0x0 BYTE SWAP3 PUSH2 0x411E JUMP JUMPDEST MSTORE8 PUSH2 0x439D PUSH1 0x4 PUSH2 0x41CD JUMP JUMPDEST SWAP1 PUSH2 0x41E9 JUMP JUMPDEST SWAP4 PUSH2 0x4166 JUMP JUMPDEST SWAP3 PUSH2 0x4339 JUMP JUMPDEST PUSH2 0x3124 JUMP JUMPDEST PUSH2 0x43DC SWAP3 SWAP4 POP PUSH2 0x43D7 SWAP1 PUSH2 0x43D1 PUSH2 0x43CB PUSH1 0x0 PUSH2 0x3108 JUMP JUMPDEST SWAP2 PUSH2 0x2A2 JUMP JUMPDEST EQ PUSH2 0x426A JUMP JUMPDEST PUSH2 0x1D20 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x43F1 PUSH2 0x43EC DUP4 PUSH2 0x713 JUMP JUMPDEST PUSH2 0x6FE JUMP JUMPDEST SWAP2 DUP3 MSTORE JUMP JUMPDEST PUSH2 0x4400 PUSH1 0x0 PUSH2 0x43DF JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x440B PUSH2 0x43F6 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP2 SWAP4 SWAP3 SWAP1 PUSH2 0x441A PUSH2 0x3310 JUMP JUMPDEST PUSH2 0x4546 JUMPI JUMPDEST DUP2 MLOAD DUP6 MLOAD SUB PUSH2 0x4538 JUMPI PUSH1 0x60 SHL SWAP2 DUP3 PUSH8 0x9A31110384E0B0C9 OR PUSH1 0x20 MSTORE DUP1 PUSH1 0x60 SHL DUP4 DUP2 EQ SWAP1 ISZERO OR ISZERO PUSH2 0x4516 JUMPI JUMPDEST POP DUP4 MLOAD PUSH1 0x5 SHL DUP1 JUMPDEST PUSH2 0x44E0 JUMPI POP PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH1 0x0 SWAP4 SWAP5 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP2 PUSH1 0x40 DUP4 MSTORE DUP1 MLOAD PUSH1 0x5 SHL PUSH1 0x20 ADD DUP1 SWAP2 PUSH1 0x40 DUP6 ADD SWAP3 DUP4 SWAP2 PUSH1 0x4 GAS STATICCALL POP RETURNDATASIZE PUSH1 0x40 ADD PUSH1 0x20 DUP5 ADD MSTORE RETURNDATASIZE ADD SWAP1 DUP2 DUP2 MLOAD PUSH1 0x5 SHL PUSH1 0x20 ADD DUP1 SWAP3 PUSH1 0x4 GAS STATICCALL POP RETURNDATASIZE ADD SUB SWAP3 PUSH1 0x60 SHR SWAP3 CALLER SWAP3 LOG4 PUSH2 0x44CB PUSH2 0x331E JUMP JUMPDEST PUSH2 0x44D2 JUMPI JUMPDEST JUMP JUMPDEST PUSH2 0x44DA PUSH2 0x4403 JUMP JUMPDEST POP PUSH2 0x44D0 JUMP JUMPDEST DUP1 DUP3 ADD MLOAD SWAP1 DUP1 DUP7 ADD MLOAD PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP1 SLOAD SWAP3 DUP4 DUP2 GT PUSH2 0x4508 JUMPI PUSH1 0x20 SWAP4 SUB SWAP1 SSTORE SUB DUP1 PUSH2 0x4452 JUMP JUMPDEST PUSH4 0xF4D678B8 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x34 PUSH1 0xC KECCAK256 SLOAD ISZERO PUSH2 0x452A JUMPI CODESIZE PUSH2 0x444A JUMP JUMPDEST PUSH4 0x4B6E7F18 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0x3B800A46 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH2 0x454E PUSH2 0x4403 JUMP JUMPDEST POP PUSH2 0x441F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD SWAP1 JUMP JUMPDEST PUSH2 0x456F DUP2 PUSH2 0x4562 JUMP JUMPDEST DUP3 LT ISZERO PUSH2 0x458A JUMPI PUSH2 0x4581 PUSH1 0x1 SWAP2 PUSH2 0x4557 JUMP JUMPDEST SWAP2 MUL ADD SWAP1 PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x3124 JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x45A5 PUSH2 0x45A0 PUSH2 0x45AD SWAP4 PUSH2 0x1D81 JUMP JUMPDEST PUSH2 0x2BC8 JUMP JUMPDEST SWAP1 DUP4 SLOAD PUSH2 0x1934 JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST SWAP1 DUP2 SLOAD SWAP2 PUSH9 0x10000000000000000 DUP4 LT ISZERO PUSH2 0x45E1 JUMPI DUP3 PUSH2 0x45D9 SWAP2 PUSH1 0x1 PUSH2 0x45DF SWAP6 ADD DUP2 SSTORE PUSH2 0x4566 JUMP JUMPDEST SWAP1 PUSH2 0x458F JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x5B9 JUMP JUMPDEST SWAP1 PUSH2 0x45F0 SWAP1 PUSH2 0x1D81 JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH2 0x4606 PUSH2 0x1834 JUMP JUMPDEST POP PUSH2 0x461B PUSH2 0x4615 DUP3 DUP5 SWAP1 PUSH2 0x4AAF JUMP JUMPDEST ISZERO PUSH2 0x39F JUMP JUMPDEST PUSH1 0x0 EQ PUSH2 0x465E JUMPI PUSH2 0x4654 PUSH2 0x4659 SWAP3 PUSH2 0x463F PUSH2 0x4638 PUSH1 0x0 DUP6 ADD PUSH2 0x4554 JUMP JUMPDEST DUP3 SWAP1 PUSH2 0x45B1 JUMP JUMPDEST PUSH1 0x1 PUSH2 0x464D PUSH1 0x0 DUP6 ADD PUSH2 0x3D4F JUMP JUMPDEST SWAP4 ADD PUSH2 0x45E6 JUMP JUMPDEST PUSH2 0x31AD JUMP JUMPDEST PUSH1 0x1 SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x31 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x468D SWAP2 PUSH2 0x4687 PUSH2 0x1D7C JUMP JUMPDEST SWAP2 PUSH2 0x458F JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x4698 DUP2 PUSH2 0x4562 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x46B9 JUMPI PUSH1 0x1 SWAP1 SUB SWAP1 PUSH2 0x46B6 PUSH2 0x46B0 DUP4 DUP4 PUSH2 0x4566 JUMP JUMPDEST SWAP1 PUSH2 0x467B JUMP JUMPDEST SSTORE JUMP JUMPDEST PUSH2 0x4665 JUMP JUMPDEST PUSH2 0x46C6 PUSH2 0x1834 JUMP JUMPDEST POP PUSH2 0x46DD PUSH2 0x46D8 PUSH1 0x1 DUP4 ADD DUP5 SWAP1 PUSH2 0x45E6 JUMP JUMPDEST PUSH2 0x317B JUMP JUMPDEST SWAP1 DUP2 PUSH2 0x46F2 PUSH2 0x46EC PUSH1 0x0 PUSH2 0x3108 JUMP JUMPDEST SWAP2 PUSH2 0x2A2 JUMP JUMPDEST EQ ISZERO PUSH1 0x0 EQ PUSH2 0x47C0 JUMPI PUSH2 0x4772 SWAP3 PUSH1 0x1 PUSH2 0x476D SWAP3 DUP5 PUSH2 0x471B PUSH1 0x0 SWAP7 PUSH2 0x4715 DUP6 PUSH2 0x414A JUMP JUMPDEST SWAP1 PUSH2 0x3188 JUMP JUMPDEST PUSH2 0x4738 PUSH2 0x4729 DUP9 DUP6 ADD PUSH2 0x3D4F JUMP JUMPDEST PUSH2 0x4732 DUP7 PUSH2 0x414A JUMP JUMPDEST SWAP1 PUSH2 0x3188 JUMP JUMPDEST DUP1 PUSH2 0x474B PUSH2 0x4745 DUP5 PUSH2 0x2A2 JUMP JUMPDEST SWAP2 PUSH2 0x2A2 JUMP JUMPDEST SUB PUSH2 0x4777 JUMPI JUMPDEST POP POP POP PUSH2 0x4767 PUSH2 0x4762 DUP7 DUP4 ADD PUSH2 0x4554 JUMP JUMPDEST PUSH2 0x468F JUMP JUMPDEST ADD PUSH2 0x45E6 JUMP JUMPDEST PUSH2 0x197F JUMP JUMPDEST PUSH1 0x1 SWAP1 JUMP JUMPDEST PUSH2 0x47B8 SWAP3 PUSH2 0x47AA PUSH2 0x4796 PUSH2 0x4790 PUSH2 0x47B3 SWAP5 DUP13 DUP10 ADD PUSH2 0x3D5E JUMP JUMPDEST SWAP1 PUSH2 0x3D9F JUMP JUMPDEST SWAP4 PUSH2 0x47A4 DUP6 SWAP2 DUP13 DUP10 ADD PUSH2 0x3D5E JUMP JUMPDEST SWAP1 PUSH2 0x458F JUMP JUMPDEST SWAP2 DUP6 DUP6 ADD PUSH2 0x45E6 JUMP JUMPDEST PUSH2 0x31AD JUMP JUMPDEST CODESIZE DUP1 DUP1 PUSH2 0x4751 JUMP JUMPDEST POP POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x47D0 PUSH2 0x1834 JUMP JUMPDEST POP EXTCODESIZE SWAP1 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 SWAP4 PUSH1 0x40 MLOAD SWAP6 DUP7 SWAP5 PUSH4 0xF23A6E61 DUP7 MSTORE CALLER DUP8 DUP8 ADD MSTORE PUSH1 0x60 SHL PUSH1 0x60 SHR PUSH1 0x40 DUP7 ADD MSTORE PUSH1 0x60 DUP6 ADD MSTORE PUSH1 0x80 DUP5 ADD MSTORE PUSH1 0xA0 DUP1 DUP5 ADD MSTORE DUP1 MLOAD DUP1 SWAP2 DUP2 DUP1 PUSH1 0xC0 DUP8 ADD MSTORE PUSH2 0x485A JUMPI JUMPDEST POP POP PUSH1 0xC4 ADD SWAP1 PUSH1 0x0 PUSH1 0x1C DUP5 ADD SWAP2 GAS CALL ISZERO PUSH2 0x484B JUMPI JUMPDEST PUSH4 0xF23A6E61 PUSH1 0xE0 SHL SWAP1 MLOAD SUB PUSH2 0x483D JUMPI JUMP JUMPDEST PUSH4 0x9C05499B PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x482C JUMPI RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST DUP2 DUP7 PUSH1 0xE0 DUP8 ADD SWAP3 ADD PUSH1 0x4 GAS STATICCALL POP DUP1 CODESIZE PUSH2 0x4817 JUMP JUMPDEST SWAP1 PUSH2 0x4885 PUSH2 0x487E PUSH2 0x488C SWAP4 PUSH2 0x1B8E JUMP JUMPDEST PUSH1 0x6 PUSH2 0x1BC4 JUMP JUMPDEST PUSH1 0x7 PUSH2 0x2BD4 JUMP JUMPDEST JUMP JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x489A PUSH2 0x3310 JUMP JUMPDEST PUSH2 0x4970 JUMPI JUMPDEST PUSH1 0x60 SHL SWAP1 DUP2 PUSH8 0x9A31110384E0B0C9 OR PUSH1 0x20 MSTORE DUP2 DUP2 PUSH1 0x60 SHL EQ DUP2 PUSH1 0x60 SHL ISZERO OR ISZERO PUSH2 0x494E JUMPI JUMPDEST POP DUP3 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD SWAP2 DUP3 DUP5 GT PUSH2 0x4940 JUMPI DUP4 PUSH1 0x0 SWAP4 SUB SWAP1 SSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x60 SHR CALLER PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP5 LOG4 PUSH2 0x4914 PUSH2 0x331E JUMP JUMPDEST PUSH2 0x491D JUMPI JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x4929 PUSH2 0x492F SWAP3 PUSH2 0x37C9 JUMP JUMPDEST POP PUSH2 0x37C9 JUMP JUMPDEST POP PUSH2 0x4938 PUSH2 0x4403 JUMP JUMPDEST POP CODESIZE DUP1 PUSH2 0x4919 JUMP JUMPDEST PUSH4 0xF4D678B8 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x34 PUSH1 0xC KECCAK256 SLOAD ISZERO PUSH2 0x4962 JUMPI CODESIZE PUSH2 0x48C3 JUMP JUMPDEST PUSH4 0x4B6E7F18 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH2 0x4979 DUP5 PUSH2 0x37C9 JUMP JUMPDEST POP PUSH2 0x4983 DUP4 PUSH2 0x37C9 JUMP JUMPDEST POP PUSH2 0x498C PUSH2 0x4403 JUMP JUMPDEST POP PUSH2 0x489F JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 SWAP4 PUSH1 0x40 MLOAD SWAP6 DUP7 SWAP5 PUSH4 0xBC197C81 DUP7 MSTORE CALLER DUP8 DUP8 ADD MSTORE PUSH1 0x60 SHL PUSH1 0x60 SHR PUSH1 0x40 DUP7 ADD MSTORE PUSH1 0xA0 PUSH1 0x60 DUP7 ADD MSTORE DUP1 MLOAD PUSH1 0x5 SHL DUP7 ADD DUP1 SWAP2 PUSH1 0xC0 DUP8 ADD SWAP3 DUP4 SWAP2 PUSH1 0x4 GAS STATICCALL POP RETURNDATASIZE PUSH1 0xA0 ADD SWAP1 DUP2 PUSH1 0x80 DUP8 ADD MSTORE RETURNDATASIZE ADD SWAP2 DUP3 DUP2 MLOAD PUSH1 0x5 SHL DUP9 ADD DUP1 SWAP3 PUSH1 0x4 GAS STATICCALL POP RETURNDATASIZE ADD PUSH1 0xA0 DUP6 ADD MSTORE RETURNDATASIZE ADD SWAP1 DUP2 DUP2 MLOAD DUP7 ADD DUP1 SWAP3 PUSH1 0x4 GAS STATICCALL POP PUSH1 0x1C DUP4 ADD SWAP1 RETURNDATASIZE ADD SUB SWAP1 PUSH1 0x0 PUSH1 0x1C DUP5 ADD SWAP2 GAS CALL ISZERO PUSH2 0x4A3A JUMPI JUMPDEST PUSH4 0xBC197C81 PUSH1 0xE0 SHL SWAP1 MLOAD SUB PUSH2 0x4A2C JUMPI JUMP JUMPDEST PUSH4 0x9C05499B PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x4A1B JUMPI RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH2 0x4A51 PUSH2 0x1834 JUMP JUMPDEST POP PUSH2 0x4A6B PUSH2 0x4A65 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL PUSH2 0x350 JUMP JUMPDEST SWAP2 PUSH2 0x350 JUMP JUMPDEST EQ SWAP1 JUMP JUMPDEST PUSH2 0x4A77 PUSH2 0x1834 JUMP JUMPDEST POP DUP1 PUSH2 0x4A92 PUSH2 0x4A8C PUSH4 0x7965DB0B PUSH1 0xE0 SHL PUSH2 0x350 JUMP JUMPDEST SWAP2 PUSH2 0x350 JUMP JUMPDEST EQ SWAP1 DUP2 ISZERO PUSH2 0x4A9F JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x4AA9 SWAP2 POP PUSH2 0x3F6C JUMP JUMPDEST CODESIZE PUSH2 0x4A9B JUMP JUMPDEST PUSH2 0x4ACD SWAP2 PUSH1 0x1 PUSH2 0x4AC8 SWAP3 PUSH2 0x4AC1 PUSH2 0x1834 JUMP JUMPDEST POP ADD PUSH2 0x45E6 JUMP JUMPDEST PUSH2 0x317B JUMP JUMPDEST PUSH2 0x4AE0 PUSH2 0x4ADA PUSH1 0x0 PUSH2 0x3108 JUMP JUMPDEST SWAP2 PUSH2 0x2A2 JUMP JUMPDEST EQ ISZERO SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB8 0x29 0xE6 0x2C 0xBD TIMESTAMP SWAP2 ISZERO PUSH16 0xD8E41F29314AC27B4F688A516435044F PUSH7 0xA0AD587E708064 PUSH20 0x6F6C634300081B00330000000000000000000000 ", + "sourceMap": "305:2684:41:-:0;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "abi_decode": { + "entryPoint": 1177, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_decode_address": { + "entryPoint": 659, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_addresst_address": { + "entryPoint": 5828, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_addresst_addresst_array_uint256_dyn_calldatat_array_uint256_dyn_calldatat_bytes_calldata": { + "entryPoint": 3205, + "id": null, + "parameterSlots": 2, + "returnSlots": 8 + }, + "abi_decode_addresst_addresst_uint256t_uint256t_bytes_calldata": { + "entryPoint": 5979, + "id": null, + "parameterSlots": 2, + "returnSlots": 6 + }, + "abi_decode_addresst_array_uint256_dynt_array_uint256_dynt_bytes": { + "entryPoint": 5455, + "id": null, + "parameterSlots": 2, + "returnSlots": 4 + }, + "abi_decode_addresst_bool": { + "entryPoint": 5305, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_addresst_stringt_stringt_stringt_addresst_uint96t_addresst_bytes32": { + "entryPoint": 4462, + "id": null, + "parameterSlots": 2, + "returnSlots": 8 + }, + "abi_decode_addresst_struct_Attestation_calldatat_struct_Call_calldata": { + "entryPoint": 4995, + "id": null, + "parameterSlots": 2, + "returnSlots": 3 + }, + "abi_decode_addresst_uint256": { + "entryPoint": 713, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_addresst_uint256t_uint256t_bytes": { + "entryPoint": 4260, + "id": null, + "parameterSlots": 2, + "returnSlots": 4 + }, + "abi_decode_addresst_uint96": { + "entryPoint": 1073, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_array_address_dyn_calldata": { + "entryPoint": 3579, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_array_address_dyn_calldatat_array_uint256_dyn_calldata": { + "entryPoint": 3642, + "id": null, + "parameterSlots": 2, + "returnSlots": 4 + }, + "abi_decode_array_uint256_dyn": { + "entryPoint": 2451, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_array_uint256_dyn_calldata": { + "entryPoint": 3079, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_array_uint256_dynt_array_uint256_dyn": { + "entryPoint": 2486, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_available_length_array_uint256_dyn": { + "entryPoint": 2364, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_decode_available_length_bytes": { + "entryPoint": 4171, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_decode_available_length_string": { + "entryPoint": 1858, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_decode_bool": { + "entryPoint": 5290, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_bytes": { + "entryPoint": 4225, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_bytes32": { + "entryPoint": 2671, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_bytes32_fromMemory": { + "entryPoint": 9940, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_bytes32t_address": { + "entryPoint": 3429, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_bytes32t_uint256": { + "entryPoint": 4725, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_bytes4": { + "entryPoint": 896, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_bytes_calldata": { + "entryPoint": 3142, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_string": { + "entryPoint": 1947, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_string_memory_ptr": { + "entryPoint": 1912, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_struct_Attestation_calldata": { + "entryPoint": 4957, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_struct_Call_calldata": { + "entryPoint": 4976, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_t_bytes32": { + "entryPoint": 2656, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_t_bytes32_fromMemory": { + "entryPoint": 9925, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_t_bytes4": { + "entryPoint": 881, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_address": { + "entryPoint": 2052, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_uint256": { + "entryPoint": 2134, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_uint256": { + "entryPoint": 698, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_uint256t_addresst_uint96": { + "entryPoint": 3956, + "id": null, + "parameterSlots": 2, + "returnSlots": 3 + }, + "abi_decode_uint256t_uint256": { + "entryPoint": 2924, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_uint64": { + "entryPoint": 10359, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_uint96": { + "entryPoint": 1058, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encodeUpdatedPos_string_storage": { + "entryPoint": 1442, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encodeUpdatedPos_uint256": { + "entryPoint": 3770, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_address": { + "entryPoint": 2970, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_address_struct_Attestation_calldata_bytes32": { + "entryPoint": 10643, + "id": null, + "parameterSlots": 4, + "returnSlots": 1 + }, + "abi_encode_address_to_address": { + "entryPoint": 9989, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_address_uint256": { + "entryPoint": 2983, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_array_uint256_dyn": { + "entryPoint": 3874, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_array_uint256_dyn_memory_ptr": { + "entryPoint": 3793, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_bool": { + "entryPoint": 945, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_bool_to_bool": { + "entryPoint": 932, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_bytes32": { + "entryPoint": 10051, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_bytes32_to_bytes32": { + "entryPoint": 2702, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_bytes4": { + "entryPoint": 10020, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_bytes_calldata": { + "entryPoint": 10158, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_packed_string_storage_string_stringliteral": { + "entryPoint": 7425, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_packed_stringliteral_da0d_string_stringliteral_f986_string": { + "entryPoint": 14686, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_string": { + "entryPoint": 1702, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_string_calldata": { + "entryPoint": 10290, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_string_memory_ptr": { + "entryPoint": 7319, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_string_storage": { + "entryPoint": 1299, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_string_storage_to_string_nonPadded_inplace": { + "entryPoint": 7182, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_string_to_string": { + "entryPoint": 1653, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_stringliteral": { + "entryPoint": 7400, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_stringliteral_04fc": { + "entryPoint": 16952, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_stringliteral_d20a": { + "entryPoint": 13311, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_stringliteral_da0d": { + "entryPoint": 14596, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_stringliteral_dcda": { + "entryPoint": 11905, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_stringliteral_f66a": { + "entryPoint": 12037, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_stringliteral_f986": { + "entryPoint": 14661, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_stringliteral_fb06": { + "entryPoint": 9106, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_struct_Attestation_calldata": { + "entryPoint": 10470, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_struct_AuthData_calldata": { + "entryPoint": 10405, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple": { + "entryPoint": 1119, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple_address": { + "entryPoint": 4771, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_bytes32": { + "entryPoint": 2715, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_stringliteral_04fc": { + "entryPoint": 16977, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple_stringliteral_d20a": { + "entryPoint": 13337, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple_stringliteral_dcda": { + "entryPoint": 11931, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple_stringliteral_f66a": { + "entryPoint": 12063, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple_stringliteral_fb06": { + "entryPoint": 9132, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_uint256": { + "entryPoint": 772, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_uint256_to_uint256": { + "entryPoint": 3757, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_uint256_to_uint256_fromStack": { + "entryPoint": 759, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_uint64": { + "entryPoint": 10392, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "allocate_and_zero_memory_array_bytes": { + "entryPoint": 16619, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "allocate_memory": { + "entryPoint": 1790, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "allocate_memory_array_bytes": { + "entryPoint": 16591, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "allocate_memory_array_string": { + "entryPoint": 17375, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "allocate_memory_struct_struct_RoyaltyInfo": { + "entryPoint": 7822, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "allocate_memory_struct_struct_RoyaltyInfo_storage_ptr": { + "entryPoint": 12129, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "allocate_unbounded": { + "entryPoint": 594, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "array_allocation_size_array_uint256_dyn": { + "entryPoint": 2330, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_allocation_size_bytes": { + "entryPoint": 4136, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_allocation_size_string": { + "entryPoint": 1811, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_dataslot_array_bytes32_dyn_storage": { + "entryPoint": 15699, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_dataslot_array_bytes32_dyn_storage_ptr": { + "entryPoint": 17751, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_dataslot_array_uint256_dyn": { + "entryPoint": 3751, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_dataslot_string_storage": { + "entryPoint": 1288, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_length_array_bytes32_dyn_storage": { + "entryPoint": 15695, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_length_array_bytes32_dyn_storage_ptr": { + "entryPoint": 17762, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_length_array_uint256_dyn": { + "entryPoint": 3738, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_length_bytes": { + "entryPoint": 16666, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_length_string": { + "entryPoint": 1603, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_nextElement_array_uint256_dyn": { + "entryPoint": 3787, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_pop_array_bytes32_dyn_storage_ptr": { + "entryPoint": 18063, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "array_push_from_bytes32_to_array_bytes32_dyn_storage_ptr": { + "entryPoint": 17841, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "array_storeLengthForEncoding_array_uint256_dyn": { + "entryPoint": 3742, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "array_storeLengthForEncoding_bytes": { + "entryPoint": 10149, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "array_storeLengthForEncoding_string": { + "entryPoint": 1279, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "array_storeLengthForEncoding_string_fromStack": { + "entryPoint": 1607, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "array_storeLengthForEncoding_string_nonPadded_inplace": { + "entryPoint": 7177, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "calldata_access_address": { + "entryPoint": 9971, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "calldata_access_bytes32": { + "entryPoint": 10033, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "calldata_access_bytes4": { + "entryPoint": 10002, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "calldata_access_bytes_calldata": { + "entryPoint": 10079, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "calldata_access_string_calldata": { + "entryPoint": 10220, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "calldata_access_struct_AuthData_calldata": { + "entryPoint": 10193, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "calldata_access_uint64": { + "entryPoint": 10374, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "checked_add_uint256": { + "entryPoint": 12749, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "checked_div_uint256": { + "entryPoint": 8095, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "checked_mul_uint256": { + "entryPoint": 8020, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "checked_sub_uint256": { + "entryPoint": 12680, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "clean_up_bytearray_end_slots_string_storage": { + "entryPoint": 6579, + "id": null, + "parameterSlots": 3, + "returnSlots": 0 + }, + "cleanup_address": { + "entryPoint": 626, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_bool": { + "entryPoint": 927, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_bytes32": { + "entryPoint": 2632, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_bytes4": { + "entryPoint": 848, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_from_storage_address": { + "entryPoint": 7694, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_from_storage_bool": { + "entryPoint": 9730, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_from_storage_bytes32": { + "entryPoint": 7595, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_from_storage_contract_IImplicitProjectValidation": { + "entryPoint": 9863, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_from_storage_uint256": { + "entryPoint": 2222, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_from_storage_uint96": { + "entryPoint": 7758, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_rational_0_by": { + "entryPoint": 5155, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_rational_15_by": { + "entryPoint": 16805, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_rational_1_by": { + "entryPoint": 16711, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_rational_2_by": { + "entryPoint": 16560, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_rational_by": { + "entryPoint": 16842, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_rational_by_1": { + "entryPoint": 13018, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_t_rational_by": { + "entryPoint": 14525, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_t_rational_by_1": { + "entryPoint": 16428, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_uint160": { + "entryPoint": 615, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_uint256": { + "entryPoint": 674, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_uint64": { + "entryPoint": 10325, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_uint8": { + "entryPoint": 16431, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_uint96": { + "entryPoint": 1020, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "clear_storage_range_bytes1": { + "entryPoint": 6547, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "constant_ADDRESS_LENGTH": { + "entryPoint": 16465, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "constant_DEFAULT_ADMIN_ROLE": { + "entryPoint": 5192, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "constant_IMPLICIT_MODE_ADMIN_ROLE": { + "entryPoint": 6951, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "constant_METADATA_ADMIN_ROLE": { + "entryPoint": 6375, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "constant_MINTER_ROLE": { + "entryPoint": 9420, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "constant_ROYALTY_ADMIN_ROLE": { + "entryPoint": 6287, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "constant_SYMBOLS": { + "entryPoint": 16794, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "convert_address_to_address": { + "entryPoint": 9694, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_address_to_contract_IImplicitProjectValidation": { + "entryPoint": 7054, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_address_to_uint160": { + "entryPoint": 15069, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_array_array_bytes32_dyn_storage_to_array_bytes32_dyn_ptr": { + "entryPoint": 17748, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_array_array_uint256_dyn_calldata_to_array_uint256_dyn": { + "entryPoint": 8320, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "convert_array_bytes_calldata_to_bytes": { + "entryPoint": 8334, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "convert_array_bytes_to_string": { + "entryPoint": 7456, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_bool_to_bool": { + "entryPoint": 13642, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_bytes32_to_bytes32": { + "entryPoint": 7553, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_bytes32_to_uint256": { + "entryPoint": 13850, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_contract_IImplicitProjectValidation_to_address": { + "entryPoint": 9907, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_contract_IImplicitProjectValidation_to_contract_IImplicitProjectValidation": { + "entryPoint": 7093, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_0_by_1_to_uint256": { + "entryPoint": 12552, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_1_by_1_to_uint256": { + "entryPoint": 16714, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_2_by_1_to_uint256": { + "entryPoint": 16563, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_by_to_address": { + "entryPoint": 7945, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_by_to_bytes32": { + "entryPoint": 5164, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_by_to_uint160": { + "entryPoint": 7917, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_by_to_uint256": { + "entryPoint": 16808, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_by_to_uint8": { + "entryPoint": 16845, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_by_to_uint96": { + "entryPoint": 13021, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_stringliteral_0448_to_bytes1": { + "entryPoint": 16658, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "convert_stringliteral_c5d2_to_bytes": { + "entryPoint": 17411, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "convert_stringliteral_cb29_to_bytes16": { + "entryPoint": 16771, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "convert_stringliteral_to_bytes1": { + "entryPoint": 16703, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "convert_struct_AddressSet_storage_to_struct_AddressSet_ptr": { + "entryPoint": 9639, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_struct_RoyaltyInfo_storage_to_struct_RoyaltyInfo": { + "entryPoint": 7892, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_struct_Set_storage_to_struct_Set_ptr": { + "entryPoint": 13847, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_t_rational_by_to_t_uint256": { + "entryPoint": 14528, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_t_rational_by_to_t_uint8": { + "entryPoint": 16437, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint160_to_address": { + "entryPoint": 9682, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint160_to_contract_IImplicitProjectValidation": { + "entryPoint": 7042, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint160_to_uint160": { + "entryPoint": 7014, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint160_to_uint256": { + "entryPoint": 15081, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint256_to_bytes32": { + "entryPoint": 15109, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint256_to_uint160": { + "entryPoint": 13870, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint256_to_uint256": { + "entryPoint": 2793, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint8_to_uint256": { + "entryPoint": 16478, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint96_to_uint256": { + "entryPoint": 7970, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint96_to_uint96": { + "entryPoint": 12219, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "copy_array_from_storage_to_memory_string": { + "entryPoint": 1528, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "copy_byte_array_to_storage_from_string_to_string": { + "entryPoint": 6706, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "copy_calldata_to_memory_with_cleanup": { + "entryPoint": 1846, + "id": null, + "parameterSlots": 3, + "returnSlots": 0 + }, + "copy_literal_to_memory_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470": { + "entryPoint": 17398, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "copy_memory_to_memory_with_cleanup": { + "entryPoint": 1616, + "id": null, + "parameterSlots": 3, + "returnSlots": 0 + }, + "copy_struct_to_storage_from_struct_RoyaltyInfo_to_struct_RoyaltyInfo": { + "entryPoint": 12282, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "decrement_uint256": { + "entryPoint": 16742, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "divide_by_ceil": { + "entryPoint": 6438, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "external_fun_DEFAULT_ADMIN_ROLE": { + "entryPoint": 5216, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_acceptImplicitRequest": { + "entryPoint": 5101, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_balanceOf": { + "entryPoint": 794, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_balanceOfBatch": { + "entryPoint": 3899, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_baseURI": { + "entryPoint": 4083, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_batchBurn": { + "entryPoint": 2580, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_batchMint": { + "entryPoint": 5599, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_burn": { + "entryPoint": 5403, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_contractURI": { + "entryPoint": 5775, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_getRoleAdmin": { + "entryPoint": 2737, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_getRoleMember": { + "entryPoint": 4793, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_getRoleMemberCount": { + "entryPoint": 5654, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_grantRole": { + "entryPoint": 3475, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_hasRole": { + "entryPoint": 4847, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_initialize": { + "entryPoint": 4664, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_isApprovedForAll": { + "entryPoint": 5874, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_mint": { + "entryPoint": 4356, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_name": { + "entryPoint": 1727, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_renounceRole": { + "entryPoint": 3527, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_revokeRole": { + "entryPoint": 5707, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_royaltyInfo": { + "entryPoint": 3019, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_safeBatchTransferFrom": { + "entryPoint": 3368, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_safeTransferFrom": { + "entryPoint": 6092, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_setApprovalForAll": { + "entryPoint": 5351, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_setBaseMetadataURI": { + "entryPoint": 4411, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_setContractName": { + "entryPoint": 2001, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_setContractURI": { + "entryPoint": 4901, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_setDefaultRoyalty": { + "entryPoint": 1125, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_setImplicitModeProjectId": { + "entryPoint": 5928, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_setImplicitModeValidator": { + "entryPoint": 2083, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_setTokenRoyalty": { + "entryPoint": 4015, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_supportsInterface": { + "entryPoint": 967, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_tokenSupply": { + "entryPoint": 2871, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_totalSupply": { + "entryPoint": 2277, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_uri": { + "entryPoint": 2165, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "extract_byte_array_length": { + "entryPoint": 1237, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "extract_from_storage_value_dynamict_bytes32": { + "entryPoint": 15751, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "extract_from_storage_value_dynamict_uint256": { + "entryPoint": 2225, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "extract_from_storage_value_offsett_address": { + "entryPoint": 7705, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "extract_from_storage_value_offsett_bool": { + "entryPoint": 9736, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "extract_from_storage_value_offsett_bytes32": { + "entryPoint": 7598, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "extract_from_storage_value_offsett_contract_IImplicitProjectValidation": { + "entryPoint": 9874, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "extract_from_storage_value_offsett_uint256": { + "entryPoint": 12647, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "extract_from_storage_value_offsett_uint96": { + "entryPoint": 7775, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "extract_used_part_and_set_length_of_short_byte_array": { + "entryPoint": 6688, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "finalize_allocation": { + "entryPoint": 1487, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun__batchBurn": { + "entryPoint": 14879, + "id": 5620, + "parameterSlots": 3, + "returnSlots": 0 + }, + "fun__batchMint": { + "entryPoint": 15850, + "id": 5524, + "parameterSlots": 4, + "returnSlots": 0 + }, + "fun__burn": { + "entryPoint": 18574, + "id": 5597, + "parameterSlots": 4, + "returnSlots": 0 + }, + "fun__checkRole": { + "entryPoint": 11807, + "id": 92, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun__grantRole": { + "entryPoint": 14906, + "id": 283, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun__mint": { + "entryPoint": 13534, + "id": 8617, + "parameterSlots": 4, + "returnSlots": 0 + }, + "fun__revokeRole": { + "entryPoint": 13229, + "id": 439, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun__setTokenRoyalty": { + "entryPoint": 13403, + "id": 1327, + "parameterSlots": 3, + "returnSlots": 0 + }, + "fun_acceptImplicitRequest": { + "entryPoint": 10714, + "id": 5098, + "parameterSlots": 3, + "returnSlots": 1 + }, + "fun_add": { + "entryPoint": 17918, + "id": 3172, + "parameterSlots": 2, + "returnSlots": 1 + }, + "fun_add_3472": { + "entryPoint": 15137, + "id": 3472, + "parameterSlots": 2, + "returnSlots": 1 + }, + "fun_afterTokenTransferCalldata": { + "entryPoint": 13100, + "id": 5933, + "parameterSlots": 8, + "returnSlots": 0 + }, + "fun_at": { + "entryPoint": 15789, + "id": 3306, + "parameterSlots": 2, + "returnSlots": 1 + }, + "fun_at_3568": { + "entryPoint": 13898, + "id": 3568, + "parameterSlots": 2, + "returnSlots": 1 + }, + "fun_balanceOf": { + "entryPoint": 6160, + "id": 5257, + "parameterSlots": 2, + "returnSlots": 1 + }, + "fun_balanceOfBatch": { + "entryPoint": 9250, + "id": 5386, + "parameterSlots": 4, + "returnSlots": 1 + }, + "fun_batchBurn": { + "entryPoint": 12801, + "id": 8780, + "parameterSlots": 3, + "returnSlots": 0 + }, + "fun_batchBurn_5666": { + "entryPoint": 17422, + "id": 5666, + "parameterSlots": 4, + "returnSlots": 0 + }, + "fun_batchBurn_8537": { + "entryPoint": 7533, + "id": 8537, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun_batchMint": { + "entryPoint": 14037, + "id": 8685, + "parameterSlots": 4, + "returnSlots": 0 + }, + "fun_batchMint_8936": { + "entryPoint": 11016, + "id": 8936, + "parameterSlots": 4, + "returnSlots": 0 + }, + "fun_batchMint_inner": { + "entryPoint": 11000, + "id": null, + "parameterSlots": 4, + "returnSlots": 0 + }, + "fun_burn": { + "entryPoint": 13955, + "id": 8715, + "parameterSlots": 3, + "returnSlots": 0 + }, + "fun_burn_5545": { + "entryPoint": 15823, + "id": 5545, + "parameterSlots": 3, + "returnSlots": 0 + }, + "fun_burn_8517": { + "entryPoint": 10955, + "id": 8517, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun_checkOnERC1155BatchReceived": { + "entryPoint": 18834, + "id": 5977, + "parameterSlots": 5, + "returnSlots": 0 + }, + "fun_checkOnERC1155Received": { + "entryPoint": 18389, + "id": 5959, + "parameterSlots": 5, + "returnSlots": 0 + }, + "fun_checkRole": { + "entryPoint": 14726, + "id": 131, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun_contains": { + "entryPoint": 19119, + "id": 3275, + "parameterSlots": 2, + "returnSlots": 1 + }, + "fun_feeDenominator": { + "entryPoint": 13049, + "id": 1247, + "parameterSlots": 0, + "returnSlots": 1 + }, + "fun_getRoleAdmin": { + "entryPoint": 7631, + "id": 146, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_getRoleMember": { + "entryPoint": 9642, + "id": 375, + "parameterSlots": 2, + "returnSlots": 1 + }, + "fun_getRoleMemberCount": { + "entryPoint": 11030, + "id": 391, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_grantRole": { + "entryPoint": 13174, + "id": 415, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun_grantRole_166": { + "entryPoint": 9016, + "id": 166, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun_grantRole_inner": { + "entryPoint": 9004, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun_hasCode": { + "entryPoint": 18376, + "id": 5943, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_hasRole": { + "entryPoint": 9769, + "id": 79, + "parameterSlots": 2, + "returnSlots": 1 + }, + "fun_initialize": { + "entryPoint": 13689, + "id": 8436, + "parameterSlots": 6, + "returnSlots": 0 + }, + "fun_initializeImplicitMode": { + "entryPoint": 15666, + "id": 10071, + "parameterSlots": 3, + "returnSlots": 0 + }, + "fun_initializeSignalsImplicitMode": { + "entryPoint": 18542, + "id": 5070, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun_initialize_8888": { + "entryPoint": 9567, + "id": 8888, + "parameterSlots": 8, + "returnSlots": 0 + }, + "fun_isApprovedForAll": { + "entryPoint": 11122, + "id": 5269, + "parameterSlots": 2, + "returnSlots": 1 + }, + "fun_length": { + "entryPoint": 16173, + "id": 3289, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_length_3541": { + "entryPoint": 14249, + "id": 3541, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_mint": { + "entryPoint": 15409, + "id": 5463, + "parameterSlots": 4, + "returnSlots": 0 + }, + "fun_mint_8911": { + "entryPoint": 9502, + "id": 8911, + "parameterSlots": 4, + "returnSlots": 0 + }, + "fun_mint_inner": { + "entryPoint": 9486, + "id": null, + "parameterSlots": 4, + "returnSlots": 0 + }, + "fun_msgSender": { + "entryPoint": 13216, + "id": 1682, + "parameterSlots": 0, + "returnSlots": 1 + }, + "fun_remove": { + "entryPoint": 18110, + "id": 3256, + "parameterSlots": 2, + "returnSlots": 1 + }, + "fun_remove_3499": { + "entryPoint": 15350, + "id": 3499, + "parameterSlots": 2, + "returnSlots": 1 + }, + "fun_renounceRole": { + "entryPoint": 9198, + "id": 209, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun_revokeRole": { + "entryPoint": 11110, + "id": 186, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun_revokeRole_314": { + "entryPoint": 15196, + "id": 314, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun_revokeRole_inner": { + "entryPoint": 11098, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun_royaltyInfo": { + "entryPoint": 8129, + "id": 1238, + "parameterSlots": 2, + "returnSlots": 2 + }, + "fun_safeBatchTransferFrom": { + "entryPoint": 8348, + "id": 5371, + "parameterSlots": 8, + "returnSlots": 0 + }, + "fun_safeTransferFrom": { + "entryPoint": 11276, + "id": 5328, + "parameterSlots": 6, + "returnSlots": 0 + }, + "fun_setApprovalForAll": { + "entryPoint": 10875, + "id": 5279, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun_setBaseMetadataURI": { + "entryPoint": 9556, + "id": 8473, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_setBaseMetadataURI_inner": { + "entryPoint": 9543, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_setContractName": { + "entryPoint": 6940, + "id": 8487, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_setContractName_inner": { + "entryPoint": 6927, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_setContractURI": { + "entryPoint": 9852, + "id": 8501, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_setContractURI_inner": { + "entryPoint": 9839, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_setDefaultRoyalty": { + "entryPoint": 12345, + "id": 1281, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun_setDefaultRoyalty_9954": { + "entryPoint": 6363, + "id": 9954, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun_setDefaultRoyalty_inner": { + "entryPoint": 6351, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun_setImplicitModeProjectId": { + "entryPoint": 11265, + "id": 10101, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_setImplicitModeProjectId_inner": { + "entryPoint": 11252, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_setImplicitModeValidator": { + "entryPoint": 7161, + "id": 10087, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_setImplicitModeValidator_inner": { + "entryPoint": 7140, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_setTokenRoyalty": { + "entryPoint": 9407, + "id": 9974, + "parameterSlots": 3, + "returnSlots": 0 + }, + "fun_setTokenRoyalty_inner": { + "entryPoint": 9392, + "id": null, + "parameterSlots": 3, + "returnSlots": 0 + }, + "fun_single": { + "entryPoint": 14281, + "id": 5988, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_supportsInterface": { + "entryPoint": 14377, + "id": 10008, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_supportsInterface_10123": { + "entryPoint": 14479, + "id": 10123, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_supportsInterface_1188": { + "entryPoint": 16236, + "id": 1188, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_supportsInterface_2135": { + "entryPoint": 19017, + "id": 2135, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_supportsInterface_356": { + "entryPoint": 16300, + "id": 356, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_supportsInterface_5133": { + "entryPoint": 16364, + "id": 5133, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_supportsInterface_5396": { + "entryPoint": 16197, + "id": 5396, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_supportsInterface_60": { + "entryPoint": 19055, + "id": 60, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_supportsInterface_8565": { + "entryPoint": 11739, + "id": 8565, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_supportsInterface_8803": { + "entryPoint": 14313, + "id": 8803, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_supportsInterface_8964": { + "entryPoint": 6201, + "id": 8964, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_toHexString": { + "entryPoint": 16506, + "id": 2086, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_toHexString_2066": { + "entryPoint": 17043, + "id": 2066, + "parameterSlots": 2, + "returnSlots": 1 + }, + "fun_toString": { + "entryPoint": 12467, + "id": 6719, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_uri": { + "entryPoint": 7459, + "id": 8459, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_useAfterTokenTransfer": { + "entryPoint": 13086, + "id": 5887, + "parameterSlots": 0, + "returnSlots": 1 + }, + "fun_useBeforeTokenTransfer": { + "entryPoint": 13072, + "id": 5861, + "parameterSlots": 0, + "returnSlots": 1 + }, + "getter_fun_DEFAULT_ADMIN_ROLE": { + "entryPoint": 5205, + "id": 27, + "parameterSlots": 0, + "returnSlots": 1 + }, + "getter_fun_baseURI": { + "entryPoint": 4067, + "id": 8372, + "parameterSlots": 0, + "returnSlots": 1 + }, + "getter_fun_contractURI": { + "entryPoint": 5759, + "id": 8374, + "parameterSlots": 0, + "returnSlots": 1 + }, + "getter_fun_name": { + "entryPoint": 1587, + "id": 8370, + "parameterSlots": 0, + "returnSlots": 1 + }, + "getter_fun_tokenSupply": { + "entryPoint": 2845, + "id": 8584, + "parameterSlots": 1, + "returnSlots": 1 + }, + "getter_fun_totalSupply": { + "entryPoint": 2263, + "id": 8580, + "parameterSlots": 0, + "returnSlots": 1 + }, + "identity": { + "entryPoint": 2790, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "increment_wrapping_uint256": { + "entryPoint": 12786, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "mapping_index_access_mapping_address_bool_of_address": { + "entryPoint": 9706, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "mapping_index_access_mapping_bytes32_struct_AddressSet_storage_of_bytes32": { + "entryPoint": 9615, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "mapping_index_access_mapping_bytes32_struct_RoleData_storage_of_bytes32": { + "entryPoint": 7565, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "mapping_index_access_mapping_bytes32_uint256_of_bytes32": { + "entryPoint": 17894, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "mapping_index_access_mapping_uint256_struct_RoyaltyInfo_storage_of_uint256": { + "entryPoint": 7670, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "mapping_index_access_mapping_uint256_uint256_of_uint256": { + "entryPoint": 2821, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "mask_bytes_dynamic": { + "entryPoint": 6666, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "memory_array_index_access_bytes": { + "entryPoint": 16670, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "memory_array_index_access_uint256_dyn": { + "entryPoint": 12602, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "modifier_onlyRole": { + "entryPoint": 9456, + "id": 38, + "parameterSlots": 4, + "returnSlots": 0 + }, + "modifier_onlyRole_10078": { + "entryPoint": 6987, + "id": 38, + "parameterSlots": 1, + "returnSlots": 0 + }, + "modifier_onlyRole_10094": { + "entryPoint": 11158, + "id": 38, + "parameterSlots": 1, + "returnSlots": 0 + }, + "modifier_onlyRole_158": { + "entryPoint": 8975, + "id": 38, + "parameterSlots": 2, + "returnSlots": 0 + }, + "modifier_onlyRole_178": { + "entryPoint": 11069, + "id": 38, + "parameterSlots": 2, + "returnSlots": 0 + }, + "modifier_onlyRole_8466": { + "entryPoint": 9516, + "id": 38, + "parameterSlots": 1, + "returnSlots": 0 + }, + "modifier_onlyRole_8480": { + "entryPoint": 6411, + "id": 38, + "parameterSlots": 1, + "returnSlots": 0 + }, + "modifier_onlyRole_8494": { + "entryPoint": 9812, + "id": 38, + "parameterSlots": 1, + "returnSlots": 0 + }, + "modifier_onlyRole_8926": { + "entryPoint": 10970, + "id": 38, + "parameterSlots": 4, + "returnSlots": 0 + }, + "modifier_onlyRole_9946": { + "entryPoint": 6323, + "id": 38, + "parameterSlots": 2, + "returnSlots": 0 + }, + "modifier_onlyRole_9965": { + "entryPoint": 9363, + "id": 38, + "parameterSlots": 3, + "returnSlots": 0 + }, + "panic_error_0x00": { + "entryPoint": 1193, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "panic_error_0x11": { + "entryPoint": 7998, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "panic_error_0x12": { + "entryPoint": 8073, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "panic_error_0x22": { + "entryPoint": 1215, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "panic_error_0x31": { + "entryPoint": 18021, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "panic_error_0x32": { + "entryPoint": 12580, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "panic_error_0x41": { + "entryPoint": 1465, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "prepare_store_address": { + "entryPoint": 12142, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "prepare_store_bool": { + "entryPoint": 13654, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "prepare_store_bytes32": { + "entryPoint": 11208, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "prepare_store_contract_IImplicitProjectValidation": { + "entryPoint": 7105, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "prepare_store_uint256": { + "entryPoint": 6490, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "prepare_store_uint96": { + "entryPoint": 12247, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "read_from_memoryt_address": { + "entryPoint": 7904, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "read_from_memoryt_uint256": { + "entryPoint": 12634, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "read_from_memoryt_uint96": { + "entryPoint": 7957, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "read_from_storage_dynamic_split_string": { + "entryPoint": 1562, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "read_from_storage_reference_type_struct_RoyaltyInfo": { + "entryPoint": 7835, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "read_from_storage_split_dynamic_bytes32": { + "entryPoint": 15775, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "read_from_storage_split_dynamic_uint256": { + "entryPoint": 2249, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "read_from_storage_split_offset_address": { + "entryPoint": 7725, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "read_from_storage_split_offset_bool": { + "entryPoint": 9756, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "read_from_storage_split_offset_bytes32": { + "entryPoint": 7618, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "read_from_storage_split_offset_contract_IImplicitProjectValidation": { + "entryPoint": 9894, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "read_from_storage_split_offset_uint256": { + "entryPoint": 12667, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "read_from_storage_split_offset_uint96": { + "entryPoint": 7795, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "require_helper_stringliteral_04fc": { + "entryPoint": 17002, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "require_helper_stringliteral_d20a": { + "entryPoint": 13362, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "require_helper_stringliteral_dcda": { + "entryPoint": 11956, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "require_helper_stringliteral_f66a": { + "entryPoint": 12088, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "require_helper_stringliteral_fb06": { + "entryPoint": 9157, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "revert_error_0803104b3ab68501accf02de57372b8e5e6e1582158b771d3f89279dc6822fe2": { + "entryPoint": 10064, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_15abf5612cd996bc235ba1e55a4a30ac60e6bb601ff7ba4ad3f179b6be8d0490": { + "entryPoint": 3074, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_1b9f4a0a5773e33b91aa01db23bf8c55fce1411167c872835e7fa00a4f17d46d": { + "entryPoint": 1780, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_21fe6b43b4db61d76a176e95bf1a6b9ede4c301f93a4246f41fecb96e160861d": { + "entryPoint": 4952, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_3894daff73bdbb8963c284e167b207f7abade3c031c50828ea230a16bdbc0f20": { + "entryPoint": 10069, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74": { + "entryPoint": 6150, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_81385d8c0b31fffe14be1da910c8bd3a80be4cfa248e04f42ec0faea3132a8ef": { + "entryPoint": 2359, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_987264b3b1d58a9c7f8255e93e81c77d86d6299019c33110a076957a3e06e2ae": { + "entryPoint": 1785, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db": { + "entryPoint": 610, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb": { + "entryPoint": 600, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_db64ea6d4a12deece376118739de8d9f517a2db5b58ea2ca332ea908c04c71d4": { + "entryPoint": 10074, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b": { + "entryPoint": 605, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_forward": { + "entryPoint": 10697, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "round_up_to_mul_of": { + "entryPoint": 1455, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_left": { + "entryPoint": 5158, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_left_160": { + "entryPoint": 12177, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_left_224": { + "entryPoint": 9919, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_left_248": { + "entryPoint": 16836, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_left_dynamic": { + "entryPoint": 6448, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "shift_right_0_unsigned": { + "entryPoint": 7589, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_right_224_unsigned": { + "entryPoint": 588, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_right_uint256_uint8": { + "entryPoint": 16873, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "shift_right_unsigned": { + "entryPoint": 7752, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_right_unsigned_dynamic": { + "entryPoint": 2218, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "storage_array_index_access_bytes32_dyn": { + "entryPoint": 15710, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "storage_array_index_access_bytes32_dyn_ptr": { + "entryPoint": 17766, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "storage_set_to_zero_bytes32": { + "entryPoint": 18043, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "storage_set_to_zero_uint256": { + "entryPoint": 6527, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "store_literal_in_memory_04fc88320d7c9f639317c75102c103ff0044d3075a5c627e24e76e5bbb2733c2": { + "entryPoint": 16912, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "store_literal_in_memory_94311adc0a0cd4e10be11b23bd4316b8cffa4adf693e8f96f5c075aa439a7972": { + "entryPoint": 7360, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "store_literal_in_memory_d20a09dd8b4080dbbc254e38d9f607ef83a2c7a38b671ae8f8f162ffe46e2084": { + "entryPoint": 13271, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "store_literal_in_memory_da0d07ce4a2849fbfc4cb9d6f939e9bd93016c372ca4a5ff14fe06caf3d67874": { + "entryPoint": 14556, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "store_literal_in_memory_dcda5bd52710522f2cc94635314fdacbfec7cf9b64adb69f4a07b374f938990d": { + "entryPoint": 11827, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "store_literal_in_memory_f66a1010ca1024f054dcd95a016427c9d452e7f1ceb553ccd3a5e37073a6ffff": { + "entryPoint": 11997, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "store_literal_in_memory_f986ce851518a691bccd44ea42a5a185d1b866ef6cb07984a09b81694d20ab69": { + "entryPoint": 14621, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "store_literal_in_memory_fb06fa8ff2141e8ed74502f6792273793f25f0e9d3cf15344f3f5a0d4948fd4b": { + "entryPoint": 9028, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "update_byte_slice_1_shift": { + "entryPoint": 13620, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "update_byte_slice_20_shift": { + "entryPoint": 7066, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "update_byte_slice_dynamic32": { + "entryPoint": 6452, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "update_byte_slice_shift": { + "entryPoint": 12183, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "update_byte_slice_shift_0": { + "entryPoint": 11185, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "update_storage_value_bytes32_to_bytes32": { + "entryPoint": 17807, + "id": null, + "parameterSlots": 3, + "returnSlots": 0 + }, + "update_storage_value_offsett_address_to_address": { + "entryPoint": 12145, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "update_storage_value_offsett_bool_to_bool": { + "entryPoint": 13657, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "update_storage_value_offsett_bytes32_to_bytes32": { + "entryPoint": 11220, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "update_storage_value_offsett_contract_IImplicitProjectValidation_to_contract_IImplicitProjectValidation": { + "entryPoint": 7108, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "update_storage_value_offsett_string_to_string": { + "entryPoint": 6915, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "update_storage_value_offsett_struct_RoyaltyInfo_to_struct_RoyaltyInfo": { + "entryPoint": 12333, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "update_storage_value_offsett_uint256_to_uint256": { + "entryPoint": 12717, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "update_storage_value_offsett_uint96_to_uint96": { + "entryPoint": 12250, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "update_storage_value_uint256_to_uint256": { + "entryPoint": 6493, + "id": null, + "parameterSlots": 3, + "returnSlots": 0 + }, + "validator_revert_address": { + "entryPoint": 638, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "validator_revert_bool": { + "entryPoint": 5269, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "validator_revert_bytes32": { + "entryPoint": 2635, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "validator_revert_bytes4": { + "entryPoint": 860, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "validator_revert_uint256": { + "entryPoint": 677, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "validator_revert_uint64": { + "entryPoint": 10338, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "validator_revert_uint96": { + "entryPoint": 1037, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "write_to_memory_address": { + "entryPoint": 7738, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "write_to_memory_uint96": { + "entryPoint": 7808, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "zero_memory_chunk_bytes1": { + "entryPoint": 16614, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "zero_value_for_split_address": { + "entryPoint": 7665, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "zero_value_for_split_array_uint256_dyn": { + "entryPoint": 9245, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "zero_value_for_split_bool": { + "entryPoint": 6196, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "zero_value_for_split_bytes32": { + "entryPoint": 7548, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "zero_value_for_split_string": { + "entryPoint": 7172, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "zero_value_for_split_uint256": { + "entryPoint": 6155, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "zero_value_for_split_uint96": { + "entryPoint": 13013, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + } + }, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "60806040526004361015610013575b611806565b61001e60003561024c565b8062fdd58e1461024757806301ffc9a71461024257806304634d8d1461023d57806306fdde03146102385780630b5ee006146102335780630bb310de1461022e5780630e89341c1461022957806318160ddd1461022457806320ec271b1461021f578063248a9ca31461021a5780632693ebf2146102155780632a55205a146102105780632eb2c2d61461020b5780632f2ff15d1461020657806336568abe146102015780634e1273f4146101fc5780635944c753146101f75780636c0360eb146101f2578063731133e9146101ed5780637e518ec8146101e85780638ff83ac1146101e35780639010d07c146101de57806391d14854146101d9578063938e3d7b146101d45780639d043a66146101cf578063a217fddf146101ca578063a22cb465146101c5578063b390c0ab146101c0578063b48ab8b6146101bb578063ca15c873146101b6578063d547741f146101b1578063e8a3d485146101ac578063e985e9c5146101a7578063ed4c2ac7146101a25763f242432a0361000e576117cc565b611728565b6116f2565b61168f565b61164b565b611616565b6115df565b61151b565b6114e7565b611460565b6113ed565b611325565b6112ef565b6112b9565b611238565b61113b565b611104565b610ff3565b610faf565b610f3b565b610dc7565b610d93565b610d28565b610bcb565b610b37565b610ab1565b610a14565b6108e5565b610875565b610823565b6107d1565b6106bf565b610465565b6103c7565b61031a565b60e01c90565b60405190565b600080fd5b600080fd5b600080fd5b60018060a01b031690565b61027b90610267565b90565b61028781610272565b0361028e57565b600080fd5b905035906102a08261027e565b565b90565b6102ae816102a2565b036102b557565b600080fd5b905035906102c7826102a5565b565b91906040838203126102f257806102e66102ef9260008601610293565b936020016102ba565b90565b61025d565b610300906102a2565b9052565b9190610318906000602085019401906102f7565b565b3461034b576103476103366103303660046102c9565b90611810565b61033e610252565b91829182610304565b0390f35b610258565b63ffffffff60e01b1690565b61036581610350565b0361036c57565b600080fd5b9050359061037e8261035c565b565b9060208282031261039a5761039791600001610371565b90565b61025d565b151590565b6103ad9061039f565b9052565b91906103c5906000602085019401906103a4565b565b346103f7576103f36103e26103dd366004610380565b611839565b6103ea610252565b918291826103b1565b0390f35b610258565b6bffffffffffffffffffffffff1690565b610416816103fc565b0361041d57565b600080fd5b9050359061042f8261040d565b565b919060408382031261045a578061044e6104579260008601610293565b93602001610422565b90565b61025d565b60000190565b346104945761047e610478366004610431565b906118db565b610486610252565b806104908161045f565b0390f35b610258565b60009103126104a457565b61025d565b634e487b7160e01b600052600060045260246000fd5b634e487b7160e01b600052602260045260246000fd5b90600160028304921680156104f5575b60208310146104f057565b6104bf565b91607f16916104e5565b60209181520190565b600052602060002090565b906000929180549061052e610527836104d5565b80946104ff565b91600181169081600014610587575060011461054a575b505050565b6105579192939450610508565b916000925b81841061056f5750500190388080610545565b6001816020929593955484860152019101929061055c565b92949550505060ff1916825215156020020190388080610545565b906105ac91610513565b90565b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b906105d9906105af565b810190811067ffffffffffffffff8211176105f357604052565b6105b9565b9061061861061192610608610252565b938480926105a2565b03836105cf565b565b9060001061062e5761062b906105f8565b90565b6104a9565b610640600860009061061a565b90565b5190565b60209181520190565b60005b838110610664575050906000910152565b806020918301518185015201610653565b61069461069d6020936106a29361068b81610643565b93848093610647565b95869101610650565b6105af565b0190565b6106bc9160208201916000818403910152610675565b90565b346106ef576106cf366004610499565b6106eb6106da610633565b6106e2610252565b918291826106a6565b0390f35b610258565b600080fd5b600080fd5b9061071161070a610252565b92836105cf565b565b67ffffffffffffffff81116107315761072d6020916105af565b0190565b6105b9565b90826000939282370152565b9092919261075761075282610713565b6106fe565b938185526020850190828401116107735761077192610736565b565b6106f9565b9080601f830112156107965781602061079393359101610742565b90565b6106f4565b906020828203126107cc57600082013567ffffffffffffffff81116107c7576107c49201610778565b90565b610262565b61025d565b346107ff576107e96107e436600461079b565b611b1c565b6107f1610252565b806107fb8161045f565b0390f35b610258565b9060208282031261081e5761081b91600001610293565b90565b61025d565b346108515761083b610836366004610804565b611bf9565b610843610252565b8061084d8161045f565b0390f35b610258565b906020828203126108705761086d916000016102ba565b90565b61025d565b346108a5576108a161089061088b366004610856565b611d23565b610898610252565b918291826106a6565b0390f35b610258565b1c90565b90565b6108c19060086108c693026108aa565b6108ae565b90565b906108d491546108b1565b90565b6108e26000806108c9565b90565b34610915576108f5366004610499565b6109116109006108d7565b610908610252565b91829182610304565b0390f35b610258565b67ffffffffffffffff81116109325760208091020190565b6105b9565b600080fd5b9092919261095161094c8261091a565b6106fe565b938185526020808601920283019281841161098e57915b8383106109755750505050565b6020809161098384866102ba565b815201920191610968565b610937565b9080601f830112156109b1578160206109ae9335910161093c565b90565b6106f4565b919091604081840312610a0f57600081013567ffffffffffffffff8111610a0a57836109e3918301610993565b92602082013567ffffffffffffffff8111610a0557610a029201610993565b90565b610262565b610262565b61025d565b34610a4357610a2d610a273660046109b6565b90611d6d565b610a35610252565b80610a3f8161045f565b0390f35b610258565b90565b610a5481610a48565b03610a5b57565b600080fd5b90503590610a6d82610a4b565b565b90602082820312610a8957610a8691600001610a60565b90565b61025d565b610a9790610a48565b9052565b9190610aaf90600060208501940190610a8e565b565b34610ae157610add610acc610ac7366004610a6f565b611dcf565b610ad4610252565b91829182610a9b565b0390f35b610258565b90565b610afd610af8610b02926102a2565b610ae6565b6102a2565b90565b90610b0f90610ae9565b600052602052604060002090565b610b3490610b2f600191600092610b05565b6108c9565b90565b34610b6757610b63610b52610b4d366004610856565b610b1d565b610b5a610252565b91829182610304565b0390f35b610258565b9190604083820312610b955780610b89610b9292600086016102ba565b936020016102ba565b90565b61025d565b610ba390610272565b9052565b916020610bc9929493610bc260408201966000830190610b9a565b01906102f7565b565b34610bfd57610be4610bde366004610b6c565b90611fc1565b90610bf9610bf0610252565b92839283610ba7565b0390f35b610258565b600080fd5b909182601f83011215610c415781359167ffffffffffffffff8311610c3c576020019260208302840111610c3757565b610937565b610c02565b6106f4565b909182601f83011215610c805781359167ffffffffffffffff8311610c7b576020019260018302840111610c7657565b610937565b610c02565b6106f4565b9160a083830312610d2357610c9d8260008501610293565b92610cab8360208301610293565b92604082013567ffffffffffffffff8111610d1e5781610ccc918401610c07565b929093606082013567ffffffffffffffff8111610d195783610cef918401610c07565b929093608082013567ffffffffffffffff8111610d1457610d109201610c46565b9091565b610262565b610262565b610262565b61025d565b34610d6057610d4a610d3b366004610c85565b9695909594919493929361209c565b610d52610252565b80610d5c8161045f565b0390f35b610258565b9190604083820312610d8e5780610d82610d8b9260008601610a60565b93602001610293565b90565b61025d565b34610dc257610dac610da6366004610d65565b90612338565b610db4610252565b80610dbe8161045f565b0390f35b610258565b34610df657610de0610dda366004610d65565b906123ee565b610de8610252565b80610df28161045f565b0390f35b610258565b909182601f83011215610e355781359167ffffffffffffffff8311610e30576020019260208302840111610e2b57565b610937565b610c02565b6106f4565b9091604082840312610e9557600082013567ffffffffffffffff8111610e905783610e66918401610dfb565b929093602082013567ffffffffffffffff8111610e8b57610e879201610c07565b9091565b610262565b610262565b61025d565b5190565b60209181520190565b60200190565b610eb6906102a2565b9052565b90610ec781602093610ead565b0190565b60200190565b90610eee610ee8610ee184610e9a565b8093610e9e565b92610ea7565b9060005b818110610eff5750505090565b909192610f18610f126001928651610eba565b94610ecb565b9101919091610ef2565b610f389160208201916000818403910152610ed1565b90565b34610f6f57610f6b610f5a610f51366004610e3a565b92919091612422565b610f62610252565b91829182610f22565b0390f35b610258565b9091606082840312610faa57610fa7610f9084600085016102ba565b93610f9e8160208601610293565b93604001610422565b90565b61025d565b34610fde57610fc8610fc2366004610f74565b916124bf565b610fd0610252565b80610fda8161045f565b0390f35b610258565b610ff0600960009061061a565b90565b3461102357611003366004610499565b61101f61100e610fe3565b611016610252565b918291826106a6565b0390f35b610258565b67ffffffffffffffff8111611046576110426020916105af565b0190565b6105b9565b9092919261106061105b82611028565b6106fe565b9381855260208501908284011161107c5761107a92610736565b565b6106f9565b9080601f8301121561109f5781602061109c9335910161104b565b90565b6106f4565b906080828203126110ff576110bc8160008401610293565b926110ca82602085016102ba565b926110d883604083016102ba565b92606082013567ffffffffffffffff81116110fa576110f79201611081565b90565b610262565b61025d565b34611136576111206111173660046110a4565b9291909161251e565b611128610252565b806111328161045f565b0390f35b610258565b346111695761115361114e36600461079b565b612554565b61115b610252565b806111658161045f565b0390f35b610258565b919061010083820312611233576111888160008501610293565b92602081013567ffffffffffffffff811161122e57826111a9918301610778565b92604082013567ffffffffffffffff811161122957836111ca918401610778565b92606083013567ffffffffffffffff811161122457816111eb918501610778565b926111f98260808301610293565b9261122161120a8460a08501610422565b936112188160c08601610293565b9360e001610a60565b90565b610262565b610262565b610262565b61025d565b346112705761125a61124b36600461116e565b9695909594919493929361255f565b611262610252565b8061126c8161045f565b0390f35b610258565b919060408382031261129e578061129261129b9260008601610a60565b936020016102ba565b90565b61025d565b91906112b790600060208501940190610b9a565b565b346112ea576112e66112d56112cf366004611275565b906125aa565b6112dd610252565b918291826112a3565b0390f35b610258565b346113205761131c61130b611305366004610d65565b90612629565b611313610252565b918291826103b1565b0390f35b610258565b346113535761133d61133836600461079b565b61267c565b611345610252565b8061134f8161045f565b0390f35b610258565b600080fd5b908160c091031261136b5790565b611358565b908160e091031261137e5790565b611358565b916060838303126113e85761139b8260008501610293565b92602081013567ffffffffffffffff81116113e357836113bc91830161135d565b92604082013567ffffffffffffffff81116113de576113db9201611370565b90565b610262565b610262565b61025d565b3461141e5761141a611409611403366004611383565b916129da565b611411610252565b91829182610a9b565b0390f35b610258565b90565b60001b90565b61144061143b61144592611423565b611426565b610a48565b90565b611452600061142c565b90565b61145d611448565b90565b3461149057611470366004610499565b61148c61147b611455565b611483610252565b91829182610a9b565b0390f35b610258565b61149e8161039f565b036114a557565b600080fd5b905035906114b782611495565b565b91906040838203126114e257806114d66114df9260008601610293565b936020016114aa565b90565b61025d565b34611516576115006114fa3660046114b9565b90612a7b565b611508610252565b806115128161045f565b0390f35b610258565b3461154a5761153461152e366004610b6c565b90612acb565b61153c610252565b806115468161045f565b0390f35b610258565b906080828203126115da576115678160008401610293565b92602083013567ffffffffffffffff81116115d55782611588918501610993565b92604081013567ffffffffffffffff81116115d057836115a9918301610993565b92606082013567ffffffffffffffff81116115cb576115c89201611081565b90565b610262565b610262565b610262565b61025d565b34611611576115fb6115f236600461154f565b92919091612b08565b611603610252565b8061160d8161045f565b0390f35b610258565b346116465761164261163161162c366004610a6f565b612b16565b611639610252565b91829182610304565b0390f35b610258565b3461167a5761166461165e366004610d65565b90612b66565b61166c610252565b806116768161045f565b0390f35b610258565b61168c600a60009061061a565b90565b346116bf5761169f366004610499565b6116bb6116aa61167f565b6116b2610252565b918291826106a6565b0390f35b610258565b91906040838203126116ed57806116e16116ea9260008601610293565b93602001610293565b90565b61025d565b346117235761171f61170e6117083660046116c4565b90612b72565b611716610252565b918291826103b1565b0390f35b610258565b346117565761174061173b366004610a6f565b612c01565b611748610252565b806117528161045f565b0390f35b610258565b91909160a0818403126117c7576117758360008301610293565b926117838160208401610293565b9261179182604085016102ba565b9261179f83606083016102ba565b92608082013567ffffffffffffffff81116117c2576117be9201610c46565b9091565b610262565b61025d565b34611801576117eb6117df36600461175b565b94939093929192612c0c565b6117f3610252565b806117fd8161045f565b0390f35b610258565b600080fd5b600090565b61181861180b565b50679a31110384e0b0c960205260145260005260406000205490565b600090565b611841611834565b5063c79b8b5f60e01b61185c61185683610350565b91610350565b148015611880575b908115611870575b5090565b61187a9150612ddb565b3861186c565b5061188a81612ddb565b611864565b7f6db4061a20ca83a3be756ee172bd37a029093ac5afe4ce968c6d5435b43cb01190565b906118cd916118c86118c361188f565b612e1f565b6118cf565b565b906118d991613039565b565b906118e5916118b3565b565b7fe02a0315b383857ac496e9d2b2546a699afaeb4e5e83a1fdef64376d0b74e5a590565b6119249061191f61191a6118e7565b612e1f565b611b0f565b565b601f602091010490565b1b90565b9190600861195091029161194a60001984611930565b92611930565b9181191691161790565b90565b919061197361196e61197b93610ae9565b61195a565b908354611934565b9055565b6119919161198b61180b565b9161195d565b565b5b81811061199f575050565b806119ad600060019361197f565b01611994565b9190601f81116119c3575b505050565b6119cf6119f493610508565b9060206119db84611926565b830193106119fc575b6119ed90611926565b0190611993565b3880806119be565b91506119ed819290506119e4565b90611a1b90600019906008026108aa565b191690565b81611a2a91611a0a565b906002021790565b90611a3c81610643565b9067ffffffffffffffff8211611afe57611a6082611a5a85546104d5565b856119b3565b602090601f8311600114611a9557918091611a8493600092611a89575b5050611a20565b90555b565b90915001513880611a7d565b601f19831691611aa485610508565b9260005b818110611ae657509160029391856001969410611acc575b50505002019055611a87565b611adc910151601f841690611a0a565b9055388080611ac0565b91936020600181928787015181550195019201611aa8565b6105b9565b90611b0d91611a32565b565b611b1a906008611b03565b565b611b259061190b565b565b7f70649ec320b507febad3e8ef750e5f580b9ae32f9f50d4c7b121332c8197153090565b611b6490611b5f611b5a611b27565b612e1f565b611be4565b565b611b7a611b75611b7f92610267565b610ae6565b610267565b90565b611b8b90611b66565b90565b611b9790611b82565b90565b90611bab60018060a01b0391611426565b9181191691161790565b611bbe90611b82565b90565b90565b90611bd9611bd4611be092611bb5565b611bc1565b8254611b9a565b9055565b611bf0611bf791611b8e565b6006611bc4565b565b611c0290611b4b565b565b606090565b905090565b9060009291805490611c29611c22836104d5565b8094611c09565b91600181169081600014611c7d5750600114611c45575b505050565b611c529192939450610508565b6000905b838210611c695750500190388080611c40565b600181602092548486015201910190611c56565b92949550505060ff19168252801515020190388080611c40565b611cbc611cb392602092611caa81610643565b94858093611c09565b93849101610650565b0190565b60007f2e6a736f6e000000000000000000000000000000000000000000000000000000910152565b611cf460058092611c09565b611cfd81611cc0565b0190565b91611d12611d1d93611d1893611c0e565b90611c97565b611ce8565b90565b90565b611d6a90611d2f611c04565b50611d65611d3e6009926130b3565b91611d56611d4a610252565b93849260208401611d01565b602082018103825203826105cf565b611d20565b90565b611d7a9133919091613201565b565b600090565b611d8a90610a48565b90565b90611d9790611d81565b600052602052604060002090565b60001c90565b90565b611dba611dbf91611da5565b611dab565b90565b611dcc9054611dae565b90565b6001611de8611dee92611de0611d7c565b506004611d8d565b01611dc2565b90565b600090565b90611e0090610ae9565b600052602052604060002090565b60018060a01b031690565b611e25611e2a91611da5565b611e0e565b90565b611e379054611e19565b90565b90611e4490610272565b9052565b60a01c90565b6bffffffffffffffffffffffff1690565b611e6b611e7091611e48565b611e4e565b90565b611e7d9054611e5f565b90565b90611e8a906103fc565b9052565b611e9860406106fe565b90565b90611ed2611ec96000611eac611e8e565b94611ec3611ebb838301611e2d565b838801611e3a565b01611e73565b60208401611e80565b565b611edd90611e9b565b90565b611eea9051610272565b90565b611f01611efc611f0692611423565b610ae6565b610267565b90565b611f1290611eed565b90565b611f1f90516103fc565b90565b611f36611f31611f3b926103fc565b610ae6565b6102a2565b90565b634e487b7160e01b600052601160045260246000fd5b611f63611f69919392936102a2565b926102a2565b91611f758382026102a2565b928184041490151715611f8457565b611f3e565b634e487b7160e01b600052601260045260246000fd5b611fab611fb1916102a2565b916102a2565b908115611fbc570490565b611f89565b611fe4611fe991939293611fd3611df1565b50611fdc61180b565b506003611df6565b611ed4565b91611ff660008401611ee0565b61201161200b6120066000611f09565b610272565b91610272565b1461205e575b600061205361203d61205a9361203761203260208901611f15565b611f22565b90611f54565b61204d6120486132f9565b611f22565b90611f9f565b9301611ee0565b9190565b915061205a600061205361203d6120756002611ed4565b959350505050612017565b61208b91369161093c565b90565b61209991369161104b565b90565b9693969590949192956120ad613310565b6122e6575b8287036122d85760601b679a31110384e0b0c9179460601b679a31110384e0b0c91791856020528560601c958360601c9384156122ca578733036122ae575b8860051b805b61224e57505050828660207f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb604051604081528b8d8160051b948286936040860152838d6060870137836060018286015260608486010190815201376080339380010190a461216461331e565b612231575b50813b61217a575b50505050505050565b602080809786946000528060c06040519b8c9a63bc197c818c5233868d015260408c015260a060608c01528a8360051b998a9586948593015260e08d01378160c00160808c015260e0828c010192835284830137818060e0010160a08a01520101838152013780010161010401601c60405101600080515af115612222575b63bc197c8160e01b9051036122145738808080808080612171565b639c05499b6000526004601cfd5b3d156121f9573d6000823e3d90fd5b612248908690849086908a8c919287948b9661332c565b38612169565b60209003808b01358360205281880135600052604060002080548083116122a0578290039055826020526040600020908154908101908110612292578291556120f7565b6301336cea6000526004601cfd5b63f4d678b86000526004601cfd5b336000526034600c20546120f157634b6e7f186000526004601cfd5b63ea553b346000526004601cfd5b633b800a466000526004601cfd5b61230984886123038b87906122fd88948c96612080565b50612080565b5061208e565b506120b2565b9061232a9161232561232082611dcf565b612e1f565b61232c565b565b9061233691613376565b565b906123429161230f565b565b60207f20726f6c657320666f722073656c660000000000000000000000000000000000917f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201520152565b61239f602f604092610647565b6123a881612344565b0190565b6123c29060208101906000818303910152612392565b90565b156123cc57565b6123d4610252565b62461bcd60e51b8152806123ea600482016123ac565b0390fd5b9061241b916124168261241061240a6124056133a0565b610272565b91610272565b146123c5565b6133ad565b565b606090565b9392919061242e61241d565b5082036124855760405193828552602085019260051b808481016040525b6124565750505050565b602090038082013560601b679a31110384e0b0c91760205280830135600052806040600020548186015261244c565b633b800a466000526004601cfd5b906124ae92916124a96124a461188f565b612e1f565b6124b0565b565b916124bd9291909161345b565b565b906124ca9291612493565b565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a690565b9061250c9392916125076125026124cc565b612e1f565b61250e565b565b9161251c93919091926134de565b565b9061252a9392916124f0565b565b6125459061254061253b6118e7565b612e1f565b612547565b565b612552906009611b03565b565b61255d9061252c565b565b959661258d9761258096959461257b9489949091929394613579565b613039565b6125886124cc565b613376565b565b9061259990611d81565b600052602052604060002090565b90565b906125ca6125c56125cf936125bd611df1565b50600561258f565b6125a7565b61364a565b90565b6125db90611b66565b90565b6125e7906125d2565b90565b906125f4906125de565b600052602052604060002090565b60ff1690565b61261461261991611da5565b612602565b90565b6126269054612608565b90565b61265191600061264661264c9361263e611834565b506004611d8d565b016125ea565b61261c565b90565b61266d906126686126636118e7565b612e1f565b61266f565b565b61267a90600a611b03565b565b61268590612654565b565b60018060a01b031690565b61269e6126a391611da5565b612687565b90565b6126b09054612692565b90565b6126bc906125d2565b90565b60e01b90565b905051906126d282610a4b565b565b906020828203126126ee576126eb916000016126c5565b90565b61025d565b50612702906020810190610293565b90565b61270e90610272565b9052565b50612721906020810190610371565b90565b61272d90610350565b9052565b50612740906020810190610a60565b90565b61274c90610a48565b9052565b600080fd5b600080fd5b600080fd5b90356001602003823603038112156127a057016020813591019167ffffffffffffffff821161279b57600182023603831361279657565b612755565b612750565b61275a565b60209181520190565b91906127c8816127c1816127cd956127a5565b8095610736565b6105af565b0190565b90356001604003823603038112156127e7570190565b61275a565b903560016020038236030381121561282d57016020813591019167ffffffffffffffff821161282857600182023603831361282357565b612755565b612750565b61275a565b919061284c8161284581612851956104ff565b8095610736565b6105af565b0190565b67ffffffffffffffff1690565b61286b81612855565b0361287257565b600080fd5b9050359061288482612862565b565b50612895906020810190612877565b90565b6128a190612855565b9052565b906128e39060206128db6128d1604084016128c360008801886127ec565b908683036000880152612832565b9482810190612886565b910190612898565b90565b6129909161298261297760c0830161290e61290460008701876126f3565b6000860190612705565b61292861291e6020870187612712565b6020860190612724565b6129426129386040870187612731565b6040860190612743565b61295c6129526060870187612731565b6060860190612743565b612969608086018661275f565b9085830360808701526127ae565b9260a08101906127d1565b9060a08184039101526128a5565b90565b9392906129bf6040916129c7946129b2606089019260008a0190610b9a565b87820360208901526128e6565b940190610a8e565b565b6129d1610252565b3d6000823e3d90fd5b91506020906129e7611d7c565b506129fa6129f560066126a6565b6126b3565b612a26633808a90b949294612a31612a126007611dc2565b612a1a610252565b978896879586956126bf565b855260048501612993565b03915afa908115612a7657600091612a48575b5090565b612a69915060203d8111612a6f575b612a6181836105cf565b8101906126d4565b38612a44565b503d612a57565b6129c9565b901515679a31110384e0b0c96020523360145281600052806034600c205560005260601b60601c337f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160206000a3565b612ad89133919091613683565b565b90612af6939291612af1612aec6124cc565b612e1f565b612af8565b565b91612b0693919091926136d5565b565b90612b14939291612ada565b565b612b35612b30612b3a92612b2861180b565b50600561258f565b6125a7565b6137a9565b90565b90612b5891612b53612b4e82611dcf565b612e1f565b612b5a565b565b90612b64916133ad565b565b90612b7091612b3d565b565b612b7a611834565b50679a31110384e0b0c96020526014526000526034600c205490565b612baf90612baa612ba5611b27565b612e1f565b612bf4565b565b90612bbe60001991611426565b9181191691161790565b612bd190611da5565b90565b90612be9612be4612bf092611d81565b612bc8565b8254612bb1565b9055565b612bff906007612bd4565b565b612c0a90612b96565b565b94909194612c18613310565b612db6575b60601b679a31110384e0b0c9179160601b679a31110384e0b0c917918060205260601c928260601c928315612da857843303612d8c575b8660005260406000208054808411612d7e5783900390556020526040600020805490828201918210612d705755806020528284337fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6260406000a4612cb661331e565b612d4b575b823b612cca575b505050505050565b602094829160405197889663f23a6e618852338989015260408801526060870152608086015260a0808601528160c086015260e085013760c401906000601c8401915af115612d3c575b63f23a6e6160e01b905103612d2e57388080808080612cc2565b639c05499b6000526004601cfd5b3d15612d14573d6000823e3d90fd5b612d54866137c9565b50612d5e816137c9565b50612d6a85839061208e565b50612cbb565b6301336cea6000526004601cfd5b63f4d678b86000526004601cfd5b336000526034600c2054612c5457634b6e7f186000526004601cfd5b63ea553b346000526004601cfd5b612dbf866137c9565b50612dc9846137c9565b50612dd585839061208e565b50612c1d565b612de3611834565b50612ded816137e9565b8015612e10575b908115612e00575b5090565b612e0a915061388f565b38612dfc565b50612e1a81613829565b612df4565b612e3190612e2b6133a0565b90613986565b565b60207f2073616c65507269636500000000000000000000000000000000000000000000917f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201520152565b612e8e602a604092610647565b612e9781612e33565b0190565b612eb19060208101906000818303910152612e81565b90565b15612ebb57565b612ec3610252565b62461bcd60e51b815280612ed960048201612e9b565b0390fd5b60007f455243323938313a20696e76616c696420726563656976657200000000000000910152565b612f126019602092610647565b612f1b81612edd565b0190565b612f359060208101906000818303910152612f05565b90565b15612f3f57565b612f47610252565b62461bcd60e51b815280612f5d60048201612f1f565b0390fd5b612f6b60406106fe565b90565b90565b90612f86612f81612f8d926125de565b612f6e565b8254611b9a565b9055565b60a01b90565b90612fb16bffffffffffffffffffffffff60a01b91612f91565b9181191691161790565b612fcf612fca612fd4926103fc565b610ae6565b6103fc565b90565b90565b90612fef612fea612ff692612fbb565b612fd7565b8254612f97565b9055565b906130256020600061302b9461301d828201613017848801611ee0565b90612f71565b019201611f15565b90612fda565b565b9061303791612ffa565b565b906130aa6130b1926130658361305e6130586130536132f9565b6103fc565b916103fc565b1115612eb4565b61308b8161308461307e6130796000611f09565b610272565b91610272565b1415612f38565b916130a1613097612f61565b9360008501611e3a565b60208301611e80565b600261302d565b565b906130bc611c04565b506080604051019160208301604052600083528290600a6000198092955b01948181066030018653049384156130f95790600a91908092916130da565b93505082602091039203918252565b61311c61311761312192611423565b610ae6565b6102a2565b90565b634e487b7160e01b600052603260045260246000fd5b9061314482610e9a565b811015613155576020809102010190565b613124565b61316490516102a2565b90565b61317361317891611da5565b6108ae565b90565b6131859054613167565b90565b61319761319d919392936102a2565b926102a2565b82039182116131a857565b611f3e565b906131c26131bd6131c992610ae9565b61195a565b8254612bb1565b9055565b6131dc6131e2919392936102a2565b926102a2565b82018092116131ed57565b611f3e565b60016131fe91016102a2565b90565b61321090939293828591613a1f565b61321981610e9a565b926132246000613108565b9261322d61180b565b935b8461324261323c886102a2565b916102a2565b10156132af576132a36132a99161326261325d86899061313a565b61315a565b61329d886132976132888a61328261327d879560019361313a565b61315a565b90610b05565b916132928361317b565b613188565b906131ad565b906131cd565b946131f2565b9361322f565b915093506132d392506132cc91506132c7600061317b565b613188565b60006131ad565b565b600090565b90565b6132f16132ec6132f6926132da565b610ae6565b6103fc565b90565b6133016132d5565b5061330d6127106132dd565b90565b613318611834565b50600090565b613326611834565b50600090565b5050949293909361333b61331e565b613348575b505050505050565b61335e6133649361336a97969092939596612080565b50612080565b5061208e565b50388080808080613340565b9061339861339361339d9361338c818590613a3a565b600561258f565b6125a7565b613b21565b50565b6133a8611df1565b503390565b906133cf6133ca6133d4936133c3818590613b5c565b600561258f565b6125a7565b613bf6565b50565b60007f455243323938313a20496e76616c696420706172616d65746572730000000000910152565b61340c601b602092610647565b613415816133d7565b0190565b61342f90602081019060008183039101526133ff565b90565b1561343957565b613441610252565b62461bcd60e51b81528061345760048201613419565b0390fd5b6134d7906134d06134dc949361348b8561348461347e6134796132f9565b6103fc565b916103fc565b1115612eb4565b6134b1816134aa6134a461349f6000611f09565b610272565b91610272565b1415613432565b936134c76134bd612f61565b9560008701611e3a565b60208501611e80565b6003611df6565b61302d565b565b61352c91926134f86135329561351d939086849192613c31565b61351561350e82613509600061317b565b6131cd565b60006131ad565b926001610b05565b916135278361317b565b6131cd565b906131ad565b565b9061354060ff91611426565b9181191691161790565b6135539061039f565b90565b90565b9061356e6135696135759261354a565b613556565b8254613534565b9055565b91909492613587600b61261c565b6135fa576135a76135ae926135a06135ec986008611b03565b6009611b03565b600a611b03565b6135c06135b9611448565b8290613376565b6135d26135cb61188f565b8290613376565b6135e46135dd6118e7565b8290613376565b919091613d32565b6135f86001600b613559565b565b600063f92ee8a960e01b8152806136136004820161045f565b0390fd5b90565b61362661362b91611da5565b610ae9565b90565b61364261363d613647926102a2565b610ae6565b610267565b90565b6136766136716136809361366c600061367b95613665611df1565b5001613617565b613dad565b61361a565b61362e565b6125d2565b90565b6136be6136d3936136996136cd93858391613dcf565b6136b66136af826136aa600061317b565b613188565b60006131ad565b926001610b05565b916136c88361317b565b613188565b906131ad565b565b926136e7919492939085859192613dea565b6136f083610e9a565b916136fb6000613108565b9161370461180b565b5b80613718613712876102a2565b916102a2565b10156137845761377f9061377a61374361373b61373687859061313a565b61315a565b9687906131cd565b95613774613765600161375f61375a8d889061313a565b61315a565b90610b05565b9161376f8361317b565b6131cd565b906131ad565b6131f2565b613705565b509350506137a791506137a09061379b600061317b565b6131cd565b60006131ad565b565b6137c160006137c6926137ba61180b565b5001613617565b613f2d565b90565b906137d261241d565b506040519160408301604052600183526020830152565b6137f1611834565b50633e85e62f60e01b61380c61380683610350565b91610350565b14908115613819575b5090565b6138239150613f45565b38613815565b613831611834565b5061383b81613f6c565b8015613880575b8015613865575b908115613855575b5090565b61385f9150613fac565b38613851565b50600061387a61387483610350565b91610350565b14613849565b5061388a81613fac565b613842565b613897611834565b506138a181613fac565b9081156138ad575b5090565b6138b79150613fec565b386138a9565b90565b6138d46138cf6138d9926138bd565b610ae6565b6102a2565b90565b60007f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000910152565b61391060178092611c09565b613919816138dc565b0190565b60007f206973206d697373696e6720726f6c6520000000000000000000000000000000910152565b61395160118092611c09565b61395a8161391d565b0190565b613978613983939261397261397d93613904565b90611c97565b613945565b90611c97565b90565b9061399b613995838390612629565b1561039f565b6139a3575050565b613a1b916139f96139d26139c26139bc6139fe9561407a565b9361361a565b6139cc60206138c0565b90614293565b916139ea6139de610252565b9384926020840161395e565b602082018103825203826105cf565b611d20565b613a06610252565b91829162461bcd60e51b8352600483016106a6565b0390fd5b9091613a3892613a2f6000611f09565b9290919261440e565b565b613a4e613a48828490612629565b1561039f565b613a57575b5050565b613a7a6001613a756000613a6d60048690611d8d565b0185906125ea565b613559565b90613a836133a0565b90613ac0613aba613ab47f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d95611d81565b926125de565b926125de565b92613ac9610252565b80613ad38161045f565b0390a43880613a53565b613ae690611b66565b90565b613afd613af8613b0292610267565b610ae6565b6102a2565b90565b613b19613b14613b1e926102a2565b611426565b610a48565b90565b90613b54613b4e613b49613b446000613b5996613b3c611834565b500194613add565b613ae9565b613b05565b91613617565b6145fe565b90565b613b67818390612629565b613b70575b5050565b613b936000613b8e6000613b8660048690611d8d565b0185906125ea565b613559565b90613b9c6133a0565b90613bd9613bd3613bcd7ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b95611d81565b926125de565b926125de565b92613be2610252565b80613bec8161045f565b0390a43880613b6c565b90613c29613c23613c1e613c196000613c2e96613c11611834565b500194613add565b613ae9565b613b05565b91613617565b6146be565b90565b91929092613c3d613310565b613d19575b8260601b8015613d0b57679a31110384e0b0c960205283601452846000526040600020805490838201918210613cfd57558160205260601c6000337fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604083a4613caa61331e565b613ce4575b613cb8836147c8565b613cc3575b50505050565b613cdb93613cd16000611f09565b93909192936147d5565b38808080613cbd565b613ced846137c9565b50613cf7816137c9565b50613caf565b6301336cea6000526004601cfd5b63ea553b346000526004601cfd5b613d22846137c9565b50613d2c816137c9565b50613c42565b90613d48613d4d9392613d43611b27565b613376565b61486e565b565b5490565b600052602060002090565b613d6781613d4f565b821015613d8257613d79600191613d53565b91020190600090565b613124565b613d97906008613d9c93026108aa565b611dab565b90565b90613daa9154613d87565b90565b613dcc916000613dc692613dbf611d7c565b5001613d5e565b90613d9f565b90565b9091613de892613ddf6000611f09565b9290919261488e565b565b91929092613df6613310565b613f28575b8051845103613f1a578260601b8015613f0c5780679a31110384e0b0c917602052845160051b805b613ed557506000604051604081527f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb81885160051b602001604082019081818c60045afa503d60400160208301523d01865160051b60200181818960045afa503d01039360601c933392a4613e9661331e565b613ed0575b613ea4836147c8565b613eaf575b50505050565b613ec793613ebd6000611f09565b9390919293614992565b38808080613ea9565b613e9b565b8083015190808701516000526040600020918254908101908110613efe57602092550380613e23565b6301336cea6000526004601cfd5b63ea553b346000526004601cfd5b633b800a466000526004601cfd5b613dfb565b6000613f4291613f3b61180b565b5001613d4f565b90565b613f4d611834565b5060e01c630e89341c8114906301ffc9a763d9b67a2682149114171790565b613f74611834565b5080613f8f613f8963152a902d60e11b610350565b91610350565b14908115613f9c575b5090565b613fa69150614a49565b38613f98565b613fb4611834565b5080613fcf613fc9635a05180f60e01b610350565b91610350565b14908115613fdc575b5090565b613fe69150614a6f565b38613fd8565b613ff4611834565b508061400f614009634e821d3360e11b610350565b91610350565b1490811561401c575b5090565b6140269150613829565b38614018565b90565b60ff1690565b61404961404461404e9261402c565b610ae6565b61402f565b90565b61405b6014614035565b90565b61407261406d6140779261402f565b610ae6565b6102a2565b90565b6140976140926140ad9261408c611c04565b50613add565b613ae9565b6140a76140a2614051565b61405e565b90614293565b90565b90565b6140c76140c26140cc926140b0565b610ae6565b6102a2565b90565b906140e16140dc83611028565b6106fe565b918252565b369037565b906141106140f8836140cf565b926020806141068693611028565b92019103906140e6565b565b600360fc1b90565b5190565b906141288261411a565b81101561413a57600160209102010190565b613124565b600f60fb1b90565b90565b61415e61415961416392614147565b610ae6565b6102a2565b90565b61416f906102a2565b6000811461417e576001900390565b611f3e565b6f181899199a1a9b1b9c1cb0b131b232b360811b90565b6141a2614183565b90565b90565b6141bc6141b76141c1926141a5565b610ae6565b6102a2565b90565b60f81b90565b90565b6141e16141dc6141e6926141ca565b610ae6565b61402f565b90565b614208906142026141fc61420d9461402f565b916102a2565b906108aa565b6102a2565b90565b60007f537472696e67733a20686578206c656e67746820696e73756666696369656e74910152565b61424460208092610647565b61424d81614210565b0190565b6142679060208101906000818303910152614238565b90565b1561427157565b614279610252565b62461bcd60e51b81528061428f60048201614251565b0390fd5b919061429d611c04565b506143376143276142d36142ce6142be60026142b987916140b3565b611f54565b6142c860026140b3565b906131cd565b6140eb565b926142dc614112565b6142f5856142ef60009360001a93613108565b9061411e565b536142fe61413f565b6143178561431160019360001a9361414a565b9061411e565b5361432260026140b3565b611f54565b614331600161414a565b906131cd565b925b8361434d614347600161414a565b916102a2565b11156143b45761435b61419a565b81614366600f6141a8565b169160108310156143af576143826143a3926143a9941a6141c4565b6143928591889060001a9261411e565b5361439d60046141cd565b906141e9565b93614166565b92614339565b613124565b6143dc9293506143d7906143d16143cb6000613108565b916102a2565b1461426a565b611d20565b90565b906143f16143ec83610713565b6106fe565b918252565b61440060006143df565b90565b61440b6143f6565b90565b9193929061441a613310565b614546575b81518551036145385760601b9182679a31110384e0b0c9176020528060601b83811490151715614516575b50835160051b805b6144e057507f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb6000939460405192839160408352805160051b60200180916040850192839160045afa503d60400160208401523d019081815160051b602001809260045afa503d01039260601c923392a46144cb61331e565b6144d2575b565b6144da614403565b506144d0565b8082015190808601516000526040600020805492838111614508576020930390550380614452565b63f4d678b86000526004601cfd5b6000526034600c20541561452a573861444a565b634b6e7f186000526004601cfd5b633b800a466000526004601cfd5b61454e614403565b5061441f565b90565b600052602060002090565b5490565b61456f81614562565b82101561458a57614581600191614557565b91020190600090565b613124565b91906145a56145a06145ad93611d81565b612bc8565b908354611934565b9055565b90815491680100000000000000008310156145e157826145d99160016145df95018155614566565b9061458f565b565b6105b9565b906145f090611d81565b600052602052604060002090565b614606611834565b5061461b614615828490614aaf565b1561039f565b60001461465e576146546146599261463f61463860008501614554565b82906145b1565b600161464d60008501613d4f565b93016145e6565b6131ad565b600190565b5050600090565b634e487b7160e01b600052603160045260246000fd5b61468d91614687611d7c565b9161458f565b565b61469881614562565b80156146b95760019003906146b66146b08383614566565b9061467b565b55565b614665565b6146c6611834565b506146dd6146d86001830184906145e6565b61317b565b90816146f26146ec6000613108565b916102a2565b14156000146147c05761477292600161476d928461471b6000966147158561414a565b90613188565b614738614729888501613d4f565b6147328661414a565b90613188565b8061474b614745846102a2565b916102a2565b03614777575b505050614767614762868301614554565b61468f565b016145e6565b61197f565b600190565b6147b8926147aa6147966147906147b3948c8901613d5e565b90613d9f565b936147a485918c8901613d5e565b9061458f565b918585016145e6565b6131ad565b388080614751565b505050600090565b6147d0611834565b503b90565b919360209360405195869463f23a6e618652338787015260601b60601c60408601526060850152608084015260a08084015280518091818060c087015261485a575b505060c401906000601c8401915af11561484b575b63f23a6e6160e01b90510361483d57565b639c05499b6000526004601cfd5b3d1561482c573d6000823e3d90fd5b818660e08701920160045afa508038614817565b9061488561487e61488c93611b8e565b6006611bc4565b6007612bd4565b565b9092919261489a613310565b614970575b60601b9081679a31110384e0b0c917602052818160601b148160601b15171561494e575b508260005260406000209081549182841161494057836000930390558260205260601c337fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604084a461491461331e565b61491d575b5050565b61492961492f926137c9565b506137c9565b50614938614403565b503880614919565b63f4d678b86000526004601cfd5b6000526034600c20541561496257386148c3565b634b6e7f186000526004601cfd5b614979846137c9565b50614983836137c9565b5061498c614403565b5061489f565b919360209360405195869463bc197c818652338787015260601b60601c604086015260a06060860152805160051b8601809160c0870192839160045afa503d60a001908160808701523d019182815160051b8801809260045afa503d0160a08501523d01908181518601809260045afa50601c8301903d0103906000601c8401915af115614a3a575b63bc197c8160e01b905103614a2c57565b639c05499b6000526004601cfd5b3d15614a1b573d6000823e3d90fd5b614a51611834565b50614a6b614a656301ffc9a760e01b610350565b91610350565b1490565b614a77611834565b5080614a92614a8c637965db0b60e01b610350565b91610350565b14908115614a9f575b5090565b614aa99150613f6c565b38614a9b565b614acd916001614ac892614ac1611834565b50016145e6565b61317b565b614ae0614ada6000613108565b916102a2565b14159056fea2646970667358221220b829e62cbd4291156fd8e41f29314ac27b4f688a516435044f66a0ad587e708064736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x13 JUMPI JUMPDEST PUSH2 0x1806 JUMP JUMPDEST PUSH2 0x1E PUSH1 0x0 CALLDATALOAD PUSH2 0x24C JUMP JUMPDEST DUP1 PUSH3 0xFDD58E EQ PUSH2 0x247 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x242 JUMPI DUP1 PUSH4 0x4634D8D EQ PUSH2 0x23D JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x238 JUMPI DUP1 PUSH4 0xB5EE006 EQ PUSH2 0x233 JUMPI DUP1 PUSH4 0xBB310DE EQ PUSH2 0x22E JUMPI DUP1 PUSH4 0xE89341C EQ PUSH2 0x229 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x224 JUMPI DUP1 PUSH4 0x20EC271B EQ PUSH2 0x21F JUMPI DUP1 PUSH4 0x248A9CA3 EQ PUSH2 0x21A JUMPI DUP1 PUSH4 0x2693EBF2 EQ PUSH2 0x215 JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x210 JUMPI DUP1 PUSH4 0x2EB2C2D6 EQ PUSH2 0x20B JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x206 JUMPI DUP1 PUSH4 0x36568ABE EQ PUSH2 0x201 JUMPI DUP1 PUSH4 0x4E1273F4 EQ PUSH2 0x1FC JUMPI DUP1 PUSH4 0x5944C753 EQ PUSH2 0x1F7 JUMPI DUP1 PUSH4 0x6C0360EB EQ PUSH2 0x1F2 JUMPI DUP1 PUSH4 0x731133E9 EQ PUSH2 0x1ED JUMPI DUP1 PUSH4 0x7E518EC8 EQ PUSH2 0x1E8 JUMPI DUP1 PUSH4 0x8FF83AC1 EQ PUSH2 0x1E3 JUMPI DUP1 PUSH4 0x9010D07C EQ PUSH2 0x1DE JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x1D9 JUMPI DUP1 PUSH4 0x938E3D7B EQ PUSH2 0x1D4 JUMPI DUP1 PUSH4 0x9D043A66 EQ PUSH2 0x1CF JUMPI DUP1 PUSH4 0xA217FDDF EQ PUSH2 0x1CA JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x1C5 JUMPI DUP1 PUSH4 0xB390C0AB EQ PUSH2 0x1C0 JUMPI DUP1 PUSH4 0xB48AB8B6 EQ PUSH2 0x1BB JUMPI DUP1 PUSH4 0xCA15C873 EQ PUSH2 0x1B6 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x1B1 JUMPI DUP1 PUSH4 0xE8A3D485 EQ PUSH2 0x1AC JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x1A7 JUMPI DUP1 PUSH4 0xED4C2AC7 EQ PUSH2 0x1A2 JUMPI PUSH4 0xF242432A SUB PUSH2 0xE JUMPI PUSH2 0x17CC JUMP JUMPDEST PUSH2 0x1728 JUMP JUMPDEST PUSH2 0x16F2 JUMP JUMPDEST PUSH2 0x168F JUMP JUMPDEST PUSH2 0x164B JUMP JUMPDEST PUSH2 0x1616 JUMP JUMPDEST PUSH2 0x15DF JUMP JUMPDEST PUSH2 0x151B JUMP JUMPDEST PUSH2 0x14E7 JUMP JUMPDEST PUSH2 0x1460 JUMP JUMPDEST PUSH2 0x13ED JUMP JUMPDEST PUSH2 0x1325 JUMP JUMPDEST PUSH2 0x12EF JUMP JUMPDEST PUSH2 0x12B9 JUMP JUMPDEST PUSH2 0x1238 JUMP JUMPDEST PUSH2 0x113B JUMP JUMPDEST PUSH2 0x1104 JUMP JUMPDEST PUSH2 0xFF3 JUMP JUMPDEST PUSH2 0xFAF JUMP JUMPDEST PUSH2 0xF3B JUMP JUMPDEST PUSH2 0xDC7 JUMP JUMPDEST PUSH2 0xD93 JUMP JUMPDEST PUSH2 0xD28 JUMP JUMPDEST PUSH2 0xBCB JUMP JUMPDEST PUSH2 0xB37 JUMP JUMPDEST PUSH2 0xAB1 JUMP JUMPDEST PUSH2 0xA14 JUMP JUMPDEST PUSH2 0x8E5 JUMP JUMPDEST PUSH2 0x875 JUMP JUMPDEST PUSH2 0x823 JUMP JUMPDEST PUSH2 0x7D1 JUMP JUMPDEST PUSH2 0x6BF JUMP JUMPDEST PUSH2 0x465 JUMP JUMPDEST PUSH2 0x3C7 JUMP JUMPDEST PUSH2 0x31A JUMP JUMPDEST PUSH1 0xE0 SHR SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x27B SWAP1 PUSH2 0x267 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x287 DUP2 PUSH2 0x272 JUMP JUMPDEST SUB PUSH2 0x28E JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x2A0 DUP3 PUSH2 0x27E JUMP JUMPDEST JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2AE DUP2 PUSH2 0x2A2 JUMP JUMPDEST SUB PUSH2 0x2B5 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x2C7 DUP3 PUSH2 0x2A5 JUMP JUMPDEST JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0x2F2 JUMPI DUP1 PUSH2 0x2E6 PUSH2 0x2EF SWAP3 PUSH1 0x0 DUP7 ADD PUSH2 0x293 JUMP JUMPDEST SWAP4 PUSH1 0x20 ADD PUSH2 0x2BA JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST PUSH2 0x300 SWAP1 PUSH2 0x2A2 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x318 SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0x2F7 JUMP JUMPDEST JUMP JUMPDEST CALLVALUE PUSH2 0x34B JUMPI PUSH2 0x347 PUSH2 0x336 PUSH2 0x330 CALLDATASIZE PUSH1 0x4 PUSH2 0x2C9 JUMP JUMPDEST SWAP1 PUSH2 0x1810 JUMP JUMPDEST PUSH2 0x33E PUSH2 0x252 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x304 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL AND SWAP1 JUMP JUMPDEST PUSH2 0x365 DUP2 PUSH2 0x350 JUMP JUMPDEST SUB PUSH2 0x36C JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x37E DUP3 PUSH2 0x35C JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x39A JUMPI PUSH2 0x397 SWAP2 PUSH1 0x0 ADD PUSH2 0x371 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH2 0x3AD SWAP1 PUSH2 0x39F JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x3C5 SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0x3A4 JUMP JUMPDEST JUMP JUMPDEST CALLVALUE PUSH2 0x3F7 JUMPI PUSH2 0x3F3 PUSH2 0x3E2 PUSH2 0x3DD CALLDATASIZE PUSH1 0x4 PUSH2 0x380 JUMP JUMPDEST PUSH2 0x1839 JUMP JUMPDEST PUSH2 0x3EA PUSH2 0x252 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x3B1 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0x416 DUP2 PUSH2 0x3FC JUMP JUMPDEST SUB PUSH2 0x41D JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x42F DUP3 PUSH2 0x40D JUMP JUMPDEST JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0x45A JUMPI DUP1 PUSH2 0x44E PUSH2 0x457 SWAP3 PUSH1 0x0 DUP7 ADD PUSH2 0x293 JUMP JUMPDEST SWAP4 PUSH1 0x20 ADD PUSH2 0x422 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST PUSH1 0x0 ADD SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x494 JUMPI PUSH2 0x47E PUSH2 0x478 CALLDATASIZE PUSH1 0x4 PUSH2 0x431 JUMP JUMPDEST SWAP1 PUSH2 0x18DB JUMP JUMPDEST PUSH2 0x486 PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0x490 DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST PUSH1 0x0 SWAP2 SUB SLT PUSH2 0x4A4 JUMPI JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x1 PUSH1 0x2 DUP4 DIV SWAP3 AND DUP1 ISZERO PUSH2 0x4F5 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x4F0 JUMPI JUMP JUMPDEST PUSH2 0x4BF JUMP JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x4E5 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x0 SWAP3 SWAP2 DUP1 SLOAD SWAP1 PUSH2 0x52E PUSH2 0x527 DUP4 PUSH2 0x4D5 JUMP JUMPDEST DUP1 SWAP5 PUSH2 0x4FF JUMP JUMPDEST SWAP2 PUSH1 0x1 DUP2 AND SWAP1 DUP2 PUSH1 0x0 EQ PUSH2 0x587 JUMPI POP PUSH1 0x1 EQ PUSH2 0x54A JUMPI JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x557 SWAP2 SWAP3 SWAP4 SWAP5 POP PUSH2 0x508 JUMP JUMPDEST SWAP2 PUSH1 0x0 SWAP3 JUMPDEST DUP2 DUP5 LT PUSH2 0x56F JUMPI POP POP ADD SWAP1 CODESIZE DUP1 DUP1 PUSH2 0x545 JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x20 SWAP3 SWAP6 SWAP4 SWAP6 SLOAD DUP5 DUP7 ADD MSTORE ADD SWAP2 ADD SWAP3 SWAP1 PUSH2 0x55C JUMP JUMPDEST SWAP3 SWAP5 SWAP6 POP POP POP PUSH1 0xFF NOT AND DUP3 MSTORE ISZERO ISZERO PUSH1 0x20 MUL ADD SWAP1 CODESIZE DUP1 DUP1 PUSH2 0x545 JUMP JUMPDEST SWAP1 PUSH2 0x5AC SWAP2 PUSH2 0x513 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1F DUP1 NOT SWAP2 ADD AND SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH2 0x5D9 SWAP1 PUSH2 0x5AF JUMP JUMPDEST DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x5F3 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH2 0x5B9 JUMP JUMPDEST SWAP1 PUSH2 0x618 PUSH2 0x611 SWAP3 PUSH2 0x608 PUSH2 0x252 JUMP JUMPDEST SWAP4 DUP5 DUP1 SWAP3 PUSH2 0x5A2 JUMP JUMPDEST SUB DUP4 PUSH2 0x5CF JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x0 LT PUSH2 0x62E JUMPI PUSH2 0x62B SWAP1 PUSH2 0x5F8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x4A9 JUMP JUMPDEST PUSH2 0x640 PUSH1 0x8 PUSH1 0x0 SWAP1 PUSH2 0x61A JUMP JUMPDEST SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x664 JUMPI POP POP SWAP1 PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP1 PUSH1 0x20 SWAP2 DUP4 ADD MLOAD DUP2 DUP6 ADD MSTORE ADD PUSH2 0x653 JUMP JUMPDEST PUSH2 0x694 PUSH2 0x69D PUSH1 0x20 SWAP4 PUSH2 0x6A2 SWAP4 PUSH2 0x68B DUP2 PUSH2 0x643 JUMP JUMPDEST SWAP4 DUP5 DUP1 SWAP4 PUSH2 0x647 JUMP JUMPDEST SWAP6 DUP7 SWAP2 ADD PUSH2 0x650 JUMP JUMPDEST PUSH2 0x5AF JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x6BC SWAP2 PUSH1 0x20 DUP3 ADD SWAP2 PUSH1 0x0 DUP2 DUP5 SUB SWAP2 ADD MSTORE PUSH2 0x675 JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x6EF JUMPI PUSH2 0x6CF CALLDATASIZE PUSH1 0x4 PUSH2 0x499 JUMP JUMPDEST PUSH2 0x6EB PUSH2 0x6DA PUSH2 0x633 JUMP JUMPDEST PUSH2 0x6E2 PUSH2 0x252 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x6A6 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 PUSH2 0x711 PUSH2 0x70A PUSH2 0x252 JUMP JUMPDEST SWAP3 DUP4 PUSH2 0x5CF JUMP JUMPDEST JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x731 JUMPI PUSH2 0x72D PUSH1 0x20 SWAP2 PUSH2 0x5AF JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x5B9 JUMP JUMPDEST SWAP1 DUP3 PUSH1 0x0 SWAP4 SWAP3 DUP3 CALLDATACOPY ADD MSTORE JUMP JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x757 PUSH2 0x752 DUP3 PUSH2 0x713 JUMP JUMPDEST PUSH2 0x6FE JUMP JUMPDEST SWAP4 DUP2 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP1 DUP3 DUP5 ADD GT PUSH2 0x773 JUMPI PUSH2 0x771 SWAP3 PUSH2 0x736 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x6F9 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x796 JUMPI DUP2 PUSH1 0x20 PUSH2 0x793 SWAP4 CALLDATALOAD SWAP2 ADD PUSH2 0x742 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x6F4 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x7CC JUMPI PUSH1 0x0 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x7C7 JUMPI PUSH2 0x7C4 SWAP3 ADD PUSH2 0x778 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x262 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST CALLVALUE PUSH2 0x7FF JUMPI PUSH2 0x7E9 PUSH2 0x7E4 CALLDATASIZE PUSH1 0x4 PUSH2 0x79B JUMP JUMPDEST PUSH2 0x1B1C JUMP JUMPDEST PUSH2 0x7F1 PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0x7FB DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x81E JUMPI PUSH2 0x81B SWAP2 PUSH1 0x0 ADD PUSH2 0x293 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST CALLVALUE PUSH2 0x851 JUMPI PUSH2 0x83B PUSH2 0x836 CALLDATASIZE PUSH1 0x4 PUSH2 0x804 JUMP JUMPDEST PUSH2 0x1BF9 JUMP JUMPDEST PUSH2 0x843 PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0x84D DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x870 JUMPI PUSH2 0x86D SWAP2 PUSH1 0x0 ADD PUSH2 0x2BA JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST CALLVALUE PUSH2 0x8A5 JUMPI PUSH2 0x8A1 PUSH2 0x890 PUSH2 0x88B CALLDATASIZE PUSH1 0x4 PUSH2 0x856 JUMP JUMPDEST PUSH2 0x1D23 JUMP JUMPDEST PUSH2 0x898 PUSH2 0x252 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x6A6 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST SHR SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x8C1 SWAP1 PUSH1 0x8 PUSH2 0x8C6 SWAP4 MUL PUSH2 0x8AA JUMP JUMPDEST PUSH2 0x8AE JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x8D4 SWAP2 SLOAD PUSH2 0x8B1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x8E2 PUSH1 0x0 DUP1 PUSH2 0x8C9 JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x915 JUMPI PUSH2 0x8F5 CALLDATASIZE PUSH1 0x4 PUSH2 0x499 JUMP JUMPDEST PUSH2 0x911 PUSH2 0x900 PUSH2 0x8D7 JUMP JUMPDEST PUSH2 0x908 PUSH2 0x252 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x304 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x932 JUMPI PUSH1 0x20 DUP1 SWAP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH2 0x5B9 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x951 PUSH2 0x94C DUP3 PUSH2 0x91A JUMP JUMPDEST PUSH2 0x6FE JUMP JUMPDEST SWAP4 DUP2 DUP6 MSTORE PUSH1 0x20 DUP1 DUP7 ADD SWAP3 MUL DUP4 ADD SWAP3 DUP2 DUP5 GT PUSH2 0x98E JUMPI SWAP2 JUMPDEST DUP4 DUP4 LT PUSH2 0x975 JUMPI POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 SWAP2 PUSH2 0x983 DUP5 DUP7 PUSH2 0x2BA JUMP JUMPDEST DUP2 MSTORE ADD SWAP3 ADD SWAP2 PUSH2 0x968 JUMP JUMPDEST PUSH2 0x937 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x9B1 JUMPI DUP2 PUSH1 0x20 PUSH2 0x9AE SWAP4 CALLDATALOAD SWAP2 ADD PUSH2 0x93C JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x6F4 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH1 0x40 DUP2 DUP5 SUB SLT PUSH2 0xA0F JUMPI PUSH1 0x0 DUP2 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xA0A JUMPI DUP4 PUSH2 0x9E3 SWAP2 DUP4 ADD PUSH2 0x993 JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xA05 JUMPI PUSH2 0xA02 SWAP3 ADD PUSH2 0x993 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x262 JUMP JUMPDEST PUSH2 0x262 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST CALLVALUE PUSH2 0xA43 JUMPI PUSH2 0xA2D PUSH2 0xA27 CALLDATASIZE PUSH1 0x4 PUSH2 0x9B6 JUMP JUMPDEST SWAP1 PUSH2 0x1D6D JUMP JUMPDEST PUSH2 0xA35 PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0xA3F DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xA54 DUP2 PUSH2 0xA48 JUMP JUMPDEST SUB PUSH2 0xA5B JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0xA6D DUP3 PUSH2 0xA4B JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0xA89 JUMPI PUSH2 0xA86 SWAP2 PUSH1 0x0 ADD PUSH2 0xA60 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST PUSH2 0xA97 SWAP1 PUSH2 0xA48 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0xAAF SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0xA8E JUMP JUMPDEST JUMP JUMPDEST CALLVALUE PUSH2 0xAE1 JUMPI PUSH2 0xADD PUSH2 0xACC PUSH2 0xAC7 CALLDATASIZE PUSH1 0x4 PUSH2 0xA6F JUMP JUMPDEST PUSH2 0x1DCF JUMP JUMPDEST PUSH2 0xAD4 PUSH2 0x252 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xA9B JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xAFD PUSH2 0xAF8 PUSH2 0xB02 SWAP3 PUSH2 0x2A2 JUMP JUMPDEST PUSH2 0xAE6 JUMP JUMPDEST PUSH2 0x2A2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0xB0F SWAP1 PUSH2 0xAE9 JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH2 0xB34 SWAP1 PUSH2 0xB2F PUSH1 0x1 SWAP2 PUSH1 0x0 SWAP3 PUSH2 0xB05 JUMP JUMPDEST PUSH2 0x8C9 JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0xB67 JUMPI PUSH2 0xB63 PUSH2 0xB52 PUSH2 0xB4D CALLDATASIZE PUSH1 0x4 PUSH2 0x856 JUMP JUMPDEST PUSH2 0xB1D JUMP JUMPDEST PUSH2 0xB5A PUSH2 0x252 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x304 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0xB95 JUMPI DUP1 PUSH2 0xB89 PUSH2 0xB92 SWAP3 PUSH1 0x0 DUP7 ADD PUSH2 0x2BA JUMP JUMPDEST SWAP4 PUSH1 0x20 ADD PUSH2 0x2BA JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST PUSH2 0xBA3 SWAP1 PUSH2 0x272 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 PUSH1 0x20 PUSH2 0xBC9 SWAP3 SWAP5 SWAP4 PUSH2 0xBC2 PUSH1 0x40 DUP3 ADD SWAP7 PUSH1 0x0 DUP4 ADD SWAP1 PUSH2 0xB9A JUMP JUMPDEST ADD SWAP1 PUSH2 0x2F7 JUMP JUMPDEST JUMP JUMPDEST CALLVALUE PUSH2 0xBFD JUMPI PUSH2 0xBE4 PUSH2 0xBDE CALLDATASIZE PUSH1 0x4 PUSH2 0xB6C JUMP JUMPDEST SWAP1 PUSH2 0x1FC1 JUMP JUMPDEST SWAP1 PUSH2 0xBF9 PUSH2 0xBF0 PUSH2 0x252 JUMP JUMPDEST SWAP3 DUP4 SWAP3 DUP4 PUSH2 0xBA7 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP2 DUP3 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0xC41 JUMPI DUP2 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xC3C JUMPI PUSH1 0x20 ADD SWAP3 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH2 0xC37 JUMPI JUMP JUMPDEST PUSH2 0x937 JUMP JUMPDEST PUSH2 0xC02 JUMP JUMPDEST PUSH2 0x6F4 JUMP JUMPDEST SWAP1 SWAP2 DUP3 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0xC80 JUMPI DUP2 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xC7B JUMPI PUSH1 0x20 ADD SWAP3 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH2 0xC76 JUMPI JUMP JUMPDEST PUSH2 0x937 JUMP JUMPDEST PUSH2 0xC02 JUMP JUMPDEST PUSH2 0x6F4 JUMP JUMPDEST SWAP2 PUSH1 0xA0 DUP4 DUP4 SUB SLT PUSH2 0xD23 JUMPI PUSH2 0xC9D DUP3 PUSH1 0x0 DUP6 ADD PUSH2 0x293 JUMP JUMPDEST SWAP3 PUSH2 0xCAB DUP4 PUSH1 0x20 DUP4 ADD PUSH2 0x293 JUMP JUMPDEST SWAP3 PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xD1E JUMPI DUP2 PUSH2 0xCCC SWAP2 DUP5 ADD PUSH2 0xC07 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xD19 JUMPI DUP4 PUSH2 0xCEF SWAP2 DUP5 ADD PUSH2 0xC07 JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH1 0x80 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xD14 JUMPI PUSH2 0xD10 SWAP3 ADD PUSH2 0xC46 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH2 0x262 JUMP JUMPDEST PUSH2 0x262 JUMP JUMPDEST PUSH2 0x262 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST CALLVALUE PUSH2 0xD60 JUMPI PUSH2 0xD4A PUSH2 0xD3B CALLDATASIZE PUSH1 0x4 PUSH2 0xC85 JUMP JUMPDEST SWAP7 SWAP6 SWAP1 SWAP6 SWAP5 SWAP2 SWAP5 SWAP4 SWAP3 SWAP4 PUSH2 0x209C JUMP JUMPDEST PUSH2 0xD52 PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0xD5C DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0xD8E JUMPI DUP1 PUSH2 0xD82 PUSH2 0xD8B SWAP3 PUSH1 0x0 DUP7 ADD PUSH2 0xA60 JUMP JUMPDEST SWAP4 PUSH1 0x20 ADD PUSH2 0x293 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST CALLVALUE PUSH2 0xDC2 JUMPI PUSH2 0xDAC PUSH2 0xDA6 CALLDATASIZE PUSH1 0x4 PUSH2 0xD65 JUMP JUMPDEST SWAP1 PUSH2 0x2338 JUMP JUMPDEST PUSH2 0xDB4 PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0xDBE DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST CALLVALUE PUSH2 0xDF6 JUMPI PUSH2 0xDE0 PUSH2 0xDDA CALLDATASIZE PUSH1 0x4 PUSH2 0xD65 JUMP JUMPDEST SWAP1 PUSH2 0x23EE JUMP JUMPDEST PUSH2 0xDE8 PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0xDF2 DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST SWAP1 SWAP2 DUP3 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0xE35 JUMPI DUP2 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xE30 JUMPI PUSH1 0x20 ADD SWAP3 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH2 0xE2B JUMPI JUMP JUMPDEST PUSH2 0x937 JUMP JUMPDEST PUSH2 0xC02 JUMP JUMPDEST PUSH2 0x6F4 JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x40 DUP3 DUP5 SUB SLT PUSH2 0xE95 JUMPI PUSH1 0x0 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xE90 JUMPI DUP4 PUSH2 0xE66 SWAP2 DUP5 ADD PUSH2 0xDFB JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xE8B JUMPI PUSH2 0xE87 SWAP3 ADD PUSH2 0xC07 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH2 0x262 JUMP JUMPDEST PUSH2 0x262 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH2 0xEB6 SWAP1 PUSH2 0x2A2 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP1 PUSH2 0xEC7 DUP2 PUSH1 0x20 SWAP4 PUSH2 0xEAD JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0xEEE PUSH2 0xEE8 PUSH2 0xEE1 DUP5 PUSH2 0xE9A JUMP JUMPDEST DUP1 SWAP4 PUSH2 0xE9E JUMP JUMPDEST SWAP3 PUSH2 0xEA7 JUMP JUMPDEST SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0xEFF JUMPI POP POP POP SWAP1 JUMP JUMPDEST SWAP1 SWAP2 SWAP3 PUSH2 0xF18 PUSH2 0xF12 PUSH1 0x1 SWAP3 DUP7 MLOAD PUSH2 0xEBA JUMP JUMPDEST SWAP5 PUSH2 0xECB JUMP JUMPDEST SWAP2 ADD SWAP2 SWAP1 SWAP2 PUSH2 0xEF2 JUMP JUMPDEST PUSH2 0xF38 SWAP2 PUSH1 0x20 DUP3 ADD SWAP2 PUSH1 0x0 DUP2 DUP5 SUB SWAP2 ADD MSTORE PUSH2 0xED1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0xF6F JUMPI PUSH2 0xF6B PUSH2 0xF5A PUSH2 0xF51 CALLDATASIZE PUSH1 0x4 PUSH2 0xE3A JUMP JUMPDEST SWAP3 SWAP2 SWAP1 SWAP2 PUSH2 0x2422 JUMP JUMPDEST PUSH2 0xF62 PUSH2 0x252 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xF22 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x60 DUP3 DUP5 SUB SLT PUSH2 0xFAA JUMPI PUSH2 0xFA7 PUSH2 0xF90 DUP5 PUSH1 0x0 DUP6 ADD PUSH2 0x2BA JUMP JUMPDEST SWAP4 PUSH2 0xF9E DUP2 PUSH1 0x20 DUP7 ADD PUSH2 0x293 JUMP JUMPDEST SWAP4 PUSH1 0x40 ADD PUSH2 0x422 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST CALLVALUE PUSH2 0xFDE JUMPI PUSH2 0xFC8 PUSH2 0xFC2 CALLDATASIZE PUSH1 0x4 PUSH2 0xF74 JUMP JUMPDEST SWAP2 PUSH2 0x24BF JUMP JUMPDEST PUSH2 0xFD0 PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0xFDA DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST PUSH2 0xFF0 PUSH1 0x9 PUSH1 0x0 SWAP1 PUSH2 0x61A JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x1023 JUMPI PUSH2 0x1003 CALLDATASIZE PUSH1 0x4 PUSH2 0x499 JUMP JUMPDEST PUSH2 0x101F PUSH2 0x100E PUSH2 0xFE3 JUMP JUMPDEST PUSH2 0x1016 PUSH2 0x252 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x6A6 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1046 JUMPI PUSH2 0x1042 PUSH1 0x20 SWAP2 PUSH2 0x5AF JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x5B9 JUMP JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x1060 PUSH2 0x105B DUP3 PUSH2 0x1028 JUMP JUMPDEST PUSH2 0x6FE JUMP JUMPDEST SWAP4 DUP2 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP1 DUP3 DUP5 ADD GT PUSH2 0x107C JUMPI PUSH2 0x107A SWAP3 PUSH2 0x736 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x6F9 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x109F JUMPI DUP2 PUSH1 0x20 PUSH2 0x109C SWAP4 CALLDATALOAD SWAP2 ADD PUSH2 0x104B JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x6F4 JUMP JUMPDEST SWAP1 PUSH1 0x80 DUP3 DUP3 SUB SLT PUSH2 0x10FF JUMPI PUSH2 0x10BC DUP2 PUSH1 0x0 DUP5 ADD PUSH2 0x293 JUMP JUMPDEST SWAP3 PUSH2 0x10CA DUP3 PUSH1 0x20 DUP6 ADD PUSH2 0x2BA JUMP JUMPDEST SWAP3 PUSH2 0x10D8 DUP4 PUSH1 0x40 DUP4 ADD PUSH2 0x2BA JUMP JUMPDEST SWAP3 PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x10FA JUMPI PUSH2 0x10F7 SWAP3 ADD PUSH2 0x1081 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x262 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST CALLVALUE PUSH2 0x1136 JUMPI PUSH2 0x1120 PUSH2 0x1117 CALLDATASIZE PUSH1 0x4 PUSH2 0x10A4 JUMP JUMPDEST SWAP3 SWAP2 SWAP1 SWAP2 PUSH2 0x251E JUMP JUMPDEST PUSH2 0x1128 PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0x1132 DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST CALLVALUE PUSH2 0x1169 JUMPI PUSH2 0x1153 PUSH2 0x114E CALLDATASIZE PUSH1 0x4 PUSH2 0x79B JUMP JUMPDEST PUSH2 0x2554 JUMP JUMPDEST PUSH2 0x115B PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0x1165 DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x100 DUP4 DUP3 SUB SLT PUSH2 0x1233 JUMPI PUSH2 0x1188 DUP2 PUSH1 0x0 DUP6 ADD PUSH2 0x293 JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x122E JUMPI DUP3 PUSH2 0x11A9 SWAP2 DUP4 ADD PUSH2 0x778 JUMP JUMPDEST SWAP3 PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1229 JUMPI DUP4 PUSH2 0x11CA SWAP2 DUP5 ADD PUSH2 0x778 JUMP JUMPDEST SWAP3 PUSH1 0x60 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1224 JUMPI DUP2 PUSH2 0x11EB SWAP2 DUP6 ADD PUSH2 0x778 JUMP JUMPDEST SWAP3 PUSH2 0x11F9 DUP3 PUSH1 0x80 DUP4 ADD PUSH2 0x293 JUMP JUMPDEST SWAP3 PUSH2 0x1221 PUSH2 0x120A DUP5 PUSH1 0xA0 DUP6 ADD PUSH2 0x422 JUMP JUMPDEST SWAP4 PUSH2 0x1218 DUP2 PUSH1 0xC0 DUP7 ADD PUSH2 0x293 JUMP JUMPDEST SWAP4 PUSH1 0xE0 ADD PUSH2 0xA60 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x262 JUMP JUMPDEST PUSH2 0x262 JUMP JUMPDEST PUSH2 0x262 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST CALLVALUE PUSH2 0x1270 JUMPI PUSH2 0x125A PUSH2 0x124B CALLDATASIZE PUSH1 0x4 PUSH2 0x116E JUMP JUMPDEST SWAP7 SWAP6 SWAP1 SWAP6 SWAP5 SWAP2 SWAP5 SWAP4 SWAP3 SWAP4 PUSH2 0x255F JUMP JUMPDEST PUSH2 0x1262 PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0x126C DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0x129E JUMPI DUP1 PUSH2 0x1292 PUSH2 0x129B SWAP3 PUSH1 0x0 DUP7 ADD PUSH2 0xA60 JUMP JUMPDEST SWAP4 PUSH1 0x20 ADD PUSH2 0x2BA JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x12B7 SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0xB9A JUMP JUMPDEST JUMP JUMPDEST CALLVALUE PUSH2 0x12EA JUMPI PUSH2 0x12E6 PUSH2 0x12D5 PUSH2 0x12CF CALLDATASIZE PUSH1 0x4 PUSH2 0x1275 JUMP JUMPDEST SWAP1 PUSH2 0x25AA JUMP JUMPDEST PUSH2 0x12DD PUSH2 0x252 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x12A3 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST CALLVALUE PUSH2 0x1320 JUMPI PUSH2 0x131C PUSH2 0x130B PUSH2 0x1305 CALLDATASIZE PUSH1 0x4 PUSH2 0xD65 JUMP JUMPDEST SWAP1 PUSH2 0x2629 JUMP JUMPDEST PUSH2 0x1313 PUSH2 0x252 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x3B1 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST CALLVALUE PUSH2 0x1353 JUMPI PUSH2 0x133D PUSH2 0x1338 CALLDATASIZE PUSH1 0x4 PUSH2 0x79B JUMP JUMPDEST PUSH2 0x267C JUMP JUMPDEST PUSH2 0x1345 PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0x134F DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0xC0 SWAP2 SUB SLT PUSH2 0x136B JUMPI SWAP1 JUMP JUMPDEST PUSH2 0x1358 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0xE0 SWAP2 SUB SLT PUSH2 0x137E JUMPI SWAP1 JUMP JUMPDEST PUSH2 0x1358 JUMP JUMPDEST SWAP2 PUSH1 0x60 DUP4 DUP4 SUB SLT PUSH2 0x13E8 JUMPI PUSH2 0x139B DUP3 PUSH1 0x0 DUP6 ADD PUSH2 0x293 JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x13E3 JUMPI DUP4 PUSH2 0x13BC SWAP2 DUP4 ADD PUSH2 0x135D JUMP JUMPDEST SWAP3 PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x13DE JUMPI PUSH2 0x13DB SWAP3 ADD PUSH2 0x1370 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x262 JUMP JUMPDEST PUSH2 0x262 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST CALLVALUE PUSH2 0x141E JUMPI PUSH2 0x141A PUSH2 0x1409 PUSH2 0x1403 CALLDATASIZE PUSH1 0x4 PUSH2 0x1383 JUMP JUMPDEST SWAP2 PUSH2 0x29DA JUMP JUMPDEST PUSH2 0x1411 PUSH2 0x252 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xA9B JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SHL SWAP1 JUMP JUMPDEST PUSH2 0x1440 PUSH2 0x143B PUSH2 0x1445 SWAP3 PUSH2 0x1423 JUMP JUMPDEST PUSH2 0x1426 JUMP JUMPDEST PUSH2 0xA48 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1452 PUSH1 0x0 PUSH2 0x142C JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x145D PUSH2 0x1448 JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x1490 JUMPI PUSH2 0x1470 CALLDATASIZE PUSH1 0x4 PUSH2 0x499 JUMP JUMPDEST PUSH2 0x148C PUSH2 0x147B PUSH2 0x1455 JUMP JUMPDEST PUSH2 0x1483 PUSH2 0x252 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xA9B JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST PUSH2 0x149E DUP2 PUSH2 0x39F JUMP JUMPDEST SUB PUSH2 0x14A5 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x14B7 DUP3 PUSH2 0x1495 JUMP JUMPDEST JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0x14E2 JUMPI DUP1 PUSH2 0x14D6 PUSH2 0x14DF SWAP3 PUSH1 0x0 DUP7 ADD PUSH2 0x293 JUMP JUMPDEST SWAP4 PUSH1 0x20 ADD PUSH2 0x14AA JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST CALLVALUE PUSH2 0x1516 JUMPI PUSH2 0x1500 PUSH2 0x14FA CALLDATASIZE PUSH1 0x4 PUSH2 0x14B9 JUMP JUMPDEST SWAP1 PUSH2 0x2A7B JUMP JUMPDEST PUSH2 0x1508 PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0x1512 DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST CALLVALUE PUSH2 0x154A JUMPI PUSH2 0x1534 PUSH2 0x152E CALLDATASIZE PUSH1 0x4 PUSH2 0xB6C JUMP JUMPDEST SWAP1 PUSH2 0x2ACB JUMP JUMPDEST PUSH2 0x153C PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0x1546 DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST SWAP1 PUSH1 0x80 DUP3 DUP3 SUB SLT PUSH2 0x15DA JUMPI PUSH2 0x1567 DUP2 PUSH1 0x0 DUP5 ADD PUSH2 0x293 JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x15D5 JUMPI DUP3 PUSH2 0x1588 SWAP2 DUP6 ADD PUSH2 0x993 JUMP JUMPDEST SWAP3 PUSH1 0x40 DUP2 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x15D0 JUMPI DUP4 PUSH2 0x15A9 SWAP2 DUP4 ADD PUSH2 0x993 JUMP JUMPDEST SWAP3 PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x15CB JUMPI PUSH2 0x15C8 SWAP3 ADD PUSH2 0x1081 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x262 JUMP JUMPDEST PUSH2 0x262 JUMP JUMPDEST PUSH2 0x262 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST CALLVALUE PUSH2 0x1611 JUMPI PUSH2 0x15FB PUSH2 0x15F2 CALLDATASIZE PUSH1 0x4 PUSH2 0x154F JUMP JUMPDEST SWAP3 SWAP2 SWAP1 SWAP2 PUSH2 0x2B08 JUMP JUMPDEST PUSH2 0x1603 PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0x160D DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST CALLVALUE PUSH2 0x1646 JUMPI PUSH2 0x1642 PUSH2 0x1631 PUSH2 0x162C CALLDATASIZE PUSH1 0x4 PUSH2 0xA6F JUMP JUMPDEST PUSH2 0x2B16 JUMP JUMPDEST PUSH2 0x1639 PUSH2 0x252 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x304 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST CALLVALUE PUSH2 0x167A JUMPI PUSH2 0x1664 PUSH2 0x165E CALLDATASIZE PUSH1 0x4 PUSH2 0xD65 JUMP JUMPDEST SWAP1 PUSH2 0x2B66 JUMP JUMPDEST PUSH2 0x166C PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0x1676 DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST PUSH2 0x168C PUSH1 0xA PUSH1 0x0 SWAP1 PUSH2 0x61A JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x16BF JUMPI PUSH2 0x169F CALLDATASIZE PUSH1 0x4 PUSH2 0x499 JUMP JUMPDEST PUSH2 0x16BB PUSH2 0x16AA PUSH2 0x167F JUMP JUMPDEST PUSH2 0x16B2 PUSH2 0x252 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x6A6 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0x16ED JUMPI DUP1 PUSH2 0x16E1 PUSH2 0x16EA SWAP3 PUSH1 0x0 DUP7 ADD PUSH2 0x293 JUMP JUMPDEST SWAP4 PUSH1 0x20 ADD PUSH2 0x293 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST CALLVALUE PUSH2 0x1723 JUMPI PUSH2 0x171F PUSH2 0x170E PUSH2 0x1708 CALLDATASIZE PUSH1 0x4 PUSH2 0x16C4 JUMP JUMPDEST SWAP1 PUSH2 0x2B72 JUMP JUMPDEST PUSH2 0x1716 PUSH2 0x252 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x3B1 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST CALLVALUE PUSH2 0x1756 JUMPI PUSH2 0x1740 PUSH2 0x173B CALLDATASIZE PUSH1 0x4 PUSH2 0xA6F JUMP JUMPDEST PUSH2 0x2C01 JUMP JUMPDEST PUSH2 0x1748 PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0x1752 DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH1 0xA0 DUP2 DUP5 SUB SLT PUSH2 0x17C7 JUMPI PUSH2 0x1775 DUP4 PUSH1 0x0 DUP4 ADD PUSH2 0x293 JUMP JUMPDEST SWAP3 PUSH2 0x1783 DUP2 PUSH1 0x20 DUP5 ADD PUSH2 0x293 JUMP JUMPDEST SWAP3 PUSH2 0x1791 DUP3 PUSH1 0x40 DUP6 ADD PUSH2 0x2BA JUMP JUMPDEST SWAP3 PUSH2 0x179F DUP4 PUSH1 0x60 DUP4 ADD PUSH2 0x2BA JUMP JUMPDEST SWAP3 PUSH1 0x80 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x17C2 JUMPI PUSH2 0x17BE SWAP3 ADD PUSH2 0xC46 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH2 0x262 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST CALLVALUE PUSH2 0x1801 JUMPI PUSH2 0x17EB PUSH2 0x17DF CALLDATASIZE PUSH1 0x4 PUSH2 0x175B JUMP JUMPDEST SWAP5 SWAP4 SWAP1 SWAP4 SWAP3 SWAP2 SWAP3 PUSH2 0x2C0C JUMP JUMPDEST PUSH2 0x17F3 PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0x17FD DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x258 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x1818 PUSH2 0x180B JUMP JUMPDEST POP PUSH8 0x9A31110384E0B0C9 PUSH1 0x20 MSTORE PUSH1 0x14 MSTORE PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x1841 PUSH2 0x1834 JUMP JUMPDEST POP PUSH4 0xC79B8B5F PUSH1 0xE0 SHL PUSH2 0x185C PUSH2 0x1856 DUP4 PUSH2 0x350 JUMP JUMPDEST SWAP2 PUSH2 0x350 JUMP JUMPDEST EQ DUP1 ISZERO PUSH2 0x1880 JUMPI JUMPDEST SWAP1 DUP2 ISZERO PUSH2 0x1870 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x187A SWAP2 POP PUSH2 0x2DDB JUMP JUMPDEST CODESIZE PUSH2 0x186C JUMP JUMPDEST POP PUSH2 0x188A DUP2 PUSH2 0x2DDB JUMP JUMPDEST PUSH2 0x1864 JUMP JUMPDEST PUSH32 0x6DB4061A20CA83A3BE756EE172BD37A029093AC5AFE4CE968C6D5435B43CB011 SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x18CD SWAP2 PUSH2 0x18C8 PUSH2 0x18C3 PUSH2 0x188F JUMP JUMPDEST PUSH2 0x2E1F JUMP JUMPDEST PUSH2 0x18CF JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x18D9 SWAP2 PUSH2 0x3039 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x18E5 SWAP2 PUSH2 0x18B3 JUMP JUMPDEST JUMP JUMPDEST PUSH32 0xE02A0315B383857AC496E9D2B2546A699AFAEB4E5E83A1FDEF64376D0B74E5A5 SWAP1 JUMP JUMPDEST PUSH2 0x1924 SWAP1 PUSH2 0x191F PUSH2 0x191A PUSH2 0x18E7 JUMP JUMPDEST PUSH2 0x2E1F JUMP JUMPDEST PUSH2 0x1B0F JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x1F PUSH1 0x20 SWAP2 ADD DIV SWAP1 JUMP JUMPDEST SHL SWAP1 JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x8 PUSH2 0x1950 SWAP2 MUL SWAP2 PUSH2 0x194A PUSH1 0x0 NOT DUP5 PUSH2 0x1930 JUMP JUMPDEST SWAP3 PUSH2 0x1930 JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x1973 PUSH2 0x196E PUSH2 0x197B SWAP4 PUSH2 0xAE9 JUMP JUMPDEST PUSH2 0x195A JUMP JUMPDEST SWAP1 DUP4 SLOAD PUSH2 0x1934 JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x1991 SWAP2 PUSH2 0x198B PUSH2 0x180B JUMP JUMPDEST SWAP2 PUSH2 0x195D JUMP JUMPDEST JUMP JUMPDEST JUMPDEST DUP2 DUP2 LT PUSH2 0x199F JUMPI POP POP JUMP JUMPDEST DUP1 PUSH2 0x19AD PUSH1 0x0 PUSH1 0x1 SWAP4 PUSH2 0x197F JUMP JUMPDEST ADD PUSH2 0x1994 JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x1F DUP2 GT PUSH2 0x19C3 JUMPI JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x19CF PUSH2 0x19F4 SWAP4 PUSH2 0x508 JUMP JUMPDEST SWAP1 PUSH1 0x20 PUSH2 0x19DB DUP5 PUSH2 0x1926 JUMP JUMPDEST DUP4 ADD SWAP4 LT PUSH2 0x19FC JUMPI JUMPDEST PUSH2 0x19ED SWAP1 PUSH2 0x1926 JUMP JUMPDEST ADD SWAP1 PUSH2 0x1993 JUMP JUMPDEST CODESIZE DUP1 DUP1 PUSH2 0x19BE JUMP JUMPDEST SWAP2 POP PUSH2 0x19ED DUP2 SWAP3 SWAP1 POP PUSH2 0x19E4 JUMP JUMPDEST SWAP1 PUSH2 0x1A1B SWAP1 PUSH1 0x0 NOT SWAP1 PUSH1 0x8 MUL PUSH2 0x8AA JUMP JUMPDEST NOT AND SWAP1 JUMP JUMPDEST DUP2 PUSH2 0x1A2A SWAP2 PUSH2 0x1A0A JUMP JUMPDEST SWAP1 PUSH1 0x2 MUL OR SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x1A3C DUP2 PUSH2 0x643 JUMP JUMPDEST SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x1AFE JUMPI PUSH2 0x1A60 DUP3 PUSH2 0x1A5A DUP6 SLOAD PUSH2 0x4D5 JUMP JUMPDEST DUP6 PUSH2 0x19B3 JUMP JUMPDEST PUSH1 0x20 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x1A95 JUMPI SWAP2 DUP1 SWAP2 PUSH2 0x1A84 SWAP4 PUSH1 0x0 SWAP3 PUSH2 0x1A89 JUMPI JUMPDEST POP POP PUSH2 0x1A20 JUMP JUMPDEST SWAP1 SSTORE JUMPDEST JUMP JUMPDEST SWAP1 SWAP2 POP ADD MLOAD CODESIZE DUP1 PUSH2 0x1A7D JUMP JUMPDEST PUSH1 0x1F NOT DUP4 AND SWAP2 PUSH2 0x1AA4 DUP6 PUSH2 0x508 JUMP JUMPDEST SWAP3 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x1AE6 JUMPI POP SWAP2 PUSH1 0x2 SWAP4 SWAP2 DUP6 PUSH1 0x1 SWAP7 SWAP5 LT PUSH2 0x1ACC JUMPI JUMPDEST POP POP POP MUL ADD SWAP1 SSTORE PUSH2 0x1A87 JUMP JUMPDEST PUSH2 0x1ADC SWAP2 ADD MLOAD PUSH1 0x1F DUP5 AND SWAP1 PUSH2 0x1A0A JUMP JUMPDEST SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x1AC0 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD MLOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x1AA8 JUMP JUMPDEST PUSH2 0x5B9 JUMP JUMPDEST SWAP1 PUSH2 0x1B0D SWAP2 PUSH2 0x1A32 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x1B1A SWAP1 PUSH1 0x8 PUSH2 0x1B03 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x1B25 SWAP1 PUSH2 0x190B JUMP JUMPDEST JUMP JUMPDEST PUSH32 0x70649EC320B507FEBAD3E8EF750E5F580B9AE32F9F50D4C7B121332C81971530 SWAP1 JUMP JUMPDEST PUSH2 0x1B64 SWAP1 PUSH2 0x1B5F PUSH2 0x1B5A PUSH2 0x1B27 JUMP JUMPDEST PUSH2 0x2E1F JUMP JUMPDEST PUSH2 0x1BE4 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x1B7A PUSH2 0x1B75 PUSH2 0x1B7F SWAP3 PUSH2 0x267 JUMP JUMPDEST PUSH2 0xAE6 JUMP JUMPDEST PUSH2 0x267 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1B8B SWAP1 PUSH2 0x1B66 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1B97 SWAP1 PUSH2 0x1B82 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x1BAB PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB SWAP2 PUSH2 0x1426 JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST PUSH2 0x1BBE SWAP1 PUSH2 0x1B82 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x1BD9 PUSH2 0x1BD4 PUSH2 0x1BE0 SWAP3 PUSH2 0x1BB5 JUMP JUMPDEST PUSH2 0x1BC1 JUMP JUMPDEST DUP3 SLOAD PUSH2 0x1B9A JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x1BF0 PUSH2 0x1BF7 SWAP2 PUSH2 0x1B8E JUMP JUMPDEST PUSH1 0x6 PUSH2 0x1BC4 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x1C02 SWAP1 PUSH2 0x1B4B JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x60 SWAP1 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x0 SWAP3 SWAP2 DUP1 SLOAD SWAP1 PUSH2 0x1C29 PUSH2 0x1C22 DUP4 PUSH2 0x4D5 JUMP JUMPDEST DUP1 SWAP5 PUSH2 0x1C09 JUMP JUMPDEST SWAP2 PUSH1 0x1 DUP2 AND SWAP1 DUP2 PUSH1 0x0 EQ PUSH2 0x1C7D JUMPI POP PUSH1 0x1 EQ PUSH2 0x1C45 JUMPI JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x1C52 SWAP2 SWAP3 SWAP4 SWAP5 POP PUSH2 0x508 JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMPDEST DUP4 DUP3 LT PUSH2 0x1C69 JUMPI POP POP ADD SWAP1 CODESIZE DUP1 DUP1 PUSH2 0x1C40 JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x20 SWAP3 SLOAD DUP5 DUP7 ADD MSTORE ADD SWAP2 ADD SWAP1 PUSH2 0x1C56 JUMP JUMPDEST SWAP3 SWAP5 SWAP6 POP POP POP PUSH1 0xFF NOT AND DUP3 MSTORE DUP1 ISZERO ISZERO MUL ADD SWAP1 CODESIZE DUP1 DUP1 PUSH2 0x1C40 JUMP JUMPDEST PUSH2 0x1CBC PUSH2 0x1CB3 SWAP3 PUSH1 0x20 SWAP3 PUSH2 0x1CAA DUP2 PUSH2 0x643 JUMP JUMPDEST SWAP5 DUP6 DUP1 SWAP4 PUSH2 0x1C09 JUMP JUMPDEST SWAP4 DUP5 SWAP2 ADD PUSH2 0x650 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x2E6A736F6E000000000000000000000000000000000000000000000000000000 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x1CF4 PUSH1 0x5 DUP1 SWAP3 PUSH2 0x1C09 JUMP JUMPDEST PUSH2 0x1CFD DUP2 PUSH2 0x1CC0 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST SWAP2 PUSH2 0x1D12 PUSH2 0x1D1D SWAP4 PUSH2 0x1D18 SWAP4 PUSH2 0x1C0E JUMP JUMPDEST SWAP1 PUSH2 0x1C97 JUMP JUMPDEST PUSH2 0x1CE8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1D6A SWAP1 PUSH2 0x1D2F PUSH2 0x1C04 JUMP JUMPDEST POP PUSH2 0x1D65 PUSH2 0x1D3E PUSH1 0x9 SWAP3 PUSH2 0x30B3 JUMP JUMPDEST SWAP2 PUSH2 0x1D56 PUSH2 0x1D4A PUSH2 0x252 JUMP JUMPDEST SWAP4 DUP5 SWAP3 PUSH1 0x20 DUP5 ADD PUSH2 0x1D01 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE SUB DUP3 PUSH2 0x5CF JUMP JUMPDEST PUSH2 0x1D20 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1D7A SWAP2 CALLER SWAP2 SWAP1 SWAP2 PUSH2 0x3201 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x1D8A SWAP1 PUSH2 0xA48 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x1D97 SWAP1 PUSH2 0x1D81 JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x0 SHR SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1DBA PUSH2 0x1DBF SWAP2 PUSH2 0x1DA5 JUMP JUMPDEST PUSH2 0x1DAB JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1DCC SWAP1 SLOAD PUSH2 0x1DAE JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH2 0x1DE8 PUSH2 0x1DEE SWAP3 PUSH2 0x1DE0 PUSH2 0x1D7C JUMP JUMPDEST POP PUSH1 0x4 PUSH2 0x1D8D JUMP JUMPDEST ADD PUSH2 0x1DC2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x1E00 SWAP1 PUSH2 0xAE9 JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x1E25 PUSH2 0x1E2A SWAP2 PUSH2 0x1DA5 JUMP JUMPDEST PUSH2 0x1E0E JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1E37 SWAP1 SLOAD PUSH2 0x1E19 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x1E44 SWAP1 PUSH2 0x272 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST PUSH1 0xA0 SHR SWAP1 JUMP JUMPDEST PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0x1E6B PUSH2 0x1E70 SWAP2 PUSH2 0x1E48 JUMP JUMPDEST PUSH2 0x1E4E JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1E7D SWAP1 SLOAD PUSH2 0x1E5F JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x1E8A SWAP1 PUSH2 0x3FC JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST PUSH2 0x1E98 PUSH1 0x40 PUSH2 0x6FE JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x1ED2 PUSH2 0x1EC9 PUSH1 0x0 PUSH2 0x1EAC PUSH2 0x1E8E JUMP JUMPDEST SWAP5 PUSH2 0x1EC3 PUSH2 0x1EBB DUP4 DUP4 ADD PUSH2 0x1E2D JUMP JUMPDEST DUP4 DUP9 ADD PUSH2 0x1E3A JUMP JUMPDEST ADD PUSH2 0x1E73 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD PUSH2 0x1E80 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x1EDD SWAP1 PUSH2 0x1E9B JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1EEA SWAP1 MLOAD PUSH2 0x272 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1F01 PUSH2 0x1EFC PUSH2 0x1F06 SWAP3 PUSH2 0x1423 JUMP JUMPDEST PUSH2 0xAE6 JUMP JUMPDEST PUSH2 0x267 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1F12 SWAP1 PUSH2 0x1EED JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1F1F SWAP1 MLOAD PUSH2 0x3FC JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1F36 PUSH2 0x1F31 PUSH2 0x1F3B SWAP3 PUSH2 0x3FC JUMP JUMPDEST PUSH2 0xAE6 JUMP JUMPDEST PUSH2 0x2A2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x1F63 PUSH2 0x1F69 SWAP2 SWAP4 SWAP3 SWAP4 PUSH2 0x2A2 JUMP JUMPDEST SWAP3 PUSH2 0x2A2 JUMP JUMPDEST SWAP2 PUSH2 0x1F75 DUP4 DUP3 MUL PUSH2 0x2A2 JUMP JUMPDEST SWAP3 DUP2 DUP5 DIV EQ SWAP1 ISZERO OR ISZERO PUSH2 0x1F84 JUMPI JUMP JUMPDEST PUSH2 0x1F3E JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x1FAB PUSH2 0x1FB1 SWAP2 PUSH2 0x2A2 JUMP JUMPDEST SWAP2 PUSH2 0x2A2 JUMP JUMPDEST SWAP1 DUP2 ISZERO PUSH2 0x1FBC JUMPI DIV SWAP1 JUMP JUMPDEST PUSH2 0x1F89 JUMP JUMPDEST PUSH2 0x1FE4 PUSH2 0x1FE9 SWAP2 SWAP4 SWAP3 SWAP4 PUSH2 0x1FD3 PUSH2 0x1DF1 JUMP JUMPDEST POP PUSH2 0x1FDC PUSH2 0x180B JUMP JUMPDEST POP PUSH1 0x3 PUSH2 0x1DF6 JUMP JUMPDEST PUSH2 0x1ED4 JUMP JUMPDEST SWAP2 PUSH2 0x1FF6 PUSH1 0x0 DUP5 ADD PUSH2 0x1EE0 JUMP JUMPDEST PUSH2 0x2011 PUSH2 0x200B PUSH2 0x2006 PUSH1 0x0 PUSH2 0x1F09 JUMP JUMPDEST PUSH2 0x272 JUMP JUMPDEST SWAP2 PUSH2 0x272 JUMP JUMPDEST EQ PUSH2 0x205E JUMPI JUMPDEST PUSH1 0x0 PUSH2 0x2053 PUSH2 0x203D PUSH2 0x205A SWAP4 PUSH2 0x2037 PUSH2 0x2032 PUSH1 0x20 DUP10 ADD PUSH2 0x1F15 JUMP JUMPDEST PUSH2 0x1F22 JUMP JUMPDEST SWAP1 PUSH2 0x1F54 JUMP JUMPDEST PUSH2 0x204D PUSH2 0x2048 PUSH2 0x32F9 JUMP JUMPDEST PUSH2 0x1F22 JUMP JUMPDEST SWAP1 PUSH2 0x1F9F JUMP JUMPDEST SWAP4 ADD PUSH2 0x1EE0 JUMP JUMPDEST SWAP2 SWAP1 JUMP JUMPDEST SWAP2 POP PUSH2 0x205A PUSH1 0x0 PUSH2 0x2053 PUSH2 0x203D PUSH2 0x2075 PUSH1 0x2 PUSH2 0x1ED4 JUMP JUMPDEST SWAP6 SWAP4 POP POP POP POP PUSH2 0x2017 JUMP JUMPDEST PUSH2 0x208B SWAP2 CALLDATASIZE SWAP2 PUSH2 0x93C JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2099 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x104B JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP7 SWAP4 SWAP7 SWAP6 SWAP1 SWAP5 SWAP2 SWAP3 SWAP6 PUSH2 0x20AD PUSH2 0x3310 JUMP JUMPDEST PUSH2 0x22E6 JUMPI JUMPDEST DUP3 DUP8 SUB PUSH2 0x22D8 JUMPI PUSH1 0x60 SHL PUSH8 0x9A31110384E0B0C9 OR SWAP5 PUSH1 0x60 SHL PUSH8 0x9A31110384E0B0C9 OR SWAP2 DUP6 PUSH1 0x20 MSTORE DUP6 PUSH1 0x60 SHR SWAP6 DUP4 PUSH1 0x60 SHR SWAP4 DUP5 ISZERO PUSH2 0x22CA JUMPI DUP8 CALLER SUB PUSH2 0x22AE JUMPI JUMPDEST DUP9 PUSH1 0x5 SHL DUP1 JUMPDEST PUSH2 0x224E JUMPI POP POP POP DUP3 DUP7 PUSH1 0x20 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH1 0x40 MLOAD PUSH1 0x40 DUP2 MSTORE DUP12 DUP14 DUP2 PUSH1 0x5 SHL SWAP5 DUP3 DUP7 SWAP4 PUSH1 0x40 DUP7 ADD MSTORE DUP4 DUP14 PUSH1 0x60 DUP8 ADD CALLDATACOPY DUP4 PUSH1 0x60 ADD DUP3 DUP7 ADD MSTORE PUSH1 0x60 DUP5 DUP7 ADD ADD SWAP1 DUP2 MSTORE ADD CALLDATACOPY PUSH1 0x80 CALLER SWAP4 DUP1 ADD ADD SWAP1 LOG4 PUSH2 0x2164 PUSH2 0x331E JUMP JUMPDEST PUSH2 0x2231 JUMPI JUMPDEST POP DUP2 EXTCODESIZE PUSH2 0x217A JUMPI JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP1 SWAP8 DUP7 SWAP5 PUSH1 0x0 MSTORE DUP1 PUSH1 0xC0 PUSH1 0x40 MLOAD SWAP12 DUP13 SWAP11 PUSH4 0xBC197C81 DUP13 MSTORE CALLER DUP7 DUP14 ADD MSTORE PUSH1 0x40 DUP13 ADD MSTORE PUSH1 0xA0 PUSH1 0x60 DUP13 ADD MSTORE DUP11 DUP4 PUSH1 0x5 SHL SWAP10 DUP11 SWAP6 DUP7 SWAP5 DUP6 SWAP4 ADD MSTORE PUSH1 0xE0 DUP14 ADD CALLDATACOPY DUP2 PUSH1 0xC0 ADD PUSH1 0x80 DUP13 ADD MSTORE PUSH1 0xE0 DUP3 DUP13 ADD ADD SWAP3 DUP4 MSTORE DUP5 DUP4 ADD CALLDATACOPY DUP2 DUP1 PUSH1 0xE0 ADD ADD PUSH1 0xA0 DUP11 ADD MSTORE ADD ADD DUP4 DUP2 MSTORE ADD CALLDATACOPY DUP1 ADD ADD PUSH2 0x104 ADD PUSH1 0x1C PUSH1 0x40 MLOAD ADD PUSH1 0x0 DUP1 MLOAD GAS CALL ISZERO PUSH2 0x2222 JUMPI JUMPDEST PUSH4 0xBC197C81 PUSH1 0xE0 SHL SWAP1 MLOAD SUB PUSH2 0x2214 JUMPI CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x2171 JUMP JUMPDEST PUSH4 0x9C05499B PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x21F9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH2 0x2248 SWAP1 DUP7 SWAP1 DUP5 SWAP1 DUP7 SWAP1 DUP11 DUP13 SWAP2 SWAP3 DUP8 SWAP5 DUP12 SWAP7 PUSH2 0x332C JUMP JUMPDEST CODESIZE PUSH2 0x2169 JUMP JUMPDEST PUSH1 0x20 SWAP1 SUB DUP1 DUP12 ADD CALLDATALOAD DUP4 PUSH1 0x20 MSTORE DUP2 DUP9 ADD CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP1 SLOAD DUP1 DUP4 GT PUSH2 0x22A0 JUMPI DUP3 SWAP1 SUB SWAP1 SSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD SWAP1 DUP2 ADD SWAP1 DUP2 LT PUSH2 0x2292 JUMPI DUP3 SWAP2 SSTORE PUSH2 0x20F7 JUMP JUMPDEST PUSH4 0x1336CEA PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0xF4D678B8 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST CALLER PUSH1 0x0 MSTORE PUSH1 0x34 PUSH1 0xC KECCAK256 SLOAD PUSH2 0x20F1 JUMPI PUSH4 0x4B6E7F18 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0xEA553B34 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0x3B800A46 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH2 0x2309 DUP5 DUP9 PUSH2 0x2303 DUP12 DUP8 SWAP1 PUSH2 0x22FD DUP9 SWAP5 DUP13 SWAP7 PUSH2 0x2080 JUMP JUMPDEST POP PUSH2 0x2080 JUMP JUMPDEST POP PUSH2 0x208E JUMP JUMPDEST POP PUSH2 0x20B2 JUMP JUMPDEST SWAP1 PUSH2 0x232A SWAP2 PUSH2 0x2325 PUSH2 0x2320 DUP3 PUSH2 0x1DCF JUMP JUMPDEST PUSH2 0x2E1F JUMP JUMPDEST PUSH2 0x232C JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x2336 SWAP2 PUSH2 0x3376 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x2342 SWAP2 PUSH2 0x230F JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x20 PUSH32 0x20726F6C657320666F722073656C660000000000000000000000000000000000 SWAP2 PUSH32 0x416363657373436F6E74726F6C3A2063616E206F6E6C792072656E6F756E6365 PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x239F PUSH1 0x2F PUSH1 0x40 SWAP3 PUSH2 0x647 JUMP JUMPDEST PUSH2 0x23A8 DUP2 PUSH2 0x2344 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x23C2 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x2392 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x23CC JUMPI JUMP JUMPDEST PUSH2 0x23D4 PUSH2 0x252 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x23EA PUSH1 0x4 DUP3 ADD PUSH2 0x23AC JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP1 PUSH2 0x241B SWAP2 PUSH2 0x2416 DUP3 PUSH2 0x2410 PUSH2 0x240A PUSH2 0x2405 PUSH2 0x33A0 JUMP JUMPDEST PUSH2 0x272 JUMP JUMPDEST SWAP2 PUSH2 0x272 JUMP JUMPDEST EQ PUSH2 0x23C5 JUMP JUMPDEST PUSH2 0x33AD JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x60 SWAP1 JUMP JUMPDEST SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x242E PUSH2 0x241D JUMP JUMPDEST POP DUP3 SUB PUSH2 0x2485 JUMPI PUSH1 0x40 MLOAD SWAP4 DUP3 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP3 PUSH1 0x5 SHL DUP1 DUP5 DUP2 ADD PUSH1 0x40 MSTORE JUMPDEST PUSH2 0x2456 JUMPI POP POP POP POP JUMP JUMPDEST PUSH1 0x20 SWAP1 SUB DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x60 SHL PUSH8 0x9A31110384E0B0C9 OR PUSH1 0x20 MSTORE DUP1 DUP4 ADD CALLDATALOAD PUSH1 0x0 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP2 DUP7 ADD MSTORE PUSH2 0x244C JUMP JUMPDEST PUSH4 0x3B800A46 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST SWAP1 PUSH2 0x24AE SWAP3 SWAP2 PUSH2 0x24A9 PUSH2 0x24A4 PUSH2 0x188F JUMP JUMPDEST PUSH2 0x2E1F JUMP JUMPDEST PUSH2 0x24B0 JUMP JUMPDEST JUMP JUMPDEST SWAP2 PUSH2 0x24BD SWAP3 SWAP2 SWAP1 SWAP2 PUSH2 0x345B JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x24CA SWAP3 SWAP2 PUSH2 0x2493 JUMP JUMPDEST JUMP JUMPDEST PUSH32 0x9F2DF0FED2C77648DE5860A4CC508CD0818C85B8B8A1AB4CEEEF8D981C8956A6 SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x250C SWAP4 SWAP3 SWAP2 PUSH2 0x2507 PUSH2 0x2502 PUSH2 0x24CC JUMP JUMPDEST PUSH2 0x2E1F JUMP JUMPDEST PUSH2 0x250E JUMP JUMPDEST JUMP JUMPDEST SWAP2 PUSH2 0x251C SWAP4 SWAP2 SWAP1 SWAP2 SWAP3 PUSH2 0x34DE JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x252A SWAP4 SWAP3 SWAP2 PUSH2 0x24F0 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x2545 SWAP1 PUSH2 0x2540 PUSH2 0x253B PUSH2 0x18E7 JUMP JUMPDEST PUSH2 0x2E1F JUMP JUMPDEST PUSH2 0x2547 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x2552 SWAP1 PUSH1 0x9 PUSH2 0x1B03 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x255D SWAP1 PUSH2 0x252C JUMP JUMPDEST JUMP JUMPDEST SWAP6 SWAP7 PUSH2 0x258D SWAP8 PUSH2 0x2580 SWAP7 SWAP6 SWAP5 PUSH2 0x257B SWAP5 DUP10 SWAP5 SWAP1 SWAP2 SWAP3 SWAP4 SWAP5 PUSH2 0x3579 JUMP JUMPDEST PUSH2 0x3039 JUMP JUMPDEST PUSH2 0x2588 PUSH2 0x24CC JUMP JUMPDEST PUSH2 0x3376 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x2599 SWAP1 PUSH2 0x1D81 JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x25CA PUSH2 0x25C5 PUSH2 0x25CF SWAP4 PUSH2 0x25BD PUSH2 0x1DF1 JUMP JUMPDEST POP PUSH1 0x5 PUSH2 0x258F JUMP JUMPDEST PUSH2 0x25A7 JUMP JUMPDEST PUSH2 0x364A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x25DB SWAP1 PUSH2 0x1B66 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x25E7 SWAP1 PUSH2 0x25D2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x25F4 SWAP1 PUSH2 0x25DE JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH2 0x2614 PUSH2 0x2619 SWAP2 PUSH2 0x1DA5 JUMP JUMPDEST PUSH2 0x2602 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2626 SWAP1 SLOAD PUSH2 0x2608 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2651 SWAP2 PUSH1 0x0 PUSH2 0x2646 PUSH2 0x264C SWAP4 PUSH2 0x263E PUSH2 0x1834 JUMP JUMPDEST POP PUSH1 0x4 PUSH2 0x1D8D JUMP JUMPDEST ADD PUSH2 0x25EA JUMP JUMPDEST PUSH2 0x261C JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x266D SWAP1 PUSH2 0x2668 PUSH2 0x2663 PUSH2 0x18E7 JUMP JUMPDEST PUSH2 0x2E1F JUMP JUMPDEST PUSH2 0x266F JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x267A SWAP1 PUSH1 0xA PUSH2 0x1B03 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x2685 SWAP1 PUSH2 0x2654 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x269E PUSH2 0x26A3 SWAP2 PUSH2 0x1DA5 JUMP JUMPDEST PUSH2 0x2687 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x26B0 SWAP1 SLOAD PUSH2 0x2692 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x26BC SWAP1 PUSH2 0x25D2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xE0 SHL SWAP1 JUMP JUMPDEST SWAP1 POP MLOAD SWAP1 PUSH2 0x26D2 DUP3 PUSH2 0xA4B JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x26EE JUMPI PUSH2 0x26EB SWAP2 PUSH1 0x0 ADD PUSH2 0x26C5 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x25D JUMP JUMPDEST POP PUSH2 0x2702 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x293 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x270E SWAP1 PUSH2 0x272 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST POP PUSH2 0x2721 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x371 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x272D SWAP1 PUSH2 0x350 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST POP PUSH2 0x2740 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0xA60 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x274C SWAP1 PUSH2 0xA48 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SUB DUP3 CALLDATASIZE SUB SUB DUP2 SLT ISZERO PUSH2 0x27A0 JUMPI ADD PUSH1 0x20 DUP2 CALLDATALOAD SWAP2 ADD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x279B JUMPI PUSH1 0x1 DUP3 MUL CALLDATASIZE SUB DUP4 SGT PUSH2 0x2796 JUMPI JUMP JUMPDEST PUSH2 0x2755 JUMP JUMPDEST PUSH2 0x2750 JUMP JUMPDEST PUSH2 0x275A JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x27C8 DUP2 PUSH2 0x27C1 DUP2 PUSH2 0x27CD SWAP6 PUSH2 0x27A5 JUMP JUMPDEST DUP1 SWAP6 PUSH2 0x736 JUMP JUMPDEST PUSH2 0x5AF JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST SWAP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x40 SUB DUP3 CALLDATASIZE SUB SUB DUP2 SLT ISZERO PUSH2 0x27E7 JUMPI ADD SWAP1 JUMP JUMPDEST PUSH2 0x275A JUMP JUMPDEST SWAP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SUB DUP3 CALLDATASIZE SUB SUB DUP2 SLT ISZERO PUSH2 0x282D JUMPI ADD PUSH1 0x20 DUP2 CALLDATALOAD SWAP2 ADD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2828 JUMPI PUSH1 0x1 DUP3 MUL CALLDATASIZE SUB DUP4 SGT PUSH2 0x2823 JUMPI JUMP JUMPDEST PUSH2 0x2755 JUMP JUMPDEST PUSH2 0x2750 JUMP JUMPDEST PUSH2 0x275A JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x284C DUP2 PUSH2 0x2845 DUP2 PUSH2 0x2851 SWAP6 PUSH2 0x4FF JUMP JUMPDEST DUP1 SWAP6 PUSH2 0x736 JUMP JUMPDEST PUSH2 0x5AF JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0x286B DUP2 PUSH2 0x2855 JUMP JUMPDEST SUB PUSH2 0x2872 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x2884 DUP3 PUSH2 0x2862 JUMP JUMPDEST JUMP JUMPDEST POP PUSH2 0x2895 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x2877 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x28A1 SWAP1 PUSH2 0x2855 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP1 PUSH2 0x28E3 SWAP1 PUSH1 0x20 PUSH2 0x28DB PUSH2 0x28D1 PUSH1 0x40 DUP5 ADD PUSH2 0x28C3 PUSH1 0x0 DUP9 ADD DUP9 PUSH2 0x27EC JUMP JUMPDEST SWAP1 DUP7 DUP4 SUB PUSH1 0x0 DUP9 ADD MSTORE PUSH2 0x2832 JUMP JUMPDEST SWAP5 DUP3 DUP2 ADD SWAP1 PUSH2 0x2886 JUMP JUMPDEST SWAP2 ADD SWAP1 PUSH2 0x2898 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2990 SWAP2 PUSH2 0x2982 PUSH2 0x2977 PUSH1 0xC0 DUP4 ADD PUSH2 0x290E PUSH2 0x2904 PUSH1 0x0 DUP8 ADD DUP8 PUSH2 0x26F3 JUMP JUMPDEST PUSH1 0x0 DUP7 ADD SWAP1 PUSH2 0x2705 JUMP JUMPDEST PUSH2 0x2928 PUSH2 0x291E PUSH1 0x20 DUP8 ADD DUP8 PUSH2 0x2712 JUMP JUMPDEST PUSH1 0x20 DUP7 ADD SWAP1 PUSH2 0x2724 JUMP JUMPDEST PUSH2 0x2942 PUSH2 0x2938 PUSH1 0x40 DUP8 ADD DUP8 PUSH2 0x2731 JUMP JUMPDEST PUSH1 0x40 DUP7 ADD SWAP1 PUSH2 0x2743 JUMP JUMPDEST PUSH2 0x295C PUSH2 0x2952 PUSH1 0x60 DUP8 ADD DUP8 PUSH2 0x2731 JUMP JUMPDEST PUSH1 0x60 DUP7 ADD SWAP1 PUSH2 0x2743 JUMP JUMPDEST PUSH2 0x2969 PUSH1 0x80 DUP7 ADD DUP7 PUSH2 0x275F JUMP JUMPDEST SWAP1 DUP6 DUP4 SUB PUSH1 0x80 DUP8 ADD MSTORE PUSH2 0x27AE JUMP JUMPDEST SWAP3 PUSH1 0xA0 DUP2 ADD SWAP1 PUSH2 0x27D1 JUMP JUMPDEST SWAP1 PUSH1 0xA0 DUP2 DUP5 SUB SWAP2 ADD MSTORE PUSH2 0x28A5 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP4 SWAP3 SWAP1 PUSH2 0x29BF PUSH1 0x40 SWAP2 PUSH2 0x29C7 SWAP5 PUSH2 0x29B2 PUSH1 0x60 DUP10 ADD SWAP3 PUSH1 0x0 DUP11 ADD SWAP1 PUSH2 0xB9A JUMP JUMPDEST DUP8 DUP3 SUB PUSH1 0x20 DUP10 ADD MSTORE PUSH2 0x28E6 JUMP JUMPDEST SWAP5 ADD SWAP1 PUSH2 0xA8E JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x29D1 PUSH2 0x252 JUMP JUMPDEST RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST SWAP2 POP PUSH1 0x20 SWAP1 PUSH2 0x29E7 PUSH2 0x1D7C JUMP JUMPDEST POP PUSH2 0x29FA PUSH2 0x29F5 PUSH1 0x6 PUSH2 0x26A6 JUMP JUMPDEST PUSH2 0x26B3 JUMP JUMPDEST PUSH2 0x2A26 PUSH4 0x3808A90B SWAP5 SWAP3 SWAP5 PUSH2 0x2A31 PUSH2 0x2A12 PUSH1 0x7 PUSH2 0x1DC2 JUMP JUMPDEST PUSH2 0x2A1A PUSH2 0x252 JUMP JUMPDEST SWAP8 DUP9 SWAP7 DUP8 SWAP6 DUP7 SWAP6 PUSH2 0x26BF JUMP JUMPDEST DUP6 MSTORE PUSH1 0x4 DUP6 ADD PUSH2 0x2993 JUMP JUMPDEST SUB SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x2A76 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x2A48 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x2A69 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x2A6F JUMPI JUMPDEST PUSH2 0x2A61 DUP2 DUP4 PUSH2 0x5CF JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x26D4 JUMP JUMPDEST CODESIZE PUSH2 0x2A44 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x2A57 JUMP JUMPDEST PUSH2 0x29C9 JUMP JUMPDEST SWAP1 ISZERO ISZERO PUSH8 0x9A31110384E0B0C9 PUSH1 0x20 MSTORE CALLER PUSH1 0x14 MSTORE DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x34 PUSH1 0xC KECCAK256 SSTORE PUSH1 0x0 MSTORE PUSH1 0x60 SHL PUSH1 0x60 SHR CALLER PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 PUSH1 0x20 PUSH1 0x0 LOG3 JUMP JUMPDEST PUSH2 0x2AD8 SWAP2 CALLER SWAP2 SWAP1 SWAP2 PUSH2 0x3683 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x2AF6 SWAP4 SWAP3 SWAP2 PUSH2 0x2AF1 PUSH2 0x2AEC PUSH2 0x24CC JUMP JUMPDEST PUSH2 0x2E1F JUMP JUMPDEST PUSH2 0x2AF8 JUMP JUMPDEST JUMP JUMPDEST SWAP2 PUSH2 0x2B06 SWAP4 SWAP2 SWAP1 SWAP2 SWAP3 PUSH2 0x36D5 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x2B14 SWAP4 SWAP3 SWAP2 PUSH2 0x2ADA JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x2B35 PUSH2 0x2B30 PUSH2 0x2B3A SWAP3 PUSH2 0x2B28 PUSH2 0x180B JUMP JUMPDEST POP PUSH1 0x5 PUSH2 0x258F JUMP JUMPDEST PUSH2 0x25A7 JUMP JUMPDEST PUSH2 0x37A9 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2B58 SWAP2 PUSH2 0x2B53 PUSH2 0x2B4E DUP3 PUSH2 0x1DCF JUMP JUMPDEST PUSH2 0x2E1F JUMP JUMPDEST PUSH2 0x2B5A JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x2B64 SWAP2 PUSH2 0x33AD JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x2B70 SWAP2 PUSH2 0x2B3D JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x2B7A PUSH2 0x1834 JUMP JUMPDEST POP PUSH8 0x9A31110384E0B0C9 PUSH1 0x20 MSTORE PUSH1 0x14 MSTORE PUSH1 0x0 MSTORE PUSH1 0x34 PUSH1 0xC KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH2 0x2BAF SWAP1 PUSH2 0x2BAA PUSH2 0x2BA5 PUSH2 0x1B27 JUMP JUMPDEST PUSH2 0x2E1F JUMP JUMPDEST PUSH2 0x2BF4 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x2BBE PUSH1 0x0 NOT SWAP2 PUSH2 0x1426 JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST PUSH2 0x2BD1 SWAP1 PUSH2 0x1DA5 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2BE9 PUSH2 0x2BE4 PUSH2 0x2BF0 SWAP3 PUSH2 0x1D81 JUMP JUMPDEST PUSH2 0x2BC8 JUMP JUMPDEST DUP3 SLOAD PUSH2 0x2BB1 JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x2BFF SWAP1 PUSH1 0x7 PUSH2 0x2BD4 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x2C0A SWAP1 PUSH2 0x2B96 JUMP JUMPDEST JUMP JUMPDEST SWAP5 SWAP1 SWAP2 SWAP5 PUSH2 0x2C18 PUSH2 0x3310 JUMP JUMPDEST PUSH2 0x2DB6 JUMPI JUMPDEST PUSH1 0x60 SHL PUSH8 0x9A31110384E0B0C9 OR SWAP2 PUSH1 0x60 SHL PUSH8 0x9A31110384E0B0C9 OR SWAP2 DUP1 PUSH1 0x20 MSTORE PUSH1 0x60 SHR SWAP3 DUP3 PUSH1 0x60 SHR SWAP3 DUP4 ISZERO PUSH2 0x2DA8 JUMPI DUP5 CALLER SUB PUSH2 0x2D8C JUMPI JUMPDEST DUP7 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP1 SLOAD DUP1 DUP5 GT PUSH2 0x2D7E JUMPI DUP4 SWAP1 SUB SWAP1 SSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP1 SLOAD SWAP1 DUP3 DUP3 ADD SWAP2 DUP3 LT PUSH2 0x2D70 JUMPI SSTORE DUP1 PUSH1 0x20 MSTORE DUP3 DUP5 CALLER PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 PUSH1 0x0 LOG4 PUSH2 0x2CB6 PUSH2 0x331E JUMP JUMPDEST PUSH2 0x2D4B JUMPI JUMPDEST DUP3 EXTCODESIZE PUSH2 0x2CCA JUMPI JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 SWAP5 DUP3 SWAP2 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP7 PUSH4 0xF23A6E61 DUP9 MSTORE CALLER DUP10 DUP10 ADD MSTORE PUSH1 0x40 DUP9 ADD MSTORE PUSH1 0x60 DUP8 ADD MSTORE PUSH1 0x80 DUP7 ADD MSTORE PUSH1 0xA0 DUP1 DUP7 ADD MSTORE DUP2 PUSH1 0xC0 DUP7 ADD MSTORE PUSH1 0xE0 DUP6 ADD CALLDATACOPY PUSH1 0xC4 ADD SWAP1 PUSH1 0x0 PUSH1 0x1C DUP5 ADD SWAP2 GAS CALL ISZERO PUSH2 0x2D3C JUMPI JUMPDEST PUSH4 0xF23A6E61 PUSH1 0xE0 SHL SWAP1 MLOAD SUB PUSH2 0x2D2E JUMPI CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x2CC2 JUMP JUMPDEST PUSH4 0x9C05499B PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x2D14 JUMPI RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH2 0x2D54 DUP7 PUSH2 0x37C9 JUMP JUMPDEST POP PUSH2 0x2D5E DUP2 PUSH2 0x37C9 JUMP JUMPDEST POP PUSH2 0x2D6A DUP6 DUP4 SWAP1 PUSH2 0x208E JUMP JUMPDEST POP PUSH2 0x2CBB JUMP JUMPDEST PUSH4 0x1336CEA PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0xF4D678B8 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST CALLER PUSH1 0x0 MSTORE PUSH1 0x34 PUSH1 0xC KECCAK256 SLOAD PUSH2 0x2C54 JUMPI PUSH4 0x4B6E7F18 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0xEA553B34 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH2 0x2DBF DUP7 PUSH2 0x37C9 JUMP JUMPDEST POP PUSH2 0x2DC9 DUP5 PUSH2 0x37C9 JUMP JUMPDEST POP PUSH2 0x2DD5 DUP6 DUP4 SWAP1 PUSH2 0x208E JUMP JUMPDEST POP PUSH2 0x2C1D JUMP JUMPDEST PUSH2 0x2DE3 PUSH2 0x1834 JUMP JUMPDEST POP PUSH2 0x2DED DUP2 PUSH2 0x37E9 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x2E10 JUMPI JUMPDEST SWAP1 DUP2 ISZERO PUSH2 0x2E00 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x2E0A SWAP2 POP PUSH2 0x388F JUMP JUMPDEST CODESIZE PUSH2 0x2DFC JUMP JUMPDEST POP PUSH2 0x2E1A DUP2 PUSH2 0x3829 JUMP JUMPDEST PUSH2 0x2DF4 JUMP JUMPDEST PUSH2 0x2E31 SWAP1 PUSH2 0x2E2B PUSH2 0x33A0 JUMP JUMPDEST SWAP1 PUSH2 0x3986 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x20 PUSH32 0x2073616C65507269636500000000000000000000000000000000000000000000 SWAP2 PUSH32 0x455243323938313A20726F79616C7479206665652077696C6C20657863656564 PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x2E8E PUSH1 0x2A PUSH1 0x40 SWAP3 PUSH2 0x647 JUMP JUMPDEST PUSH2 0x2E97 DUP2 PUSH2 0x2E33 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x2EB1 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x2E81 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x2EBB JUMPI JUMP JUMPDEST PUSH2 0x2EC3 PUSH2 0x252 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x2ED9 PUSH1 0x4 DUP3 ADD PUSH2 0x2E9B JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH32 0x455243323938313A20696E76616C696420726563656976657200000000000000 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x2F12 PUSH1 0x19 PUSH1 0x20 SWAP3 PUSH2 0x647 JUMP JUMPDEST PUSH2 0x2F1B DUP2 PUSH2 0x2EDD JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x2F35 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x2F05 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x2F3F JUMPI JUMP JUMPDEST PUSH2 0x2F47 PUSH2 0x252 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x2F5D PUSH1 0x4 DUP3 ADD PUSH2 0x2F1F JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x2F6B PUSH1 0x40 PUSH2 0x6FE JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2F86 PUSH2 0x2F81 PUSH2 0x2F8D SWAP3 PUSH2 0x25DE JUMP JUMPDEST PUSH2 0x2F6E JUMP JUMPDEST DUP3 SLOAD PUSH2 0x1B9A JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH1 0xA0 SHL SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2FB1 PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xA0 SHL SWAP2 PUSH2 0x2F91 JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST PUSH2 0x2FCF PUSH2 0x2FCA PUSH2 0x2FD4 SWAP3 PUSH2 0x3FC JUMP JUMPDEST PUSH2 0xAE6 JUMP JUMPDEST PUSH2 0x3FC JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2FEF PUSH2 0x2FEA PUSH2 0x2FF6 SWAP3 PUSH2 0x2FBB JUMP JUMPDEST PUSH2 0x2FD7 JUMP JUMPDEST DUP3 SLOAD PUSH2 0x2F97 JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST SWAP1 PUSH2 0x3025 PUSH1 0x20 PUSH1 0x0 PUSH2 0x302B SWAP5 PUSH2 0x301D DUP3 DUP3 ADD PUSH2 0x3017 DUP5 DUP9 ADD PUSH2 0x1EE0 JUMP JUMPDEST SWAP1 PUSH2 0x2F71 JUMP JUMPDEST ADD SWAP3 ADD PUSH2 0x1F15 JUMP JUMPDEST SWAP1 PUSH2 0x2FDA JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x3037 SWAP2 PUSH2 0x2FFA JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x30AA PUSH2 0x30B1 SWAP3 PUSH2 0x3065 DUP4 PUSH2 0x305E PUSH2 0x3058 PUSH2 0x3053 PUSH2 0x32F9 JUMP JUMPDEST PUSH2 0x3FC JUMP JUMPDEST SWAP2 PUSH2 0x3FC JUMP JUMPDEST GT ISZERO PUSH2 0x2EB4 JUMP JUMPDEST PUSH2 0x308B DUP2 PUSH2 0x3084 PUSH2 0x307E PUSH2 0x3079 PUSH1 0x0 PUSH2 0x1F09 JUMP JUMPDEST PUSH2 0x272 JUMP JUMPDEST SWAP2 PUSH2 0x272 JUMP JUMPDEST EQ ISZERO PUSH2 0x2F38 JUMP JUMPDEST SWAP2 PUSH2 0x30A1 PUSH2 0x3097 PUSH2 0x2F61 JUMP JUMPDEST SWAP4 PUSH1 0x0 DUP6 ADD PUSH2 0x1E3A JUMP JUMPDEST PUSH1 0x20 DUP4 ADD PUSH2 0x1E80 JUMP JUMPDEST PUSH1 0x2 PUSH2 0x302D JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x30BC PUSH2 0x1C04 JUMP JUMPDEST POP PUSH1 0x80 PUSH1 0x40 MLOAD ADD SWAP2 PUSH1 0x20 DUP4 ADD PUSH1 0x40 MSTORE PUSH1 0x0 DUP4 MSTORE DUP3 SWAP1 PUSH1 0xA PUSH1 0x0 NOT DUP1 SWAP3 SWAP6 JUMPDEST ADD SWAP5 DUP2 DUP2 MOD PUSH1 0x30 ADD DUP7 MSTORE8 DIV SWAP4 DUP5 ISZERO PUSH2 0x30F9 JUMPI SWAP1 PUSH1 0xA SWAP2 SWAP1 DUP1 SWAP3 SWAP2 PUSH2 0x30DA JUMP JUMPDEST SWAP4 POP POP DUP3 PUSH1 0x20 SWAP2 SUB SWAP3 SUB SWAP2 DUP3 MSTORE JUMP JUMPDEST PUSH2 0x311C PUSH2 0x3117 PUSH2 0x3121 SWAP3 PUSH2 0x1423 JUMP JUMPDEST PUSH2 0xAE6 JUMP JUMPDEST PUSH2 0x2A2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH2 0x3144 DUP3 PUSH2 0xE9A JUMP JUMPDEST DUP2 LT ISZERO PUSH2 0x3155 JUMPI PUSH1 0x20 DUP1 SWAP2 MUL ADD ADD SWAP1 JUMP JUMPDEST PUSH2 0x3124 JUMP JUMPDEST PUSH2 0x3164 SWAP1 MLOAD PUSH2 0x2A2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3173 PUSH2 0x3178 SWAP2 PUSH2 0x1DA5 JUMP JUMPDEST PUSH2 0x8AE JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3185 SWAP1 SLOAD PUSH2 0x3167 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3197 PUSH2 0x319D SWAP2 SWAP4 SWAP3 SWAP4 PUSH2 0x2A2 JUMP JUMPDEST SWAP3 PUSH2 0x2A2 JUMP JUMPDEST DUP3 SUB SWAP2 DUP3 GT PUSH2 0x31A8 JUMPI JUMP JUMPDEST PUSH2 0x1F3E JUMP JUMPDEST SWAP1 PUSH2 0x31C2 PUSH2 0x31BD PUSH2 0x31C9 SWAP3 PUSH2 0xAE9 JUMP JUMPDEST PUSH2 0x195A JUMP JUMPDEST DUP3 SLOAD PUSH2 0x2BB1 JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x31DC PUSH2 0x31E2 SWAP2 SWAP4 SWAP3 SWAP4 PUSH2 0x2A2 JUMP JUMPDEST SWAP3 PUSH2 0x2A2 JUMP JUMPDEST DUP3 ADD DUP1 SWAP3 GT PUSH2 0x31ED JUMPI JUMP JUMPDEST PUSH2 0x1F3E JUMP JUMPDEST PUSH1 0x1 PUSH2 0x31FE SWAP2 ADD PUSH2 0x2A2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3210 SWAP1 SWAP4 SWAP3 SWAP4 DUP3 DUP6 SWAP2 PUSH2 0x3A1F JUMP JUMPDEST PUSH2 0x3219 DUP2 PUSH2 0xE9A JUMP JUMPDEST SWAP3 PUSH2 0x3224 PUSH1 0x0 PUSH2 0x3108 JUMP JUMPDEST SWAP3 PUSH2 0x322D PUSH2 0x180B JUMP JUMPDEST SWAP4 JUMPDEST DUP5 PUSH2 0x3242 PUSH2 0x323C DUP9 PUSH2 0x2A2 JUMP JUMPDEST SWAP2 PUSH2 0x2A2 JUMP JUMPDEST LT ISZERO PUSH2 0x32AF JUMPI PUSH2 0x32A3 PUSH2 0x32A9 SWAP2 PUSH2 0x3262 PUSH2 0x325D DUP7 DUP10 SWAP1 PUSH2 0x313A JUMP JUMPDEST PUSH2 0x315A JUMP JUMPDEST PUSH2 0x329D DUP9 PUSH2 0x3297 PUSH2 0x3288 DUP11 PUSH2 0x3282 PUSH2 0x327D DUP8 SWAP6 PUSH1 0x1 SWAP4 PUSH2 0x313A JUMP JUMPDEST PUSH2 0x315A JUMP JUMPDEST SWAP1 PUSH2 0xB05 JUMP JUMPDEST SWAP2 PUSH2 0x3292 DUP4 PUSH2 0x317B JUMP JUMPDEST PUSH2 0x3188 JUMP JUMPDEST SWAP1 PUSH2 0x31AD JUMP JUMPDEST SWAP1 PUSH2 0x31CD JUMP JUMPDEST SWAP5 PUSH2 0x31F2 JUMP JUMPDEST SWAP4 PUSH2 0x322F JUMP JUMPDEST SWAP2 POP SWAP4 POP PUSH2 0x32D3 SWAP3 POP PUSH2 0x32CC SWAP2 POP PUSH2 0x32C7 PUSH1 0x0 PUSH2 0x317B JUMP JUMPDEST PUSH2 0x3188 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x31AD JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x32F1 PUSH2 0x32EC PUSH2 0x32F6 SWAP3 PUSH2 0x32DA JUMP JUMPDEST PUSH2 0xAE6 JUMP JUMPDEST PUSH2 0x3FC JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3301 PUSH2 0x32D5 JUMP JUMPDEST POP PUSH2 0x330D PUSH2 0x2710 PUSH2 0x32DD JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3318 PUSH2 0x1834 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x3326 PUSH2 0x1834 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST POP POP SWAP5 SWAP3 SWAP4 SWAP1 SWAP4 PUSH2 0x333B PUSH2 0x331E JUMP JUMPDEST PUSH2 0x3348 JUMPI JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x335E PUSH2 0x3364 SWAP4 PUSH2 0x336A SWAP8 SWAP7 SWAP1 SWAP3 SWAP4 SWAP6 SWAP7 PUSH2 0x2080 JUMP JUMPDEST POP PUSH2 0x2080 JUMP JUMPDEST POP PUSH2 0x208E JUMP JUMPDEST POP CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x3340 JUMP JUMPDEST SWAP1 PUSH2 0x3398 PUSH2 0x3393 PUSH2 0x339D SWAP4 PUSH2 0x338C DUP2 DUP6 SWAP1 PUSH2 0x3A3A JUMP JUMPDEST PUSH1 0x5 PUSH2 0x258F JUMP JUMPDEST PUSH2 0x25A7 JUMP JUMPDEST PUSH2 0x3B21 JUMP JUMPDEST POP JUMP JUMPDEST PUSH2 0x33A8 PUSH2 0x1DF1 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x33CF PUSH2 0x33CA PUSH2 0x33D4 SWAP4 PUSH2 0x33C3 DUP2 DUP6 SWAP1 PUSH2 0x3B5C JUMP JUMPDEST PUSH1 0x5 PUSH2 0x258F JUMP JUMPDEST PUSH2 0x25A7 JUMP JUMPDEST PUSH2 0x3BF6 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0x455243323938313A20496E76616C696420706172616D65746572730000000000 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x340C PUSH1 0x1B PUSH1 0x20 SWAP3 PUSH2 0x647 JUMP JUMPDEST PUSH2 0x3415 DUP2 PUSH2 0x33D7 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x342F SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x33FF JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x3439 JUMPI JUMP JUMPDEST PUSH2 0x3441 PUSH2 0x252 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x3457 PUSH1 0x4 DUP3 ADD PUSH2 0x3419 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x34D7 SWAP1 PUSH2 0x34D0 PUSH2 0x34DC SWAP5 SWAP4 PUSH2 0x348B DUP6 PUSH2 0x3484 PUSH2 0x347E PUSH2 0x3479 PUSH2 0x32F9 JUMP JUMPDEST PUSH2 0x3FC JUMP JUMPDEST SWAP2 PUSH2 0x3FC JUMP JUMPDEST GT ISZERO PUSH2 0x2EB4 JUMP JUMPDEST PUSH2 0x34B1 DUP2 PUSH2 0x34AA PUSH2 0x34A4 PUSH2 0x349F PUSH1 0x0 PUSH2 0x1F09 JUMP JUMPDEST PUSH2 0x272 JUMP JUMPDEST SWAP2 PUSH2 0x272 JUMP JUMPDEST EQ ISZERO PUSH2 0x3432 JUMP JUMPDEST SWAP4 PUSH2 0x34C7 PUSH2 0x34BD PUSH2 0x2F61 JUMP JUMPDEST SWAP6 PUSH1 0x0 DUP8 ADD PUSH2 0x1E3A JUMP JUMPDEST PUSH1 0x20 DUP6 ADD PUSH2 0x1E80 JUMP JUMPDEST PUSH1 0x3 PUSH2 0x1DF6 JUMP JUMPDEST PUSH2 0x302D JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x352C SWAP2 SWAP3 PUSH2 0x34F8 PUSH2 0x3532 SWAP6 PUSH2 0x351D SWAP4 SWAP1 DUP7 DUP5 SWAP2 SWAP3 PUSH2 0x3C31 JUMP JUMPDEST PUSH2 0x3515 PUSH2 0x350E DUP3 PUSH2 0x3509 PUSH1 0x0 PUSH2 0x317B JUMP JUMPDEST PUSH2 0x31CD JUMP JUMPDEST PUSH1 0x0 PUSH2 0x31AD JUMP JUMPDEST SWAP3 PUSH1 0x1 PUSH2 0xB05 JUMP JUMPDEST SWAP2 PUSH2 0x3527 DUP4 PUSH2 0x317B JUMP JUMPDEST PUSH2 0x31CD JUMP JUMPDEST SWAP1 PUSH2 0x31AD JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x3540 PUSH1 0xFF SWAP2 PUSH2 0x1426 JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST PUSH2 0x3553 SWAP1 PUSH2 0x39F JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x356E PUSH2 0x3569 PUSH2 0x3575 SWAP3 PUSH2 0x354A JUMP JUMPDEST PUSH2 0x3556 JUMP JUMPDEST DUP3 SLOAD PUSH2 0x3534 JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST SWAP2 SWAP1 SWAP5 SWAP3 PUSH2 0x3587 PUSH1 0xB PUSH2 0x261C JUMP JUMPDEST PUSH2 0x35FA JUMPI PUSH2 0x35A7 PUSH2 0x35AE SWAP3 PUSH2 0x35A0 PUSH2 0x35EC SWAP9 PUSH1 0x8 PUSH2 0x1B03 JUMP JUMPDEST PUSH1 0x9 PUSH2 0x1B03 JUMP JUMPDEST PUSH1 0xA PUSH2 0x1B03 JUMP JUMPDEST PUSH2 0x35C0 PUSH2 0x35B9 PUSH2 0x1448 JUMP JUMPDEST DUP3 SWAP1 PUSH2 0x3376 JUMP JUMPDEST PUSH2 0x35D2 PUSH2 0x35CB PUSH2 0x188F JUMP JUMPDEST DUP3 SWAP1 PUSH2 0x3376 JUMP JUMPDEST PUSH2 0x35E4 PUSH2 0x35DD PUSH2 0x18E7 JUMP JUMPDEST DUP3 SWAP1 PUSH2 0x3376 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH2 0x3D32 JUMP JUMPDEST PUSH2 0x35F8 PUSH1 0x1 PUSH1 0xB PUSH2 0x3559 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 PUSH4 0xF92EE8A9 PUSH1 0xE0 SHL DUP2 MSTORE DUP1 PUSH2 0x3613 PUSH1 0x4 DUP3 ADD PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3626 PUSH2 0x362B SWAP2 PUSH2 0x1DA5 JUMP JUMPDEST PUSH2 0xAE9 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3642 PUSH2 0x363D PUSH2 0x3647 SWAP3 PUSH2 0x2A2 JUMP JUMPDEST PUSH2 0xAE6 JUMP JUMPDEST PUSH2 0x267 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3676 PUSH2 0x3671 PUSH2 0x3680 SWAP4 PUSH2 0x366C PUSH1 0x0 PUSH2 0x367B SWAP6 PUSH2 0x3665 PUSH2 0x1DF1 JUMP JUMPDEST POP ADD PUSH2 0x3617 JUMP JUMPDEST PUSH2 0x3DAD JUMP JUMPDEST PUSH2 0x361A JUMP JUMPDEST PUSH2 0x362E JUMP JUMPDEST PUSH2 0x25D2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x36BE PUSH2 0x36D3 SWAP4 PUSH2 0x3699 PUSH2 0x36CD SWAP4 DUP6 DUP4 SWAP2 PUSH2 0x3DCF JUMP JUMPDEST PUSH2 0x36B6 PUSH2 0x36AF DUP3 PUSH2 0x36AA PUSH1 0x0 PUSH2 0x317B JUMP JUMPDEST PUSH2 0x3188 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x31AD JUMP JUMPDEST SWAP3 PUSH1 0x1 PUSH2 0xB05 JUMP JUMPDEST SWAP2 PUSH2 0x36C8 DUP4 PUSH2 0x317B JUMP JUMPDEST PUSH2 0x3188 JUMP JUMPDEST SWAP1 PUSH2 0x31AD JUMP JUMPDEST JUMP JUMPDEST SWAP3 PUSH2 0x36E7 SWAP2 SWAP5 SWAP3 SWAP4 SWAP1 DUP6 DUP6 SWAP2 SWAP3 PUSH2 0x3DEA JUMP JUMPDEST PUSH2 0x36F0 DUP4 PUSH2 0xE9A JUMP JUMPDEST SWAP2 PUSH2 0x36FB PUSH1 0x0 PUSH2 0x3108 JUMP JUMPDEST SWAP2 PUSH2 0x3704 PUSH2 0x180B JUMP JUMPDEST JUMPDEST DUP1 PUSH2 0x3718 PUSH2 0x3712 DUP8 PUSH2 0x2A2 JUMP JUMPDEST SWAP2 PUSH2 0x2A2 JUMP JUMPDEST LT ISZERO PUSH2 0x3784 JUMPI PUSH2 0x377F SWAP1 PUSH2 0x377A PUSH2 0x3743 PUSH2 0x373B PUSH2 0x3736 DUP8 DUP6 SWAP1 PUSH2 0x313A JUMP JUMPDEST PUSH2 0x315A JUMP JUMPDEST SWAP7 DUP8 SWAP1 PUSH2 0x31CD JUMP JUMPDEST SWAP6 PUSH2 0x3774 PUSH2 0x3765 PUSH1 0x1 PUSH2 0x375F PUSH2 0x375A DUP14 DUP9 SWAP1 PUSH2 0x313A JUMP JUMPDEST PUSH2 0x315A JUMP JUMPDEST SWAP1 PUSH2 0xB05 JUMP JUMPDEST SWAP2 PUSH2 0x376F DUP4 PUSH2 0x317B JUMP JUMPDEST PUSH2 0x31CD JUMP JUMPDEST SWAP1 PUSH2 0x31AD JUMP JUMPDEST PUSH2 0x31F2 JUMP JUMPDEST PUSH2 0x3705 JUMP JUMPDEST POP SWAP4 POP POP PUSH2 0x37A7 SWAP2 POP PUSH2 0x37A0 SWAP1 PUSH2 0x379B PUSH1 0x0 PUSH2 0x317B JUMP JUMPDEST PUSH2 0x31CD JUMP JUMPDEST PUSH1 0x0 PUSH2 0x31AD JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x37C1 PUSH1 0x0 PUSH2 0x37C6 SWAP3 PUSH2 0x37BA PUSH2 0x180B JUMP JUMPDEST POP ADD PUSH2 0x3617 JUMP JUMPDEST PUSH2 0x3F2D JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x37D2 PUSH2 0x241D JUMP JUMPDEST POP PUSH1 0x40 MLOAD SWAP2 PUSH1 0x40 DUP4 ADD PUSH1 0x40 MSTORE PUSH1 0x1 DUP4 MSTORE PUSH1 0x20 DUP4 ADD MSTORE JUMP JUMPDEST PUSH2 0x37F1 PUSH2 0x1834 JUMP JUMPDEST POP PUSH4 0x3E85E62F PUSH1 0xE0 SHL PUSH2 0x380C PUSH2 0x3806 DUP4 PUSH2 0x350 JUMP JUMPDEST SWAP2 PUSH2 0x350 JUMP JUMPDEST EQ SWAP1 DUP2 ISZERO PUSH2 0x3819 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x3823 SWAP2 POP PUSH2 0x3F45 JUMP JUMPDEST CODESIZE PUSH2 0x3815 JUMP JUMPDEST PUSH2 0x3831 PUSH2 0x1834 JUMP JUMPDEST POP PUSH2 0x383B DUP2 PUSH2 0x3F6C JUMP JUMPDEST DUP1 ISZERO PUSH2 0x3880 JUMPI JUMPDEST DUP1 ISZERO PUSH2 0x3865 JUMPI JUMPDEST SWAP1 DUP2 ISZERO PUSH2 0x3855 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x385F SWAP2 POP PUSH2 0x3FAC JUMP JUMPDEST CODESIZE PUSH2 0x3851 JUMP JUMPDEST POP PUSH1 0x0 PUSH2 0x387A PUSH2 0x3874 DUP4 PUSH2 0x350 JUMP JUMPDEST SWAP2 PUSH2 0x350 JUMP JUMPDEST EQ PUSH2 0x3849 JUMP JUMPDEST POP PUSH2 0x388A DUP2 PUSH2 0x3FAC JUMP JUMPDEST PUSH2 0x3842 JUMP JUMPDEST PUSH2 0x3897 PUSH2 0x1834 JUMP JUMPDEST POP PUSH2 0x38A1 DUP2 PUSH2 0x3FAC JUMP JUMPDEST SWAP1 DUP2 ISZERO PUSH2 0x38AD JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x38B7 SWAP2 POP PUSH2 0x3FEC JUMP JUMPDEST CODESIZE PUSH2 0x38A9 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x38D4 PUSH2 0x38CF PUSH2 0x38D9 SWAP3 PUSH2 0x38BD JUMP JUMPDEST PUSH2 0xAE6 JUMP JUMPDEST PUSH2 0x2A2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x416363657373436F6E74726F6C3A206163636F756E7420000000000000000000 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x3910 PUSH1 0x17 DUP1 SWAP3 PUSH2 0x1C09 JUMP JUMPDEST PUSH2 0x3919 DUP2 PUSH2 0x38DC JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x206973206D697373696E6720726F6C6520000000000000000000000000000000 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x3951 PUSH1 0x11 DUP1 SWAP3 PUSH2 0x1C09 JUMP JUMPDEST PUSH2 0x395A DUP2 PUSH2 0x391D JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x3978 PUSH2 0x3983 SWAP4 SWAP3 PUSH2 0x3972 PUSH2 0x397D SWAP4 PUSH2 0x3904 JUMP JUMPDEST SWAP1 PUSH2 0x1C97 JUMP JUMPDEST PUSH2 0x3945 JUMP JUMPDEST SWAP1 PUSH2 0x1C97 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x399B PUSH2 0x3995 DUP4 DUP4 SWAP1 PUSH2 0x2629 JUMP JUMPDEST ISZERO PUSH2 0x39F JUMP JUMPDEST PUSH2 0x39A3 JUMPI POP POP JUMP JUMPDEST PUSH2 0x3A1B SWAP2 PUSH2 0x39F9 PUSH2 0x39D2 PUSH2 0x39C2 PUSH2 0x39BC PUSH2 0x39FE SWAP6 PUSH2 0x407A JUMP JUMPDEST SWAP4 PUSH2 0x361A JUMP JUMPDEST PUSH2 0x39CC PUSH1 0x20 PUSH2 0x38C0 JUMP JUMPDEST SWAP1 PUSH2 0x4293 JUMP JUMPDEST SWAP2 PUSH2 0x39EA PUSH2 0x39DE PUSH2 0x252 JUMP JUMPDEST SWAP4 DUP5 SWAP3 PUSH1 0x20 DUP5 ADD PUSH2 0x395E JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE SUB DUP3 PUSH2 0x5CF JUMP JUMPDEST PUSH2 0x1D20 JUMP JUMPDEST PUSH2 0x3A06 PUSH2 0x252 JUMP JUMPDEST SWAP2 DUP3 SWAP2 PUSH3 0x461BCD PUSH1 0xE5 SHL DUP4 MSTORE PUSH1 0x4 DUP4 ADD PUSH2 0x6A6 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP1 SWAP2 PUSH2 0x3A38 SWAP3 PUSH2 0x3A2F PUSH1 0x0 PUSH2 0x1F09 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 SWAP3 PUSH2 0x440E JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x3A4E PUSH2 0x3A48 DUP3 DUP5 SWAP1 PUSH2 0x2629 JUMP JUMPDEST ISZERO PUSH2 0x39F JUMP JUMPDEST PUSH2 0x3A57 JUMPI JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x3A7A PUSH1 0x1 PUSH2 0x3A75 PUSH1 0x0 PUSH2 0x3A6D PUSH1 0x4 DUP7 SWAP1 PUSH2 0x1D8D JUMP JUMPDEST ADD DUP6 SWAP1 PUSH2 0x25EA JUMP JUMPDEST PUSH2 0x3559 JUMP JUMPDEST SWAP1 PUSH2 0x3A83 PUSH2 0x33A0 JUMP JUMPDEST SWAP1 PUSH2 0x3AC0 PUSH2 0x3ABA PUSH2 0x3AB4 PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP6 PUSH2 0x1D81 JUMP JUMPDEST SWAP3 PUSH2 0x25DE JUMP JUMPDEST SWAP3 PUSH2 0x25DE JUMP JUMPDEST SWAP3 PUSH2 0x3AC9 PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0x3AD3 DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 LOG4 CODESIZE DUP1 PUSH2 0x3A53 JUMP JUMPDEST PUSH2 0x3AE6 SWAP1 PUSH2 0x1B66 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3AFD PUSH2 0x3AF8 PUSH2 0x3B02 SWAP3 PUSH2 0x267 JUMP JUMPDEST PUSH2 0xAE6 JUMP JUMPDEST PUSH2 0x2A2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3B19 PUSH2 0x3B14 PUSH2 0x3B1E SWAP3 PUSH2 0x2A2 JUMP JUMPDEST PUSH2 0x1426 JUMP JUMPDEST PUSH2 0xA48 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x3B54 PUSH2 0x3B4E PUSH2 0x3B49 PUSH2 0x3B44 PUSH1 0x0 PUSH2 0x3B59 SWAP7 PUSH2 0x3B3C PUSH2 0x1834 JUMP JUMPDEST POP ADD SWAP5 PUSH2 0x3ADD JUMP JUMPDEST PUSH2 0x3AE9 JUMP JUMPDEST PUSH2 0x3B05 JUMP JUMPDEST SWAP2 PUSH2 0x3617 JUMP JUMPDEST PUSH2 0x45FE JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3B67 DUP2 DUP4 SWAP1 PUSH2 0x2629 JUMP JUMPDEST PUSH2 0x3B70 JUMPI JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x3B93 PUSH1 0x0 PUSH2 0x3B8E PUSH1 0x0 PUSH2 0x3B86 PUSH1 0x4 DUP7 SWAP1 PUSH2 0x1D8D JUMP JUMPDEST ADD DUP6 SWAP1 PUSH2 0x25EA JUMP JUMPDEST PUSH2 0x3559 JUMP JUMPDEST SWAP1 PUSH2 0x3B9C PUSH2 0x33A0 JUMP JUMPDEST SWAP1 PUSH2 0x3BD9 PUSH2 0x3BD3 PUSH2 0x3BCD PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP6 PUSH2 0x1D81 JUMP JUMPDEST SWAP3 PUSH2 0x25DE JUMP JUMPDEST SWAP3 PUSH2 0x25DE JUMP JUMPDEST SWAP3 PUSH2 0x3BE2 PUSH2 0x252 JUMP JUMPDEST DUP1 PUSH2 0x3BEC DUP2 PUSH2 0x45F JUMP JUMPDEST SUB SWAP1 LOG4 CODESIZE DUP1 PUSH2 0x3B6C JUMP JUMPDEST SWAP1 PUSH2 0x3C29 PUSH2 0x3C23 PUSH2 0x3C1E PUSH2 0x3C19 PUSH1 0x0 PUSH2 0x3C2E SWAP7 PUSH2 0x3C11 PUSH2 0x1834 JUMP JUMPDEST POP ADD SWAP5 PUSH2 0x3ADD JUMP JUMPDEST PUSH2 0x3AE9 JUMP JUMPDEST PUSH2 0x3B05 JUMP JUMPDEST SWAP2 PUSH2 0x3617 JUMP JUMPDEST PUSH2 0x46BE JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP2 SWAP3 SWAP1 SWAP3 PUSH2 0x3C3D PUSH2 0x3310 JUMP JUMPDEST PUSH2 0x3D19 JUMPI JUMPDEST DUP3 PUSH1 0x60 SHL DUP1 ISZERO PUSH2 0x3D0B JUMPI PUSH8 0x9A31110384E0B0C9 PUSH1 0x20 MSTORE DUP4 PUSH1 0x14 MSTORE DUP5 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP1 SLOAD SWAP1 DUP4 DUP3 ADD SWAP2 DUP3 LT PUSH2 0x3CFD JUMPI SSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x60 SHR PUSH1 0x0 CALLER PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP4 LOG4 PUSH2 0x3CAA PUSH2 0x331E JUMP JUMPDEST PUSH2 0x3CE4 JUMPI JUMPDEST PUSH2 0x3CB8 DUP4 PUSH2 0x47C8 JUMP JUMPDEST PUSH2 0x3CC3 JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x3CDB SWAP4 PUSH2 0x3CD1 PUSH1 0x0 PUSH2 0x1F09 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 SWAP3 SWAP4 PUSH2 0x47D5 JUMP JUMPDEST CODESIZE DUP1 DUP1 DUP1 PUSH2 0x3CBD JUMP JUMPDEST PUSH2 0x3CED DUP5 PUSH2 0x37C9 JUMP JUMPDEST POP PUSH2 0x3CF7 DUP2 PUSH2 0x37C9 JUMP JUMPDEST POP PUSH2 0x3CAF JUMP JUMPDEST PUSH4 0x1336CEA PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0xEA553B34 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH2 0x3D22 DUP5 PUSH2 0x37C9 JUMP JUMPDEST POP PUSH2 0x3D2C DUP2 PUSH2 0x37C9 JUMP JUMPDEST POP PUSH2 0x3C42 JUMP JUMPDEST SWAP1 PUSH2 0x3D48 PUSH2 0x3D4D SWAP4 SWAP3 PUSH2 0x3D43 PUSH2 0x1B27 JUMP JUMPDEST PUSH2 0x3376 JUMP JUMPDEST PUSH2 0x486E JUMP JUMPDEST JUMP JUMPDEST SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH2 0x3D67 DUP2 PUSH2 0x3D4F JUMP JUMPDEST DUP3 LT ISZERO PUSH2 0x3D82 JUMPI PUSH2 0x3D79 PUSH1 0x1 SWAP2 PUSH2 0x3D53 JUMP JUMPDEST SWAP2 MUL ADD SWAP1 PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x3124 JUMP JUMPDEST PUSH2 0x3D97 SWAP1 PUSH1 0x8 PUSH2 0x3D9C SWAP4 MUL PUSH2 0x8AA JUMP JUMPDEST PUSH2 0x1DAB JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x3DAA SWAP2 SLOAD PUSH2 0x3D87 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3DCC SWAP2 PUSH1 0x0 PUSH2 0x3DC6 SWAP3 PUSH2 0x3DBF PUSH2 0x1D7C JUMP JUMPDEST POP ADD PUSH2 0x3D5E JUMP JUMPDEST SWAP1 PUSH2 0x3D9F JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 SWAP2 PUSH2 0x3DE8 SWAP3 PUSH2 0x3DDF PUSH1 0x0 PUSH2 0x1F09 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 SWAP3 PUSH2 0x488E JUMP JUMPDEST JUMP JUMPDEST SWAP2 SWAP3 SWAP1 SWAP3 PUSH2 0x3DF6 PUSH2 0x3310 JUMP JUMPDEST PUSH2 0x3F28 JUMPI JUMPDEST DUP1 MLOAD DUP5 MLOAD SUB PUSH2 0x3F1A JUMPI DUP3 PUSH1 0x60 SHL DUP1 ISZERO PUSH2 0x3F0C JUMPI DUP1 PUSH8 0x9A31110384E0B0C9 OR PUSH1 0x20 MSTORE DUP5 MLOAD PUSH1 0x5 SHL DUP1 JUMPDEST PUSH2 0x3ED5 JUMPI POP PUSH1 0x0 PUSH1 0x40 MLOAD PUSH1 0x40 DUP2 MSTORE PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB DUP2 DUP9 MLOAD PUSH1 0x5 SHL PUSH1 0x20 ADD PUSH1 0x40 DUP3 ADD SWAP1 DUP2 DUP2 DUP13 PUSH1 0x4 GAS STATICCALL POP RETURNDATASIZE PUSH1 0x40 ADD PUSH1 0x20 DUP4 ADD MSTORE RETURNDATASIZE ADD DUP7 MLOAD PUSH1 0x5 SHL PUSH1 0x20 ADD DUP2 DUP2 DUP10 PUSH1 0x4 GAS STATICCALL POP RETURNDATASIZE ADD SUB SWAP4 PUSH1 0x60 SHR SWAP4 CALLER SWAP3 LOG4 PUSH2 0x3E96 PUSH2 0x331E JUMP JUMPDEST PUSH2 0x3ED0 JUMPI JUMPDEST PUSH2 0x3EA4 DUP4 PUSH2 0x47C8 JUMP JUMPDEST PUSH2 0x3EAF JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x3EC7 SWAP4 PUSH2 0x3EBD PUSH1 0x0 PUSH2 0x1F09 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 SWAP3 SWAP4 PUSH2 0x4992 JUMP JUMPDEST CODESIZE DUP1 DUP1 DUP1 PUSH2 0x3EA9 JUMP JUMPDEST PUSH2 0x3E9B JUMP JUMPDEST DUP1 DUP4 ADD MLOAD SWAP1 DUP1 DUP8 ADD MLOAD PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 DUP3 SLOAD SWAP1 DUP2 ADD SWAP1 DUP2 LT PUSH2 0x3EFE JUMPI PUSH1 0x20 SWAP3 SSTORE SUB DUP1 PUSH2 0x3E23 JUMP JUMPDEST PUSH4 0x1336CEA PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0xEA553B34 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0x3B800A46 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH2 0x3DFB JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3F42 SWAP2 PUSH2 0x3F3B PUSH2 0x180B JUMP JUMPDEST POP ADD PUSH2 0x3D4F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3F4D PUSH2 0x1834 JUMP JUMPDEST POP PUSH1 0xE0 SHR PUSH4 0xE89341C DUP2 EQ SWAP1 PUSH4 0x1FFC9A7 PUSH4 0xD9B67A26 DUP3 EQ SWAP2 EQ OR OR SWAP1 JUMP JUMPDEST PUSH2 0x3F74 PUSH2 0x1834 JUMP JUMPDEST POP DUP1 PUSH2 0x3F8F PUSH2 0x3F89 PUSH4 0x152A902D PUSH1 0xE1 SHL PUSH2 0x350 JUMP JUMPDEST SWAP2 PUSH2 0x350 JUMP JUMPDEST EQ SWAP1 DUP2 ISZERO PUSH2 0x3F9C JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x3FA6 SWAP2 POP PUSH2 0x4A49 JUMP JUMPDEST CODESIZE PUSH2 0x3F98 JUMP JUMPDEST PUSH2 0x3FB4 PUSH2 0x1834 JUMP JUMPDEST POP DUP1 PUSH2 0x3FCF PUSH2 0x3FC9 PUSH4 0x5A05180F PUSH1 0xE0 SHL PUSH2 0x350 JUMP JUMPDEST SWAP2 PUSH2 0x350 JUMP JUMPDEST EQ SWAP1 DUP2 ISZERO PUSH2 0x3FDC JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x3FE6 SWAP2 POP PUSH2 0x4A6F JUMP JUMPDEST CODESIZE PUSH2 0x3FD8 JUMP JUMPDEST PUSH2 0x3FF4 PUSH2 0x1834 JUMP JUMPDEST POP DUP1 PUSH2 0x400F PUSH2 0x4009 PUSH4 0x4E821D33 PUSH1 0xE1 SHL PUSH2 0x350 JUMP JUMPDEST SWAP2 PUSH2 0x350 JUMP JUMPDEST EQ SWAP1 DUP2 ISZERO PUSH2 0x401C JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x4026 SWAP2 POP PUSH2 0x3829 JUMP JUMPDEST CODESIZE PUSH2 0x4018 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH2 0x4049 PUSH2 0x4044 PUSH2 0x404E SWAP3 PUSH2 0x402C JUMP JUMPDEST PUSH2 0xAE6 JUMP JUMPDEST PUSH2 0x402F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x405B PUSH1 0x14 PUSH2 0x4035 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x4072 PUSH2 0x406D PUSH2 0x4077 SWAP3 PUSH2 0x402F JUMP JUMPDEST PUSH2 0xAE6 JUMP JUMPDEST PUSH2 0x2A2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x4097 PUSH2 0x4092 PUSH2 0x40AD SWAP3 PUSH2 0x408C PUSH2 0x1C04 JUMP JUMPDEST POP PUSH2 0x3ADD JUMP JUMPDEST PUSH2 0x3AE9 JUMP JUMPDEST PUSH2 0x40A7 PUSH2 0x40A2 PUSH2 0x4051 JUMP JUMPDEST PUSH2 0x405E JUMP JUMPDEST SWAP1 PUSH2 0x4293 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x40C7 PUSH2 0x40C2 PUSH2 0x40CC SWAP3 PUSH2 0x40B0 JUMP JUMPDEST PUSH2 0xAE6 JUMP JUMPDEST PUSH2 0x2A2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x40E1 PUSH2 0x40DC DUP4 PUSH2 0x1028 JUMP JUMPDEST PUSH2 0x6FE JUMP JUMPDEST SWAP2 DUP3 MSTORE JUMP JUMPDEST CALLDATASIZE SWAP1 CALLDATACOPY JUMP JUMPDEST SWAP1 PUSH2 0x4110 PUSH2 0x40F8 DUP4 PUSH2 0x40CF JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP1 PUSH2 0x4106 DUP7 SWAP4 PUSH2 0x1028 JUMP JUMPDEST SWAP3 ADD SWAP2 SUB SWAP1 PUSH2 0x40E6 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x3 PUSH1 0xFC SHL SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x4128 DUP3 PUSH2 0x411A JUMP JUMPDEST DUP2 LT ISZERO PUSH2 0x413A JUMPI PUSH1 0x1 PUSH1 0x20 SWAP2 MUL ADD ADD SWAP1 JUMP JUMPDEST PUSH2 0x3124 JUMP JUMPDEST PUSH1 0xF PUSH1 0xFB SHL SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x415E PUSH2 0x4159 PUSH2 0x4163 SWAP3 PUSH2 0x4147 JUMP JUMPDEST PUSH2 0xAE6 JUMP JUMPDEST PUSH2 0x2A2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x416F SWAP1 PUSH2 0x2A2 JUMP JUMPDEST PUSH1 0x0 DUP2 EQ PUSH2 0x417E JUMPI PUSH1 0x1 SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH2 0x1F3E JUMP JUMPDEST PUSH16 0x181899199A1A9B1B9C1CB0B131B232B3 PUSH1 0x81 SHL SWAP1 JUMP JUMPDEST PUSH2 0x41A2 PUSH2 0x4183 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x41BC PUSH2 0x41B7 PUSH2 0x41C1 SWAP3 PUSH2 0x41A5 JUMP JUMPDEST PUSH2 0xAE6 JUMP JUMPDEST PUSH2 0x2A2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xF8 SHL SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x41E1 PUSH2 0x41DC PUSH2 0x41E6 SWAP3 PUSH2 0x41CA JUMP JUMPDEST PUSH2 0xAE6 JUMP JUMPDEST PUSH2 0x402F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x4208 SWAP1 PUSH2 0x4202 PUSH2 0x41FC PUSH2 0x420D SWAP5 PUSH2 0x402F JUMP JUMPDEST SWAP2 PUSH2 0x2A2 JUMP JUMPDEST SWAP1 PUSH2 0x8AA JUMP JUMPDEST PUSH2 0x2A2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x537472696E67733A20686578206C656E67746820696E73756666696369656E74 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x4244 PUSH1 0x20 DUP1 SWAP3 PUSH2 0x647 JUMP JUMPDEST PUSH2 0x424D DUP2 PUSH2 0x4210 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x4267 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x4238 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x4271 JUMPI JUMP JUMPDEST PUSH2 0x4279 PUSH2 0x252 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x428F PUSH1 0x4 DUP3 ADD PUSH2 0x4251 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP2 SWAP1 PUSH2 0x429D PUSH2 0x1C04 JUMP JUMPDEST POP PUSH2 0x4337 PUSH2 0x4327 PUSH2 0x42D3 PUSH2 0x42CE PUSH2 0x42BE PUSH1 0x2 PUSH2 0x42B9 DUP8 SWAP2 PUSH2 0x40B3 JUMP JUMPDEST PUSH2 0x1F54 JUMP JUMPDEST PUSH2 0x42C8 PUSH1 0x2 PUSH2 0x40B3 JUMP JUMPDEST SWAP1 PUSH2 0x31CD JUMP JUMPDEST PUSH2 0x40EB JUMP JUMPDEST SWAP3 PUSH2 0x42DC PUSH2 0x4112 JUMP JUMPDEST PUSH2 0x42F5 DUP6 PUSH2 0x42EF PUSH1 0x0 SWAP4 PUSH1 0x0 BYTE SWAP4 PUSH2 0x3108 JUMP JUMPDEST SWAP1 PUSH2 0x411E JUMP JUMPDEST MSTORE8 PUSH2 0x42FE PUSH2 0x413F JUMP JUMPDEST PUSH2 0x4317 DUP6 PUSH2 0x4311 PUSH1 0x1 SWAP4 PUSH1 0x0 BYTE SWAP4 PUSH2 0x414A JUMP JUMPDEST SWAP1 PUSH2 0x411E JUMP JUMPDEST MSTORE8 PUSH2 0x4322 PUSH1 0x2 PUSH2 0x40B3 JUMP JUMPDEST PUSH2 0x1F54 JUMP JUMPDEST PUSH2 0x4331 PUSH1 0x1 PUSH2 0x414A JUMP JUMPDEST SWAP1 PUSH2 0x31CD JUMP JUMPDEST SWAP3 JUMPDEST DUP4 PUSH2 0x434D PUSH2 0x4347 PUSH1 0x1 PUSH2 0x414A JUMP JUMPDEST SWAP2 PUSH2 0x2A2 JUMP JUMPDEST GT ISZERO PUSH2 0x43B4 JUMPI PUSH2 0x435B PUSH2 0x419A JUMP JUMPDEST DUP2 PUSH2 0x4366 PUSH1 0xF PUSH2 0x41A8 JUMP JUMPDEST AND SWAP2 PUSH1 0x10 DUP4 LT ISZERO PUSH2 0x43AF JUMPI PUSH2 0x4382 PUSH2 0x43A3 SWAP3 PUSH2 0x43A9 SWAP5 BYTE PUSH2 0x41C4 JUMP JUMPDEST PUSH2 0x4392 DUP6 SWAP2 DUP9 SWAP1 PUSH1 0x0 BYTE SWAP3 PUSH2 0x411E JUMP JUMPDEST MSTORE8 PUSH2 0x439D PUSH1 0x4 PUSH2 0x41CD JUMP JUMPDEST SWAP1 PUSH2 0x41E9 JUMP JUMPDEST SWAP4 PUSH2 0x4166 JUMP JUMPDEST SWAP3 PUSH2 0x4339 JUMP JUMPDEST PUSH2 0x3124 JUMP JUMPDEST PUSH2 0x43DC SWAP3 SWAP4 POP PUSH2 0x43D7 SWAP1 PUSH2 0x43D1 PUSH2 0x43CB PUSH1 0x0 PUSH2 0x3108 JUMP JUMPDEST SWAP2 PUSH2 0x2A2 JUMP JUMPDEST EQ PUSH2 0x426A JUMP JUMPDEST PUSH2 0x1D20 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x43F1 PUSH2 0x43EC DUP4 PUSH2 0x713 JUMP JUMPDEST PUSH2 0x6FE JUMP JUMPDEST SWAP2 DUP3 MSTORE JUMP JUMPDEST PUSH2 0x4400 PUSH1 0x0 PUSH2 0x43DF JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x440B PUSH2 0x43F6 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP2 SWAP4 SWAP3 SWAP1 PUSH2 0x441A PUSH2 0x3310 JUMP JUMPDEST PUSH2 0x4546 JUMPI JUMPDEST DUP2 MLOAD DUP6 MLOAD SUB PUSH2 0x4538 JUMPI PUSH1 0x60 SHL SWAP2 DUP3 PUSH8 0x9A31110384E0B0C9 OR PUSH1 0x20 MSTORE DUP1 PUSH1 0x60 SHL DUP4 DUP2 EQ SWAP1 ISZERO OR ISZERO PUSH2 0x4516 JUMPI JUMPDEST POP DUP4 MLOAD PUSH1 0x5 SHL DUP1 JUMPDEST PUSH2 0x44E0 JUMPI POP PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH1 0x0 SWAP4 SWAP5 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP2 PUSH1 0x40 DUP4 MSTORE DUP1 MLOAD PUSH1 0x5 SHL PUSH1 0x20 ADD DUP1 SWAP2 PUSH1 0x40 DUP6 ADD SWAP3 DUP4 SWAP2 PUSH1 0x4 GAS STATICCALL POP RETURNDATASIZE PUSH1 0x40 ADD PUSH1 0x20 DUP5 ADD MSTORE RETURNDATASIZE ADD SWAP1 DUP2 DUP2 MLOAD PUSH1 0x5 SHL PUSH1 0x20 ADD DUP1 SWAP3 PUSH1 0x4 GAS STATICCALL POP RETURNDATASIZE ADD SUB SWAP3 PUSH1 0x60 SHR SWAP3 CALLER SWAP3 LOG4 PUSH2 0x44CB PUSH2 0x331E JUMP JUMPDEST PUSH2 0x44D2 JUMPI JUMPDEST JUMP JUMPDEST PUSH2 0x44DA PUSH2 0x4403 JUMP JUMPDEST POP PUSH2 0x44D0 JUMP JUMPDEST DUP1 DUP3 ADD MLOAD SWAP1 DUP1 DUP7 ADD MLOAD PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP1 SLOAD SWAP3 DUP4 DUP2 GT PUSH2 0x4508 JUMPI PUSH1 0x20 SWAP4 SUB SWAP1 SSTORE SUB DUP1 PUSH2 0x4452 JUMP JUMPDEST PUSH4 0xF4D678B8 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x34 PUSH1 0xC KECCAK256 SLOAD ISZERO PUSH2 0x452A JUMPI CODESIZE PUSH2 0x444A JUMP JUMPDEST PUSH4 0x4B6E7F18 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0x3B800A46 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH2 0x454E PUSH2 0x4403 JUMP JUMPDEST POP PUSH2 0x441F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD SWAP1 JUMP JUMPDEST PUSH2 0x456F DUP2 PUSH2 0x4562 JUMP JUMPDEST DUP3 LT ISZERO PUSH2 0x458A JUMPI PUSH2 0x4581 PUSH1 0x1 SWAP2 PUSH2 0x4557 JUMP JUMPDEST SWAP2 MUL ADD SWAP1 PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x3124 JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x45A5 PUSH2 0x45A0 PUSH2 0x45AD SWAP4 PUSH2 0x1D81 JUMP JUMPDEST PUSH2 0x2BC8 JUMP JUMPDEST SWAP1 DUP4 SLOAD PUSH2 0x1934 JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST SWAP1 DUP2 SLOAD SWAP2 PUSH9 0x10000000000000000 DUP4 LT ISZERO PUSH2 0x45E1 JUMPI DUP3 PUSH2 0x45D9 SWAP2 PUSH1 0x1 PUSH2 0x45DF SWAP6 ADD DUP2 SSTORE PUSH2 0x4566 JUMP JUMPDEST SWAP1 PUSH2 0x458F JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x5B9 JUMP JUMPDEST SWAP1 PUSH2 0x45F0 SWAP1 PUSH2 0x1D81 JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH2 0x4606 PUSH2 0x1834 JUMP JUMPDEST POP PUSH2 0x461B PUSH2 0x4615 DUP3 DUP5 SWAP1 PUSH2 0x4AAF JUMP JUMPDEST ISZERO PUSH2 0x39F JUMP JUMPDEST PUSH1 0x0 EQ PUSH2 0x465E JUMPI PUSH2 0x4654 PUSH2 0x4659 SWAP3 PUSH2 0x463F PUSH2 0x4638 PUSH1 0x0 DUP6 ADD PUSH2 0x4554 JUMP JUMPDEST DUP3 SWAP1 PUSH2 0x45B1 JUMP JUMPDEST PUSH1 0x1 PUSH2 0x464D PUSH1 0x0 DUP6 ADD PUSH2 0x3D4F JUMP JUMPDEST SWAP4 ADD PUSH2 0x45E6 JUMP JUMPDEST PUSH2 0x31AD JUMP JUMPDEST PUSH1 0x1 SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x31 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x468D SWAP2 PUSH2 0x4687 PUSH2 0x1D7C JUMP JUMPDEST SWAP2 PUSH2 0x458F JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x4698 DUP2 PUSH2 0x4562 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x46B9 JUMPI PUSH1 0x1 SWAP1 SUB SWAP1 PUSH2 0x46B6 PUSH2 0x46B0 DUP4 DUP4 PUSH2 0x4566 JUMP JUMPDEST SWAP1 PUSH2 0x467B JUMP JUMPDEST SSTORE JUMP JUMPDEST PUSH2 0x4665 JUMP JUMPDEST PUSH2 0x46C6 PUSH2 0x1834 JUMP JUMPDEST POP PUSH2 0x46DD PUSH2 0x46D8 PUSH1 0x1 DUP4 ADD DUP5 SWAP1 PUSH2 0x45E6 JUMP JUMPDEST PUSH2 0x317B JUMP JUMPDEST SWAP1 DUP2 PUSH2 0x46F2 PUSH2 0x46EC PUSH1 0x0 PUSH2 0x3108 JUMP JUMPDEST SWAP2 PUSH2 0x2A2 JUMP JUMPDEST EQ ISZERO PUSH1 0x0 EQ PUSH2 0x47C0 JUMPI PUSH2 0x4772 SWAP3 PUSH1 0x1 PUSH2 0x476D SWAP3 DUP5 PUSH2 0x471B PUSH1 0x0 SWAP7 PUSH2 0x4715 DUP6 PUSH2 0x414A JUMP JUMPDEST SWAP1 PUSH2 0x3188 JUMP JUMPDEST PUSH2 0x4738 PUSH2 0x4729 DUP9 DUP6 ADD PUSH2 0x3D4F JUMP JUMPDEST PUSH2 0x4732 DUP7 PUSH2 0x414A JUMP JUMPDEST SWAP1 PUSH2 0x3188 JUMP JUMPDEST DUP1 PUSH2 0x474B PUSH2 0x4745 DUP5 PUSH2 0x2A2 JUMP JUMPDEST SWAP2 PUSH2 0x2A2 JUMP JUMPDEST SUB PUSH2 0x4777 JUMPI JUMPDEST POP POP POP PUSH2 0x4767 PUSH2 0x4762 DUP7 DUP4 ADD PUSH2 0x4554 JUMP JUMPDEST PUSH2 0x468F JUMP JUMPDEST ADD PUSH2 0x45E6 JUMP JUMPDEST PUSH2 0x197F JUMP JUMPDEST PUSH1 0x1 SWAP1 JUMP JUMPDEST PUSH2 0x47B8 SWAP3 PUSH2 0x47AA PUSH2 0x4796 PUSH2 0x4790 PUSH2 0x47B3 SWAP5 DUP13 DUP10 ADD PUSH2 0x3D5E JUMP JUMPDEST SWAP1 PUSH2 0x3D9F JUMP JUMPDEST SWAP4 PUSH2 0x47A4 DUP6 SWAP2 DUP13 DUP10 ADD PUSH2 0x3D5E JUMP JUMPDEST SWAP1 PUSH2 0x458F JUMP JUMPDEST SWAP2 DUP6 DUP6 ADD PUSH2 0x45E6 JUMP JUMPDEST PUSH2 0x31AD JUMP JUMPDEST CODESIZE DUP1 DUP1 PUSH2 0x4751 JUMP JUMPDEST POP POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x47D0 PUSH2 0x1834 JUMP JUMPDEST POP EXTCODESIZE SWAP1 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 SWAP4 PUSH1 0x40 MLOAD SWAP6 DUP7 SWAP5 PUSH4 0xF23A6E61 DUP7 MSTORE CALLER DUP8 DUP8 ADD MSTORE PUSH1 0x60 SHL PUSH1 0x60 SHR PUSH1 0x40 DUP7 ADD MSTORE PUSH1 0x60 DUP6 ADD MSTORE PUSH1 0x80 DUP5 ADD MSTORE PUSH1 0xA0 DUP1 DUP5 ADD MSTORE DUP1 MLOAD DUP1 SWAP2 DUP2 DUP1 PUSH1 0xC0 DUP8 ADD MSTORE PUSH2 0x485A JUMPI JUMPDEST POP POP PUSH1 0xC4 ADD SWAP1 PUSH1 0x0 PUSH1 0x1C DUP5 ADD SWAP2 GAS CALL ISZERO PUSH2 0x484B JUMPI JUMPDEST PUSH4 0xF23A6E61 PUSH1 0xE0 SHL SWAP1 MLOAD SUB PUSH2 0x483D JUMPI JUMP JUMPDEST PUSH4 0x9C05499B PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x482C JUMPI RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST DUP2 DUP7 PUSH1 0xE0 DUP8 ADD SWAP3 ADD PUSH1 0x4 GAS STATICCALL POP DUP1 CODESIZE PUSH2 0x4817 JUMP JUMPDEST SWAP1 PUSH2 0x4885 PUSH2 0x487E PUSH2 0x488C SWAP4 PUSH2 0x1B8E JUMP JUMPDEST PUSH1 0x6 PUSH2 0x1BC4 JUMP JUMPDEST PUSH1 0x7 PUSH2 0x2BD4 JUMP JUMPDEST JUMP JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x489A PUSH2 0x3310 JUMP JUMPDEST PUSH2 0x4970 JUMPI JUMPDEST PUSH1 0x60 SHL SWAP1 DUP2 PUSH8 0x9A31110384E0B0C9 OR PUSH1 0x20 MSTORE DUP2 DUP2 PUSH1 0x60 SHL EQ DUP2 PUSH1 0x60 SHL ISZERO OR ISZERO PUSH2 0x494E JUMPI JUMPDEST POP DUP3 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD SWAP2 DUP3 DUP5 GT PUSH2 0x4940 JUMPI DUP4 PUSH1 0x0 SWAP4 SUB SWAP1 SSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x60 SHR CALLER PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP5 LOG4 PUSH2 0x4914 PUSH2 0x331E JUMP JUMPDEST PUSH2 0x491D JUMPI JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x4929 PUSH2 0x492F SWAP3 PUSH2 0x37C9 JUMP JUMPDEST POP PUSH2 0x37C9 JUMP JUMPDEST POP PUSH2 0x4938 PUSH2 0x4403 JUMP JUMPDEST POP CODESIZE DUP1 PUSH2 0x4919 JUMP JUMPDEST PUSH4 0xF4D678B8 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x34 PUSH1 0xC KECCAK256 SLOAD ISZERO PUSH2 0x4962 JUMPI CODESIZE PUSH2 0x48C3 JUMP JUMPDEST PUSH4 0x4B6E7F18 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH2 0x4979 DUP5 PUSH2 0x37C9 JUMP JUMPDEST POP PUSH2 0x4983 DUP4 PUSH2 0x37C9 JUMP JUMPDEST POP PUSH2 0x498C PUSH2 0x4403 JUMP JUMPDEST POP PUSH2 0x489F JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 SWAP4 PUSH1 0x40 MLOAD SWAP6 DUP7 SWAP5 PUSH4 0xBC197C81 DUP7 MSTORE CALLER DUP8 DUP8 ADD MSTORE PUSH1 0x60 SHL PUSH1 0x60 SHR PUSH1 0x40 DUP7 ADD MSTORE PUSH1 0xA0 PUSH1 0x60 DUP7 ADD MSTORE DUP1 MLOAD PUSH1 0x5 SHL DUP7 ADD DUP1 SWAP2 PUSH1 0xC0 DUP8 ADD SWAP3 DUP4 SWAP2 PUSH1 0x4 GAS STATICCALL POP RETURNDATASIZE PUSH1 0xA0 ADD SWAP1 DUP2 PUSH1 0x80 DUP8 ADD MSTORE RETURNDATASIZE ADD SWAP2 DUP3 DUP2 MLOAD PUSH1 0x5 SHL DUP9 ADD DUP1 SWAP3 PUSH1 0x4 GAS STATICCALL POP RETURNDATASIZE ADD PUSH1 0xA0 DUP6 ADD MSTORE RETURNDATASIZE ADD SWAP1 DUP2 DUP2 MLOAD DUP7 ADD DUP1 SWAP3 PUSH1 0x4 GAS STATICCALL POP PUSH1 0x1C DUP4 ADD SWAP1 RETURNDATASIZE ADD SUB SWAP1 PUSH1 0x0 PUSH1 0x1C DUP5 ADD SWAP2 GAS CALL ISZERO PUSH2 0x4A3A JUMPI JUMPDEST PUSH4 0xBC197C81 PUSH1 0xE0 SHL SWAP1 MLOAD SUB PUSH2 0x4A2C JUMPI JUMP JUMPDEST PUSH4 0x9C05499B PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x4A1B JUMPI RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH2 0x4A51 PUSH2 0x1834 JUMP JUMPDEST POP PUSH2 0x4A6B PUSH2 0x4A65 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL PUSH2 0x350 JUMP JUMPDEST SWAP2 PUSH2 0x350 JUMP JUMPDEST EQ SWAP1 JUMP JUMPDEST PUSH2 0x4A77 PUSH2 0x1834 JUMP JUMPDEST POP DUP1 PUSH2 0x4A92 PUSH2 0x4A8C PUSH4 0x7965DB0B PUSH1 0xE0 SHL PUSH2 0x350 JUMP JUMPDEST SWAP2 PUSH2 0x350 JUMP JUMPDEST EQ SWAP1 DUP2 ISZERO PUSH2 0x4A9F JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x4AA9 SWAP2 POP PUSH2 0x3F6C JUMP JUMPDEST CODESIZE PUSH2 0x4A9B JUMP JUMPDEST PUSH2 0x4ACD SWAP2 PUSH1 0x1 PUSH2 0x4AC8 SWAP3 PUSH2 0x4AC1 PUSH2 0x1834 JUMP JUMPDEST POP ADD PUSH2 0x45E6 JUMP JUMPDEST PUSH2 0x317B JUMP JUMPDEST PUSH2 0x4AE0 PUSH2 0x4ADA PUSH1 0x0 PUSH2 0x3108 JUMP JUMPDEST SWAP2 PUSH2 0x2A2 JUMP JUMPDEST EQ ISZERO SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB8 0x29 0xE6 0x2C 0xBD TIMESTAMP SWAP2 ISZERO PUSH16 0xD8E41F29314AC27B4F688A516435044F PUSH7 0xA0AD587E708064 PUSH20 0x6F6C634300081B00330000000000000000000000 ", + "sourceMap": "305:2684:41:-:0;;;;;;;;;-1:-1:-1;305:2684:41;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;:::o;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;:::o;:::-;;:::o;:::-;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;:::o;:::-;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;:::o;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;:::i;:::-;:::o;:::-;;;-1:-1:-1;305:2684:41;;;;;:::i;:::-;;:::o;:::-;;:::i;686:18:38:-;;;;;;:::i;:::-;;:::o;305:2684:41:-;;;:::o;:::-;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;:::o;:::-;;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;:::o;:::-;;:::o;:::-;;;;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::o;347:26:39:-;;;;;:::i;:::-;;:::o;305:2684:41:-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;;;;;;;;:::o;379:46:39:-;;;;;;;;;:::i;:::-;;:::i;:::-;;:::o;305:2684:41:-;;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;:::o;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;:::o;:::-;;;;;;;:::o;:::-;;;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;:::o;:::-;;;;:::o;:::-;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;710:21:38:-;;;;;;:::i;:::-;;:::o;305:2684:41:-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;2153:49:0:-;2198:4;;;:::i;:::-;2153:49;:::o;:::-;;;:::i;:::-;;:::o;305:2684:41:-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;737:25:38:-;;;;;;:::i;:::-;;:::o;305:2684:41:-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;:::o;6070:334:29:-;6145:14;;:::i;:::-;6214:184;;;;;;;;;;;;6070:334;:::o;305:2684:41:-;;;:::o;2681:305::-;2798:4;;:::i;:::-;2821:40;;;;:55;;2865:11;2821:55;:::i;:::-;;;:::i;:::-;;:118;;;;2681:305;2821:158;;;;;2681:305;2814:165;;:::o;2821:158::-;2943:36;2967:11;;2943:36;:::i;:::-;2821:158;;;:118;2927:11;2892:47;2927:11;2892:47;:::i;:::-;2821:118;;496:78:48;543:31;496:78;:::o;2589:76:0:-;;2657:1;2589:76;2642:4;961:18:48;;:::i;:::-;2642:4:0;:::i;:::-;2657:1;:::i;:::-;2589:76::o;877:163:48:-;;1020:12;877:163;1020:12;:::i;:::-;877:163::o;:::-;;;;;:::i;:::-;:::o;599:80:38:-;647:32;599:80;:::o;2589:76:0:-;2657:1;2589:76;2642:4;2638:19:38;;:::i;:::-;2642:4:0;:::i;:::-;2657:1;:::i;:::-;2589:76::o;305:2684:41:-;;;;;;;:::o;:::-;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;:::o;:::-;;:::o;:::-;;;;;;;;:::i;:::-;;:::i;:::-;;;;;:::i;:::-;;;:::o;:::-;;;;;:::i;:::-;;;:::i;:::-;:::o;:::-;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::o;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;:::o;2556:136:38:-;2669:16;2556:136;2669:16;;:::i;:::-;2556:136::o;:::-;;;;:::i;:::-;:::o;514:91:50:-;568:37;514:91;:::o;2589:76:0:-;2657:1;2589:76;2642:4;1115:25:50;;:::i;:::-;2642:4:0;:::i;:::-;2657:1;:::i;:::-;2589:76::o;305:2684:41:-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;1030:179:50:-;1165:37;1152:50;1030:179;1165:37;:::i;:::-;1152:50;;:::i;:::-;1030:179::o;:::-;;;;:::i;:::-;:::o;305:2684:41:-;;;:::o;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;:::o;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;:::i;:::-;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;:::o;2000:184:38:-;2110:67;2000:184;2078:13;;:::i;:::-;2134:7;2117:59;2143:23;2134:7;2162:3;2143:23;:::i;:::-;2117:59;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;2110:67;:::i;:::-;2103:74;:::o;3571:151::-;3707:7;3571:151;3685:10;3697:8;3707:7;;;:::i;:::-;3571:151::o;305:2684:41:-;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;:::o;:::-;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;4504:129:0:-;4604:22;:12;:22;4504:129;4578:7;;:::i;:::-;4604:6;;:12;:::i;:::-;:22;;:::i;:::-;4597:29;:::o;305:2684:41:-;;;:::o;:::-;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;;:::o;:::-;;;;:::o;:::-;;;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;:::o;:::-;;:::i;1671:428:12:-;1823:26;1794:55;1671:428;;;;1766:7;;:::i;:::-;1775;;;:::i;:::-;1823:17;;:26;:::i;:::-;1794:55;:::i;:::-;1864:7;:16;;:7;:16;;:::i;:::-;:30;;1884:10;1892:1;1884:10;:::i;:::-;1864:30;:::i;:::-;;;:::i;:::-;;1860:90;;1671:428;2060:16;1984:57;1985:35;2060:16;1985:9;:35;1997:23;;:7;:23;;:::i;:::-;1985:35;:::i;:::-;;;:::i;:::-;1984:57;2024:17;;:::i;:::-;1984:57;:::i;:::-;;;:::i;:::-;2060:7;:16;;:::i;:::-;2052:40;;:::o;1860:90::-;1920:19;;2060:16;;1984:57;1985:35;1910:29;1920:19;1910:29;:::i;:::-;1860:90;;;;;;;;305:2684:41;;;;;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::o;12785:5890:29:-;;;;;;;;;;12990:25;;:::i;:::-;12986:106;;12785:5890;13144:3349;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12785:5890;13144:3349;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16506:24;;:::i;:::-;16502:112;;13144:3349;16666:2003;;;;;13144:3349;12785:5890;;;;;;;:::o;16666:2003::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16502:112;16598:4;16574;;16580:2;;16584:3;;;;16589:7;;16598:4;;;;;;:::i;:::-;16502:112;;;13144:3349;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12986:106;13031:50;13062:3;;13031:50;13067:7;;13076:4;13031:50;13076:4;;;13031:50;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;12986:106;;2589:76:0;;2657:1;2589:76;2642:4;5012:18;5025:4;5012:18;:::i;:::-;2642:4;:::i;:::-;2657:1;:::i;:::-;2589:76::o;4929:145::-;;5059:7;4929:145;5059:7;:::i;:::-;4929:145::o;:::-;;;;;:::i;:::-;:::o;305:2684:41:-;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;6038:214:0;;6237:7;6038:214;6125:83;6133:7;:23;;6144:12;;:::i;:::-;6133:23;:::i;:::-;;;:::i;:::-;;6125:83;:::i;:::-;6237:7;:::i;:::-;6038:214::o;305:2684:41:-;;;:::o;18822:1021:29:-;;;;;18958:25;;:::i;:::-;19042:795;;;;;;;;;;;;;;;;;;;;;;;;;;18822:1021;;;;:::o;19042:795::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2589:76:0;;2657:1;2589:76;;2642:4;1593:18:48;;:::i;:::-;2642:4:0;:::i;:::-;2657:1;:::i;:::-;2589:76::o;1464:215:48:-;;1659:12;1464:215;1649:8;1659:12;;;:::i;:::-;1464:215::o;:::-;;;;;;:::i;:::-;:::o;369:64:41:-;409:24;369:64;:::o;2589:76:0:-;;2657:1;2589:76;;;2642:4;2003:11:41;;:::i;:::-;2642:4:0;:::i;:::-;2657:1;:::i;:::-;2589:76::o;1907:158:41:-;;2053:4;1907:158;;2045:6;2053:4;;;:::i;:::-;1907:158::o;:::-;;;;;;;:::i;:::-;:::o;2589:76:0:-;2657:1;2589:76;2642:4;2392:19:38;;:::i;:::-;2642:4:0;:::i;:::-;2657:1;:::i;:::-;2589:76::o;2304:148:38:-;2423:22;2304:148;2423:22;;:::i;:::-;2304:148::o;:::-;;;;:::i;:::-;:::o;1057:590:41:-;;;1634:5;1057:590;1579:19;1057:590;;;1502:21;1057:590;1429:5;1436:9;1447:12;1461:16;1479:21;1502;;;:::i;:::-;1579:19;:::i;:::-;1621:11;;:::i;:::-;1634:5;:::i;:::-;1057:590::o;305:2684::-;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;:::o;1431:151:1:-;;1547:21;:18;:28;1431:151;1521:7;;:::i;:::-;1547:12;;:18;:::i;:::-;:21;:::i;:::-;:28;:::i;:::-;1540:35;:::o;305:2684:41:-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;3021:145:0:-;3130:29;3021:145;3130:20;:12;:29;3021:145;3107:4;;:::i;:::-;3130:6;;:12;:::i;:::-;:20;:29;:::i;:::-;;:::i;:::-;3123:36;:::o;2589:76::-;2657:1;2589:76;2642:4;2989:19:38;;:::i;:::-;2642:4:0;:::i;:::-;2657:1;:::i;:::-;2589:76::o;2901:156:38:-;3020:30;2901:156;3020:30;;:::i;:::-;2901:156::o;:::-;;;;:::i;:::-;:::o;305:2684:41:-;;;;;;;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;:::o;:::-;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;:::i;:::-;;;:::o;:::-;;;;:::o;:::-;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;:::i;:::-;:::o;:::-;;;:::i;:::-;;;;;;;;1171:295:27;;;1398:63;1171:295;1319:7;;:::i;:::-;1398:10;:30;:10;;;:::i;:::-;:30;:::i;:::-;:63;:30;1429:6;1437:11;1450:10;1398:63;1450:10;;;:::i;:::-;1398:63;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;1171:295;1391:70;;:::o;1398:63::-;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;:::i;7020:720:29:-;;7150:584;;;;;;;;;;;;;;;;;;;;;;;;;;;7020:720::o;3253:113:38:-;3352:6;3253:113;3331:10;3343:7;3352:6;;;:::i;:::-;3253:113::o;2589:76:0:-;;2657:1;2589:76;;;2642:4;2458:11:41;;:::i;:::-;2642:4:0;:::i;:::-;2657:1;:::i;:::-;2589:76::o;2299:228:41:-;;2515:4;2299:228;;2506:7;2515:4;;;:::i;:::-;2299:228::o;:::-;;;;;;;:::i;:::-;:::o;1750:140:1:-;1856:25;:18;:27;1750:140;1830:7;;:::i;:::-;1856:12;;:18;:::i;:::-;:25;:::i;:::-;:27;:::i;:::-;1849:34;:::o;2589:76:0:-;;2657:1;2589:76;2642:4;5438:18;5451:4;5438:18;:::i;:::-;2642:4;:::i;:::-;2657:1;:::i;:::-;2589:76::o;5354:147::-;;5486:7;5354:147;5486:7;:::i;:::-;5354:147::o;:::-;;;;;:::i;:::-;:::o;6495:386:29:-;6615:11;;:::i;:::-;6685:190;;;;;;;;;;;;6495:386;:::o;2589:76:0:-;2657:1;2589:76;2642:4;1486:25:50;;:::i;:::-;2642:4:0;:::i;:::-;2657:1;:::i;:::-;2589:76::o;305:2684:41:-;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;;;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;1401:151:50:-;1523:22;1401:151;1523:22;;:::i;:::-;1401:151::o;:::-;;;;:::i;:::-;:::o;8225:4012:29:-;;;;;8401:25;;:::i;:::-;8397:122;;8225:4012;8571:2095;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8225:4012;8571:2095;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10679:24;;:::i;:::-;10675:120;;8225:4012;10847:1384;;;;8225:4012;;;;;;;:::o;10847:1384::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10675:120;10749:11;10757:2;10749:11;:::i;:::-;;10762:15;10770:6;10762:15;:::i;:::-;;10719:65;10779:4;;10719:65;;:::i;:::-;;10675:120;;8571:2095;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8397:122;8473:11;8481:2;8473:11;:::i;:::-;;8486:15;8494:6;8486:15;:::i;:::-;;8442:66;8503:4;;8442:66;;:::i;:::-;;8397:122;;3876:366:38;4040:4;;:::i;:::-;4095:11;4063:44;4095:11;4063:44;:::i;:::-;:96;;;;3876:366;4063:172;;;;;3876:366;4056:179;;:::o;4063:172::-;4175:60;4223:11;;4175:60;:::i;:::-;4063:172;;;:96;4147:11;4111:48;4147:11;4111:48;:::i;:::-;4063:96;;3460:103:0;3543:12;3460:103;3543:12;;:::i;:::-;;;:::i;:::-;3460:103::o;305:2684:41:-;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;:::o;:::-;;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;:::i;:::-;:::o;:::-;;;;;:::i;:::-;:::o;2730:327:12:-;;3015:35;2993:57;2730:327;2824:88;2832:12;:33;;2848:17;;:::i;:::-;2832:33;:::i;:::-;;;:::i;:::-;;;2824:88;:::i;:::-;2922:60;2930:8;:22;;2942:10;2950:1;2942:10;:::i;:::-;2930:22;:::i;:::-;;;:::i;:::-;;;2922:60;:::i;:::-;3037:12;3015:35;;;:::i;:::-;;;;;;:::i;:::-;;;;;:::i;:::-;2993:57;;:::i;:::-;2730:327::o;6111:1560:31:-;;6167:20;;:::i;:::-;6242:1423;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6111:1560::o;305:2684:41:-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;:::i;:::-;;:::o;2455:557:39:-;2606:8;2455:557;;;;2600:4;2606:8;;;:::i;:::-;2642:11;:4;:11;:::i;:::-;2685:1;2663:23;2685:1;2663:23;:::i;:::-;2701:9;;;:::i;:::-;2696:274;2701:9;2712:1;:9;;2716:5;2712:9;:::i;:::-;;;:::i;:::-;;;;;2824:21;2942:3;2755:8;:11;;:8;2764:1;2755:11;;:::i;:::-;;:::i;:::-;2780:30;2804:6;2780:30;:20;2804:6;2792:7;;2804:6;2780:11;;2792:4;:7;:::i;:::-;;:::i;:::-;2780:20;;:::i;:::-;:30;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;2824:21;;:::i;:::-;2942:3;;:::i;:::-;2701:9;;;2712;;;;;2979:26;2712:9;;2979:26;2712:9;;2979:26;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;2455:557::o;305:2684:41:-;;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;2374:95:12:-;2432:6;;:::i;:::-;2457:5;2450:12;2457:5;2450:12;:::i;:::-;;:::o;41921:101:29:-;41987:4;;:::i;:::-;42010:5;;42003:12;:::o;42664:100::-;42729:4;;:::i;:::-;42752:5;;42745:12;:::o;43666:310::-;;;;;;;;43870:24;;:::i;:::-;43866:104;;43666:310;;;;;;;:::o;43866:104::-;43910:49;;43940:3;43910:49;43940:3;;43945:7;;43954:4;;43910:49;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;43866:104;;;;;;;;1978:166:1;;2106:22;:18;:31;1978:166;2088:7;2082:4;2088:7;;;:::i;:::-;2106:12;:18;:::i;:::-;:22;:::i;:::-;:31;:::i;:::-;;1978:166::o;640:96:14:-;693:7;;:::i;:::-;719:10;;712:17;:::o;2233:171:1:-;;2363:25;:18;:34;2233:171;2345:7;2339:4;2345:7;;;:::i;:::-;2363:12;:18;:::i;:::-;:25;:::i;:::-;:34;:::i;:::-;;2233:171::o;305:2684:41:-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;3491:351:12;3771:26;3491:351;3800:35;3771:64;3491:351;;3600:88;3608:12;:33;;3624:17;;:::i;:::-;3608:33;:::i;:::-;;;:::i;:::-;;;3600:88;:::i;:::-;3698:62;3706:8;:22;;3718:10;3726:1;3718:10;:::i;:::-;3706:22;:::i;:::-;;;:::i;:::-;;;3698:62;:::i;:::-;3822:12;3800:35;;;:::i;:::-;;;;;;:::i;:::-;;;;;:::i;:::-;3771:17;:26;:::i;:::-;:64;:::i;:::-;3491:351::o;678:228:39:-;872:27;678:228;;823:5;872:27;678:228;872:16;678:228;809:3;;814:7;823:5;;;:::i;:::-;840:22;;855:7;840:22;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;872:11;;:16;:::i;:::-;:27;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;678:228::o;305:2684:41:-;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;1241:694:38:-;;;;;1501:12;;;:::i;:::-;1497:73;;1606:22;1638:30;1587:9;1580:16;1876:21;1587:9;1580:16;;:::i;:::-;1606:22;;:::i;:::-;1638:30;;:::i;:::-;1710:5;1690:18;;:::i;:::-;1710:5;;;:::i;:::-;1757;1737:18;;:::i;:::-;1757:5;;;:::i;:::-;1805;1784:19;;:::i;:::-;1805:5;;;:::i;:::-;1853:21;1876;;;:::i;:::-;1909:19;1924:4;1909:19;;:::i;:::-;1241:694::o;1497:73::-;1536:23;;;;;;;;;;;;:::i;:::-;;;;305:2684:41;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;9563:156:22:-;9679:31;9687:22;9663:49;9563:156;9687:22;9691:10;9671:40;9563:156;9637:7;;:::i;:::-;9691:3;:10;9687:22;:::i;:::-;;:::i;:::-;9679:31;:::i;:::-;9671:40;:::i;:::-;9663:49;:::i;:::-;9656:56;:::o;2000:205:39:-;2171:16;:27;2000:205;2120:7;2171:27;2000:205;2115:3;2120:7;;;:::i;:::-;2139:22;;2154:7;2139:22;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;2171:11;;:16;:::i;:::-;:27;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;2000:205::o;1177:618::-;;1392:5;1177:618;;;;1376:4;;1382:8;1392:5;;;:::i;:::-;1425:11;:4;:11;:::i;:::-;1468:1;1446:23;1468:1;1446:23;:::i;:::-;1484:9;;;:::i;:::-;;1495:1;:9;;1499:5;1495:9;:::i;:::-;;;:::i;:::-;;;;;1725:3;1538:8;1598:30;1563:21;1538:11;;:8;1547:1;1538:11;;:::i;:::-;;:::i;:::-;1578:6;;1563:21;;:::i;:::-;1622:6;1598:30;:20;:11;1610:7;;:4;1615:1;1610:7;;:::i;:::-;;:::i;:::-;1598:20;;:::i;:::-;:30;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;1725:3;:::i;:::-;1484:9;;1495;;;;;1762:26;1495:9;;1762:26;1495:9;1762:26;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;1177:618::o;9106:115:22:-;9195:19;9203:10;9195:19;9106:115;9169:7;;:::i;:::-;9203:3;:10;9195:19;:::i;:::-;;:::i;:::-;9188:26;:::o;48030:303:29:-;;48080:23;;:::i;:::-;48158:169;;;;;;;;;;;;;;;;48030:303::o;3166:234:39:-;3274:4;;:::i;:::-;3297:41;;;;:56;;3342:11;3297:56;:::i;:::-;;;:::i;:::-;;:96;;;;;3166:234;3290:103;;:::o;3297:96::-;3357:36;3381:11;;3357:36;:::i;:::-;3297:96;;;1833:366:48;1966:4;;:::i;:::-;2015:11;1989:38;2015:11;1989:38;:::i;:::-;:96;;;;1833:366;1989:163;;;;1833:366;1989:203;;;;;1833:366;1982:210;;:::o;1989:203::-;2156:36;2180:11;;2156:36;:::i;:::-;1989:203;;;:163;2101:36;;:51;;2141:11;2101:51;:::i;:::-;;;:::i;:::-;;1989:163;;:96;2073:11;2031:54;2073:11;2031:54;:::i;:::-;1989:96;;1586:295:50;1731:4;;:::i;:::-;1808:11;1766:54;1808:11;1766:54;:::i;:::-;:108;;;;;1586:295;1747:127;;:::o;1766:108::-;1824:50;1862:11;;1824:50;:::i;:::-;1766:108;;;305:2684:41;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;:::o;3844:479:0:-;;3931:23;3932:22;3940:4;3946:7;3932:22;;:::i;:::-;3931:23;;:::i;:::-;3927:390;;3844:479;;:::o;3927:390::-;3970:336;4135:7;4022:252;4214:38;4234:13;4115:28;3994:298;4135:7;4115:28;:::i;:::-;4242:4;4234:13;:::i;:::-;4214:38;4249:2;4214:38;:::i;:::-;;;:::i;:::-;4022:252;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;3994:298;:::i;:::-;3970:336;;:::i;:::-;305:2684:41;;;;;;3970:336:0;;;;;;:::i;:::-;;;;28229:178:29;;;28392:7;28229:178;28369:10;28377:1;28369:10;:::i;:::-;28381:4;28387:3;28392:7;;;:::i;:::-;28229:178::o;7587:233:0:-;7669:23;7670:22;7678:4;7684:7;7670:22;;:::i;:::-;7669:23;;:::i;:::-;7665:149;;7587:233;;;:::o;7665:149::-;7708:36;7740:4;7708:29;:20;:12;:6;7715:4;7708:12;;:::i;:::-;:20;7729:7;7708:29;;:::i;:::-;:36;:::i;:::-;7781:7;7790:12;;:::i;:::-;7763:40;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;:::i;:::-;;;;;:::i;:::-;;;;7665:149;;;;305:2684:41;;;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;8305:150:22:-;;8398:50;8415:32;8423:23;8431:14;8403:10;8398:50;8305:150;8375:4;;:::i;:::-;8403:3;:10;8439:5;8431:14;:::i;:::-;8423:23;:::i;:::-;8415:32;:::i;:::-;8398:50;;:::i;:::-;;:::i;:::-;8391:57;:::o;7991:234:0:-;8074:22;8082:4;8088:7;8074:22;;:::i;:::-;8070:149;;7991:234;;;:::o;8070:149::-;8112:37;8144:5;8112:29;:20;:12;:6;8119:4;8112:12;;:::i;:::-;:20;8133:7;8112:29;;:::i;:::-;:37;:::i;:::-;8186:7;8195:12;;:::i;:::-;8168:40;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;:::i;:::-;;;;;:::i;:::-;;;;8070:149;;;;8623:156:22;;8719:53;8739:32;8747:23;8755:14;8727:10;8719:53;8623:156;8696:4;;:::i;:::-;8727:3;:10;8763:5;8755:14;:::i;:::-;8747:23;:::i;:::-;8739:32;:::i;:::-;8719:53;;:::i;:::-;;:::i;:::-;8712:60;:::o;21034:1574:29:-;;;;;21139:25;;:::i;:::-;21135:128;;21034:1574;21315:1067;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22395:24;;:::i;:::-;22391:126;;21034:1574;22530:12;22539:2;22530:12;:::i;:::-;22526:75;;21034:1574;;;;;:::o;22526:75::-;22596:4;22576:1;22568:10;22576:1;22568:10;:::i;:::-;22580:2;22584;22588:6;22596:4;;;:::i;:::-;22526:75;;;;;;22391:126;22471:11;22479:2;22471:11;:::i;:::-;;22484:15;22492:6;22484:15;:::i;:::-;;22391:126;;21315:1067;;;;;;;;;;;;;;21135:128;21217:11;21225:2;21217:11;:::i;:::-;;21230:15;21238:6;21230:15;:::i;:::-;;21135:128;;612:218:50;;755:5;813:9;612:218;;728:25;;:::i;:::-;755:5;:::i;:::-;813:9;:::i;:::-;612:218::o;305:2684:41:-;;;:::o;:::-;;;;;;;:::o;:::-;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::o;4912:118:22:-;5005:18;4912:118;5005:11;:18;4912:118;4979:7;;:::i;:::-;5005:3;:11;:18;:::i;:::-;;;:::i;:::-;4998:25;:::o;26059:126:29:-;;;26171:6;26059:126;26149:10;26157:1;26149:10;:::i;:::-;26161:4;26167:2;26171:6;;;:::i;:::-;26059:126::o;22985:2719::-;;;;;23153:25;;:::i;:::-;23149:112;;22985:2719;23313:2174;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25500:24;;:::i;:::-;25496:110;;23313:2174;25619:12;25628:2;25619:12;:::i;:::-;25615:82;;23313:2174;22985:2719;;;;:::o;25615:82::-;25692:4;25670:1;25662:10;25670:1;25662:10;:::i;:::-;25674:2;25678:3;25683:7;25692:4;;;:::i;:::-;25615:82;;;;;;25496:110;;;23313:2174;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23149:112;;;4463:107:22;4545:11;:18;4463:107;4519:7;;:::i;:::-;4545:3;:11;:18;:::i;:::-;4538:25;:::o;20052:385:29:-;20128:11;;:::i;:::-;20194:237;;;;;;;;;;;;;;;20052:385;:::o;1408:213:12:-;1510:4;;:::i;:::-;1533:11;;:41;;1548:26;;;1533:41;:::i;:::-;;;:::i;:::-;;:81;;;;;1408:213;1526:88;;:::o;1533:81::-;1578:36;1602:11;;1578:36;:::i;:::-;1533:81;;;634:212:1;719:4;;:::i;:::-;742:11;;:57;;757:42;;;742:57;:::i;:::-;;;:::i;:::-;;:97;;;;;634:212;735:104;;:::o;742:97::-;803:36;827:11;;803:36;:::i;:::-;742:97;;;1899:210:27;1992:4;;:::i;:::-;2011:11;;:53;;2026:38;;;2011:53;:::i;:::-;;;:::i;:::-;;:93;;;;;1899:210;2004:100;;:::o;2011:93::-;2068:36;2092:11;;2068:36;:::i;:::-;2011:93;;;305:2684:41;;:::o;:::-;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;302:43:17:-;343:2;;;:::i;:::-;302:43;:::o;343:2::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;2407:149::-;2509:22;2517:13;2497:52;2407:149;2465:13;;:::i;:::-;2525:4;2517:13;:::i;:::-;2509:22;:::i;:::-;2497:52;2533:15;;:::i;:::-;2497:52;:::i;:::-;;;:::i;:::-;2490:59;:::o;305:2684:41:-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;;;:::o;:::-;;;;:::o;:::-;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;:::o;:::-;;;;;:::o;:::-;;;:::o;:::-;;;;;:::i;:::-;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;:::o;242:54:17:-;278:18;;:::i;:::-;242:54;:::o;278:18::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;305:2684:41;;;278:18:17;;;;;;;;:::i;:::-;;;;1818:437;;;1893:13;;:::i;:::-;1950:1;2042:14;:10;1940:25;1950:14;:10;:1;:10;1954:6;1950:10;;:::i;:::-;;:::i;:::-;:14;1963:1;1950:14;:::i;:::-;;;:::i;:::-;1940:25;:::i;:::-;1975:15;;;:::i;:::-;;:6;:15;1982:1;1975:15;;;;;:::i;:::-;;;:::i;:::-;;2000;;:::i;:::-;;:6;:15;2007:1;2000:15;;;;;:::i;:::-;;;:::i;:::-;;2042:10;:1;:10;:::i;:::-;;:::i;:::-;:14;2055:1;2042:14;:::i;:::-;;;:::i;:::-;2025:128;2065:3;2058:1;:5;;2062:1;2058:5;:::i;:::-;;;:::i;:::-;;;;;2096:8;;:::i;:::-;2105:5;:11;2113:3;2105:11;:::i;:::-;;2096:21;;;;;;;;2131:11;2096:21;2065:3;2096:21;;;:::i;:::-;2084:33;:6;2091:1;;2084:33;;;;;:::i;:::-;;2131:11;2141:1;2131:11;:::i;:::-;;;:::i;:::-;2065:3;;:::i;:::-;2030:26;;;2096:21;;:::i;2058:5::-;2234:14;2058:5;;;2162:55;2058:5;2170:10;;2179:1;2170:10;:::i;:::-;;;:::i;:::-;;2162:55;:::i;:::-;2234:14;:::i;:::-;2227:21;:::o;305:2684:41:-;;;;;;:::i;:::-;;:::i;:::-;;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;:::i;:::-;;:::o;28780:2807:29:-;;;;;28925:25;;:::i;:::-;28921:112;;28780:2807;29085:2377;;;;;;;;;;;;;;;;;;;;;;;;;;;28780:2807;29085:2377;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31475:24;;:::i;:::-;31471:110;;29085:2377;28780:2807::o;31471:110::-;31515:55;;:::i;:::-;;31471:110;;29085:2377;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28921:112;28966:56;;:::i;:::-;;28921:112;;305:2684:41;;:::o;:::-;;;;;;;:::o;:::-;;;:::o;:::-;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;:::i;:::-;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;:::o;:::-;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;:::o;2214:404:22:-;2277:4;;:::i;:::-;2308:3;2297:22;2298:21;2308:3;2313:5;2298:21;;:::i;:::-;2297:22;;:::i;:::-;2293:319;;;;2493:19;:40;2335:3;:23;:16;:11;:3;:11;:16;:::i;:::-;2352:5;2335:23;;:::i;:::-;2493:12;2515:18;:11;:3;:11;:18;:::i;:::-;2493:3;:12;:19;:::i;:::-;:40;:::i;:::-;2554:4;2547:11;:::o;2293:319::-;2596:5;;;2589:12;:::o;305:2684:41:-;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;:::o;:::-;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;:::o;:::-;;:::i;2786:1388:22:-;2852:4;;:::i;:::-;2989:3;:19;;:12;:3;:12;3002:5;2989:19;;:::i;:::-;;:::i;:::-;3023:10;;:15;;3037:1;3023:15;:::i;:::-;;;:::i;:::-;;;3019:1149;;;;4062:26;3416:10;4069:12;:19;3416:10;;:14;4062:26;3416:10;:14;3429:1;3416:14;:::i;:::-;;;:::i;:::-;3464:22;:18;:3;;:11;:18;:::i;:::-;:22;3485:1;3464:22;:::i;:::-;;;:::i;:::-;3505:9;:26;;3518:13;3505:26;:::i;:::-;;;:::i;:::-;;3501:398;;3019:1149;3977:3;;;:15;;:3;;:11;:15;:::i;:::-;;:::i;:::-;4069:12;:19;:::i;:::-;4062:26;:::i;:::-;4110:4;4103:11;:::o;3501:398::-;3805:36;3571:3;3693:38;3571:22;;3805:23;3571:3;;;:11;:22;:::i;:::-;;;:::i;:::-;3722:9;3693:26;3722:9;3693:3;;;:11;:26;:::i;:::-;:38;;:::i;:::-;3805:3;;;:12;:23;:::i;:::-;:36;:::i;:::-;3501:398;;;;;3019:1149;4152:5;;;;4145:12;:::o;44043:212:29:-;44094:11;;:::i;:::-;44160:89;;44043:212;:::o;44416:1433::-;;;44629:1214;44416:1433;44629:1214;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44416:1433;44629:1214;;;;;;;;;;;;;;;44416:1433;44629:1214;;;;;;;;44416:1433::o;44629:1214::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;952:176:27;;1045:50;1058:37;1101:22;952:176;1058:37;:::i;:::-;1045:50;;:::i;:::-;1101:22;;:::i;:::-;952:176::o;26498:1652:29:-;;;;;26598:25;;:::i;:::-;26594:128;;26498:1652;26774:1235;;;;;;;;;;;;;;;;;;;;;26498:1652;26774:1235;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28022:24;;:::i;:::-;28018:126;;26498:1652;;;:::o;28018:126::-;28100:11;28113:15;28108:2;28100:11;:::i;:::-;;28113:15;:::i;:::-;;28062:71;;:::i;:::-;;28018:126;;;;26774:1235;;;;;;;;;;;;;;;;;;;;;;;;;;;26594:128;26678:11;26686:2;26678:11;:::i;:::-;;26691:15;26699:6;26691:15;:::i;:::-;;26639:72;;:::i;:::-;;26594:128;;46015:1949;;;46253:1705;46015:1949;46253:1705;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46015:1949;46253:1705;;;;;;;;46015:1949::o;46253:1705::-;;;;;;;;;;;;;;;;;;;829:155:18;914:4;;:::i;:::-;937:11;:40;;20194:237:29;952:25:18;;937:40;:::i;:::-;;;:::i;:::-;;930:47;:::o;2732:202:0:-;2817:4;;:::i;:::-;2840:11;;:47;;2855:32;;;2840:47;:::i;:::-;;;:::i;:::-;;:87;;;;;2732:202;2833:94;;:::o;2840:87::-;2891:36;2915:11;;2891:36;:::i;:::-;2840:87;;;4255:127:22;4351:19;4255:127;4351:12;:19;4255:127;4328:4;;:::i;:::-;4351:3;:12;:19;:::i;:::-;;:::i;:::-;:24;;4374:1;4351:24;:::i;:::-;;;:::i;:::-;;;4344:31;:::o" + }, + "methodIdentifiers": { + "DEFAULT_ADMIN_ROLE()": "a217fddf", + "acceptImplicitRequest(address,(address,bytes4,bytes32,bytes32,bytes,(string,uint64)),(address,uint256,bytes,uint256,bool,bool,uint256))": "9d043a66", + "balanceOf(address,uint256)": "00fdd58e", + "balanceOfBatch(address[],uint256[])": "4e1273f4", + "baseURI()": "6c0360eb", + "batchBurn(uint256[],uint256[])": "20ec271b", + "batchMint(address,uint256[],uint256[],bytes)": "b48ab8b6", + "burn(uint256,uint256)": "b390c0ab", + "contractURI()": "e8a3d485", + "getRoleAdmin(bytes32)": "248a9ca3", + "getRoleMember(bytes32,uint256)": "9010d07c", + "getRoleMemberCount(bytes32)": "ca15c873", + "grantRole(bytes32,address)": "2f2ff15d", + "hasRole(bytes32,address)": "91d14854", + "initialize(address,string,string,string,address,uint96,address,bytes32)": "8ff83ac1", + "isApprovedForAll(address,address)": "e985e9c5", + "mint(address,uint256,uint256,bytes)": "731133e9", + "name()": "06fdde03", + "renounceRole(bytes32,address)": "36568abe", + "revokeRole(bytes32,address)": "d547741f", + "royaltyInfo(uint256,uint256)": "2a55205a", + "safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)": "2eb2c2d6", + "safeTransferFrom(address,address,uint256,uint256,bytes)": "f242432a", + "setApprovalForAll(address,bool)": "a22cb465", + "setBaseMetadataURI(string)": "7e518ec8", + "setContractName(string)": "0b5ee006", + "setContractURI(string)": "938e3d7b", + "setDefaultRoyalty(address,uint96)": "04634d8d", + "setImplicitModeProjectId(bytes32)": "ed4c2ac7", + "setImplicitModeValidator(address)": "0bb310de", + "setTokenRoyalty(uint256,address,uint96)": "5944c753", + "supportsInterface(bytes4)": "01ffc9a7", + "tokenSupply(uint256)": "2693ebf2", + "totalSupply()": "18160ddd", + "uri(uint256)": "0e89341c" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"AccountBalanceOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ArrayLengthsMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidArrayLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotOwnerNorApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToNonERC1155ReceiverImplementer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isApproved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"TransferBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TransferSingle\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"value\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"URI\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wallet\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"approvedSigner\",\"type\":\"address\"},{\"internalType\":\"bytes4\",\"name\":\"identityType\",\"type\":\"bytes4\"},{\"internalType\":\"bytes32\",\"name\":\"issuerHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"audienceHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"applicationData\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"redirectUrl\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"issuedAt\",\"type\":\"uint64\"}],\"internalType\":\"struct AuthData\",\"name\":\"authData\",\"type\":\"tuple\"}],\"internalType\":\"struct Attestation\",\"name\":\"attestation\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"delegateCall\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"onlyFallback\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"behaviorOnError\",\"type\":\"uint256\"}],\"internalType\":\"struct Payload.Call\",\"name\":\"call\",\"type\":\"tuple\"}],\"name\":\"acceptImplicitRequest\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"result\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"owners\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"}],\"name\":\"balanceOfBatch\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"balances\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"baseURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"batchBurn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"batchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"contractURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"getRoleMember\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleMemberCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenBaseURI\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenContractURI\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"royaltyReceiver\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"royaltyFeeNumerator\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"implicitModeValidator\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"implicitModeProjectId\",\"type\":\"bytes32\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"salePrice\",\"type\":\"uint256\"}],\"name\":\"royaltyInfo\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeBatchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isApproved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenBaseURI\",\"type\":\"string\"}],\"name\":\"setBaseMetadataURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"}],\"name\":\"setContractName\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenContractURI\",\"type\":\"string\"}],\"name\":\"setContractURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"feeNumerator\",\"type\":\"uint96\"}],\"name\":\"setDefaultRoyalty\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"projectId\",\"type\":\"bytes32\"}],\"name\":\"setImplicitModeProjectId\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"setImplicitModeValidator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"feeNumerator\",\"type\":\"uint96\"}],\"name\":\"setTokenRoyalty\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"tokenSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"}],\"name\":\"uri\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AccountBalanceOverflow()\":[{\"details\":\"The recipient's balance has overflowed.\"}],\"ArrayLengthsMismatch()\":[{\"details\":\"The lengths of the input arrays are not the same.\"}],\"InsufficientBalance()\":[{\"details\":\"Insufficient balance.\"}],\"NotOwnerNorApproved()\":[{\"details\":\"Only the token owner or an approved account can manage the tokens.\"}],\"TransferToNonERC1155ReceiverImplementer()\":[{\"details\":\"Cannot safely transfer to a contract that does not implement the ERC1155Receiver interface.\"}],\"TransferToZeroAddress()\":[{\"details\":\"Cannot mint or transfer to the zero address.\"}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"details\":\"Emitted when `owner` enables or disables `operator` to manage all of their tokens.\"},\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this. _Available since v3.1._\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)\"},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"details\":\"Emitted when `amounts` of token `ids` are transferred from `from` to `to` by `operator`.\"},\"TransferSingle(address,address,address,uint256,uint256)\":{\"details\":\"Emitted when `amount` of token `id` is transferred from `from` to `to` by `operator`.\"},\"URI(string,uint256)\":{\"details\":\"Emitted when the Uniform Resource Identifier (URI) for token `id` is updated to `value`. This event is not used in the base contract. You may need to emit this event depending on your URI logic. See: https://eips.ethereum.org/EIPS/eip-1155#metadata\"}},\"kind\":\"dev\",\"methods\":{\"acceptImplicitRequest(address,(address,bytes4,bytes32,bytes32,bytes,(string,uint64)),(address,uint256,bytes,uint256,bool,bool,uint256))\":{\"params\":{\"attestation\":\"The attestation data\",\"call\":\"The call to validate\",\"wallet\":\"The wallet's address\"},\"returns\":{\"_0\":\"The hash of the implicit request if valid\"}},\"balanceOf(address,uint256)\":{\"details\":\"Returns the amount of `id` owned by `owner`.\"},\"balanceOfBatch(address[],uint256[])\":{\"details\":\"Returns the amounts of `ids` for `owners. Requirements: - `owners` and `ids` must have the same length.\"},\"batchBurn(uint256[],uint256[])\":{\"params\":{\"amounts\":\"Array of the amount to be burned\",\"tokenIds\":\"Array of token ids to burn\"}},\"batchMint(address,uint256[],uint256[],bytes)\":{\"params\":{\"amounts\":\"Amounts of tokens to mint.\",\"data\":\"Data to pass if receiver is contract.\",\"to\":\"Address to mint tokens to.\",\"tokenIds\":\"Token IDs to mint.\"}},\"burn(uint256,uint256)\":{\"params\":{\"amount\":\"Amount of tokens to burn\",\"tokenId\":\"Id of token to burn\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"getRoleMember(bytes32,uint256)\":{\"details\":\"Returns one of the accounts that have `role`. `index` must be a value between 0 and {getRoleMemberCount}, non-inclusive. Role bearers are not sorted in any particular way, and their ordering may change at any point. WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure you perform all queries on the same block. See the following https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] for more information.\"},\"getRoleMemberCount(bytes32)\":{\"details\":\"Returns the number of accounts that have `role`. Can be used together with {getRoleMember} to enumerate all bearers of a role.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"initialize(address,string,string,string,address,uint96,address,bytes32)\":{\"details\":\"This should be called immediately after deployment.\",\"params\":{\"implicitModeProjectId\":\"The implicit mode project id\",\"implicitModeValidator\":\"The implicit mode validator address\",\"owner\":\"Owner address\",\"royaltyFeeNumerator\":\"The royalty fee numerator in basis points (e.g. 15% would be 1500)\",\"royaltyReceiver\":\"Address of who should be sent the royalty payment\",\"tokenBaseURI\":\"Base URI for token metadata\",\"tokenContractURI\":\"Contract URI for token metadata\",\"tokenName\":\"Token name\"}},\"isApprovedForAll(address,address)\":{\"details\":\"Returns whether `operator` is approved to manage the tokens of `owner`.\"},\"mint(address,uint256,uint256,bytes)\":{\"params\":{\"amount\":\"Amount of tokens to mint.\",\"data\":\"Data to pass if receiver is contract.\",\"to\":\"Address to mint tokens to.\",\"tokenId\":\"Token ID to mint.\"}},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"royaltyInfo(uint256,uint256)\":{\"details\":\"Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of exchange. The royalty amount is denominated and should be paid in that same unit of exchange.\"},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"details\":\"Transfers `amounts` of `ids` from `from` to `to`. Requirements: - `to` cannot be the zero address. - `from` must have at least `amount` of `id`. - `ids` and `amounts` must have the same length. - If the caller is not `from`, it must be approved to manage the tokens of `from`. - If `to` refers to a smart contract, it must implement {ERC1155-onERC1155BatchReceived}, which is called upon a batch transfer. Emits a {TransferBatch} event.\"},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"details\":\"Transfers `amount` of `id` from `from` to `to`. Requirements: - `to` cannot be the zero address. - `from` must have at least `amount` of `id`. - If the caller is not `from`, it must be approved to manage the tokens of `from`. - If `to` refers to a smart contract, it must implement {ERC1155-onERC1155Received}, which is called upon a batch transfer. Emits a {TransferSingle} event.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"Sets whether `operator` is approved to manage the tokens of the caller. Emits a {ApprovalForAll} event.\"},\"setBaseMetadataURI(string)\":{\"params\":{\"tokenBaseURI\":\"New base URI of token's URI\"}},\"setContractName(string)\":{\"params\":{\"tokenName\":\"New contract name\"}},\"setContractURI(string)\":{\"params\":{\"tokenContractURI\":\"New contract URI of token's URI\"}},\"setDefaultRoyalty(address,uint96)\":{\"params\":{\"feeNumerator\":\"The royalty fee numerator in basis points (e.g. 15% would be 1500)\",\"receiver\":\"Address of who should be sent the royalty payment\"}},\"setImplicitModeProjectId(bytes32)\":{\"params\":{\"projectId\":\"The project id.\"}},\"setImplicitModeValidator(address)\":{\"params\":{\"validator\":\"The validator address.\"}},\"setTokenRoyalty(uint256,address,uint96)\":{\"params\":{\"feeNumerator\":\"The royalty fee numerator in basis points (e.g. 15% would be 1500)\",\"receiver\":\"Address of who should be sent the royalty payment\",\"tokenId\":\"The token id to set the royalty information for\"}},\"supportsInterface(bytes4)\":{\"params\":{\"interfaceId\":\"Interface id\"},\"returns\":{\"_0\":\"True if supported\"}},\"uri(uint256)\":{\"details\":\"Returns the URI for token `id`. You can either return the same templated URI for all token IDs, (e.g. \\\"https://example.com/api/{id}.json\\\"), or return a unique URI for each `id`. See: https://eips.ethereum.org/EIPS/eip-1155#metadata\"}},\"version\":1},\"userdoc\":{\"errors\":{\"InvalidArrayLength()\":[{\"notice\":\"Invalid array input length.\"}],\"InvalidInitialization()\":[{\"notice\":\"Invalid initialization error.\"}]},\"kind\":\"user\",\"methods\":{\"acceptImplicitRequest(address,(address,bytes4,bytes32,bytes32,bytes,(string,uint64)),(address,uint256,bytes,uint256,bool,bool,uint256))\":{\"notice\":\"Determines if an implicit request is valid\"},\"batchBurn(uint256[],uint256[])\":{\"notice\":\"Burn tokens of given token id for each (tokenIds[i], amounts[i]) pair.\"},\"batchMint(address,uint256[],uint256[],bytes)\":{\"notice\":\"Mint tokens.\"},\"burn(uint256,uint256)\":{\"notice\":\"Allows the owner of the token to burn their tokens.\"},\"initialize(address,string,string,string,address,uint96,address,bytes32)\":{\"notice\":\"Initialize the contract.\"},\"mint(address,uint256,uint256,bytes)\":{\"notice\":\"Mint tokens.\"},\"setBaseMetadataURI(string)\":{\"notice\":\"Update the base URI of token's URI.\"},\"setContractName(string)\":{\"notice\":\"Update the name of the contract.\"},\"setContractURI(string)\":{\"notice\":\"Update the contract URI of token's URI.Refer to https://docs.opensea.io/docs/contract-level-metadata\"},\"setDefaultRoyalty(address,uint96)\":{\"notice\":\"Sets the royalty information that all ids in this contract will default to.\"},\"setImplicitModeProjectId(bytes32)\":{\"notice\":\"Updates the settings for implicit mode validation.Only callable by an address with the project admin role.\"},\"setImplicitModeValidator(address)\":{\"notice\":\"Updates the validator for implicit mode validation.Only callable by an address with the project admin role.\"},\"setTokenRoyalty(uint256,address,uint96)\":{\"notice\":\"Sets the royalty information that a given token id in this contract will use.This overrides the default royalty information for this token id\"},\"supportsInterface(bytes4)\":{\"notice\":\"Check interface support.\"}},\"notice\":\"An implementation of ERC-1155 capable of minting when role provided.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/tokens/ERC1155/presets/items/ERC1155Items.sol\":\"ERC1155Items\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Strings.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```solidity\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```solidity\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}\\n * to enforce additional security measures for this role.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n * Overriding this function changes the behavior of the {onlyRole} modifier.\\n *\\n * Format of the revert message is described in {_checkRole}.\\n *\\n * _Available since v4.6._\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n Strings.toHexString(account),\\n \\\" is missing role \\\",\\n Strings.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * May emit a {RoleGranted} event.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n}\\n\",\"keccak256\":\"0x0dd6e52cb394d7f5abe5dca2d4908a6be40417914720932de757de34a99ab87f\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/access/AccessControlEnumerable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControlEnumerable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControlEnumerable.sol\\\";\\nimport \\\"./AccessControl.sol\\\";\\nimport \\\"../utils/structs/EnumerableSet.sol\\\";\\n\\n/**\\n * @dev Extension of {AccessControl} that allows enumerating the members of each role.\\n */\\nabstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl {\\n using EnumerableSet for EnumerableSet.AddressSet;\\n\\n mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers;\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns one of the accounts that have `role`. `index` must be a\\n * value between 0 and {getRoleMemberCount}, non-inclusive.\\n *\\n * Role bearers are not sorted in any particular way, and their ordering may\\n * change at any point.\\n *\\n * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure\\n * you perform all queries on the same block. See the following\\n * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]\\n * for more information.\\n */\\n function getRoleMember(bytes32 role, uint256 index) public view virtual override returns (address) {\\n return _roleMembers[role].at(index);\\n }\\n\\n /**\\n * @dev Returns the number of accounts that have `role`. Can be used\\n * together with {getRoleMember} to enumerate all bearers of a role.\\n */\\n function getRoleMemberCount(bytes32 role) public view virtual override returns (uint256) {\\n return _roleMembers[role].length();\\n }\\n\\n /**\\n * @dev Overload {_grantRole} to track enumerable memberships\\n */\\n function _grantRole(bytes32 role, address account) internal virtual override {\\n super._grantRole(role, account);\\n _roleMembers[role].add(account);\\n }\\n\\n /**\\n * @dev Overload {_revokeRole} to track enumerable memberships\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual override {\\n super._revokeRole(role, account);\\n _roleMembers[role].remove(account);\\n }\\n}\\n\",\"keccak256\":\"0x13f5e15f2a0650c0b6aaee2ef19e89eaf4870d6e79662d572a393334c1397247\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/access/IAccessControlEnumerable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControlEnumerable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\n\\n/**\\n * @dev External interface of AccessControlEnumerable declared to support ERC165 detection.\\n */\\ninterface IAccessControlEnumerable is IAccessControl {\\n /**\\n * @dev Returns one of the accounts that have `role`. `index` must be a\\n * value between 0 and {getRoleMemberCount}, non-inclusive.\\n *\\n * Role bearers are not sorted in any particular way, and their ordering may\\n * change at any point.\\n *\\n * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure\\n * you perform all queries on the same block. See the following\\n * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]\\n * for more information.\\n */\\n function getRoleMember(bytes32 role, uint256 index) external view returns (address);\\n\\n /**\\n * @dev Returns the number of accounts that have `role`. Can be used\\n * together with {getRoleMember} to enumerate all bearers of a role.\\n */\\n function getRoleMemberCount(bytes32 role) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0xba4459ab871dfa300f5212c6c30178b63898c03533a1ede28436f11546626676\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/interfaces/IERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC2981.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Interface for the NFT Royalty Standard.\\n *\\n * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal\\n * support for royalty payments across all NFT marketplaces and ecosystem participants.\\n *\\n * _Available since v4.5._\\n */\\ninterface IERC2981 is IERC165 {\\n /**\\n * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of\\n * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.\\n */\\n function royaltyInfo(\\n uint256 tokenId,\\n uint256 salePrice\\n ) external view returns (address receiver, uint256 royaltyAmount);\\n}\\n\",\"keccak256\":\"0x3976825a61df20457730b79ad0ac9c8908e3c7978ed9bf090c67137c91256b5c\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/token/common/ERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/common/ERC2981.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/IERC2981.sol\\\";\\nimport \\\"../../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.\\n *\\n * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for\\n * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.\\n *\\n * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the\\n * fee is specified in basis points by default.\\n *\\n * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See\\n * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to\\n * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.\\n *\\n * _Available since v4.5._\\n */\\nabstract contract ERC2981 is IERC2981, ERC165 {\\n struct RoyaltyInfo {\\n address receiver;\\n uint96 royaltyFraction;\\n }\\n\\n RoyaltyInfo private _defaultRoyaltyInfo;\\n mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\\n return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @inheritdoc IERC2981\\n */\\n function royaltyInfo(uint256 tokenId, uint256 salePrice) public view virtual override returns (address, uint256) {\\n RoyaltyInfo memory royalty = _tokenRoyaltyInfo[tokenId];\\n\\n if (royalty.receiver == address(0)) {\\n royalty = _defaultRoyaltyInfo;\\n }\\n\\n uint256 royaltyAmount = (salePrice * royalty.royaltyFraction) / _feeDenominator();\\n\\n return (royalty.receiver, royaltyAmount);\\n }\\n\\n /**\\n * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a\\n * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an\\n * override.\\n */\\n function _feeDenominator() internal pure virtual returns (uint96) {\\n return 10000;\\n }\\n\\n /**\\n * @dev Sets the royalty information that all ids in this contract will default to.\\n *\\n * Requirements:\\n *\\n * - `receiver` cannot be the zero address.\\n * - `feeNumerator` cannot be greater than the fee denominator.\\n */\\n function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {\\n require(feeNumerator <= _feeDenominator(), \\\"ERC2981: royalty fee will exceed salePrice\\\");\\n require(receiver != address(0), \\\"ERC2981: invalid receiver\\\");\\n\\n _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);\\n }\\n\\n /**\\n * @dev Removes default royalty information.\\n */\\n function _deleteDefaultRoyalty() internal virtual {\\n delete _defaultRoyaltyInfo;\\n }\\n\\n /**\\n * @dev Sets the royalty information for a specific token id, overriding the global default.\\n *\\n * Requirements:\\n *\\n * - `receiver` cannot be the zero address.\\n * - `feeNumerator` cannot be greater than the fee denominator.\\n */\\n function _setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal virtual {\\n require(feeNumerator <= _feeDenominator(), \\\"ERC2981: royalty fee will exceed salePrice\\\");\\n require(receiver != address(0), \\\"ERC2981: Invalid parameters\\\");\\n\\n _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);\\n }\\n\\n /**\\n * @dev Resets royalty information for the token id back to the global default.\\n */\\n function _resetTokenRoyalty(uint256 tokenId) internal virtual {\\n delete _tokenRoyaltyInfo[tokenId];\\n }\\n}\\n\",\"keccak256\":\"0x990a4133f88b07f92724903f42bb25cdaeca0cf255fb48df26568c40e7c919c6\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\nimport \\\"./math/SignedMath.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\\n */\\n function toString(int256 value) internal pure returns (string memory) {\\n return string(abi.encodePacked(value < 0 ? \\\"-\\\" : \\\"\\\", toString(SignedMath.abs(value))));\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n\\n /**\\n * @dev Returns true if the two strings are equal.\\n */\\n function equal(string memory a, string memory b) internal pure returns (bool) {\\n return keccak256(bytes(a)) == keccak256(bytes(b));\\n }\\n}\\n\",\"keccak256\":\"0x3088eb2868e8d13d89d16670b5f8612c4ab9ff8956272837d8e90106c59c14a0\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\\n // The surrounding unchecked block does not change this fact.\\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1, \\\"Math: mulDiv overflow\\\");\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10 ** 64) {\\n value /= 10 ** 64;\\n result += 64;\\n }\\n if (value >= 10 ** 32) {\\n value /= 10 ** 32;\\n result += 32;\\n }\\n if (value >= 10 ** 16) {\\n value /= 10 ** 16;\\n result += 16;\\n }\\n if (value >= 10 ** 8) {\\n value /= 10 ** 8;\\n result += 8;\\n }\\n if (value >= 10 ** 4) {\\n value /= 10 ** 4;\\n result += 4;\\n }\\n if (value >= 10 ** 2) {\\n value /= 10 ** 2;\\n result += 2;\\n }\\n if (value >= 10 ** 1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard signed math utilities missing in the Solidity language.\\n */\\nlibrary SignedMath {\\n /**\\n * @dev Returns the largest of two signed numbers.\\n */\\n function max(int256 a, int256 b) internal pure returns (int256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two signed numbers.\\n */\\n function min(int256 a, int256 b) internal pure returns (int256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two signed numbers without overflow.\\n * The result is rounded towards zero.\\n */\\n function average(int256 a, int256 b) internal pure returns (int256) {\\n // Formula from the book \\\"Hacker's Delight\\\"\\n int256 x = (a & b) + ((a ^ b) >> 1);\\n return x + (int256(uint256(x) >> 255) & (a ^ b));\\n }\\n\\n /**\\n * @dev Returns the absolute unsigned value of a signed value.\\n */\\n function abs(int256 n) internal pure returns (uint256) {\\n unchecked {\\n // must be unchecked in order to support `n = type(int256).min`\\n return uint256(n >= 0 ? n : -n);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/EnumerableSet.sol)\\n// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for managing\\n * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive\\n * types.\\n *\\n * Sets have the following properties:\\n *\\n * - Elements are added, removed, and checked for existence in constant time\\n * (O(1)).\\n * - Elements are enumerated in O(n). No guarantees are made on the ordering.\\n *\\n * ```solidity\\n * contract Example {\\n * // Add the library methods\\n * using EnumerableSet for EnumerableSet.AddressSet;\\n *\\n * // Declare a set state variable\\n * EnumerableSet.AddressSet private mySet;\\n * }\\n * ```\\n *\\n * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)\\n * and `uint256` (`UintSet`) are supported.\\n *\\n * [WARNING]\\n * ====\\n * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure\\n * unusable.\\n * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.\\n *\\n * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an\\n * array of EnumerableSet.\\n * ====\\n */\\nlibrary EnumerableSet {\\n // To implement this library for multiple types with as little code\\n // repetition as possible, we write it in terms of a generic Set type with\\n // bytes32 values.\\n // The Set implementation uses private functions, and user-facing\\n // implementations (such as AddressSet) are just wrappers around the\\n // underlying Set.\\n // This means that we can only create new EnumerableSets for types that fit\\n // in bytes32.\\n\\n struct Set {\\n // Storage of set values\\n bytes32[] _values;\\n // Position of the value in the `values` array, plus 1 because index 0\\n // means a value is not in the set.\\n mapping(bytes32 => uint256) _indexes;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function _add(Set storage set, bytes32 value) private returns (bool) {\\n if (!_contains(set, value)) {\\n set._values.push(value);\\n // The value is stored at length-1, but we add 1 to all indexes\\n // and use 0 as a sentinel value\\n set._indexes[value] = set._values.length;\\n return true;\\n } else {\\n return false;\\n }\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function _remove(Set storage set, bytes32 value) private returns (bool) {\\n // We read and store the value's index to prevent multiple reads from the same storage slot\\n uint256 valueIndex = set._indexes[value];\\n\\n if (valueIndex != 0) {\\n // Equivalent to contains(set, value)\\n // To delete an element from the _values array in O(1), we swap the element to delete with the last one in\\n // the array, and then remove the last element (sometimes called as 'swap and pop').\\n // This modifies the order of the array, as noted in {at}.\\n\\n uint256 toDeleteIndex = valueIndex - 1;\\n uint256 lastIndex = set._values.length - 1;\\n\\n if (lastIndex != toDeleteIndex) {\\n bytes32 lastValue = set._values[lastIndex];\\n\\n // Move the last value to the index where the value to delete is\\n set._values[toDeleteIndex] = lastValue;\\n // Update the index for the moved value\\n set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex\\n }\\n\\n // Delete the slot where the moved value was stored\\n set._values.pop();\\n\\n // Delete the index for the deleted slot\\n delete set._indexes[value];\\n\\n return true;\\n } else {\\n return false;\\n }\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function _contains(Set storage set, bytes32 value) private view returns (bool) {\\n return set._indexes[value] != 0;\\n }\\n\\n /**\\n * @dev Returns the number of values on the set. O(1).\\n */\\n function _length(Set storage set) private view returns (uint256) {\\n return set._values.length;\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function _at(Set storage set, uint256 index) private view returns (bytes32) {\\n return set._values[index];\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function _values(Set storage set) private view returns (bytes32[] memory) {\\n return set._values;\\n }\\n\\n // Bytes32Set\\n\\n struct Bytes32Set {\\n Set _inner;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {\\n return _add(set._inner, value);\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {\\n return _remove(set._inner, value);\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {\\n return _contains(set._inner, value);\\n }\\n\\n /**\\n * @dev Returns the number of values in the set. O(1).\\n */\\n function length(Bytes32Set storage set) internal view returns (uint256) {\\n return _length(set._inner);\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {\\n return _at(set._inner, index);\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {\\n bytes32[] memory store = _values(set._inner);\\n bytes32[] memory result;\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := store\\n }\\n\\n return result;\\n }\\n\\n // AddressSet\\n\\n struct AddressSet {\\n Set _inner;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function add(AddressSet storage set, address value) internal returns (bool) {\\n return _add(set._inner, bytes32(uint256(uint160(value))));\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function remove(AddressSet storage set, address value) internal returns (bool) {\\n return _remove(set._inner, bytes32(uint256(uint160(value))));\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function contains(AddressSet storage set, address value) internal view returns (bool) {\\n return _contains(set._inner, bytes32(uint256(uint160(value))));\\n }\\n\\n /**\\n * @dev Returns the number of values in the set. O(1).\\n */\\n function length(AddressSet storage set) internal view returns (uint256) {\\n return _length(set._inner);\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function at(AddressSet storage set, uint256 index) internal view returns (address) {\\n return address(uint160(uint256(_at(set._inner, index))));\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function values(AddressSet storage set) internal view returns (address[] memory) {\\n bytes32[] memory store = _values(set._inner);\\n address[] memory result;\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := store\\n }\\n\\n return result;\\n }\\n\\n // UintSet\\n\\n struct UintSet {\\n Set _inner;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function add(UintSet storage set, uint256 value) internal returns (bool) {\\n return _add(set._inner, bytes32(value));\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function remove(UintSet storage set, uint256 value) internal returns (bool) {\\n return _remove(set._inner, bytes32(value));\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function contains(UintSet storage set, uint256 value) internal view returns (bool) {\\n return _contains(set._inner, bytes32(value));\\n }\\n\\n /**\\n * @dev Returns the number of values in the set. O(1).\\n */\\n function length(UintSet storage set) internal view returns (uint256) {\\n return _length(set._inner);\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function at(UintSet storage set, uint256 index) internal view returns (uint256) {\\n return uint256(_at(set._inner, index));\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function values(UintSet storage set) internal view returns (uint256[] memory) {\\n bytes32[] memory store = _values(set._inner);\\n uint256[] memory result;\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := store\\n }\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0x9f4357008a8f7d8c8bf5d48902e789637538d8c016be5766610901b4bba81514\",\"license\":\"MIT\"},\"lib/signals-implicit-mode/lib/sequence-v3/src/extensions/sessions/implicit/Attestation.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.27;\\n\\nimport { LibBytes } from \\\"../../../utils/LibBytes.sol\\\";\\nimport { ACCEPT_IMPLICIT_REQUEST_MAGIC_PREFIX } from \\\"./ISignalsImplicitMode.sol\\\";\\n\\nusing LibBytes for bytes;\\n\\n/// @notice Attestation for a specific session\\n/// @param approvedSigner Address of the approved signer\\n/// @param identityType Identity type\\n/// @param issuerHash Hash of the issuer\\n/// @param audienceHash Hash of the audience\\n/// @param applicationData Unspecified application data\\n/// @param authData Auth data\\nstruct Attestation {\\n address approvedSigner;\\n bytes4 identityType;\\n bytes32 issuerHash;\\n bytes32 audienceHash;\\n bytes applicationData;\\n AuthData authData;\\n}\\n\\n/// @notice Auth data for an attestation\\n/// @param redirectUrl Authorization redirect URL\\n/// @param issuedAt Timestamp of the attestation issuance\\nstruct AuthData {\\n string redirectUrl;\\n uint64 issuedAt;\\n}\\n\\n/// @title LibAttestation\\n/// @author Michael Standen\\n/// @notice Library for attestation management\\nlibrary LibAttestation {\\n\\n /// @notice Hashes an attestation\\n function toHash(\\n Attestation memory attestation\\n ) internal pure returns (bytes32) {\\n return keccak256(toPacked(attestation));\\n }\\n\\n /// @notice Decodes an attestation from a packed bytes array\\n /// @param encoded The packed bytes array\\n /// @param pointer The pointer to the start of the attestation\\n /// @return attestation The decoded attestation\\n /// @return newPointer The new pointer to the end of the attestation\\n function fromPacked(\\n bytes calldata encoded,\\n uint256 pointer\\n ) internal pure returns (Attestation memory attestation, uint256 newPointer) {\\n newPointer = pointer;\\n (attestation.approvedSigner, newPointer) = encoded.readAddress(newPointer);\\n (attestation.identityType, newPointer) = encoded.readBytes4(newPointer);\\n (attestation.issuerHash, newPointer) = encoded.readBytes32(newPointer);\\n (attestation.audienceHash, newPointer) = encoded.readBytes32(newPointer);\\n // Application data (arbitrary bytes)\\n uint256 dataSize;\\n (dataSize, newPointer) = encoded.readUint24(newPointer);\\n attestation.applicationData = encoded[newPointer:newPointer + dataSize];\\n newPointer += dataSize;\\n // Auth data\\n (attestation.authData, newPointer) = fromPackedAuthData(encoded, newPointer);\\n return (attestation, newPointer);\\n }\\n\\n /// @notice Decodes the auth data from a packed bytes\\n /// @param encoded The packed bytes containing the auth data\\n /// @param pointer The pointer to the start of the auth data within the encoded data\\n /// @return authData The decoded auth data\\n /// @return newPointer The pointer to the end of the auth data within the encoded data\\n function fromPackedAuthData(\\n bytes calldata encoded,\\n uint256 pointer\\n ) internal pure returns (AuthData memory authData, uint256 newPointer) {\\n uint24 redirectUrlLength;\\n (redirectUrlLength, pointer) = encoded.readUint24(pointer);\\n authData.redirectUrl = string(encoded[pointer:pointer + redirectUrlLength]);\\n pointer += redirectUrlLength;\\n (authData.issuedAt, pointer) = encoded.readUint64(pointer);\\n return (authData, pointer);\\n }\\n\\n /// @notice Encodes an attestation into a packed bytes array\\n /// @param attestation The attestation to encode\\n /// @return encoded The packed bytes array\\n function toPacked(\\n Attestation memory attestation\\n ) internal pure returns (bytes memory encoded) {\\n return abi.encodePacked(\\n attestation.approvedSigner,\\n attestation.identityType,\\n attestation.issuerHash,\\n attestation.audienceHash,\\n uint24(attestation.applicationData.length),\\n attestation.applicationData,\\n toPackAuthData(attestation.authData)\\n );\\n }\\n\\n /// @notice Encodes the auth data into a packed bytes array\\n /// @param authData The auth data to encode\\n /// @return encoded The packed bytes array\\n function toPackAuthData(\\n AuthData memory authData\\n ) internal pure returns (bytes memory encoded) {\\n return abi.encodePacked(uint24(bytes(authData.redirectUrl).length), bytes(authData.redirectUrl), authData.issuedAt);\\n }\\n\\n /// @notice Generates the implicit request magic return value\\n /// @param attestation The attestation\\n /// @param wallet The wallet\\n /// @return magic The expected implicit request magic\\n function generateImplicitRequestMagic(Attestation memory attestation, address wallet) internal pure returns (bytes32) {\\n return keccak256(\\n abi.encodePacked(ACCEPT_IMPLICIT_REQUEST_MAGIC_PREFIX, wallet, attestation.audienceHash, attestation.issuerHash)\\n );\\n }\\n\\n}\\n\",\"keccak256\":\"0xcaa44022b5eb4bc7ab487b3b1a0125da67e2e891cee983ef6cdb6814f045efc8\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/lib/sequence-v3/src/extensions/sessions/implicit/ISignalsImplicitMode.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.27;\\n\\nimport { Payload } from \\\"../../../modules/Payload.sol\\\";\\nimport { Attestation } from \\\"./Attestation.sol\\\";\\n\\n/// @dev Magic prefix for the implicit request\\nbytes32 constant ACCEPT_IMPLICIT_REQUEST_MAGIC_PREFIX = keccak256(abi.encodePacked(\\\"acceptImplicitRequest\\\"));\\n\\n/// @title ISignalsImplicitMode\\n/// @author Agustin Aguilar, Michael Standen\\n/// @notice Interface for the contracts that support implicit mode validation\\ninterface ISignalsImplicitMode {\\n\\n /// @notice Determines if an implicit request is valid\\n /// @param wallet The wallet's address\\n /// @param attestation The attestation data\\n /// @param call The call to validate\\n /// @return magic The hash of the implicit request if valid\\n function acceptImplicitRequest(\\n address wallet,\\n Attestation calldata attestation,\\n Payload.Call calldata call\\n ) external view returns (bytes32 magic);\\n\\n}\\n\",\"keccak256\":\"0x6cb48f50c49bcb3c7071306fe9fac6c102bc9eabf73d9909e19ab3b9a835d0a8\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/lib/sequence-v3/src/modules/Payload.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.27;\\n\\nimport { LibBytes } from \\\"../utils/LibBytes.sol\\\";\\n\\nusing LibBytes for bytes;\\n\\n/// @title Payload\\n/// @author Agustin Aguilar, Michael Standen, William Hua\\n/// @notice Library for encoding and decoding payloads\\nlibrary Payload {\\n\\n /// @notice Error thrown when the kind is invalid\\n error InvalidKind(uint8 kind);\\n\\n /// @dev keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\")\\n bytes32 private constant EIP712_DOMAIN_TYPEHASH = 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f;\\n\\n /// @dev keccak256(\\\"Sequence Wallet\\\")\\n bytes32 private constant EIP712_DOMAIN_NAME_SEQUENCE =\\n 0x4aa45ca7ad825ceb1bf35643f0a58c295239df563b1b565c2485f96477c56318;\\n\\n /// @dev keccak256(\\\"3\\\")\\n bytes32 private constant EIP712_DOMAIN_VERSION_SEQUENCE =\\n 0x2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de;\\n\\n function domainSeparator(bool _noChainId, address _wallet) internal view returns (bytes32 _domainSeparator) {\\n return keccak256(\\n abi.encode(\\n EIP712_DOMAIN_TYPEHASH,\\n EIP712_DOMAIN_NAME_SEQUENCE,\\n EIP712_DOMAIN_VERSION_SEQUENCE,\\n _noChainId ? uint256(0) : uint256(block.chainid),\\n _wallet\\n )\\n );\\n }\\n\\n /// @dev keccak256(\\\"Call(address to,uint256 value,bytes data,uint256 gasLimit,bool delegateCall,bool onlyFallback,uint256 behaviorOnError)\\\")\\n bytes32 private constant CALL_TYPEHASH = 0x0603985259a953da1f65a522f589c17bd1d0117ec1d3abb7c0788aef251ef437;\\n\\n /// @dev keccak256(\\\"Calls(Call[] calls,uint256 space,uint256 nonce,address[] wallets)Call(address to,uint256 value,bytes data,uint256 gasLimit,bool delegateCall,bool onlyFallback,uint256 behaviorOnError)\\\")\\n bytes32 private constant CALLS_TYPEHASH = 0x11e1e4079a79a66e4ade50033cfe2678cdd5341d2dfe5ef9513edb1a0be147a2;\\n\\n /// @dev keccak256(\\\"Message(bytes message,address[] wallets)\\\")\\n bytes32 private constant MESSAGE_TYPEHASH = 0xe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d466;\\n\\n /// @dev keccak256(\\\"ConfigUpdate(bytes32 imageHash,address[] wallets)\\\")\\n bytes32 private constant CONFIG_UPDATE_TYPEHASH = 0x11fdeb7e8373a1aa96bfac8d0ea91526b2c5d15e5cee20e0543e780258f3e8e4;\\n\\n /// @notice Kind of transaction\\n uint8 public constant KIND_TRANSACTIONS = 0x00;\\n /// @notice Kind of digest\\n uint8 public constant KIND_MESSAGE = 0x01;\\n /// @notice Kind of config update\\n uint8 public constant KIND_CONFIG_UPDATE = 0x02;\\n /// @notice Kind of message\\n uint8 public constant KIND_DIGEST = 0x03;\\n\\n /// @notice Behavior on error: ignore error\\n uint8 public constant BEHAVIOR_IGNORE_ERROR = 0x00;\\n /// @notice Behavior on error: revert on error\\n uint8 public constant BEHAVIOR_REVERT_ON_ERROR = 0x01;\\n /// @notice Behavior on error: abort on error\\n uint8 public constant BEHAVIOR_ABORT_ON_ERROR = 0x02;\\n\\n /// @notice Payload call information\\n /// @param to Address of the target contract\\n /// @param value Value to send with the call\\n /// @param data Data to send with the call\\n /// @param gasLimit Gas limit for the call\\n /// @param delegateCall If the call is a delegate call\\n /// @param onlyFallback If the call should only be executed in an error scenario\\n /// @param behaviorOnError Behavior on error\\n struct Call {\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 gasLimit;\\n bool delegateCall;\\n bool onlyFallback;\\n uint256 behaviorOnError;\\n }\\n\\n /// @notice Decoded payload\\n /// @param kind Kind of payload\\n /// @param noChainId If the chain ID should be omitted\\n /// @param calls Array of calls (transaction kind)\\n /// @param space Nonce space for the calls (transaction kind)\\n /// @param nonce Nonce value for the calls (transaction kind)\\n /// @param message Message to validate (message kind)\\n /// @param imageHash Image hash to update to (config update kind)\\n /// @param digest Digest to validate (digest kind)\\n /// @param parentWallets Parent wallets\\n struct Decoded {\\n uint8 kind;\\n bool noChainId;\\n // Transaction kind\\n Call[] calls;\\n uint256 space;\\n uint256 nonce;\\n // Message kind\\n // TODO: Maybe native 721 ?\\n bytes message;\\n // Config update kind\\n bytes32 imageHash;\\n // Digest kind for 1271\\n bytes32 digest;\\n // Parent wallets\\n address[] parentWallets;\\n }\\n\\n function fromMessage(\\n bytes memory message\\n ) internal pure returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_MESSAGE;\\n _decoded.message = message;\\n }\\n\\n function fromConfigUpdate(\\n bytes32 imageHash\\n ) internal pure returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_CONFIG_UPDATE;\\n _decoded.imageHash = imageHash;\\n }\\n\\n function fromDigest(\\n bytes32 digest\\n ) internal pure returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_DIGEST;\\n _decoded.digest = digest;\\n }\\n\\n function fromPackedCalls(\\n bytes calldata packed\\n ) internal view returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_TRANSACTIONS;\\n\\n // Read the global flag\\n (uint256 globalFlag, uint256 pointer) = packed.readFirstUint8();\\n\\n // First bit determines if space is zero or not\\n if (globalFlag & 0x01 == 0x01) {\\n _decoded.space = 0;\\n } else {\\n (_decoded.space, pointer) = packed.readUint160(pointer);\\n }\\n\\n // Next 3 bits determine the size of the nonce\\n uint256 nonceSize = (globalFlag >> 1) & 0x07;\\n\\n if (nonceSize > 0) {\\n // Read the nonce\\n (_decoded.nonce, pointer) = packed.readUintX(pointer, nonceSize);\\n }\\n\\n uint256 numCalls;\\n\\n // Bit 5 determines if the batch contains a single call\\n if (globalFlag & 0x10 == 0x10) {\\n numCalls = 1;\\n } else {\\n // Bit 6 determines if the number of calls uses 1 byte or 2 bytes\\n if (globalFlag & 0x20 == 0x20) {\\n (numCalls, pointer) = packed.readUint16(pointer);\\n } else {\\n (numCalls, pointer) = packed.readUint8(pointer);\\n }\\n }\\n\\n // Read the calls\\n _decoded.calls = new Call[](numCalls);\\n\\n for (uint256 i = 0; i < numCalls; i++) {\\n uint8 flags;\\n (flags, pointer) = packed.readUint8(pointer);\\n\\n // First bit determines if this is a call to self\\n // or a call to another address\\n if (flags & 0x01 == 0x01) {\\n // Call to self\\n _decoded.calls[i].to = address(this);\\n } else {\\n // Call to another address\\n (_decoded.calls[i].to, pointer) = packed.readAddress(pointer);\\n }\\n\\n // Second bit determines if the call has value or not\\n if (flags & 0x02 == 0x02) {\\n (_decoded.calls[i].value, pointer) = packed.readUint256(pointer);\\n }\\n\\n // Third bit determines if the call has data or not\\n if (flags & 0x04 == 0x04) {\\n // 3 bytes determine the size of the calldata\\n uint256 calldataSize;\\n (calldataSize, pointer) = packed.readUint24(pointer);\\n _decoded.calls[i].data = packed[pointer:pointer + calldataSize];\\n pointer += calldataSize;\\n }\\n\\n // Fourth bit determines if the call has a gas limit or not\\n if (flags & 0x08 == 0x08) {\\n (_decoded.calls[i].gasLimit, pointer) = packed.readUint256(pointer);\\n }\\n\\n // Fifth bit determines if the call is a delegate call or not\\n _decoded.calls[i].delegateCall = (flags & 0x10 == 0x10);\\n\\n // Sixth bit determines if the call is fallback only\\n _decoded.calls[i].onlyFallback = (flags & 0x20 == 0x20);\\n\\n // Last 2 bits are directly mapped to the behavior on error\\n _decoded.calls[i].behaviorOnError = (flags & 0xC0) >> 6;\\n }\\n }\\n\\n function hashCall(\\n Call memory c\\n ) internal pure returns (bytes32) {\\n return keccak256(\\n abi.encode(\\n CALL_TYPEHASH, c.to, c.value, keccak256(c.data), c.gasLimit, c.delegateCall, c.onlyFallback, c.behaviorOnError\\n )\\n );\\n }\\n\\n function hashCalls(\\n Call[] memory calls\\n ) internal pure returns (bytes32) {\\n // In EIP712, an array is often hashed as the keccak256 of the concatenated\\n // hashes of each item. So we hash each Call, pack them, and hash again.\\n bytes32[] memory callHashes = new bytes32[](calls.length);\\n for (uint256 i = 0; i < calls.length; i++) {\\n callHashes[i] = hashCall(calls[i]);\\n }\\n return keccak256(abi.encodePacked(callHashes));\\n }\\n\\n function toEIP712(\\n Decoded memory _decoded\\n ) internal pure returns (bytes32) {\\n bytes32 walletsHash = keccak256(abi.encodePacked(_decoded.parentWallets));\\n\\n if (_decoded.kind == KIND_TRANSACTIONS) {\\n bytes32 callsHash = hashCalls(_decoded.calls);\\n // The top-level struct for Calls might be something like:\\n // Calls(bytes32 callsHash,uint256 space,uint256 nonce,bytes32 walletsHash)\\n return keccak256(abi.encode(CALLS_TYPEHASH, callsHash, _decoded.space, _decoded.nonce, walletsHash));\\n } else if (_decoded.kind == KIND_MESSAGE) {\\n // If you define your top-level as: Message(bytes32 messageHash,bytes32 walletsHash)\\n return keccak256(abi.encode(MESSAGE_TYPEHASH, keccak256(_decoded.message), walletsHash));\\n } else if (_decoded.kind == KIND_CONFIG_UPDATE) {\\n // Top-level: ConfigUpdate(bytes32 imageHash,bytes32 walletsHash)\\n return keccak256(abi.encode(CONFIG_UPDATE_TYPEHASH, _decoded.imageHash, walletsHash));\\n } else if (_decoded.kind == KIND_DIGEST) {\\n // Top-level: Use MESSAGE_TYPEHASH but assume the digest is already the hashed message\\n return keccak256(abi.encode(MESSAGE_TYPEHASH, _decoded.digest, walletsHash));\\n } else {\\n // Unknown kind\\n revert InvalidKind(_decoded.kind);\\n }\\n }\\n\\n function hash(\\n Decoded memory _decoded\\n ) internal view returns (bytes32) {\\n bytes32 domain = domainSeparator(_decoded.noChainId, address(this));\\n bytes32 structHash = toEIP712(_decoded);\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domain, structHash));\\n }\\n\\n function hashFor(Decoded memory _decoded, address _wallet) internal view returns (bytes32) {\\n bytes32 domain = domainSeparator(_decoded.noChainId, _wallet);\\n bytes32 structHash = toEIP712(_decoded);\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domain, structHash));\\n }\\n\\n}\\n\",\"keccak256\":\"0x25066fa78d12d0d73d463b97b37528291f3d4d60ca642247441538b83d6597d6\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/lib/sequence-v3/src/utils/LibBytes.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.18;\\n\\n/// @title Library for reading data from bytes arrays\\n/// @author Agustin Aguilar (aa@horizon.io), Michael Standen (mstan@horizon.io)\\n/// @notice This library contains functions for reading data from bytes arrays.\\n/// @dev These functions do not check if the input index is within the bounds of the data array.\\n/// @dev Reading out of bounds may return dirty values.\\nlibrary LibBytes {\\n\\n function readFirstUint8(\\n bytes calldata _data\\n ) internal pure returns (uint8 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(_data.offset)\\n a := shr(248, word)\\n newPointer := 1\\n }\\n }\\n\\n function readUint8(bytes calldata _data, uint256 _index) internal pure returns (uint8 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(248, word)\\n newPointer := add(_index, 1)\\n }\\n }\\n\\n function readUint16(bytes calldata _data, uint256 _index) internal pure returns (uint16 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(240, word)\\n newPointer := add(_index, 2)\\n }\\n }\\n\\n function readUint24(bytes calldata _data, uint256 _index) internal pure returns (uint24 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(232, word)\\n newPointer := add(_index, 3)\\n }\\n }\\n\\n function readUint64(bytes calldata _data, uint256 _index) internal pure returns (uint64 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(192, word)\\n newPointer := add(_index, 8)\\n }\\n }\\n\\n function readUint160(bytes calldata _data, uint256 _index) internal pure returns (uint160 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(96, word)\\n newPointer := add(_index, 20)\\n }\\n }\\n\\n function readUint256(bytes calldata _data, uint256 _index) internal pure returns (uint256 a, uint256 newPointer) {\\n assembly {\\n a := calldataload(add(_index, _data.offset))\\n newPointer := add(_index, 32)\\n }\\n }\\n\\n function readUintX(\\n bytes calldata _data,\\n uint256 _index,\\n uint256 _length\\n ) internal pure returns (uint256 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n let shift := sub(256, mul(_length, 8))\\n a := and(shr(shift, word), sub(shl(mul(8, _length), 1), 1))\\n newPointer := add(_index, _length)\\n }\\n }\\n\\n function readBytes4(bytes calldata _data, uint256 _pointer) internal pure returns (bytes4 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_pointer, _data.offset))\\n a := and(word, 0xffffffff00000000000000000000000000000000000000000000000000000000)\\n newPointer := add(_pointer, 4)\\n }\\n }\\n\\n function readBytes32(bytes calldata _data, uint256 _pointer) internal pure returns (bytes32 a, uint256 newPointer) {\\n assembly {\\n a := calldataload(add(_pointer, _data.offset))\\n newPointer := add(_pointer, 32)\\n }\\n }\\n\\n function readAddress(bytes calldata _data, uint256 _index) internal pure returns (address a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := and(shr(96, word), 0xffffffffffffffffffffffffffffffffffffffff)\\n newPointer := add(_index, 20)\\n }\\n }\\n\\n /// @dev ERC-2098 Compact Signature\\n function readRSVCompact(\\n bytes calldata _data,\\n uint256 _index\\n ) internal pure returns (bytes32 r, bytes32 s, uint8 v, uint256 newPointer) {\\n uint256 yParityAndS;\\n assembly {\\n r := calldataload(add(_index, _data.offset))\\n yParityAndS := calldataload(add(_index, add(_data.offset, 32)))\\n newPointer := add(_index, 64)\\n }\\n uint256 yParity = uint256(yParityAndS >> 255);\\n s = bytes32(uint256(yParityAndS) & ((1 << 255) - 1));\\n v = uint8(yParity) + 27;\\n }\\n\\n}\\n\",\"keccak256\":\"0x4fe0b4786b2157e12384b90ae9daa1009b74b2547a8a24b800a8b998278c874b\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/src/helper/SignalsImplicitMode.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.13;\\n\\nimport { IImplicitProjectValidation } from \\\"../registry/IImplicitProjectValidation.sol\\\";\\n\\nimport { ERC165, IERC165 } from \\\"openzeppelin-contracts/contracts/utils/introspection/ERC165.sol\\\";\\nimport { Attestation } from \\\"sequence-v3/src/extensions/sessions/implicit/Attestation.sol\\\";\\nimport { ISignalsImplicitMode } from \\\"sequence-v3/src/extensions/sessions/implicit/ISignalsImplicitMode.sol\\\";\\nimport { Payload } from \\\"sequence-v3/src/modules/Payload.sol\\\";\\n\\n/// @title SignalsImplicitMode\\n/// @author Michael Standen\\n/// @notice Base contract for implicit mode validation by project\\nabstract contract SignalsImplicitMode is ISignalsImplicitMode, ERC165 {\\n\\n IImplicitProjectValidation internal _validator;\\n bytes32 internal _projectId;\\n\\n /// @notice Initialize implicit mode validation\\n /// @param validator The IImplicitProjectValidation address\\n /// @param projectId The project id\\n function _initializeSignalsImplicitMode(address validator, bytes32 projectId) internal {\\n _validator = IImplicitProjectValidation(validator);\\n _projectId = projectId;\\n }\\n\\n /// @inheritdoc ISignalsImplicitMode\\n function acceptImplicitRequest(\\n address wallet,\\n Attestation calldata attestation,\\n Payload.Call calldata call\\n ) external view returns (bytes32) {\\n _validateImplicitRequest(wallet, attestation, call);\\n return _validator.validateAttestation(wallet, attestation, _projectId);\\n }\\n\\n /// @notice Validates an implicit request\\n /// @dev Optional hook for additional validation of the implicit requests\\n /// @param wallet The wallet's address\\n /// @param attestation The attestation data\\n /// @param call The call to validate\\n function _validateImplicitRequest(\\n address wallet,\\n Attestation calldata attestation,\\n Payload.Call calldata call\\n ) internal view virtual { }\\n\\n /// @inheritdoc IERC165\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view virtual override returns (bool) {\\n return interfaceId == type(ISignalsImplicitMode).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n}\\n\",\"keccak256\":\"0xd9107be2460f7f7ec4bdfefc3d10c79aa92b9285e1b12a75cb2a8d17b150a2ec\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/src/registry/IImplicitProjectValidation.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.13;\\n\\nimport { Attestation } from \\\"sequence-v3/src/extensions/sessions/implicit/Attestation.sol\\\";\\n\\n/// @title IImplicitProjectValidation\\n/// @author Michael Standen\\n/// @notice Interface for contracts supporting validation of implicit sessions for projects\\ninterface IImplicitProjectValidation {\\n\\n /// @notice Invalid redirect url error\\n error InvalidRedirectUrl();\\n\\n /// @notice Check if a project has a code\\n /// @param wallet The wallet address\\n /// @param attestation The attestation\\n /// @param projectId The project id\\n /// @return magic The attestation magic bytes for the wallet address\\n function validateAttestation(\\n address wallet,\\n Attestation calldata attestation,\\n bytes32 projectId\\n ) external view returns (bytes32);\\n\\n}\\n\",\"keccak256\":\"0x1e8c305e011aa13d774e0ff3cfd9286af3d8174c4e33ba5ef8f724ea2dd6e5b2\",\"license\":\"Apache-2.0\"},\"lib/solady/src/tokens/ERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\n/// @notice Simple ERC1155 implementation.\\n/// @author Solady (https://github.com/vectorized/solady/blob/main/src/tokens/ERC1155.sol)\\n/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC1155.sol)\\n/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC1155/ERC1155.sol)\\n///\\n/// @dev Note:\\n/// - The ERC1155 standard allows for self-approvals.\\n/// For performance, this implementation WILL NOT revert for such actions.\\n/// Please add any checks with overrides if desired.\\n/// - The transfer functions use the identity precompile (0x4)\\n/// to copy memory internally.\\n///\\n/// If you are overriding:\\n/// - Make sure all variables written to storage are properly cleaned\\n// (e.g. the bool value for `isApprovedForAll` MUST be either 1 or 0 under the hood).\\n/// - Check that the overridden function is actually used in the function you want to\\n/// change the behavior of. Much of the code has been manually inlined for performance.\\nabstract contract ERC1155 {\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* CUSTOM ERRORS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev The lengths of the input arrays are not the same.\\n error ArrayLengthsMismatch();\\n\\n /// @dev Cannot mint or transfer to the zero address.\\n error TransferToZeroAddress();\\n\\n /// @dev The recipient's balance has overflowed.\\n error AccountBalanceOverflow();\\n\\n /// @dev Insufficient balance.\\n error InsufficientBalance();\\n\\n /// @dev Only the token owner or an approved account can manage the tokens.\\n error NotOwnerNorApproved();\\n\\n /// @dev Cannot safely transfer to a contract that does not implement\\n /// the ERC1155Receiver interface.\\n error TransferToNonERC1155ReceiverImplementer();\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* EVENTS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Emitted when `amount` of token `id` is transferred\\n /// from `from` to `to` by `operator`.\\n event TransferSingle(\\n address indexed operator,\\n address indexed from,\\n address indexed to,\\n uint256 id,\\n uint256 amount\\n );\\n\\n /// @dev Emitted when `amounts` of token `ids` are transferred\\n /// from `from` to `to` by `operator`.\\n event TransferBatch(\\n address indexed operator,\\n address indexed from,\\n address indexed to,\\n uint256[] ids,\\n uint256[] amounts\\n );\\n\\n /// @dev Emitted when `owner` enables or disables `operator` to manage all of their tokens.\\n event ApprovalForAll(address indexed owner, address indexed operator, bool isApproved);\\n\\n /// @dev Emitted when the Uniform Resource Identifier (URI) for token `id`\\n /// is updated to `value`. This event is not used in the base contract.\\n /// You may need to emit this event depending on your URI logic.\\n ///\\n /// See: https://eips.ethereum.org/EIPS/eip-1155#metadata\\n event URI(string value, uint256 indexed id);\\n\\n /// @dev `keccak256(bytes(\\\"TransferSingle(address,address,address,uint256,uint256)\\\"))`.\\n uint256 private constant _TRANSFER_SINGLE_EVENT_SIGNATURE =\\n 0xc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62;\\n\\n /// @dev `keccak256(bytes(\\\"TransferBatch(address,address,address,uint256[],uint256[])\\\"))`.\\n uint256 private constant _TRANSFER_BATCH_EVENT_SIGNATURE =\\n 0x4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb;\\n\\n /// @dev `keccak256(bytes(\\\"ApprovalForAll(address,address,bool)\\\"))`.\\n uint256 private constant _APPROVAL_FOR_ALL_EVENT_SIGNATURE =\\n 0x17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31;\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* STORAGE */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev The `ownerSlotSeed` of a given owner is given by.\\n /// ```\\n /// let ownerSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, owner))\\n /// ```\\n ///\\n /// The balance slot of `owner` is given by.\\n /// ```\\n /// mstore(0x20, ownerSlotSeed)\\n /// mstore(0x00, id)\\n /// let balanceSlot := keccak256(0x00, 0x40)\\n /// ```\\n ///\\n /// The operator approval slot of `owner` is given by.\\n /// ```\\n /// mstore(0x20, ownerSlotSeed)\\n /// mstore(0x00, operator)\\n /// let operatorApprovalSlot := keccak256(0x0c, 0x34)\\n /// ```\\n uint256 private constant _ERC1155_MASTER_SLOT_SEED = 0x9a31110384e0b0c9;\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* ERC1155 METADATA */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns the URI for token `id`.\\n ///\\n /// You can either return the same templated URI for all token IDs,\\n /// (e.g. \\\"https://example.com/api/{id}.json\\\"),\\n /// or return a unique URI for each `id`.\\n ///\\n /// See: https://eips.ethereum.org/EIPS/eip-1155#metadata\\n function uri(uint256 id) public view virtual returns (string memory);\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* ERC1155 */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns the amount of `id` owned by `owner`.\\n function balanceOf(address owner, uint256 id) public view virtual returns (uint256 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x20, _ERC1155_MASTER_SLOT_SEED)\\n mstore(0x14, owner)\\n mstore(0x00, id)\\n result := sload(keccak256(0x00, 0x40))\\n }\\n }\\n\\n /// @dev Returns whether `operator` is approved to manage the tokens of `owner`.\\n function isApprovedForAll(address owner, address operator)\\n public\\n view\\n virtual\\n returns (bool result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x20, _ERC1155_MASTER_SLOT_SEED)\\n mstore(0x14, owner)\\n mstore(0x00, operator)\\n result := sload(keccak256(0x0c, 0x34))\\n }\\n }\\n\\n /// @dev Sets whether `operator` is approved to manage the tokens of the caller.\\n ///\\n /// Emits a {ApprovalForAll} event.\\n function setApprovalForAll(address operator, bool isApproved) public virtual {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Convert to 0 or 1.\\n isApproved := iszero(iszero(isApproved))\\n // Update the `isApproved` for (`msg.sender`, `operator`).\\n mstore(0x20, _ERC1155_MASTER_SLOT_SEED)\\n mstore(0x14, caller())\\n mstore(0x00, operator)\\n sstore(keccak256(0x0c, 0x34), isApproved)\\n // Emit the {ApprovalForAll} event.\\n mstore(0x00, isApproved)\\n // forgefmt: disable-next-line\\n log3(0x00, 0x20, _APPROVAL_FOR_ALL_EVENT_SIGNATURE, caller(), shr(96, shl(96, operator)))\\n }\\n }\\n\\n /// @dev Transfers `amount` of `id` from `from` to `to`.\\n ///\\n /// Requirements:\\n /// - `to` cannot be the zero address.\\n /// - `from` must have at least `amount` of `id`.\\n /// - If the caller is not `from`,\\n /// it must be approved to manage the tokens of `from`.\\n /// - If `to` refers to a smart contract, it must implement\\n /// {ERC1155-onERC1155Received}, which is called upon a batch transfer.\\n ///\\n /// Emits a {TransferSingle} event.\\n function safeTransferFrom(\\n address from,\\n address to,\\n uint256 id,\\n uint256 amount,\\n bytes calldata data\\n ) public virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(from, to, _single(id), _single(amount), data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n let fromSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, from))\\n let toSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, to))\\n mstore(0x20, fromSlotSeed)\\n // Clear the upper 96 bits.\\n from := shr(96, fromSlotSeed)\\n to := shr(96, toSlotSeed)\\n // Revert if `to` is the zero address.\\n if iszero(to) {\\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\\n revert(0x1c, 0x04)\\n }\\n // If the caller is not `from`, do the authorization check.\\n if iszero(eq(caller(), from)) {\\n mstore(0x00, caller())\\n if iszero(sload(keccak256(0x0c, 0x34))) {\\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n // Subtract and store the updated balance of `from`.\\n {\\n mstore(0x00, id)\\n let fromBalanceSlot := keccak256(0x00, 0x40)\\n let fromBalance := sload(fromBalanceSlot)\\n if gt(amount, fromBalance) {\\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(fromBalanceSlot, sub(fromBalance, amount))\\n }\\n // Increase and store the updated balance of `to`.\\n {\\n mstore(0x20, toSlotSeed)\\n let toBalanceSlot := keccak256(0x00, 0x40)\\n let toBalanceBefore := sload(toBalanceSlot)\\n let toBalanceAfter := add(toBalanceBefore, amount)\\n if lt(toBalanceAfter, toBalanceBefore) {\\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(toBalanceSlot, toBalanceAfter)\\n }\\n // Emit a {TransferSingle} event.\\n mstore(0x20, amount)\\n log4(0x00, 0x40, _TRANSFER_SINGLE_EVENT_SIGNATURE, caller(), from, to)\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(from, to, _single(id), _single(amount), data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Do the {onERC1155Received} check if `to` is a smart contract.\\n if extcodesize(to) {\\n // Prepare the calldata.\\n let m := mload(0x40)\\n // `onERC1155Received(address,address,uint256,uint256,bytes)`.\\n mstore(m, 0xf23a6e61)\\n mstore(add(m, 0x20), caller())\\n mstore(add(m, 0x40), from)\\n mstore(add(m, 0x60), id)\\n mstore(add(m, 0x80), amount)\\n mstore(add(m, 0xa0), 0xa0)\\n mstore(add(m, 0xc0), data.length)\\n calldatacopy(add(m, 0xe0), data.offset, data.length)\\n // Revert if the call reverts.\\n if iszero(call(gas(), to, 0, add(m, 0x1c), add(0xc4, data.length), m, 0x20)) {\\n if returndatasize() {\\n // Bubble up the revert if the call reverts.\\n returndatacopy(m, 0x00, returndatasize())\\n revert(m, returndatasize())\\n }\\n }\\n // Load the returndata and compare it with the function selector.\\n if iszero(eq(mload(m), shl(224, 0xf23a6e61))) {\\n mstore(0x00, 0x9c05499b) // `TransferToNonERC1155ReceiverImplementer()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n }\\n }\\n\\n /// @dev Transfers `amounts` of `ids` from `from` to `to`.\\n ///\\n /// Requirements:\\n /// - `to` cannot be the zero address.\\n /// - `from` must have at least `amount` of `id`.\\n /// - `ids` and `amounts` must have the same length.\\n /// - If the caller is not `from`,\\n /// it must be approved to manage the tokens of `from`.\\n /// - If `to` refers to a smart contract, it must implement\\n /// {ERC1155-onERC1155BatchReceived}, which is called upon a batch transfer.\\n ///\\n /// Emits a {TransferBatch} event.\\n function safeBatchTransferFrom(\\n address from,\\n address to,\\n uint256[] calldata ids,\\n uint256[] calldata amounts,\\n bytes calldata data\\n ) public virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(from, to, ids, amounts, data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n if iszero(eq(ids.length, amounts.length)) {\\n mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.\\n revert(0x1c, 0x04)\\n }\\n let fromSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, from))\\n let toSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, to))\\n mstore(0x20, fromSlotSeed)\\n // Clear the upper 96 bits.\\n from := shr(96, fromSlotSeed)\\n to := shr(96, toSlotSeed)\\n // Revert if `to` is the zero address.\\n if iszero(to) {\\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\\n revert(0x1c, 0x04)\\n }\\n // If the caller is not `from`, do the authorization check.\\n if iszero(eq(caller(), from)) {\\n mstore(0x00, caller())\\n if iszero(sload(keccak256(0x0c, 0x34))) {\\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n // Loop through all the `ids` and update the balances.\\n {\\n for { let i := shl(5, ids.length) } i {} {\\n i := sub(i, 0x20)\\n let amount := calldataload(add(amounts.offset, i))\\n // Subtract and store the updated balance of `from`.\\n {\\n mstore(0x20, fromSlotSeed)\\n mstore(0x00, calldataload(add(ids.offset, i)))\\n let fromBalanceSlot := keccak256(0x00, 0x40)\\n let fromBalance := sload(fromBalanceSlot)\\n if gt(amount, fromBalance) {\\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(fromBalanceSlot, sub(fromBalance, amount))\\n }\\n // Increase and store the updated balance of `to`.\\n {\\n mstore(0x20, toSlotSeed)\\n let toBalanceSlot := keccak256(0x00, 0x40)\\n let toBalanceBefore := sload(toBalanceSlot)\\n let toBalanceAfter := add(toBalanceBefore, amount)\\n if lt(toBalanceAfter, toBalanceBefore) {\\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(toBalanceSlot, toBalanceAfter)\\n }\\n }\\n }\\n // Emit a {TransferBatch} event.\\n {\\n let m := mload(0x40)\\n // Copy the `ids`.\\n mstore(m, 0x40)\\n let n := shl(5, ids.length)\\n mstore(add(m, 0x40), ids.length)\\n calldatacopy(add(m, 0x60), ids.offset, n)\\n // Copy the `amounts`.\\n mstore(add(m, 0x20), add(0x60, n))\\n let o := add(add(m, n), 0x60)\\n mstore(o, ids.length)\\n calldatacopy(add(o, 0x20), amounts.offset, n)\\n // Do the emit.\\n log4(m, add(add(n, n), 0x80), _TRANSFER_BATCH_EVENT_SIGNATURE, caller(), from, to)\\n }\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransferCalldata(from, to, ids, amounts, data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Do the {onERC1155BatchReceived} check if `to` is a smart contract.\\n if extcodesize(to) {\\n mstore(0x00, to) // Cache `to` to prevent stack too deep.\\n let m := mload(0x40)\\n // Prepare the calldata.\\n // `onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)`.\\n mstore(m, 0xbc197c81)\\n mstore(add(m, 0x20), caller())\\n mstore(add(m, 0x40), from)\\n // Copy the `ids`.\\n mstore(add(m, 0x60), 0xa0)\\n let n := shl(5, ids.length)\\n mstore(add(m, 0xc0), ids.length)\\n calldatacopy(add(m, 0xe0), ids.offset, n)\\n // Copy the `amounts`.\\n mstore(add(m, 0x80), add(0xc0, n))\\n let o := add(add(m, n), 0xe0)\\n mstore(o, ids.length)\\n calldatacopy(add(o, 0x20), amounts.offset, n)\\n // Copy the `data`.\\n mstore(add(m, 0xa0), add(add(0xe0, n), n))\\n o := add(add(o, n), 0x20)\\n mstore(o, data.length)\\n calldatacopy(add(o, 0x20), data.offset, data.length)\\n let nAll := add(0x104, add(data.length, add(n, n)))\\n // Revert if the call reverts.\\n if iszero(call(gas(), mload(0x00), 0, add(mload(0x40), 0x1c), nAll, m, 0x20)) {\\n if returndatasize() {\\n // Bubble up the revert if the call reverts.\\n returndatacopy(m, 0x00, returndatasize())\\n revert(m, returndatasize())\\n }\\n }\\n // Load the returndata and compare it with the function selector.\\n if iszero(eq(mload(m), shl(224, 0xbc197c81))) {\\n mstore(0x00, 0x9c05499b) // `TransferToNonERC1155ReceiverImplementer()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n }\\n }\\n\\n /// @dev Returns the amounts of `ids` for `owners.\\n ///\\n /// Requirements:\\n /// - `owners` and `ids` must have the same length.\\n function balanceOfBatch(address[] calldata owners, uint256[] calldata ids)\\n public\\n view\\n virtual\\n returns (uint256[] memory balances)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n if iszero(eq(ids.length, owners.length)) {\\n mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.\\n revert(0x1c, 0x04)\\n }\\n balances := mload(0x40)\\n mstore(balances, ids.length)\\n let o := add(balances, 0x20)\\n let i := shl(5, ids.length)\\n mstore(0x40, add(i, o))\\n // Loop through all the `ids` and load the balances.\\n for {} i {} {\\n i := sub(i, 0x20)\\n let owner := calldataload(add(owners.offset, i))\\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, shl(96, owner)))\\n mstore(0x00, calldataload(add(ids.offset, i)))\\n mstore(add(o, i), sload(keccak256(0x00, 0x40)))\\n }\\n }\\n }\\n\\n /// @dev Returns true if this contract implements the interface defined by `interfaceId`.\\n /// See: https://eips.ethereum.org/EIPS/eip-165\\n /// This function call must use less than 30000 gas.\\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let s := shr(224, interfaceId)\\n // ERC165: 0x01ffc9a7, ERC1155: 0xd9b67a26, ERC1155MetadataURI: 0x0e89341c.\\n result := or(or(eq(s, 0x01ffc9a7), eq(s, 0xd9b67a26)), eq(s, 0x0e89341c))\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* INTERNAL MINT FUNCTIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Mints `amount` of `id` to `to`.\\n ///\\n /// Requirements:\\n /// - `to` cannot be the zero address.\\n /// - If `to` refers to a smart contract, it must implement\\n /// {ERC1155-onERC1155Received}, which is called upon a batch transfer.\\n ///\\n /// Emits a {TransferSingle} event.\\n function _mint(address to, uint256 id, uint256 amount, bytes memory data) internal virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(address(0), to, _single(id), _single(amount), data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n let to_ := shl(96, to)\\n // Revert if `to` is the zero address.\\n if iszero(to_) {\\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\\n revert(0x1c, 0x04)\\n }\\n // Increase and store the updated balance of `to`.\\n {\\n mstore(0x20, _ERC1155_MASTER_SLOT_SEED)\\n mstore(0x14, to)\\n mstore(0x00, id)\\n let toBalanceSlot := keccak256(0x00, 0x40)\\n let toBalanceBefore := sload(toBalanceSlot)\\n let toBalanceAfter := add(toBalanceBefore, amount)\\n if lt(toBalanceAfter, toBalanceBefore) {\\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(toBalanceSlot, toBalanceAfter)\\n }\\n // Emit a {TransferSingle} event.\\n mstore(0x20, amount)\\n log4(0x00, 0x40, _TRANSFER_SINGLE_EVENT_SIGNATURE, caller(), 0, shr(96, to_))\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(address(0), to, _single(id), _single(amount), data);\\n }\\n if (_hasCode(to)) _checkOnERC1155Received(address(0), to, id, amount, data);\\n }\\n\\n /// @dev Mints `amounts` of `ids` to `to`.\\n ///\\n /// Requirements:\\n /// - `to` cannot be the zero address.\\n /// - `ids` and `amounts` must have the same length.\\n /// - If `to` refers to a smart contract, it must implement\\n /// {ERC1155-onERC1155BatchReceived}, which is called upon a batch transfer.\\n ///\\n /// Emits a {TransferBatch} event.\\n function _batchMint(\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) internal virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(address(0), to, ids, amounts, data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n if iszero(eq(mload(ids), mload(amounts))) {\\n mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.\\n revert(0x1c, 0x04)\\n }\\n let to_ := shl(96, to)\\n // Revert if `to` is the zero address.\\n if iszero(to_) {\\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\\n revert(0x1c, 0x04)\\n }\\n // Loop through all the `ids` and update the balances.\\n {\\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, to_))\\n for { let i := shl(5, mload(ids)) } i { i := sub(i, 0x20) } {\\n let amount := mload(add(amounts, i))\\n // Increase and store the updated balance of `to`.\\n {\\n mstore(0x00, mload(add(ids, i)))\\n let toBalanceSlot := keccak256(0x00, 0x40)\\n let toBalanceBefore := sload(toBalanceSlot)\\n let toBalanceAfter := add(toBalanceBefore, amount)\\n if lt(toBalanceAfter, toBalanceBefore) {\\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(toBalanceSlot, toBalanceAfter)\\n }\\n }\\n }\\n // Emit a {TransferBatch} event.\\n {\\n let m := mload(0x40)\\n // Copy the `ids`.\\n mstore(m, 0x40)\\n let n := add(0x20, shl(5, mload(ids)))\\n let o := add(m, 0x40)\\n pop(staticcall(gas(), 4, ids, n, o, n))\\n // Copy the `amounts`.\\n mstore(add(m, 0x20), add(0x40, returndatasize()))\\n o := add(o, returndatasize())\\n n := add(0x20, shl(5, mload(amounts)))\\n pop(staticcall(gas(), 4, amounts, n, o, n))\\n n := sub(add(o, returndatasize()), m)\\n // Do the emit.\\n log4(m, n, _TRANSFER_BATCH_EVENT_SIGNATURE, caller(), 0, shr(96, to_))\\n }\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(address(0), to, ids, amounts, data);\\n }\\n if (_hasCode(to)) _checkOnERC1155BatchReceived(address(0), to, ids, amounts, data);\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* INTERNAL BURN FUNCTIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Equivalent to `_burn(address(0), from, id, amount)`.\\n function _burn(address from, uint256 id, uint256 amount) internal virtual {\\n _burn(address(0), from, id, amount);\\n }\\n\\n /// @dev Destroys `amount` of `id` from `from`.\\n ///\\n /// Requirements:\\n /// - `from` must have at least `amount` of `id`.\\n /// - If `by` is not the zero address, it must be either `from`,\\n /// or approved to manage the tokens of `from`.\\n ///\\n /// Emits a {TransferSingle} event.\\n function _burn(address by, address from, uint256 id, uint256 amount) internal virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(from, address(0), _single(id), _single(amount), \\\"\\\");\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n let from_ := shl(96, from)\\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, from_))\\n // If `by` is not the zero address, and not equal to `from`,\\n // check if it is approved to manage all the tokens of `from`.\\n if iszero(or(iszero(shl(96, by)), eq(shl(96, by), from_))) {\\n mstore(0x00, by)\\n if iszero(sload(keccak256(0x0c, 0x34))) {\\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n // Decrease and store the updated balance of `from`.\\n {\\n mstore(0x00, id)\\n let fromBalanceSlot := keccak256(0x00, 0x40)\\n let fromBalance := sload(fromBalanceSlot)\\n if gt(amount, fromBalance) {\\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(fromBalanceSlot, sub(fromBalance, amount))\\n }\\n // Emit a {TransferSingle} event.\\n mstore(0x20, amount)\\n log4(0x00, 0x40, _TRANSFER_SINGLE_EVENT_SIGNATURE, caller(), shr(96, from_), 0)\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(from, address(0), _single(id), _single(amount), \\\"\\\");\\n }\\n }\\n\\n /// @dev Equivalent to `_batchBurn(address(0), from, ids, amounts)`.\\n function _batchBurn(address from, uint256[] memory ids, uint256[] memory amounts)\\n internal\\n virtual\\n {\\n _batchBurn(address(0), from, ids, amounts);\\n }\\n\\n /// @dev Destroys `amounts` of `ids` from `from`.\\n ///\\n /// Requirements:\\n /// - `ids` and `amounts` must have the same length.\\n /// - `from` must have at least `amounts` of `ids`.\\n /// - If `by` is not the zero address, it must be either `from`,\\n /// or approved to manage the tokens of `from`.\\n ///\\n /// Emits a {TransferBatch} event.\\n function _batchBurn(address by, address from, uint256[] memory ids, uint256[] memory amounts)\\n internal\\n virtual\\n {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(from, address(0), ids, amounts, \\\"\\\");\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n if iszero(eq(mload(ids), mload(amounts))) {\\n mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.\\n revert(0x1c, 0x04)\\n }\\n let from_ := shl(96, from)\\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, from_))\\n // If `by` is not the zero address, and not equal to `from`,\\n // check if it is approved to manage all the tokens of `from`.\\n let by_ := shl(96, by)\\n if iszero(or(iszero(by_), eq(by_, from_))) {\\n mstore(0x00, by)\\n if iszero(sload(keccak256(0x0c, 0x34))) {\\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n // Loop through all the `ids` and update the balances.\\n {\\n for { let i := shl(5, mload(ids)) } i { i := sub(i, 0x20) } {\\n let amount := mload(add(amounts, i))\\n // Decrease and store the updated balance of `from`.\\n {\\n mstore(0x00, mload(add(ids, i)))\\n let fromBalanceSlot := keccak256(0x00, 0x40)\\n let fromBalance := sload(fromBalanceSlot)\\n if gt(amount, fromBalance) {\\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(fromBalanceSlot, sub(fromBalance, amount))\\n }\\n }\\n }\\n // Emit a {TransferBatch} event.\\n {\\n let m := mload(0x40)\\n // Copy the `ids`.\\n mstore(m, 0x40)\\n let n := add(0x20, shl(5, mload(ids)))\\n let o := add(m, 0x40)\\n pop(staticcall(gas(), 4, ids, n, o, n))\\n // Copy the `amounts`.\\n mstore(add(m, 0x20), add(0x40, returndatasize()))\\n o := add(o, returndatasize())\\n n := add(0x20, shl(5, mload(amounts)))\\n pop(staticcall(gas(), 4, amounts, n, o, n))\\n n := sub(add(o, returndatasize()), m)\\n // Do the emit.\\n log4(m, n, _TRANSFER_BATCH_EVENT_SIGNATURE, caller(), shr(96, from_), 0)\\n }\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(from, address(0), ids, amounts, \\\"\\\");\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* INTERNAL APPROVAL FUNCTIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Approve or remove the `operator` as an operator for `by`,\\n /// without authorization checks.\\n ///\\n /// Emits a {ApprovalForAll} event.\\n function _setApprovalForAll(address by, address operator, bool isApproved) internal virtual {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Convert to 0 or 1.\\n isApproved := iszero(iszero(isApproved))\\n // Update the `isApproved` for (`by`, `operator`).\\n mstore(0x20, _ERC1155_MASTER_SLOT_SEED)\\n mstore(0x14, by)\\n mstore(0x00, operator)\\n sstore(keccak256(0x0c, 0x34), isApproved)\\n // Emit the {ApprovalForAll} event.\\n mstore(0x00, isApproved)\\n let m := shr(96, not(0))\\n log3(0x00, 0x20, _APPROVAL_FOR_ALL_EVENT_SIGNATURE, and(m, by), and(m, operator))\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* INTERNAL TRANSFER FUNCTIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Equivalent to `_safeTransfer(address(0), from, to, id, amount, data)`.\\n function _safeTransfer(address from, address to, uint256 id, uint256 amount, bytes memory data)\\n internal\\n virtual\\n {\\n _safeTransfer(address(0), from, to, id, amount, data);\\n }\\n\\n /// @dev Transfers `amount` of `id` from `from` to `to`.\\n ///\\n /// Requirements:\\n /// - `to` cannot be the zero address.\\n /// - `from` must have at least `amount` of `id`.\\n /// - If `by` is not the zero address, it must be either `from`,\\n /// or approved to manage the tokens of `from`.\\n /// - If `to` refers to a smart contract, it must implement\\n /// {ERC1155-onERC1155Received}, which is called upon a batch transfer.\\n ///\\n /// Emits a {TransferSingle} event.\\n function _safeTransfer(\\n address by,\\n address from,\\n address to,\\n uint256 id,\\n uint256 amount,\\n bytes memory data\\n ) internal virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(from, to, _single(id), _single(amount), data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n let from_ := shl(96, from)\\n let to_ := shl(96, to)\\n // Revert if `to` is the zero address.\\n if iszero(to_) {\\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\\n revert(0x1c, 0x04)\\n }\\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, from_))\\n // If `by` is not the zero address, and not equal to `from`,\\n // check if it is approved to manage all the tokens of `from`.\\n let by_ := shl(96, by)\\n if iszero(or(iszero(by_), eq(by_, from_))) {\\n mstore(0x00, by)\\n if iszero(sload(keccak256(0x0c, 0x34))) {\\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n // Subtract and store the updated balance of `from`.\\n {\\n mstore(0x00, id)\\n let fromBalanceSlot := keccak256(0x00, 0x40)\\n let fromBalance := sload(fromBalanceSlot)\\n if gt(amount, fromBalance) {\\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(fromBalanceSlot, sub(fromBalance, amount))\\n }\\n // Increase and store the updated balance of `to`.\\n {\\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, to_))\\n let toBalanceSlot := keccak256(0x00, 0x40)\\n let toBalanceBefore := sload(toBalanceSlot)\\n let toBalanceAfter := add(toBalanceBefore, amount)\\n if lt(toBalanceAfter, toBalanceBefore) {\\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(toBalanceSlot, toBalanceAfter)\\n }\\n // Emit a {TransferSingle} event.\\n mstore(0x20, amount)\\n // forgefmt: disable-next-line\\n log4(0x00, 0x40, _TRANSFER_SINGLE_EVENT_SIGNATURE, caller(), shr(96, from_), shr(96, to_))\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(from, to, _single(id), _single(amount), data);\\n }\\n if (_hasCode(to)) _checkOnERC1155Received(from, to, id, amount, data);\\n }\\n\\n /// @dev Equivalent to `_safeBatchTransfer(address(0), from, to, ids, amounts, data)`.\\n function _safeBatchTransfer(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) internal virtual {\\n _safeBatchTransfer(address(0), from, to, ids, amounts, data);\\n }\\n\\n /// @dev Transfers `amounts` of `ids` from `from` to `to`.\\n ///\\n /// Requirements:\\n /// - `to` cannot be the zero address.\\n /// - `ids` and `amounts` must have the same length.\\n /// - `from` must have at least `amounts` of `ids`.\\n /// - If `by` is not the zero address, it must be either `from`,\\n /// or approved to manage the tokens of `from`.\\n /// - If `to` refers to a smart contract, it must implement\\n /// {ERC1155-onERC1155BatchReceived}, which is called upon a batch transfer.\\n ///\\n /// Emits a {TransferBatch} event.\\n function _safeBatchTransfer(\\n address by,\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) internal virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(from, to, ids, amounts, data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n if iszero(eq(mload(ids), mload(amounts))) {\\n mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.\\n revert(0x1c, 0x04)\\n }\\n let from_ := shl(96, from)\\n let to_ := shl(96, to)\\n // Revert if `to` is the zero address.\\n if iszero(to_) {\\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\\n revert(0x1c, 0x04)\\n }\\n let fromSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, from_)\\n let toSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, to_)\\n mstore(0x20, fromSlotSeed)\\n // If `by` is not the zero address, and not equal to `from`,\\n // check if it is approved to manage all the tokens of `from`.\\n let by_ := shl(96, by)\\n if iszero(or(iszero(by_), eq(by_, from_))) {\\n mstore(0x00, by)\\n if iszero(sload(keccak256(0x0c, 0x34))) {\\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n // Loop through all the `ids` and update the balances.\\n {\\n for { let i := shl(5, mload(ids)) } i { i := sub(i, 0x20) } {\\n let amount := mload(add(amounts, i))\\n // Subtract and store the updated balance of `from`.\\n {\\n mstore(0x20, fromSlotSeed)\\n mstore(0x00, mload(add(ids, i)))\\n let fromBalanceSlot := keccak256(0x00, 0x40)\\n let fromBalance := sload(fromBalanceSlot)\\n if gt(amount, fromBalance) {\\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(fromBalanceSlot, sub(fromBalance, amount))\\n }\\n // Increase and store the updated balance of `to`.\\n {\\n mstore(0x20, toSlotSeed)\\n let toBalanceSlot := keccak256(0x00, 0x40)\\n let toBalanceBefore := sload(toBalanceSlot)\\n let toBalanceAfter := add(toBalanceBefore, amount)\\n if lt(toBalanceAfter, toBalanceBefore) {\\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(toBalanceSlot, toBalanceAfter)\\n }\\n }\\n }\\n // Emit a {TransferBatch} event.\\n {\\n let m := mload(0x40)\\n // Copy the `ids`.\\n mstore(m, 0x40)\\n let n := add(0x20, shl(5, mload(ids)))\\n let o := add(m, 0x40)\\n pop(staticcall(gas(), 4, ids, n, o, n))\\n // Copy the `amounts`.\\n mstore(add(m, 0x20), add(0x40, returndatasize()))\\n o := add(o, returndatasize())\\n n := add(0x20, shl(5, mload(amounts)))\\n pop(staticcall(gas(), 4, amounts, n, o, n))\\n n := sub(add(o, returndatasize()), m)\\n // Do the emit.\\n log4(m, n, _TRANSFER_BATCH_EVENT_SIGNATURE, caller(), shr(96, from_), shr(96, to_))\\n }\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(from, to, ids, amounts, data);\\n }\\n if (_hasCode(to)) _checkOnERC1155BatchReceived(from, to, ids, amounts, data);\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* HOOKS FOR OVERRIDING */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Override this function to return true if `_beforeTokenTransfer` is used.\\n /// This is to help the compiler avoid producing dead bytecode.\\n function _useBeforeTokenTransfer() internal view virtual returns (bool) {\\n return false;\\n }\\n\\n /// @dev Hook that is called before any token transfer.\\n /// This includes minting and burning, as well as batched variants.\\n ///\\n /// The same hook is called on both single and batched variants.\\n /// For single transfers, the length of the `id` and `amount` arrays are 1.\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) internal virtual {}\\n\\n /// @dev Override this function to return true if `_afterTokenTransfer` is used.\\n /// This is to help the compiler avoid producing dead bytecode.\\n function _useAfterTokenTransfer() internal view virtual returns (bool) {\\n return false;\\n }\\n\\n /// @dev Hook that is called after any token transfer.\\n /// This includes minting and burning, as well as batched variants.\\n ///\\n /// The same hook is called on both single and batched variants.\\n /// For single transfers, the length of the `id` and `amount` arrays are 1.\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) internal virtual {}\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* PRIVATE HELPERS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Helper for calling the `_afterTokenTransfer` hook.\\n /// This is to help the compiler avoid producing dead bytecode.\\n function _afterTokenTransferCalldata(\\n address from,\\n address to,\\n uint256[] calldata ids,\\n uint256[] calldata amounts,\\n bytes calldata data\\n ) private {\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(from, to, ids, amounts, data);\\n }\\n }\\n\\n /// @dev Returns if `a` has bytecode of non-zero length.\\n function _hasCode(address a) private view returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := extcodesize(a) // Can handle dirty upper bits.\\n }\\n }\\n\\n /// @dev Perform a call to invoke {IERC1155Receiver-onERC1155Received} on `to`.\\n /// Reverts if the target does not support the function correctly.\\n function _checkOnERC1155Received(\\n address from,\\n address to,\\n uint256 id,\\n uint256 amount,\\n bytes memory data\\n ) private {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Prepare the calldata.\\n let m := mload(0x40)\\n // `onERC1155Received(address,address,uint256,uint256,bytes)`.\\n mstore(m, 0xf23a6e61)\\n mstore(add(m, 0x20), caller())\\n mstore(add(m, 0x40), shr(96, shl(96, from)))\\n mstore(add(m, 0x60), id)\\n mstore(add(m, 0x80), amount)\\n mstore(add(m, 0xa0), 0xa0)\\n let n := mload(data)\\n mstore(add(m, 0xc0), n)\\n if n { pop(staticcall(gas(), 4, add(data, 0x20), n, add(m, 0xe0), n)) }\\n // Revert if the call reverts.\\n if iszero(call(gas(), to, 0, add(m, 0x1c), add(0xc4, n), m, 0x20)) {\\n if returndatasize() {\\n // Bubble up the revert if the call reverts.\\n returndatacopy(m, 0x00, returndatasize())\\n revert(m, returndatasize())\\n }\\n }\\n // Load the returndata and compare it with the function selector.\\n if iszero(eq(mload(m), shl(224, 0xf23a6e61))) {\\n mstore(0x00, 0x9c05499b) // `TransferToNonERC1155ReceiverImplementer()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n }\\n\\n /// @dev Perform a call to invoke {IERC1155Receiver-onERC1155BatchReceived} on `to`.\\n /// Reverts if the target does not support the function correctly.\\n function _checkOnERC1155BatchReceived(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) private {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Prepare the calldata.\\n let m := mload(0x40)\\n // `onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)`.\\n mstore(m, 0xbc197c81)\\n mstore(add(m, 0x20), caller())\\n mstore(add(m, 0x40), shr(96, shl(96, from)))\\n // Copy the `ids`.\\n mstore(add(m, 0x60), 0xa0)\\n let n := add(0x20, shl(5, mload(ids)))\\n let o := add(m, 0xc0)\\n pop(staticcall(gas(), 4, ids, n, o, n))\\n // Copy the `amounts`.\\n let s := add(0xa0, returndatasize())\\n mstore(add(m, 0x80), s)\\n o := add(o, returndatasize())\\n n := add(0x20, shl(5, mload(amounts)))\\n pop(staticcall(gas(), 4, amounts, n, o, n))\\n // Copy the `data`.\\n mstore(add(m, 0xa0), add(s, returndatasize()))\\n o := add(o, returndatasize())\\n n := add(0x20, mload(data))\\n pop(staticcall(gas(), 4, data, n, o, n))\\n n := sub(add(o, returndatasize()), add(m, 0x1c))\\n // Revert if the call reverts.\\n if iszero(call(gas(), to, 0, add(m, 0x1c), n, m, 0x20)) {\\n if returndatasize() {\\n // Bubble up the revert if the call reverts.\\n returndatacopy(m, 0x00, returndatasize())\\n revert(m, returndatasize())\\n }\\n }\\n // Load the returndata and compare it with the function selector.\\n if iszero(eq(mload(m), shl(224, 0xbc197c81))) {\\n mstore(0x00, 0x9c05499b) // `TransferToNonERC1155ReceiverImplementer()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n }\\n\\n /// @dev Returns `x` in an array with a single element.\\n function _single(uint256 x) private pure returns (uint256[] memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n mstore(0x40, add(result, 0x40))\\n mstore(result, 1)\\n mstore(add(result, 0x20), x)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x306249cc3611727ffa9e15ec816282a60fd9629e5ea03ab1c780d638d1537c68\",\"license\":\"MIT\"},\"lib/solady/src/utils/LibBytes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\n/// @notice Library for byte related operations.\\n/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibBytes.sol)\\nlibrary LibBytes {\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* STRUCTS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Goated bytes storage struct that totally MOGs, no cap, fr.\\n /// Uses less gas and bytecode than Solidity's native bytes storage. It's meta af.\\n /// Packs length with the first 31 bytes if <255 bytes, so it\\u2019s mad tight.\\n struct BytesStorage {\\n bytes32 _spacer;\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* CONSTANTS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev The constant returned when the `search` is not found in the bytes.\\n uint256 internal constant NOT_FOUND = type(uint256).max;\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* BYTE STORAGE OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Sets the value of the bytes storage `$` to `s`.\\n function set(BytesStorage storage $, bytes memory s) internal {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := mload(s)\\n let packed := or(0xff, shl(8, n))\\n for { let i := 0 } 1 {} {\\n if iszero(gt(n, 0xfe)) {\\n i := 0x1f\\n packed := or(n, shl(8, mload(add(s, i))))\\n if iszero(gt(n, i)) { break }\\n }\\n let o := add(s, 0x20)\\n mstore(0x00, $.slot)\\n for { let p := keccak256(0x00, 0x20) } 1 {} {\\n sstore(add(p, shr(5, i)), mload(add(o, i)))\\n i := add(i, 0x20)\\n if iszero(lt(i, n)) { break }\\n }\\n break\\n }\\n sstore($.slot, packed)\\n }\\n }\\n\\n /// @dev Sets the value of the bytes storage `$` to `s`.\\n function setCalldata(BytesStorage storage $, bytes calldata s) internal {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let packed := or(0xff, shl(8, s.length))\\n for { let i := 0 } 1 {} {\\n if iszero(gt(s.length, 0xfe)) {\\n i := 0x1f\\n packed := or(s.length, shl(8, shr(8, calldataload(s.offset))))\\n if iszero(gt(s.length, i)) { break }\\n }\\n mstore(0x00, $.slot)\\n for { let p := keccak256(0x00, 0x20) } 1 {} {\\n sstore(add(p, shr(5, i)), calldataload(add(s.offset, i)))\\n i := add(i, 0x20)\\n if iszero(lt(i, s.length)) { break }\\n }\\n break\\n }\\n sstore($.slot, packed)\\n }\\n }\\n\\n /// @dev Sets the value of the bytes storage `$` to the empty bytes.\\n function clear(BytesStorage storage $) internal {\\n delete $._spacer;\\n }\\n\\n /// @dev Returns whether the value stored is `$` is the empty bytes \\\"\\\".\\n function isEmpty(BytesStorage storage $) internal view returns (bool) {\\n return uint256($._spacer) & 0xff == uint256(0);\\n }\\n\\n /// @dev Returns the length of the value stored in `$`.\\n function length(BytesStorage storage $) internal view returns (uint256 result) {\\n result = uint256($._spacer);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := and(0xff, result)\\n result := or(mul(shr(8, result), eq(0xff, n)), mul(n, iszero(eq(0xff, n))))\\n }\\n }\\n\\n /// @dev Returns the value stored in `$`.\\n function get(BytesStorage storage $) internal view returns (bytes memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n let o := add(result, 0x20)\\n let packed := sload($.slot)\\n let n := shr(8, packed)\\n for { let i := 0 } 1 {} {\\n if iszero(eq(or(packed, 0xff), packed)) {\\n mstore(o, packed)\\n n := and(0xff, packed)\\n i := 0x1f\\n if iszero(gt(n, i)) { break }\\n }\\n mstore(0x00, $.slot)\\n for { let p := keccak256(0x00, 0x20) } 1 {} {\\n mstore(add(o, i), sload(add(p, shr(5, i))))\\n i := add(i, 0x20)\\n if iszero(lt(i, n)) { break }\\n }\\n break\\n }\\n mstore(result, n) // Store the length of the memory.\\n mstore(add(o, n), 0) // Zeroize the slot after the bytes.\\n mstore(0x40, add(add(o, n), 0x20)) // Allocate memory.\\n }\\n }\\n\\n /// @dev Returns the uint8 at index `i`. If out-of-bounds, returns 0.\\n function uint8At(BytesStorage storage $, uint256 i) internal view returns (uint8 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n for { let packed := sload($.slot) } 1 {} {\\n if iszero(eq(or(packed, 0xff), packed)) {\\n if iszero(gt(i, 0x1e)) {\\n result := byte(i, packed)\\n break\\n }\\n if iszero(gt(i, and(0xff, packed))) {\\n mstore(0x00, $.slot)\\n let j := sub(i, 0x1f)\\n result := byte(and(j, 0x1f), sload(add(keccak256(0x00, 0x20), shr(5, j))))\\n }\\n break\\n }\\n if iszero(gt(i, shr(8, packed))) {\\n mstore(0x00, $.slot)\\n result := byte(and(i, 0x1f), sload(add(keccak256(0x00, 0x20), shr(5, i))))\\n }\\n break\\n }\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* BYTES OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns `subject` all occurrences of `needle` replaced with `replacement`.\\n function replace(bytes memory subject, bytes memory needle, bytes memory replacement)\\n internal\\n pure\\n returns (bytes memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n let needleLen := mload(needle)\\n let replacementLen := mload(replacement)\\n let d := sub(result, subject) // Memory difference.\\n let i := add(subject, 0x20) // Subject bytes pointer.\\n mstore(0x00, add(i, mload(subject))) // End of subject.\\n if iszero(gt(needleLen, mload(subject))) {\\n let subjectSearchEnd := add(sub(mload(0x00), needleLen), 1)\\n let h := 0 // The hash of `needle`.\\n if iszero(lt(needleLen, 0x20)) { h := keccak256(add(needle, 0x20), needleLen) }\\n let s := mload(add(needle, 0x20))\\n for { let m := shl(3, sub(0x20, and(needleLen, 0x1f))) } 1 {} {\\n let t := mload(i)\\n // Whether the first `needleLen % 32` bytes of `subject` and `needle` matches.\\n if iszero(shr(m, xor(t, s))) {\\n if h {\\n if iszero(eq(keccak256(i, needleLen), h)) {\\n mstore(add(i, d), t)\\n i := add(i, 1)\\n if iszero(lt(i, subjectSearchEnd)) { break }\\n continue\\n }\\n }\\n // Copy the `replacement` one word at a time.\\n for { let j := 0 } 1 {} {\\n mstore(add(add(i, d), j), mload(add(add(replacement, 0x20), j)))\\n j := add(j, 0x20)\\n if iszero(lt(j, replacementLen)) { break }\\n }\\n d := sub(add(d, replacementLen), needleLen)\\n if needleLen {\\n i := add(i, needleLen)\\n if iszero(lt(i, subjectSearchEnd)) { break }\\n continue\\n }\\n }\\n mstore(add(i, d), t)\\n i := add(i, 1)\\n if iszero(lt(i, subjectSearchEnd)) { break }\\n }\\n }\\n let end := mload(0x00)\\n let n := add(sub(d, add(result, 0x20)), end)\\n // Copy the rest of the bytes one word at a time.\\n for {} lt(i, end) { i := add(i, 0x20) } { mstore(add(i, d), mload(i)) }\\n let o := add(i, d)\\n mstore(o, 0) // Zeroize the slot after the bytes.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from left to right, starting from `from`.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function indexOf(bytes memory subject, bytes memory needle, uint256 from)\\n internal\\n pure\\n returns (uint256 result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := not(0) // Initialize to `NOT_FOUND`.\\n for { let subjectLen := mload(subject) } 1 {} {\\n if iszero(mload(needle)) {\\n result := from\\n if iszero(gt(from, subjectLen)) { break }\\n result := subjectLen\\n break\\n }\\n let needleLen := mload(needle)\\n let subjectStart := add(subject, 0x20)\\n\\n subject := add(subjectStart, from)\\n let end := add(sub(add(subjectStart, subjectLen), needleLen), 1)\\n let m := shl(3, sub(0x20, and(needleLen, 0x1f)))\\n let s := mload(add(needle, 0x20))\\n\\n if iszero(and(lt(subject, end), lt(from, subjectLen))) { break }\\n\\n if iszero(lt(needleLen, 0x20)) {\\n for { let h := keccak256(add(needle, 0x20), needleLen) } 1 {} {\\n if iszero(shr(m, xor(mload(subject), s))) {\\n if eq(keccak256(subject, needleLen), h) {\\n result := sub(subject, subjectStart)\\n break\\n }\\n }\\n subject := add(subject, 1)\\n if iszero(lt(subject, end)) { break }\\n }\\n break\\n }\\n for {} 1 {} {\\n if iszero(shr(m, xor(mload(subject), s))) {\\n result := sub(subject, subjectStart)\\n break\\n }\\n subject := add(subject, 1)\\n if iszero(lt(subject, end)) { break }\\n }\\n break\\n }\\n }\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from left to right.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function indexOf(bytes memory subject, bytes memory needle) internal pure returns (uint256) {\\n return indexOf(subject, needle, 0);\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from right to left, starting from `from`.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function lastIndexOf(bytes memory subject, bytes memory needle, uint256 from)\\n internal\\n pure\\n returns (uint256 result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n for {} 1 {} {\\n result := not(0) // Initialize to `NOT_FOUND`.\\n let needleLen := mload(needle)\\n if gt(needleLen, mload(subject)) { break }\\n let w := result\\n\\n let fromMax := sub(mload(subject), needleLen)\\n if iszero(gt(fromMax, from)) { from := fromMax }\\n\\n let end := add(add(subject, 0x20), w)\\n subject := add(add(subject, 0x20), from)\\n if iszero(gt(subject, end)) { break }\\n // As this function is not too often used,\\n // we shall simply use keccak256 for smaller bytecode size.\\n for { let h := keccak256(add(needle, 0x20), needleLen) } 1 {} {\\n if eq(keccak256(subject, needleLen), h) {\\n result := sub(subject, add(end, 1))\\n break\\n }\\n subject := add(subject, w) // `sub(subject, 1)`.\\n if iszero(gt(subject, end)) { break }\\n }\\n break\\n }\\n }\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from right to left.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function lastIndexOf(bytes memory subject, bytes memory needle)\\n internal\\n pure\\n returns (uint256)\\n {\\n return lastIndexOf(subject, needle, type(uint256).max);\\n }\\n\\n /// @dev Returns true if `needle` is found in `subject`, false otherwise.\\n function contains(bytes memory subject, bytes memory needle) internal pure returns (bool) {\\n return indexOf(subject, needle) != NOT_FOUND;\\n }\\n\\n /// @dev Returns whether `subject` starts with `needle`.\\n function startsWith(bytes memory subject, bytes memory needle)\\n internal\\n pure\\n returns (bool result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := mload(needle)\\n // Just using keccak256 directly is actually cheaper.\\n let t := eq(keccak256(add(subject, 0x20), n), keccak256(add(needle, 0x20), n))\\n result := lt(gt(n, mload(subject)), t)\\n }\\n }\\n\\n /// @dev Returns whether `subject` ends with `needle`.\\n function endsWith(bytes memory subject, bytes memory needle)\\n internal\\n pure\\n returns (bool result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := mload(needle)\\n let notInRange := gt(n, mload(subject))\\n // `subject + 0x20 + max(subject.length - needle.length, 0)`.\\n let t := add(add(subject, 0x20), mul(iszero(notInRange), sub(mload(subject), n)))\\n // Just using keccak256 directly is actually cheaper.\\n result := gt(eq(keccak256(t, n), keccak256(add(needle, 0x20), n)), notInRange)\\n }\\n }\\n\\n /// @dev Returns `subject` repeated `times`.\\n function repeat(bytes memory subject, uint256 times)\\n internal\\n pure\\n returns (bytes memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let l := mload(subject) // Subject length.\\n if iszero(or(iszero(times), iszero(l))) {\\n result := mload(0x40)\\n subject := add(subject, 0x20)\\n let o := add(result, 0x20)\\n for {} 1 {} {\\n // Copy the `subject` one word at a time.\\n for { let j := 0 } 1 {} {\\n mstore(add(o, j), mload(add(subject, j)))\\n j := add(j, 0x20)\\n if iszero(lt(j, l)) { break }\\n }\\n o := add(o, l)\\n times := sub(times, 1)\\n if iszero(times) { break }\\n }\\n mstore(o, 0) // Zeroize the slot after the bytes.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n mstore(result, sub(o, add(result, 0x20))) // Store the length.\\n }\\n }\\n }\\n\\n /// @dev Returns a copy of `subject` sliced from `start` to `end` (exclusive).\\n /// `start` and `end` are byte offsets.\\n function slice(bytes memory subject, uint256 start, uint256 end)\\n internal\\n pure\\n returns (bytes memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let l := mload(subject) // Subject length.\\n if iszero(gt(l, end)) { end := l }\\n if iszero(gt(l, start)) { start := l }\\n if lt(start, end) {\\n result := mload(0x40)\\n let n := sub(end, start)\\n let i := add(subject, start)\\n let w := not(0x1f)\\n // Copy the `subject` one word at a time, backwards.\\n for { let j := and(add(n, 0x1f), w) } 1 {} {\\n mstore(add(result, j), mload(add(i, j)))\\n j := add(j, w) // `sub(j, 0x20)`.\\n if iszero(j) { break }\\n }\\n let o := add(add(result, 0x20), n)\\n mstore(o, 0) // Zeroize the slot after the bytes.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n mstore(result, n) // Store the length.\\n }\\n }\\n }\\n\\n /// @dev Returns a copy of `subject` sliced from `start` to the end of the bytes.\\n /// `start` is a byte offset.\\n function slice(bytes memory subject, uint256 start)\\n internal\\n pure\\n returns (bytes memory result)\\n {\\n result = slice(subject, start, type(uint256).max);\\n }\\n\\n /// @dev Returns a copy of `subject` sliced from `start` to `end` (exclusive).\\n /// `start` and `end` are byte offsets. Faster than Solidity's native slicing.\\n function sliceCalldata(bytes calldata subject, uint256 start, uint256 end)\\n internal\\n pure\\n returns (bytes calldata result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n end := xor(end, mul(xor(end, subject.length), lt(subject.length, end)))\\n start := xor(start, mul(xor(start, subject.length), lt(subject.length, start)))\\n result.offset := add(subject.offset, start)\\n result.length := mul(lt(start, end), sub(end, start))\\n }\\n }\\n\\n /// @dev Returns a copy of `subject` sliced from `start` to the end of the bytes.\\n /// `start` is a byte offset. Faster than Solidity's native slicing.\\n function sliceCalldata(bytes calldata subject, uint256 start)\\n internal\\n pure\\n returns (bytes calldata result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n start := xor(start, mul(xor(start, subject.length), lt(subject.length, start)))\\n result.offset := add(subject.offset, start)\\n result.length := mul(lt(start, subject.length), sub(subject.length, start))\\n }\\n }\\n\\n /// @dev Reduces the size of `subject` to `n`.\\n /// If `n` is greater than the size of `subject`, this will be a no-op.\\n function truncate(bytes memory subject, uint256 n)\\n internal\\n pure\\n returns (bytes memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := subject\\n mstore(mul(lt(n, mload(result)), result), n)\\n }\\n }\\n\\n /// @dev Returns a copy of `subject`, with the length reduced to `n`.\\n /// If `n` is greater than the size of `subject`, this will be a no-op.\\n function truncatedCalldata(bytes calldata subject, uint256 n)\\n internal\\n pure\\n returns (bytes calldata result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result.offset := subject.offset\\n result.length := xor(n, mul(xor(n, subject.length), lt(subject.length, n)))\\n }\\n }\\n\\n /// @dev Returns all the indices of `needle` in `subject`.\\n /// The indices are byte offsets.\\n function indicesOf(bytes memory subject, bytes memory needle)\\n internal\\n pure\\n returns (uint256[] memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let searchLen := mload(needle)\\n if iszero(gt(searchLen, mload(subject))) {\\n result := mload(0x40)\\n let i := add(subject, 0x20)\\n let o := add(result, 0x20)\\n let subjectSearchEnd := add(sub(add(i, mload(subject)), searchLen), 1)\\n let h := 0 // The hash of `needle`.\\n if iszero(lt(searchLen, 0x20)) { h := keccak256(add(needle, 0x20), searchLen) }\\n let s := mload(add(needle, 0x20))\\n for { let m := shl(3, sub(0x20, and(searchLen, 0x1f))) } 1 {} {\\n let t := mload(i)\\n // Whether the first `searchLen % 32` bytes of `subject` and `needle` matches.\\n if iszero(shr(m, xor(t, s))) {\\n if h {\\n if iszero(eq(keccak256(i, searchLen), h)) {\\n i := add(i, 1)\\n if iszero(lt(i, subjectSearchEnd)) { break }\\n continue\\n }\\n }\\n mstore(o, sub(i, add(subject, 0x20))) // Append to `result`.\\n o := add(o, 0x20)\\n i := add(i, searchLen) // Advance `i` by `searchLen`.\\n if searchLen {\\n if iszero(lt(i, subjectSearchEnd)) { break }\\n continue\\n }\\n }\\n i := add(i, 1)\\n if iszero(lt(i, subjectSearchEnd)) { break }\\n }\\n mstore(result, shr(5, sub(o, add(result, 0x20)))) // Store the length of `result`.\\n // Allocate memory for result.\\n // We allocate one more word, so this array can be recycled for {split}.\\n mstore(0x40, add(o, 0x20))\\n }\\n }\\n }\\n\\n /// @dev Returns an arrays of bytess based on the `delimiter` inside of the `subject` bytes.\\n function split(bytes memory subject, bytes memory delimiter)\\n internal\\n pure\\n returns (bytes[] memory result)\\n {\\n uint256[] memory indices = indicesOf(subject, delimiter);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let w := not(0x1f)\\n let indexPtr := add(indices, 0x20)\\n let indicesEnd := add(indexPtr, shl(5, add(mload(indices), 1)))\\n mstore(add(indicesEnd, w), mload(subject))\\n mstore(indices, add(mload(indices), 1))\\n for { let prevIndex := 0 } 1 {} {\\n let index := mload(indexPtr)\\n mstore(indexPtr, 0x60)\\n if iszero(eq(index, prevIndex)) {\\n let element := mload(0x40)\\n let l := sub(index, prevIndex)\\n mstore(element, l) // Store the length of the element.\\n // Copy the `subject` one word at a time, backwards.\\n for { let o := and(add(l, 0x1f), w) } 1 {} {\\n mstore(add(element, o), mload(add(add(subject, prevIndex), o)))\\n o := add(o, w) // `sub(o, 0x20)`.\\n if iszero(o) { break }\\n }\\n mstore(add(add(element, 0x20), l), 0) // Zeroize the slot after the bytes.\\n // Allocate memory for the length and the bytes, rounded up to a multiple of 32.\\n mstore(0x40, add(element, and(add(l, 0x3f), w)))\\n mstore(indexPtr, element) // Store the `element` into the array.\\n }\\n prevIndex := add(index, mload(delimiter))\\n indexPtr := add(indexPtr, 0x20)\\n if iszero(lt(indexPtr, indicesEnd)) { break }\\n }\\n result := indices\\n if iszero(mload(delimiter)) {\\n result := add(indices, 0x20)\\n mstore(result, sub(mload(indices), 2))\\n }\\n }\\n }\\n\\n /// @dev Returns a concatenated bytes of `a` and `b`.\\n /// Cheaper than `bytes.concat()` and does not de-align the free memory pointer.\\n function concat(bytes memory a, bytes memory b) internal pure returns (bytes memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n let w := not(0x1f)\\n let aLen := mload(a)\\n // Copy `a` one word at a time, backwards.\\n for { let o := and(add(aLen, 0x20), w) } 1 {} {\\n mstore(add(result, o), mload(add(a, o)))\\n o := add(o, w) // `sub(o, 0x20)`.\\n if iszero(o) { break }\\n }\\n let bLen := mload(b)\\n let output := add(result, aLen)\\n // Copy `b` one word at a time, backwards.\\n for { let o := and(add(bLen, 0x20), w) } 1 {} {\\n mstore(add(output, o), mload(add(b, o)))\\n o := add(o, w) // `sub(o, 0x20)`.\\n if iszero(o) { break }\\n }\\n let totalLen := add(aLen, bLen)\\n let last := add(add(result, 0x20), totalLen)\\n mstore(last, 0) // Zeroize the slot after the bytes.\\n mstore(result, totalLen) // Store the length.\\n mstore(0x40, add(last, 0x20)) // Allocate memory.\\n }\\n }\\n\\n /// @dev Returns whether `a` equals `b`.\\n function eq(bytes memory a, bytes memory b) internal pure returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := eq(keccak256(add(a, 0x20), mload(a)), keccak256(add(b, 0x20), mload(b)))\\n }\\n }\\n\\n /// @dev Returns whether `a` equals `b`, where `b` is a null-terminated small bytes.\\n function eqs(bytes memory a, bytes32 b) internal pure returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // These should be evaluated on compile time, as far as possible.\\n let m := not(shl(7, div(not(iszero(b)), 255))) // `0x7f7f ...`.\\n let x := not(or(m, or(b, add(m, and(b, m)))))\\n let r := shl(7, iszero(iszero(shr(128, x))))\\n r := or(r, shl(6, iszero(iszero(shr(64, shr(r, x))))))\\n r := or(r, shl(5, lt(0xffffffff, shr(r, x))))\\n r := or(r, shl(4, lt(0xffff, shr(r, x))))\\n r := or(r, shl(3, lt(0xff, shr(r, x))))\\n // forgefmt: disable-next-item\\n result := gt(eq(mload(a), add(iszero(x), xor(31, shr(3, r)))),\\n xor(shr(add(8, r), b), shr(add(8, r), mload(add(a, 0x20)))))\\n }\\n }\\n\\n /// @dev Returns 0 if `a == b`, -1 if `a < b`, +1 if `a > b`.\\n /// If `a` == b[:a.length]`, and `a.length < b.length`, returns -1.\\n function cmp(bytes memory a, bytes memory b) internal pure returns (int256 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let aLen := mload(a)\\n let bLen := mload(b)\\n let n := and(xor(aLen, mul(xor(aLen, bLen), lt(bLen, aLen))), not(0x1f))\\n if n {\\n for { let i := 0x20 } 1 {} {\\n let x := mload(add(a, i))\\n let y := mload(add(b, i))\\n if iszero(or(xor(x, y), eq(i, n))) {\\n i := add(i, 0x20)\\n continue\\n }\\n result := sub(gt(x, y), lt(x, y))\\n break\\n }\\n }\\n // forgefmt: disable-next-item\\n if iszero(result) {\\n let l := 0x201f1e1d1c1b1a191817161514131211100f0e0d0c0b0a090807060504030201\\n let x := and(mload(add(add(a, 0x20), n)), shl(shl(3, byte(sub(aLen, n), l)), not(0)))\\n let y := and(mload(add(add(b, 0x20), n)), shl(shl(3, byte(sub(bLen, n), l)), not(0)))\\n result := sub(gt(x, y), lt(x, y))\\n if iszero(result) { result := sub(gt(aLen, bLen), lt(aLen, bLen)) }\\n }\\n }\\n }\\n\\n /// @dev Directly returns `a` without copying.\\n function directReturn(bytes memory a) internal pure {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Assumes that the bytes does not start from the scratch space.\\n let retStart := sub(a, 0x20)\\n let retUnpaddedSize := add(mload(a), 0x40)\\n // Right pad with zeroes. Just in case the bytes is produced\\n // by a method that doesn't zero right pad.\\n mstore(add(retStart, retUnpaddedSize), 0)\\n mstore(retStart, 0x20) // Store the return offset.\\n // End the transaction, returning the bytes.\\n return(retStart, and(not(0x1f), add(0x1f, retUnpaddedSize)))\\n }\\n }\\n\\n /// @dev Directly returns `a` with minimal copying.\\n function directReturn(bytes[] memory a) internal pure {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := mload(a) // `a.length`.\\n let o := add(a, 0x20) // Start of elements in `a`.\\n let u := a // Highest memory slot.\\n let w := not(0x1f)\\n for { let i := 0 } iszero(eq(i, n)) { i := add(i, 1) } {\\n let c := add(o, shl(5, i)) // Location of pointer to `a[i]`.\\n let s := mload(c) // `a[i]`.\\n let l := mload(s) // `a[i].length`.\\n let r := and(l, 0x1f) // `a[i].length % 32`.\\n let z := add(0x20, and(l, w)) // Offset of last word in `a[i]` from `s`.\\n // If `s` comes before `o`, or `s` is not zero right padded.\\n if iszero(lt(lt(s, o), or(iszero(r), iszero(shl(shl(3, r), mload(add(s, z))))))) {\\n let m := mload(0x40)\\n mstore(m, l) // Copy `a[i].length`.\\n for {} 1 {} {\\n mstore(add(m, z), mload(add(s, z))) // Copy `a[i]`, backwards.\\n z := add(z, w) // `sub(z, 0x20)`.\\n if iszero(z) { break }\\n }\\n let e := add(add(m, 0x20), l)\\n mstore(e, 0) // Zeroize the slot after the copied bytes.\\n mstore(0x40, add(e, 0x20)) // Allocate memory.\\n s := m\\n }\\n mstore(c, sub(s, o)) // Convert to calldata offset.\\n let t := add(l, add(s, 0x20))\\n if iszero(lt(t, u)) { u := t }\\n }\\n let retStart := add(a, w) // Assumes `a` doesn't start from scratch space.\\n mstore(retStart, 0x20) // Store the return offset.\\n return(retStart, add(0x40, sub(u, retStart))) // End the transaction.\\n }\\n }\\n\\n /// @dev Returns the word at `offset`, without any bounds checks.\\n function load(bytes memory a, uint256 offset) internal pure returns (bytes32 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(add(add(a, 0x20), offset))\\n }\\n }\\n\\n /// @dev Returns the word at `offset`, without any bounds checks.\\n function loadCalldata(bytes calldata a, uint256 offset)\\n internal\\n pure\\n returns (bytes32 result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := calldataload(add(a.offset, offset))\\n }\\n }\\n\\n /// @dev Returns a slice representing a static struct in the calldata. Performs bounds checks.\\n function staticStructInCalldata(bytes calldata a, uint256 offset)\\n internal\\n pure\\n returns (bytes calldata result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let l := sub(a.length, 0x20)\\n result.offset := add(a.offset, offset)\\n result.length := sub(a.length, offset)\\n if or(shr(64, or(l, a.offset)), gt(offset, l)) { revert(l, 0x00) }\\n }\\n }\\n\\n /// @dev Returns a slice representing a dynamic struct in the calldata. Performs bounds checks.\\n function dynamicStructInCalldata(bytes calldata a, uint256 offset)\\n internal\\n pure\\n returns (bytes calldata result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let l := sub(a.length, 0x20)\\n let s := calldataload(add(a.offset, offset)) // Relative offset of `result` from `a.offset`.\\n result.offset := add(a.offset, s)\\n result.length := sub(a.length, s)\\n if or(shr(64, or(s, or(l, a.offset))), gt(offset, l)) { revert(l, 0x00) }\\n }\\n }\\n\\n /// @dev Returns bytes in calldata. Performs bounds checks.\\n function bytesInCalldata(bytes calldata a, uint256 offset)\\n internal\\n pure\\n returns (bytes calldata result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let l := sub(a.length, 0x20)\\n let s := calldataload(add(a.offset, offset)) // Relative offset of `result` from `a.offset`.\\n result.offset := add(add(a.offset, s), 0x20)\\n result.length := calldataload(add(a.offset, s))\\n // forgefmt: disable-next-item\\n if or(shr(64, or(result.length, or(s, or(l, a.offset)))),\\n or(gt(add(s, result.length), l), gt(offset, l))) { revert(l, 0x00) }\\n }\\n }\\n\\n /// @dev Returns empty calldata bytes. For silencing the compiler.\\n function emptyCalldata() internal pure returns (bytes calldata result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result.length := 0\\n }\\n }\\n}\\n\",\"keccak256\":\"0x320c3c933df51e8fd6f1fc96de721c8cc6f1be1d4c586c11f1c472a23b86eba5\",\"license\":\"MIT\"},\"lib/solady/src/utils/LibString.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport {LibBytes} from \\\"./LibBytes.sol\\\";\\n\\n/// @notice Library for converting numbers into strings and other string operations.\\n/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibString.sol)\\n/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/LibString.sol)\\n///\\n/// @dev Note:\\n/// For performance and bytecode compactness, most of the string operations are restricted to\\n/// byte strings (7-bit ASCII), except where otherwise specified.\\n/// Usage of byte string operations on charsets with runes spanning two or more bytes\\n/// can lead to undefined behavior.\\nlibrary LibString {\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* STRUCTS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Goated string storage struct that totally MOGs, no cap, fr.\\n /// Uses less gas and bytecode than Solidity's native string storage. It's meta af.\\n /// Packs length with the first 31 bytes if <255 bytes, so it\\u2019s mad tight.\\n struct StringStorage {\\n bytes32 _spacer;\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* CUSTOM ERRORS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev The length of the output is too small to contain all the hex digits.\\n error HexLengthInsufficient();\\n\\n /// @dev The length of the string is more than 32 bytes.\\n error TooBigForSmallString();\\n\\n /// @dev The input string must be a 7-bit ASCII.\\n error StringNot7BitASCII();\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* CONSTANTS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev The constant returned when the `search` is not found in the string.\\n uint256 internal constant NOT_FOUND = type(uint256).max;\\n\\n /// @dev Lookup for '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'.\\n uint128 internal constant ALPHANUMERIC_7_BIT_ASCII = 0x7fffffe07fffffe03ff000000000000;\\n\\n /// @dev Lookup for 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'.\\n uint128 internal constant LETTERS_7_BIT_ASCII = 0x7fffffe07fffffe0000000000000000;\\n\\n /// @dev Lookup for 'abcdefghijklmnopqrstuvwxyz'.\\n uint128 internal constant LOWERCASE_7_BIT_ASCII = 0x7fffffe000000000000000000000000;\\n\\n /// @dev Lookup for 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.\\n uint128 internal constant UPPERCASE_7_BIT_ASCII = 0x7fffffe0000000000000000;\\n\\n /// @dev Lookup for '0123456789'.\\n uint128 internal constant DIGITS_7_BIT_ASCII = 0x3ff000000000000;\\n\\n /// @dev Lookup for '0123456789abcdefABCDEF'.\\n uint128 internal constant HEXDIGITS_7_BIT_ASCII = 0x7e0000007e03ff000000000000;\\n\\n /// @dev Lookup for '01234567'.\\n uint128 internal constant OCTDIGITS_7_BIT_ASCII = 0xff000000000000;\\n\\n /// @dev Lookup for '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!\\\"#$%&\\\\'()*+,-./:;<=>?@[\\\\\\\\]^_`{|}~ \\\\t\\\\n\\\\r\\\\x0b\\\\x0c'.\\n uint128 internal constant PRINTABLE_7_BIT_ASCII = 0x7fffffffffffffffffffffff00003e00;\\n\\n /// @dev Lookup for '!\\\"#$%&\\\\'()*+,-./:;<=>?@[\\\\\\\\]^_`{|}~'.\\n uint128 internal constant PUNCTUATION_7_BIT_ASCII = 0x78000001f8000001fc00fffe00000000;\\n\\n /// @dev Lookup for ' \\\\t\\\\n\\\\r\\\\x0b\\\\x0c'.\\n uint128 internal constant WHITESPACE_7_BIT_ASCII = 0x100003e00;\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* STRING STORAGE OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Sets the value of the string storage `$` to `s`.\\n function set(StringStorage storage $, string memory s) internal {\\n LibBytes.set(bytesStorage($), bytes(s));\\n }\\n\\n /// @dev Sets the value of the string storage `$` to `s`.\\n function setCalldata(StringStorage storage $, string calldata s) internal {\\n LibBytes.setCalldata(bytesStorage($), bytes(s));\\n }\\n\\n /// @dev Sets the value of the string storage `$` to the empty string.\\n function clear(StringStorage storage $) internal {\\n delete $._spacer;\\n }\\n\\n /// @dev Returns whether the value stored is `$` is the empty string \\\"\\\".\\n function isEmpty(StringStorage storage $) internal view returns (bool) {\\n return uint256($._spacer) & 0xff == uint256(0);\\n }\\n\\n /// @dev Returns the length of the value stored in `$`.\\n function length(StringStorage storage $) internal view returns (uint256) {\\n return LibBytes.length(bytesStorage($));\\n }\\n\\n /// @dev Returns the value stored in `$`.\\n function get(StringStorage storage $) internal view returns (string memory) {\\n return string(LibBytes.get(bytesStorage($)));\\n }\\n\\n /// @dev Returns the uint8 at index `i`. If out-of-bounds, returns 0.\\n function uint8At(StringStorage storage $, uint256 i) internal view returns (uint8) {\\n return LibBytes.uint8At(bytesStorage($), i);\\n }\\n\\n /// @dev Helper to cast `$` to a `BytesStorage`.\\n function bytesStorage(StringStorage storage $)\\n internal\\n pure\\n returns (LibBytes.BytesStorage storage casted)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n casted.slot := $.slot\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* DECIMAL OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns the base 10 decimal representation of `value`.\\n function toString(uint256 value) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // The maximum value of a uint256 contains 78 digits (1 byte per digit), but\\n // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.\\n // We will need 1 word for the trailing zeros padding, 1 word for the length,\\n // and 3 words for a maximum of 78 digits.\\n result := add(mload(0x40), 0x80)\\n mstore(0x40, add(result, 0x20)) // Allocate memory.\\n mstore(result, 0) // Zeroize the slot after the string.\\n\\n let end := result // Cache the end of the memory to calculate the length later.\\n let w := not(0) // Tsk.\\n // We write the string from rightmost digit to leftmost digit.\\n // The following is essentially a do-while loop that also handles the zero case.\\n for { let temp := value } 1 {} {\\n result := add(result, w) // `sub(result, 1)`.\\n // Store the character to the pointer.\\n // The ASCII index of the '0' character is 48.\\n mstore8(result, add(48, mod(temp, 10)))\\n temp := div(temp, 10) // Keep dividing `temp` until zero.\\n if iszero(temp) { break }\\n }\\n let n := sub(end, result)\\n result := sub(result, 0x20) // Move the pointer 32 bytes back to make room for the length.\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the base 10 decimal representation of `value`.\\n function toString(int256 value) internal pure returns (string memory result) {\\n if (value >= 0) return toString(uint256(value));\\n unchecked {\\n result = toString(~uint256(value) + 1);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n // We still have some spare memory space on the left,\\n // as we have allocated 3 words (96 bytes) for up to 78 digits.\\n let n := mload(result) // Load the string length.\\n mstore(result, 0x2d) // Store the '-' character.\\n result := sub(result, 1) // Move back the string pointer by a byte.\\n mstore(result, add(n, 1)) // Update the string length.\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* HEXADECIMAL OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns the hexadecimal representation of `value`,\\n /// left-padded to an input length of `byteCount` bytes.\\n /// The output is prefixed with \\\"0x\\\" encoded using 2 hexadecimal digits per byte,\\n /// giving a total length of `byteCount * 2 + 2` bytes.\\n /// Reverts if `byteCount` is too small for the output to contain all the digits.\\n function toHexString(uint256 value, uint256 byteCount)\\n internal\\n pure\\n returns (string memory result)\\n {\\n result = toHexStringNoPrefix(value, byteCount);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := add(mload(result), 2) // Compute the length.\\n mstore(result, 0x3078) // Store the \\\"0x\\\" prefix.\\n result := sub(result, 2) // Move the pointer.\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`,\\n /// left-padded to an input length of `byteCount` bytes.\\n /// The output is not prefixed with \\\"0x\\\" and is encoded using 2 hexadecimal digits per byte,\\n /// giving a total length of `byteCount * 2` bytes.\\n /// Reverts if `byteCount` is too small for the output to contain all the digits.\\n function toHexStringNoPrefix(uint256 value, uint256 byteCount)\\n internal\\n pure\\n returns (string memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // We need 0x20 bytes for the trailing zeros padding, `byteCount * 2` bytes\\n // for the digits, 0x02 bytes for the prefix, and 0x20 bytes for the length.\\n // We add 0x20 to the total and round down to a multiple of 0x20.\\n // (0x20 + 0x20 + 0x02 + 0x20) = 0x62.\\n result := add(mload(0x40), and(add(shl(1, byteCount), 0x42), not(0x1f)))\\n mstore(0x40, add(result, 0x20)) // Allocate memory.\\n mstore(result, 0) // Zeroize the slot after the string.\\n\\n let end := result // Cache the end to calculate the length later.\\n // Store \\\"0123456789abcdef\\\" in scratch space.\\n mstore(0x0f, 0x30313233343536373839616263646566)\\n\\n let start := sub(result, add(byteCount, byteCount))\\n let w := not(1) // Tsk.\\n let temp := value\\n // We write the string from rightmost digit to leftmost digit.\\n // The following is essentially a do-while loop that also handles the zero case.\\n for {} 1 {} {\\n result := add(result, w) // `sub(result, 2)`.\\n mstore8(add(result, 1), mload(and(temp, 15)))\\n mstore8(result, mload(and(shr(4, temp), 15)))\\n temp := shr(8, temp)\\n if iszero(xor(result, start)) { break }\\n }\\n if temp {\\n mstore(0x00, 0x2194895a) // `HexLengthInsufficient()`.\\n revert(0x1c, 0x04)\\n }\\n let n := sub(end, result)\\n result := sub(result, 0x20)\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`.\\n /// The output is prefixed with \\\"0x\\\" and encoded using 2 hexadecimal digits per byte.\\n /// As address are 20 bytes long, the output will left-padded to have\\n /// a length of `20 * 2 + 2` bytes.\\n function toHexString(uint256 value) internal pure returns (string memory result) {\\n result = toHexStringNoPrefix(value);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := add(mload(result), 2) // Compute the length.\\n mstore(result, 0x3078) // Store the \\\"0x\\\" prefix.\\n result := sub(result, 2) // Move the pointer.\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`.\\n /// The output is prefixed with \\\"0x\\\".\\n /// The output excludes leading \\\"0\\\" from the `toHexString` output.\\n /// `0x00: \\\"0x0\\\", 0x01: \\\"0x1\\\", 0x12: \\\"0x12\\\", 0x123: \\\"0x123\\\"`.\\n function toMinimalHexString(uint256 value) internal pure returns (string memory result) {\\n result = toHexStringNoPrefix(value);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let o := eq(byte(0, mload(add(result, 0x20))), 0x30) // Whether leading zero is present.\\n let n := add(mload(result), 2) // Compute the length.\\n mstore(add(result, o), 0x3078) // Store the \\\"0x\\\" prefix, accounting for leading zero.\\n result := sub(add(result, o), 2) // Move the pointer, accounting for leading zero.\\n mstore(result, sub(n, o)) // Store the length, accounting for leading zero.\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`.\\n /// The output excludes leading \\\"0\\\" from the `toHexStringNoPrefix` output.\\n /// `0x00: \\\"0\\\", 0x01: \\\"1\\\", 0x12: \\\"12\\\", 0x123: \\\"123\\\"`.\\n function toMinimalHexStringNoPrefix(uint256 value)\\n internal\\n pure\\n returns (string memory result)\\n {\\n result = toHexStringNoPrefix(value);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let o := eq(byte(0, mload(add(result, 0x20))), 0x30) // Whether leading zero is present.\\n let n := mload(result) // Get the length.\\n result := add(result, o) // Move the pointer, accounting for leading zero.\\n mstore(result, sub(n, o)) // Store the length, accounting for leading zero.\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`.\\n /// The output is encoded using 2 hexadecimal digits per byte.\\n /// As address are 20 bytes long, the output will left-padded to have\\n /// a length of `20 * 2` bytes.\\n function toHexStringNoPrefix(uint256 value) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // We need 0x20 bytes for the trailing zeros padding, 0x20 bytes for the length,\\n // 0x02 bytes for the prefix, and 0x40 bytes for the digits.\\n // The next multiple of 0x20 above (0x20 + 0x20 + 0x02 + 0x40) is 0xa0.\\n result := add(mload(0x40), 0x80)\\n mstore(0x40, add(result, 0x20)) // Allocate memory.\\n mstore(result, 0) // Zeroize the slot after the string.\\n\\n let end := result // Cache the end to calculate the length later.\\n mstore(0x0f, 0x30313233343536373839616263646566) // Store the \\\"0123456789abcdef\\\" lookup.\\n\\n let w := not(1) // Tsk.\\n // We write the string from rightmost digit to leftmost digit.\\n // The following is essentially a do-while loop that also handles the zero case.\\n for { let temp := value } 1 {} {\\n result := add(result, w) // `sub(result, 2)`.\\n mstore8(add(result, 1), mload(and(temp, 15)))\\n mstore8(result, mload(and(shr(4, temp), 15)))\\n temp := shr(8, temp)\\n if iszero(temp) { break }\\n }\\n let n := sub(end, result)\\n result := sub(result, 0x20)\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`.\\n /// The output is prefixed with \\\"0x\\\", encoded using 2 hexadecimal digits per byte,\\n /// and the alphabets are capitalized conditionally according to\\n /// https://eips.ethereum.org/EIPS/eip-55\\n function toHexStringChecksummed(address value) internal pure returns (string memory result) {\\n result = toHexString(value);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let mask := shl(6, div(not(0), 255)) // `0b010000000100000000 ...`\\n let o := add(result, 0x22)\\n let hashed := and(keccak256(o, 40), mul(34, mask)) // `0b10001000 ... `\\n let t := shl(240, 136) // `0b10001000 << 240`\\n for { let i := 0 } 1 {} {\\n mstore(add(i, i), mul(t, byte(i, hashed)))\\n i := add(i, 1)\\n if eq(i, 20) { break }\\n }\\n mstore(o, xor(mload(o), shr(1, and(mload(0x00), and(mload(o), mask)))))\\n o := add(o, 0x20)\\n mstore(o, xor(mload(o), shr(1, and(mload(0x20), and(mload(o), mask)))))\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`.\\n /// The output is prefixed with \\\"0x\\\" and encoded using 2 hexadecimal digits per byte.\\n function toHexString(address value) internal pure returns (string memory result) {\\n result = toHexStringNoPrefix(value);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := add(mload(result), 2) // Compute the length.\\n mstore(result, 0x3078) // Store the \\\"0x\\\" prefix.\\n result := sub(result, 2) // Move the pointer.\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`.\\n /// The output is encoded using 2 hexadecimal digits per byte.\\n function toHexStringNoPrefix(address value) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n // Allocate memory.\\n // We need 0x20 bytes for the trailing zeros padding, 0x20 bytes for the length,\\n // 0x02 bytes for the prefix, and 0x28 bytes for the digits.\\n // The next multiple of 0x20 above (0x20 + 0x20 + 0x02 + 0x28) is 0x80.\\n mstore(0x40, add(result, 0x80))\\n mstore(0x0f, 0x30313233343536373839616263646566) // Store the \\\"0123456789abcdef\\\" lookup.\\n\\n result := add(result, 2)\\n mstore(result, 40) // Store the length.\\n let o := add(result, 0x20)\\n mstore(add(o, 40), 0) // Zeroize the slot after the string.\\n value := shl(96, value)\\n // We write the string from rightmost digit to leftmost digit.\\n // The following is essentially a do-while loop that also handles the zero case.\\n for { let i := 0 } 1 {} {\\n let p := add(o, add(i, i))\\n let temp := byte(i, value)\\n mstore8(add(p, 1), mload(and(temp, 15)))\\n mstore8(p, mload(shr(4, temp)))\\n i := add(i, 1)\\n if eq(i, 20) { break }\\n }\\n }\\n }\\n\\n /// @dev Returns the hex encoded string from the raw bytes.\\n /// The output is encoded using 2 hexadecimal digits per byte.\\n function toHexString(bytes memory raw) internal pure returns (string memory result) {\\n result = toHexStringNoPrefix(raw);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := add(mload(result), 2) // Compute the length.\\n mstore(result, 0x3078) // Store the \\\"0x\\\" prefix.\\n result := sub(result, 2) // Move the pointer.\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the hex encoded string from the raw bytes.\\n /// The output is encoded using 2 hexadecimal digits per byte.\\n function toHexStringNoPrefix(bytes memory raw) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := mload(raw)\\n result := add(mload(0x40), 2) // Skip 2 bytes for the optional prefix.\\n mstore(result, add(n, n)) // Store the length of the output.\\n\\n mstore(0x0f, 0x30313233343536373839616263646566) // Store the \\\"0123456789abcdef\\\" lookup.\\n let o := add(result, 0x20)\\n let end := add(raw, n)\\n for {} iszero(eq(raw, end)) {} {\\n raw := add(raw, 1)\\n mstore8(add(o, 1), mload(and(mload(raw), 15)))\\n mstore8(o, mload(and(shr(4, mload(raw)), 15)))\\n o := add(o, 2)\\n }\\n mstore(o, 0) // Zeroize the slot after the string.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* RUNE STRING OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns the number of UTF characters in the string.\\n function runeCount(string memory s) internal pure returns (uint256 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n if mload(s) {\\n mstore(0x00, div(not(0), 255))\\n mstore(0x20, 0x0202020202020202020202020202020202020202020202020303030304040506)\\n let o := add(s, 0x20)\\n let end := add(o, mload(s))\\n for { result := 1 } 1 { result := add(result, 1) } {\\n o := add(o, byte(0, mload(shr(250, mload(o)))))\\n if iszero(lt(o, end)) { break }\\n }\\n }\\n }\\n }\\n\\n /// @dev Returns if this string is a 7-bit ASCII string.\\n /// (i.e. all characters codes are in [0..127])\\n function is7BitASCII(string memory s) internal pure returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := 1\\n let mask := shl(7, div(not(0), 255))\\n let n := mload(s)\\n if n {\\n let o := add(s, 0x20)\\n let end := add(o, n)\\n let last := mload(end)\\n mstore(end, 0)\\n for {} 1 {} {\\n if and(mask, mload(o)) {\\n result := 0\\n break\\n }\\n o := add(o, 0x20)\\n if iszero(lt(o, end)) { break }\\n }\\n mstore(end, last)\\n }\\n }\\n }\\n\\n /// @dev Returns if this string is a 7-bit ASCII string,\\n /// AND all characters are in the `allowed` lookup.\\n /// Note: If `s` is empty, returns true regardless of `allowed`.\\n function is7BitASCII(string memory s, uint128 allowed) internal pure returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := 1\\n if mload(s) {\\n let allowed_ := shr(128, shl(128, allowed))\\n let o := add(s, 0x20)\\n for { let end := add(o, mload(s)) } 1 {} {\\n result := and(result, shr(byte(0, mload(o)), allowed_))\\n o := add(o, 1)\\n if iszero(and(result, lt(o, end))) { break }\\n }\\n }\\n }\\n }\\n\\n /// @dev Converts the bytes in the 7-bit ASCII string `s` to\\n /// an allowed lookup for use in `is7BitASCII(s, allowed)`.\\n /// To save runtime gas, you can cache the result in an immutable variable.\\n function to7BitASCIIAllowedLookup(string memory s) internal pure returns (uint128 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n if mload(s) {\\n let o := add(s, 0x20)\\n for { let end := add(o, mload(s)) } 1 {} {\\n result := or(result, shl(byte(0, mload(o)), 1))\\n o := add(o, 1)\\n if iszero(lt(o, end)) { break }\\n }\\n if shr(128, result) {\\n mstore(0x00, 0xc9807e0d) // `StringNot7BitASCII()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* BYTE STRING OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n // For performance and bytecode compactness, byte string operations are restricted\\n // to 7-bit ASCII strings. All offsets are byte offsets, not UTF character offsets.\\n // Usage of byte string operations on charsets with runes spanning two or more bytes\\n // can lead to undefined behavior.\\n\\n /// @dev Returns `subject` all occurrences of `needle` replaced with `replacement`.\\n function replace(string memory subject, string memory needle, string memory replacement)\\n internal\\n pure\\n returns (string memory)\\n {\\n return string(LibBytes.replace(bytes(subject), bytes(needle), bytes(replacement)));\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from left to right, starting from `from`.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function indexOf(string memory subject, string memory needle, uint256 from)\\n internal\\n pure\\n returns (uint256)\\n {\\n return LibBytes.indexOf(bytes(subject), bytes(needle), from);\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from left to right.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function indexOf(string memory subject, string memory needle) internal pure returns (uint256) {\\n return LibBytes.indexOf(bytes(subject), bytes(needle), 0);\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from right to left, starting from `from`.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function lastIndexOf(string memory subject, string memory needle, uint256 from)\\n internal\\n pure\\n returns (uint256)\\n {\\n return LibBytes.lastIndexOf(bytes(subject), bytes(needle), from);\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from right to left.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function lastIndexOf(string memory subject, string memory needle)\\n internal\\n pure\\n returns (uint256)\\n {\\n return LibBytes.lastIndexOf(bytes(subject), bytes(needle), type(uint256).max);\\n }\\n\\n /// @dev Returns true if `needle` is found in `subject`, false otherwise.\\n function contains(string memory subject, string memory needle) internal pure returns (bool) {\\n return LibBytes.contains(bytes(subject), bytes(needle));\\n }\\n\\n /// @dev Returns whether `subject` starts with `needle`.\\n function startsWith(string memory subject, string memory needle) internal pure returns (bool) {\\n return LibBytes.startsWith(bytes(subject), bytes(needle));\\n }\\n\\n /// @dev Returns whether `subject` ends with `needle`.\\n function endsWith(string memory subject, string memory needle) internal pure returns (bool) {\\n return LibBytes.endsWith(bytes(subject), bytes(needle));\\n }\\n\\n /// @dev Returns `subject` repeated `times`.\\n function repeat(string memory subject, uint256 times) internal pure returns (string memory) {\\n return string(LibBytes.repeat(bytes(subject), times));\\n }\\n\\n /// @dev Returns a copy of `subject` sliced from `start` to `end` (exclusive).\\n /// `start` and `end` are byte offsets.\\n function slice(string memory subject, uint256 start, uint256 end)\\n internal\\n pure\\n returns (string memory)\\n {\\n return string(LibBytes.slice(bytes(subject), start, end));\\n }\\n\\n /// @dev Returns a copy of `subject` sliced from `start` to the end of the string.\\n /// `start` is a byte offset.\\n function slice(string memory subject, uint256 start) internal pure returns (string memory) {\\n return string(LibBytes.slice(bytes(subject), start, type(uint256).max));\\n }\\n\\n /// @dev Returns all the indices of `needle` in `subject`.\\n /// The indices are byte offsets.\\n function indicesOf(string memory subject, string memory needle)\\n internal\\n pure\\n returns (uint256[] memory)\\n {\\n return LibBytes.indicesOf(bytes(subject), bytes(needle));\\n }\\n\\n /// @dev Returns an arrays of strings based on the `delimiter` inside of the `subject` string.\\n function split(string memory subject, string memory delimiter)\\n internal\\n pure\\n returns (string[] memory result)\\n {\\n bytes[] memory a = LibBytes.split(bytes(subject), bytes(delimiter));\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := a\\n }\\n }\\n\\n /// @dev Returns a concatenated string of `a` and `b`.\\n /// Cheaper than `string.concat()` and does not de-align the free memory pointer.\\n function concat(string memory a, string memory b) internal pure returns (string memory) {\\n return string(LibBytes.concat(bytes(a), bytes(b)));\\n }\\n\\n /// @dev Returns a copy of the string in either lowercase or UPPERCASE.\\n /// WARNING! This function is only compatible with 7-bit ASCII strings.\\n function toCase(string memory subject, bool toUpper)\\n internal\\n pure\\n returns (string memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := mload(subject)\\n if n {\\n result := mload(0x40)\\n let o := add(result, 0x20)\\n let d := sub(subject, result)\\n let flags := shl(add(70, shl(5, toUpper)), 0x3ffffff)\\n for { let end := add(o, n) } 1 {} {\\n let b := byte(0, mload(add(d, o)))\\n mstore8(o, xor(and(shr(b, flags), 0x20), b))\\n o := add(o, 1)\\n if eq(o, end) { break }\\n }\\n mstore(result, n) // Store the length.\\n mstore(o, 0) // Zeroize the slot after the string.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n }\\n }\\n }\\n\\n /// @dev Returns a string from a small bytes32 string.\\n /// `s` must be null-terminated, or behavior will be undefined.\\n function fromSmallString(bytes32 s) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n let n := 0\\n for {} byte(n, s) { n := add(n, 1) } {} // Scan for '\\\\0'.\\n mstore(result, n) // Store the length.\\n let o := add(result, 0x20)\\n mstore(o, s) // Store the bytes of the string.\\n mstore(add(o, n), 0) // Zeroize the slot after the string.\\n mstore(0x40, add(result, 0x40)) // Allocate memory.\\n }\\n }\\n\\n /// @dev Returns the small string, with all bytes after the first null byte zeroized.\\n function normalizeSmallString(bytes32 s) internal pure returns (bytes32 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n for {} byte(result, s) { result := add(result, 1) } {} // Scan for '\\\\0'.\\n mstore(0x00, s)\\n mstore(result, 0x00)\\n result := mload(0x00)\\n }\\n }\\n\\n /// @dev Returns the string as a normalized null-terminated small string.\\n function toSmallString(string memory s) internal pure returns (bytes32 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(s)\\n if iszero(lt(result, 33)) {\\n mstore(0x00, 0xec92f9a3) // `TooBigForSmallString()`.\\n revert(0x1c, 0x04)\\n }\\n result := shl(shl(3, sub(32, result)), mload(add(s, result)))\\n }\\n }\\n\\n /// @dev Returns a lowercased copy of the string.\\n /// WARNING! This function is only compatible with 7-bit ASCII strings.\\n function lower(string memory subject) internal pure returns (string memory result) {\\n result = toCase(subject, false);\\n }\\n\\n /// @dev Returns an UPPERCASED copy of the string.\\n /// WARNING! This function is only compatible with 7-bit ASCII strings.\\n function upper(string memory subject) internal pure returns (string memory result) {\\n result = toCase(subject, true);\\n }\\n\\n /// @dev Escapes the string to be used within HTML tags.\\n function escapeHTML(string memory s) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n let end := add(s, mload(s))\\n let o := add(result, 0x20)\\n // Store the bytes of the packed offsets and strides into the scratch space.\\n // `packed = (stride << 5) | offset`. Max offset is 20. Max stride is 6.\\n mstore(0x1f, 0x900094)\\n mstore(0x08, 0xc0000000a6ab)\\n // Store \\\""&'<>\\\" into the scratch space.\\n mstore(0x00, shl(64, 0x2671756f743b26616d703b262333393b266c743b2667743b))\\n for {} iszero(eq(s, end)) {} {\\n s := add(s, 1)\\n let c := and(mload(s), 0xff)\\n // Not in `[\\\"\\\\\\\"\\\",\\\"'\\\",\\\"&\\\",\\\"<\\\",\\\">\\\"]`.\\n if iszero(and(shl(c, 1), 0x500000c400000000)) {\\n mstore8(o, c)\\n o := add(o, 1)\\n continue\\n }\\n let t := shr(248, mload(c))\\n mstore(o, mload(and(t, 0x1f)))\\n o := add(o, shr(5, t))\\n }\\n mstore(o, 0) // Zeroize the slot after the string.\\n mstore(result, sub(o, add(result, 0x20))) // Store the length.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n }\\n }\\n\\n /// @dev Escapes the string to be used within double-quotes in a JSON.\\n /// If `addDoubleQuotes` is true, the result will be enclosed in double-quotes.\\n function escapeJSON(string memory s, bool addDoubleQuotes)\\n internal\\n pure\\n returns (string memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n let o := add(result, 0x20)\\n if addDoubleQuotes {\\n mstore8(o, 34)\\n o := add(1, o)\\n }\\n // Store \\\"\\\\\\\\u0000\\\" in scratch space.\\n // Store \\\"0123456789abcdef\\\" in scratch space.\\n // Also, store `{0x08:\\\"b\\\", 0x09:\\\"t\\\", 0x0a:\\\"n\\\", 0x0c:\\\"f\\\", 0x0d:\\\"r\\\"}`.\\n // into the scratch space.\\n mstore(0x15, 0x5c75303030303031323334353637383961626364656662746e006672)\\n // Bitmask for detecting `[\\\"\\\\\\\"\\\",\\\"\\\\\\\\\\\"]`.\\n let e := or(shl(0x22, 1), shl(0x5c, 1))\\n for { let end := add(s, mload(s)) } iszero(eq(s, end)) {} {\\n s := add(s, 1)\\n let c := and(mload(s), 0xff)\\n if iszero(lt(c, 0x20)) {\\n if iszero(and(shl(c, 1), e)) {\\n // Not in `[\\\"\\\\\\\"\\\",\\\"\\\\\\\\\\\"]`.\\n mstore8(o, c)\\n o := add(o, 1)\\n continue\\n }\\n mstore8(o, 0x5c) // \\\"\\\\\\\\\\\".\\n mstore8(add(o, 1), c)\\n o := add(o, 2)\\n continue\\n }\\n if iszero(and(shl(c, 1), 0x3700)) {\\n // Not in `[\\\"\\\\b\\\",\\\"\\\\t\\\",\\\"\\\\n\\\",\\\"\\\\f\\\",\\\"\\\\d\\\"]`.\\n mstore8(0x1d, mload(shr(4, c))) // Hex value.\\n mstore8(0x1e, mload(and(c, 15))) // Hex value.\\n mstore(o, mload(0x19)) // \\\"\\\\\\\\u00XX\\\".\\n o := add(o, 6)\\n continue\\n }\\n mstore8(o, 0x5c) // \\\"\\\\\\\\\\\".\\n mstore8(add(o, 1), mload(add(c, 8)))\\n o := add(o, 2)\\n }\\n if addDoubleQuotes {\\n mstore8(o, 34)\\n o := add(1, o)\\n }\\n mstore(o, 0) // Zeroize the slot after the string.\\n mstore(result, sub(o, add(result, 0x20))) // Store the length.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n }\\n }\\n\\n /// @dev Escapes the string to be used within double-quotes in a JSON.\\n function escapeJSON(string memory s) internal pure returns (string memory result) {\\n result = escapeJSON(s, false);\\n }\\n\\n /// @dev Encodes `s` so that it can be safely used in a URI,\\n /// just like `encodeURIComponent` in JavaScript.\\n /// See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent\\n /// See: https://datatracker.ietf.org/doc/html/rfc2396\\n /// See: https://datatracker.ietf.org/doc/html/rfc3986\\n function encodeURIComponent(string memory s) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n // Store \\\"0123456789ABCDEF\\\" in scratch space.\\n // Uppercased to be consistent with JavaScript's implementation.\\n mstore(0x0f, 0x30313233343536373839414243444546)\\n let o := add(result, 0x20)\\n for { let end := add(s, mload(s)) } iszero(eq(s, end)) {} {\\n s := add(s, 1)\\n let c := and(mload(s), 0xff)\\n // If not in `[0-9A-Z-a-z-_.!~*'()]`.\\n if iszero(and(1, shr(c, 0x47fffffe87fffffe03ff678200000000))) {\\n mstore8(o, 0x25) // '%'.\\n mstore8(add(o, 1), mload(and(shr(4, c), 15)))\\n mstore8(add(o, 2), mload(and(c, 15)))\\n o := add(o, 3)\\n continue\\n }\\n mstore8(o, c)\\n o := add(o, 1)\\n }\\n mstore(result, sub(o, add(result, 0x20))) // Store the length.\\n mstore(o, 0) // Zeroize the slot after the string.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n }\\n }\\n\\n /// @dev Returns whether `a` equals `b`.\\n function eq(string memory a, string memory b) internal pure returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := eq(keccak256(add(a, 0x20), mload(a)), keccak256(add(b, 0x20), mload(b)))\\n }\\n }\\n\\n /// @dev Returns whether `a` equals `b`, where `b` is a null-terminated small string.\\n function eqs(string memory a, bytes32 b) internal pure returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // These should be evaluated on compile time, as far as possible.\\n let m := not(shl(7, div(not(iszero(b)), 255))) // `0x7f7f ...`.\\n let x := not(or(m, or(b, add(m, and(b, m)))))\\n let r := shl(7, iszero(iszero(shr(128, x))))\\n r := or(r, shl(6, iszero(iszero(shr(64, shr(r, x))))))\\n r := or(r, shl(5, lt(0xffffffff, shr(r, x))))\\n r := or(r, shl(4, lt(0xffff, shr(r, x))))\\n r := or(r, shl(3, lt(0xff, shr(r, x))))\\n // forgefmt: disable-next-item\\n result := gt(eq(mload(a), add(iszero(x), xor(31, shr(3, r)))),\\n xor(shr(add(8, r), b), shr(add(8, r), mload(add(a, 0x20)))))\\n }\\n }\\n\\n /// @dev Returns 0 if `a == b`, -1 if `a < b`, +1 if `a > b`.\\n /// If `a` == b[:a.length]`, and `a.length < b.length`, returns -1.\\n function cmp(string memory a, string memory b) internal pure returns (int256) {\\n return LibBytes.cmp(bytes(a), bytes(b));\\n }\\n\\n /// @dev Packs a single string with its length into a single word.\\n /// Returns `bytes32(0)` if the length is zero or greater than 31.\\n function packOne(string memory a) internal pure returns (bytes32 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // We don't need to zero right pad the string,\\n // since this is our own custom non-standard packing scheme.\\n result :=\\n mul(\\n // Load the length and the bytes.\\n mload(add(a, 0x1f)),\\n // `length != 0 && length < 32`. Abuses underflow.\\n // Assumes that the length is valid and within the block gas limit.\\n lt(sub(mload(a), 1), 0x1f)\\n )\\n }\\n }\\n\\n /// @dev Unpacks a string packed using {packOne}.\\n /// Returns the empty string if `packed` is `bytes32(0)`.\\n /// If `packed` is not an output of {packOne}, the output behavior is undefined.\\n function unpackOne(bytes32 packed) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40) // Grab the free memory pointer.\\n mstore(0x40, add(result, 0x40)) // Allocate 2 words (1 for the length, 1 for the bytes).\\n mstore(result, 0) // Zeroize the length slot.\\n mstore(add(result, 0x1f), packed) // Store the length and bytes.\\n mstore(add(add(result, 0x20), mload(result)), 0) // Right pad with zeroes.\\n }\\n }\\n\\n /// @dev Packs two strings with their lengths into a single word.\\n /// Returns `bytes32(0)` if combined length is zero or greater than 30.\\n function packTwo(string memory a, string memory b) internal pure returns (bytes32 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let aLen := mload(a)\\n // We don't need to zero right pad the strings,\\n // since this is our own custom non-standard packing scheme.\\n result :=\\n mul(\\n or( // Load the length and the bytes of `a` and `b`.\\n shl(shl(3, sub(0x1f, aLen)), mload(add(a, aLen))), mload(sub(add(b, 0x1e), aLen))),\\n // `totalLen != 0 && totalLen < 31`. Abuses underflow.\\n // Assumes that the lengths are valid and within the block gas limit.\\n lt(sub(add(aLen, mload(b)), 1), 0x1e)\\n )\\n }\\n }\\n\\n /// @dev Unpacks strings packed using {packTwo}.\\n /// Returns the empty strings if `packed` is `bytes32(0)`.\\n /// If `packed` is not an output of {packTwo}, the output behavior is undefined.\\n function unpackTwo(bytes32 packed)\\n internal\\n pure\\n returns (string memory resultA, string memory resultB)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n resultA := mload(0x40) // Grab the free memory pointer.\\n resultB := add(resultA, 0x40)\\n // Allocate 2 words for each string (1 for the length, 1 for the byte). Total 4 words.\\n mstore(0x40, add(resultB, 0x40))\\n // Zeroize the length slots.\\n mstore(resultA, 0)\\n mstore(resultB, 0)\\n // Store the lengths and bytes.\\n mstore(add(resultA, 0x1f), packed)\\n mstore(add(resultB, 0x1f), mload(add(add(resultA, 0x20), mload(resultA))))\\n // Right pad with zeroes.\\n mstore(add(add(resultA, 0x20), mload(resultA)), 0)\\n mstore(add(add(resultB, 0x20), mload(resultB)), 0)\\n }\\n }\\n\\n /// @dev Directly returns `a` without copying.\\n function directReturn(string memory a) internal pure {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Assumes that the string does not start from the scratch space.\\n let retStart := sub(a, 0x20)\\n let retUnpaddedSize := add(mload(a), 0x40)\\n // Right pad with zeroes. Just in case the string is produced\\n // by a method that doesn't zero right pad.\\n mstore(add(retStart, retUnpaddedSize), 0)\\n mstore(retStart, 0x20) // Store the return offset.\\n // End the transaction, returning the string.\\n return(retStart, and(not(0x1f), add(0x1f, retUnpaddedSize)))\\n }\\n }\\n}\\n\",\"keccak256\":\"0x8a6b219f6ccda90c08e2debae62618d78d6f0cef086eb6c9503793d7f12815dd\",\"license\":\"MIT\"},\"src/tokens/ERC1155/ERC1155BaseToken.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\nimport { ERC2981Controlled } from \\\"../common/ERC2981Controlled.sol\\\";\\nimport { SignalsImplicitModeControlled } from \\\"../common/SignalsImplicitModeControlled.sol\\\";\\nimport { ERC1155, ERC1155Supply } from \\\"./extensions/supply/ERC1155Supply.sol\\\";\\n\\nimport { LibString } from \\\"solady/utils/LibString.sol\\\";\\n\\nerror InvalidInitialization();\\n\\n/**\\n * A standard base implementation of ERC-1155 for use in Sequence library contracts.\\n */\\nabstract contract ERC1155BaseToken is ERC1155Supply, ERC2981Controlled, SignalsImplicitModeControlled {\\n\\n bytes32 internal constant METADATA_ADMIN_ROLE = keccak256(\\\"METADATA_ADMIN_ROLE\\\");\\n\\n string public name;\\n string public baseURI;\\n string public contractURI;\\n\\n bool private _initialized;\\n\\n /**\\n * Initialize the contract.\\n * @param owner Owner address.\\n * @param tokenName Token name.\\n * @param tokenBaseURI Base URI for token metadata.\\n * @param tokenContractURI Contract URI for token metadata.\\n * @param implicitModeValidator Implicit session validator address.\\n * @param implicitModeProjectId Implicit session project id.\\n * @dev This should be called immediately after deployment.\\n */\\n function _initialize(\\n address owner,\\n string memory tokenName,\\n string memory tokenBaseURI,\\n string memory tokenContractURI,\\n address implicitModeValidator,\\n bytes32 implicitModeProjectId\\n ) internal {\\n if (_initialized) {\\n revert InvalidInitialization();\\n }\\n\\n name = tokenName;\\n baseURI = tokenBaseURI;\\n contractURI = tokenContractURI;\\n\\n _grantRole(DEFAULT_ADMIN_ROLE, owner);\\n _grantRole(ROYALTY_ADMIN_ROLE, owner);\\n _grantRole(METADATA_ADMIN_ROLE, owner);\\n\\n _initializeImplicitMode(owner, implicitModeValidator, implicitModeProjectId);\\n\\n _initialized = true;\\n }\\n\\n //\\n // Metadata\\n //\\n\\n /// @inheritdoc ERC1155\\n function uri(\\n uint256 _id\\n ) public view virtual override returns (string memory) {\\n return string(abi.encodePacked(baseURI, LibString.toString(_id), \\\".json\\\"));\\n }\\n\\n /**\\n * Update the base URI of token's URI.\\n * @param tokenBaseURI New base URI of token's URI\\n */\\n function setBaseMetadataURI(\\n string memory tokenBaseURI\\n ) external onlyRole(METADATA_ADMIN_ROLE) {\\n baseURI = tokenBaseURI;\\n }\\n\\n /**\\n * Update the name of the contract.\\n * @param tokenName New contract name\\n */\\n function setContractName(\\n string memory tokenName\\n ) external onlyRole(METADATA_ADMIN_ROLE) {\\n name = tokenName;\\n }\\n\\n /**\\n * Update the contract URI of token's URI.\\n * @param tokenContractURI New contract URI of token's URI\\n * @notice Refer to https://docs.opensea.io/docs/contract-level-metadata\\n */\\n function setContractURI(\\n string memory tokenContractURI\\n ) external onlyRole(METADATA_ADMIN_ROLE) {\\n contractURI = tokenContractURI;\\n }\\n\\n //\\n // Burn\\n //\\n\\n /**\\n * Allows the owner of the token to burn their tokens.\\n * @param tokenId Id of token to burn\\n * @param amount Amount of tokens to burn\\n */\\n function burn(uint256 tokenId, uint256 amount) public virtual {\\n _burn(msg.sender, tokenId, amount);\\n }\\n\\n /**\\n * Burn tokens of given token id for each (tokenIds[i], amounts[i]) pair.\\n * @param tokenIds Array of token ids to burn\\n * @param amounts Array of the amount to be burned\\n */\\n function batchBurn(uint256[] memory tokenIds, uint256[] memory amounts) public virtual {\\n super._batchBurn(msg.sender, tokenIds, amounts);\\n }\\n\\n //\\n // Views\\n //\\n\\n /**\\n * Check interface support.\\n * @param interfaceId Interface id\\n * @return True if supported\\n */\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view virtual override(ERC1155Supply, ERC2981Controlled, SignalsImplicitModeControlled) returns (bool) {\\n return ERC1155Supply.supportsInterface(interfaceId) || ERC2981Controlled.supportsInterface(interfaceId)\\n || SignalsImplicitModeControlled.supportsInterface(interfaceId);\\n }\\n\\n}\\n\",\"keccak256\":\"0x81e8abb54378967f6c8ebb4222d2c9a5c93e730535532fa6fe56de5ef1c56c56\",\"license\":\"Apache-2.0\"},\"src/tokens/ERC1155/extensions/supply/ERC1155Supply.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\nimport { IERC1155Supply, IERC1155SupplyFunctions } from \\\"./IERC1155Supply.sol\\\";\\n\\nimport { ERC1155 } from \\\"solady/tokens/ERC1155.sol\\\";\\n\\n/**\\n * An ERC-1155 extension that tracks token supply.\\n */\\nabstract contract ERC1155Supply is ERC1155, IERC1155Supply {\\n\\n // Current supply\\n uint256 public totalSupply;\\n mapping(uint256 => uint256) public tokenSupply;\\n\\n /**\\n * Mint _amount of tokens of a given id\\n * @param _to The address to mint tokens to\\n * @param _id Token id to mint\\n * @param _amount The amount to be minted\\n * @param _data Data to pass if receiver is contract\\n */\\n function _mint(address _to, uint256 _id, uint256 _amount, bytes memory _data) internal virtual override {\\n super._mint(_to, _id, _amount, _data);\\n\\n totalSupply += _amount;\\n tokenSupply[_id] += _amount;\\n }\\n\\n /**\\n * Mint tokens for each ids in _ids\\n * @param _to The address to mint tokens to\\n * @param _ids Array of ids to mint\\n * @param _amounts Array of amount of tokens to mint per id\\n * @param _data Data to pass if receiver is contract\\n */\\n function _batchMint(\\n address _to,\\n uint256[] memory _ids,\\n uint256[] memory _amounts,\\n bytes memory _data\\n ) internal virtual override {\\n super._batchMint(_to, _ids, _amounts, _data);\\n\\n uint256 nMint = _ids.length;\\n uint256 totalAmount = 0;\\n for (uint256 i; i < nMint;) {\\n uint256 amount = _amounts[i];\\n totalAmount += amount;\\n tokenSupply[_ids[i]] += amount;\\n unchecked {\\n // Already checked in super._batchMint\\n ++i;\\n }\\n }\\n totalSupply += totalAmount;\\n }\\n\\n /**\\n * Burn _amount of tokens of a given token id\\n * @param _from The address to burn tokens from\\n * @param _id Token id to burn\\n * @param _amount The amount to be burned\\n */\\n function _burn(address _from, uint256 _id, uint256 _amount) internal virtual override {\\n super._burn(_from, _id, _amount);\\n\\n totalSupply -= _amount;\\n tokenSupply[_id] -= _amount;\\n }\\n\\n /**\\n * Burn tokens of given token id for each (_ids[i], _amounts[i]) pair\\n * @param _from The address to burn tokens from\\n * @param _ids Array of token ids to burn\\n * @param _amounts Array of the amount to be burned\\n */\\n function _batchBurn(address _from, uint256[] memory _ids, uint256[] memory _amounts) internal virtual override {\\n super._batchBurn(_from, _ids, _amounts);\\n\\n uint256 nBurn = _ids.length;\\n uint256 totalAmount = 0;\\n for (uint256 i; i < nBurn;) {\\n uint256 amount = _amounts[i];\\n tokenSupply[_ids[i]] -= amount;\\n totalAmount += amount;\\n unchecked {\\n // Already checked in super._batchBurn\\n ++i;\\n }\\n }\\n totalSupply -= totalAmount;\\n }\\n\\n //\\n // Views\\n //\\n\\n /**\\n * Check interface support.\\n * @param interfaceId Interface id\\n * @return True if supported\\n */\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view virtual override(ERC1155) returns (bool) {\\n return type(IERC1155SupplyFunctions).interfaceId == interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n}\\n\",\"keccak256\":\"0xc2cf8d5479a9cafcc2e92e3c8e9f4afce7fa2416cc811acbb766cf45db3692f0\",\"license\":\"Apache-2.0\"},\"src/tokens/ERC1155/extensions/supply/IERC1155Supply.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\ninterface IERC1155SupplyFunctions {\\n\\n /**\\n * Returns the total supply of ERC1155 tokens.\\n */\\n function totalSupply() external returns (uint256);\\n\\n /**\\n * Returns the total supply of a given ERC1155 token.\\n * @param tokenId The ERC1155 token id.\\n */\\n function tokenSupply(\\n uint256 tokenId\\n ) external returns (uint256);\\n\\n}\\n\\ninterface IERC1155SupplySignals {\\n\\n /**\\n * Invalid array input length.\\n */\\n error InvalidArrayLength();\\n\\n}\\n\\ninterface IERC1155Supply is IERC1155SupplySignals { }\\n\",\"keccak256\":\"0x135a8948daebd1229d6bada5ada73f2b3496c9bd9f8cfc78d7a68a0f117e55b5\",\"license\":\"Apache-2.0\"},\"src/tokens/ERC1155/presets/items/ERC1155Items.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\nimport { ERC1155BaseToken, ERC2981Controlled } from \\\"../../ERC1155BaseToken.sol\\\";\\nimport { IERC1155Items, IERC1155ItemsFunctions } from \\\"./IERC1155Items.sol\\\";\\n\\n/**\\n * An implementation of ERC-1155 capable of minting when role provided.\\n */\\ncontract ERC1155Items is ERC1155BaseToken, IERC1155Items {\\n\\n bytes32 internal constant MINTER_ROLE = keccak256(\\\"MINTER_ROLE\\\");\\n\\n /**\\n * Initialize the contract.\\n * @param owner Owner address\\n * @param tokenName Token name\\n * @param tokenBaseURI Base URI for token metadata\\n * @param tokenContractURI Contract URI for token metadata\\n * @param royaltyReceiver Address of who should be sent the royalty payment\\n * @param royaltyFeeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\\n * @param implicitModeValidator The implicit mode validator address\\n * @param implicitModeProjectId The implicit mode project id\\n * @dev This should be called immediately after deployment.\\n */\\n function initialize(\\n address owner,\\n string memory tokenName,\\n string memory tokenBaseURI,\\n string memory tokenContractURI,\\n address royaltyReceiver,\\n uint96 royaltyFeeNumerator,\\n address implicitModeValidator,\\n bytes32 implicitModeProjectId\\n ) public virtual {\\n ERC1155BaseToken._initialize(\\n owner, tokenName, tokenBaseURI, tokenContractURI, implicitModeValidator, implicitModeProjectId\\n );\\n _setDefaultRoyalty(royaltyReceiver, royaltyFeeNumerator);\\n\\n _grantRole(MINTER_ROLE, owner);\\n }\\n\\n //\\n // Minting\\n //\\n\\n /**\\n * Mint tokens.\\n * @param to Address to mint tokens to.\\n * @param tokenId Token ID to mint.\\n * @param amount Amount of tokens to mint.\\n * @param data Data to pass if receiver is contract.\\n */\\n function mint(address to, uint256 tokenId, uint256 amount, bytes memory data) external onlyRole(MINTER_ROLE) {\\n _mint(to, tokenId, amount, data);\\n }\\n\\n /**\\n * Mint tokens.\\n * @param to Address to mint tokens to.\\n * @param tokenIds Token IDs to mint.\\n * @param amounts Amounts of tokens to mint.\\n * @param data Data to pass if receiver is contract.\\n */\\n function batchMint(\\n address to,\\n uint256[] memory tokenIds,\\n uint256[] memory amounts,\\n bytes memory data\\n ) external onlyRole(MINTER_ROLE) {\\n _batchMint(to, tokenIds, amounts, data);\\n }\\n\\n //\\n // Views\\n //\\n\\n /**\\n * Check interface support.\\n * @param interfaceId Interface id\\n * @return True if supported\\n */\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view virtual override(ERC1155BaseToken) returns (bool) {\\n return type(IERC1155ItemsFunctions).interfaceId == interfaceId\\n || ERC1155BaseToken.supportsInterface(interfaceId) || super.supportsInterface(interfaceId);\\n }\\n\\n}\\n\",\"keccak256\":\"0x2791ebaef4b852f357f199574cbb7a923c997e28d79bc5a03929f9f8eb9dec8c\",\"license\":\"Apache-2.0\"},\"src/tokens/ERC1155/presets/items/IERC1155Items.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\ninterface IERC1155ItemsFunctions {\\n\\n /**\\n * Mint tokens.\\n * @param to Address to mint tokens to.\\n * @param tokenId Token ID to mint.\\n * @param amount Amount of tokens to mint.\\n * @param data Data to pass if receiver is contract.\\n */\\n function mint(address to, uint256 tokenId, uint256 amount, bytes memory data) external;\\n\\n /**\\n * Mint tokens.\\n * @param to Address to mint tokens to.\\n * @param tokenIds Token IDs to mint.\\n * @param amounts Amounts of tokens to mint.\\n * @param data Data to pass if receiver is contract.\\n */\\n function batchMint(address to, uint256[] memory tokenIds, uint256[] memory amounts, bytes memory data) external;\\n\\n}\\n\\ninterface IERC1155ItemsSignals {\\n\\n /**\\n * Invalid initialization error.\\n */\\n error InvalidInitialization();\\n\\n}\\n\\ninterface IERC1155Items is IERC1155ItemsFunctions, IERC1155ItemsSignals { }\\n\",\"keccak256\":\"0x4b05643201f0416f2beab08c2679e2a166a2e9b7f91021b9758fc9802f2c49ce\",\"license\":\"Apache-2.0\"},\"src/tokens/common/ERC2981Controlled.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\nimport { IERC2981Controlled } from \\\"./IERC2981Controlled.sol\\\";\\n\\nimport { AccessControlEnumerable } from \\\"openzeppelin-contracts/contracts/access/AccessControlEnumerable.sol\\\";\\nimport { ERC2981 } from \\\"openzeppelin-contracts/contracts/token/common/ERC2981.sol\\\";\\n\\n/**\\n * An implementation of ERC-2981 that allows updates by roles.\\n */\\nabstract contract ERC2981Controlled is ERC2981, AccessControlEnumerable, IERC2981Controlled {\\n\\n bytes32 internal constant ROYALTY_ADMIN_ROLE = keccak256(\\\"ROYALTY_ADMIN_ROLE\\\");\\n\\n //\\n // Royalty\\n //\\n\\n /**\\n * Sets the royalty information that all ids in this contract will default to.\\n * @param receiver Address of who should be sent the royalty payment\\n * @param feeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\\n */\\n function setDefaultRoyalty(address receiver, uint96 feeNumerator) external onlyRole(ROYALTY_ADMIN_ROLE) {\\n _setDefaultRoyalty(receiver, feeNumerator);\\n }\\n\\n /**\\n * Sets the royalty information that a given token id in this contract will use.\\n * @param tokenId The token id to set the royalty information for\\n * @param receiver Address of who should be sent the royalty payment\\n * @param feeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\\n * @notice This overrides the default royalty information for this token id\\n */\\n function setTokenRoyalty(\\n uint256 tokenId,\\n address receiver,\\n uint96 feeNumerator\\n ) external onlyRole(ROYALTY_ADMIN_ROLE) {\\n _setTokenRoyalty(tokenId, receiver, feeNumerator);\\n }\\n\\n //\\n // Views\\n //\\n\\n /**\\n * Check interface support.\\n * @param interfaceId Interface id\\n * @return True if supported\\n */\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view virtual override(ERC2981, AccessControlEnumerable) returns (bool) {\\n return ERC2981.supportsInterface(interfaceId) || AccessControlEnumerable.supportsInterface(interfaceId)\\n || type(IERC2981Controlled).interfaceId == interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n}\\n\",\"keccak256\":\"0xf02124d449f7dc76b4b1a26d9b1728d42facfc5f84771e73352e2b0c4b6c566b\",\"license\":\"Apache-2.0\"},\"src/tokens/common/IERC2981Controlled.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\ninterface IERC2981ControlledFunctions {\\n\\n /**\\n * Sets the royalty information that all ids in this contract will default to.\\n * @param receiver Address of who should be sent the royalty payment\\n * @param feeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\\n */\\n function setDefaultRoyalty(address receiver, uint96 feeNumerator) external;\\n\\n /**\\n * Sets the royalty information that a given token id in this contract will use.\\n * @param tokenId The token id to set the royalty information for\\n * @param receiver Address of who should be sent the royalty payment\\n * @param feeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\\n * @notice This overrides the default royalty information for this token id\\n */\\n function setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) external;\\n\\n}\\n\\ninterface IERC2981Controlled is IERC2981ControlledFunctions { }\\n\",\"keccak256\":\"0x65d66b30719fb4161fc4ef666794f8dcb7660528bdff9bf126b12999fac79ee0\",\"license\":\"Apache-2.0\"},\"src/tokens/common/SignalsImplicitModeControlled.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\nimport { AccessControlEnumerable } from \\\"openzeppelin-contracts/contracts/access/AccessControlEnumerable.sol\\\";\\nimport {\\n IERC165,\\n IImplicitProjectValidation,\\n SignalsImplicitMode\\n} from \\\"signals-implicit-mode/src/helper/SignalsImplicitMode.sol\\\";\\n\\n/**\\n * An abstract contract that allows implicit session access for a given project.\\n */\\nabstract contract SignalsImplicitModeControlled is AccessControlEnumerable, SignalsImplicitMode {\\n\\n bytes32 internal constant _IMPLICIT_MODE_ADMIN_ROLE = keccak256(\\\"IMPLICIT_MODE_ADMIN_ROLE\\\");\\n\\n function _initializeImplicitMode(address owner, address validator, bytes32 projectId) internal {\\n _grantRole(_IMPLICIT_MODE_ADMIN_ROLE, owner);\\n _initializeSignalsImplicitMode(validator, projectId);\\n }\\n\\n /**\\n * Updates the validator for implicit mode validation.\\n * @param validator The validator address.\\n * @notice Only callable by an address with the project admin role.\\n */\\n function setImplicitModeValidator(\\n address validator\\n ) external onlyRole(_IMPLICIT_MODE_ADMIN_ROLE) {\\n _validator = IImplicitProjectValidation(validator);\\n }\\n\\n /**\\n * Updates the settings for implicit mode validation.\\n * @param projectId The project id.\\n * @notice Only callable by an address with the project admin role.\\n */\\n function setImplicitModeProjectId(\\n bytes32 projectId\\n ) external onlyRole(_IMPLICIT_MODE_ADMIN_ROLE) {\\n _projectId = projectId;\\n }\\n\\n /// @inheritdoc IERC165\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view virtual override(AccessControlEnumerable, SignalsImplicitMode) returns (bool) {\\n return\\n AccessControlEnumerable.supportsInterface(interfaceId) || SignalsImplicitMode.supportsInterface(interfaceId);\\n }\\n\\n}\\n\",\"keccak256\":\"0xb1a20575f188af254f90ec7df7f70415610ba5f41f7966ce383b50063220b860\",\"license\":\"Apache-2.0\"}},\"version\":1}", + "userdoc": { + "errors": { + "InvalidArrayLength()": [ + { + "notice": "Invalid array input length." + } + ], + "InvalidInitialization()": [ + { + "notice": "Invalid initialization error." + } + ] + }, + "kind": "user", + "methods": { + "acceptImplicitRequest(address,(address,bytes4,bytes32,bytes32,bytes,(string,uint64)),(address,uint256,bytes,uint256,bool,bool,uint256))": { + "notice": "Determines if an implicit request is valid" + }, + "batchBurn(uint256[],uint256[])": { + "notice": "Burn tokens of given token id for each (tokenIds[i], amounts[i]) pair." + }, + "batchMint(address,uint256[],uint256[],bytes)": { + "notice": "Mint tokens." + }, + "burn(uint256,uint256)": { + "notice": "Allows the owner of the token to burn their tokens." + }, + "initialize(address,string,string,string,address,uint96,address,bytes32)": { + "notice": "Initialize the contract." + }, + "mint(address,uint256,uint256,bytes)": { + "notice": "Mint tokens." + }, + "setBaseMetadataURI(string)": { + "notice": "Update the base URI of token's URI." + }, + "setContractName(string)": { + "notice": "Update the name of the contract." + }, + "setContractURI(string)": { + "notice": "Update the contract URI of token's URI.Refer to https://docs.opensea.io/docs/contract-level-metadata" + }, + "setDefaultRoyalty(address,uint96)": { + "notice": "Sets the royalty information that all ids in this contract will default to." + }, + "setImplicitModeProjectId(bytes32)": { + "notice": "Updates the settings for implicit mode validation.Only callable by an address with the project admin role." + }, + "setImplicitModeValidator(address)": { + "notice": "Updates the validator for implicit mode validation.Only callable by an address with the project admin role." + }, + "setTokenRoyalty(uint256,address,uint96)": { + "notice": "Sets the royalty information that a given token id in this contract will use.This overrides the default royalty information for this token id" + }, + "supportsInterface(bytes4)": { + "notice": "Check interface support." + } + }, + "notice": "An implementation of ERC-1155 capable of minting when role provided.", + "version": 1 + } + } + }, + "src/tokens/ERC1155/presets/items/IERC1155Items.sol": { + "IERC1155Items": { + "abi": [ + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "batchMint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "batchMint(address,uint256[],uint256[],bytes)": { + "params": { + "amounts": "Amounts of tokens to mint.", + "data": "Data to pass if receiver is contract.", + "to": "Address to mint tokens to.", + "tokenIds": "Token IDs to mint." + } + }, + "mint(address,uint256,uint256,bytes)": { + "params": { + "amount": "Amount of tokens to mint.", + "data": "Data to pass if receiver is contract.", + "to": "Address to mint tokens to.", + "tokenId": "Token ID to mint." + } + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "batchMint(address,uint256[],uint256[],bytes)": "b48ab8b6", + "mint(address,uint256,uint256,bytes)": "731133e9" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"batchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"batchMint(address,uint256[],uint256[],bytes)\":{\"params\":{\"amounts\":\"Amounts of tokens to mint.\",\"data\":\"Data to pass if receiver is contract.\",\"to\":\"Address to mint tokens to.\",\"tokenIds\":\"Token IDs to mint.\"}},\"mint(address,uint256,uint256,bytes)\":{\"params\":{\"amount\":\"Amount of tokens to mint.\",\"data\":\"Data to pass if receiver is contract.\",\"to\":\"Address to mint tokens to.\",\"tokenId\":\"Token ID to mint.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"InvalidInitialization()\":[{\"notice\":\"Invalid initialization error.\"}]},\"kind\":\"user\",\"methods\":{\"batchMint(address,uint256[],uint256[],bytes)\":{\"notice\":\"Mint tokens.\"},\"mint(address,uint256,uint256,bytes)\":{\"notice\":\"Mint tokens.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/tokens/ERC1155/presets/items/IERC1155Items.sol\":\"IERC1155Items\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"src/tokens/ERC1155/presets/items/IERC1155Items.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\ninterface IERC1155ItemsFunctions {\\n\\n /**\\n * Mint tokens.\\n * @param to Address to mint tokens to.\\n * @param tokenId Token ID to mint.\\n * @param amount Amount of tokens to mint.\\n * @param data Data to pass if receiver is contract.\\n */\\n function mint(address to, uint256 tokenId, uint256 amount, bytes memory data) external;\\n\\n /**\\n * Mint tokens.\\n * @param to Address to mint tokens to.\\n * @param tokenIds Token IDs to mint.\\n * @param amounts Amounts of tokens to mint.\\n * @param data Data to pass if receiver is contract.\\n */\\n function batchMint(address to, uint256[] memory tokenIds, uint256[] memory amounts, bytes memory data) external;\\n\\n}\\n\\ninterface IERC1155ItemsSignals {\\n\\n /**\\n * Invalid initialization error.\\n */\\n error InvalidInitialization();\\n\\n}\\n\\ninterface IERC1155Items is IERC1155ItemsFunctions, IERC1155ItemsSignals { }\\n\",\"keccak256\":\"0x4b05643201f0416f2beab08c2679e2a166a2e9b7f91021b9758fc9802f2c49ce\",\"license\":\"Apache-2.0\"}},\"version\":1}", + "userdoc": { + "errors": { + "InvalidInitialization()": [ + { + "notice": "Invalid initialization error." + } + ] + }, + "kind": "user", + "methods": { + "batchMint(address,uint256[],uint256[],bytes)": { + "notice": "Mint tokens." + }, + "mint(address,uint256,uint256,bytes)": { + "notice": "Mint tokens." + } + }, + "version": 1 + } + }, + "IERC1155ItemsFunctions": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "batchMint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "batchMint(address,uint256[],uint256[],bytes)": { + "params": { + "amounts": "Amounts of tokens to mint.", + "data": "Data to pass if receiver is contract.", + "to": "Address to mint tokens to.", + "tokenIds": "Token IDs to mint." + } + }, + "mint(address,uint256,uint256,bytes)": { + "params": { + "amount": "Amount of tokens to mint.", + "data": "Data to pass if receiver is contract.", + "to": "Address to mint tokens to.", + "tokenId": "Token ID to mint." + } + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "batchMint(address,uint256[],uint256[],bytes)": "b48ab8b6", + "mint(address,uint256,uint256,bytes)": "731133e9" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"batchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"batchMint(address,uint256[],uint256[],bytes)\":{\"params\":{\"amounts\":\"Amounts of tokens to mint.\",\"data\":\"Data to pass if receiver is contract.\",\"to\":\"Address to mint tokens to.\",\"tokenIds\":\"Token IDs to mint.\"}},\"mint(address,uint256,uint256,bytes)\":{\"params\":{\"amount\":\"Amount of tokens to mint.\",\"data\":\"Data to pass if receiver is contract.\",\"to\":\"Address to mint tokens to.\",\"tokenId\":\"Token ID to mint.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"batchMint(address,uint256[],uint256[],bytes)\":{\"notice\":\"Mint tokens.\"},\"mint(address,uint256,uint256,bytes)\":{\"notice\":\"Mint tokens.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/tokens/ERC1155/presets/items/IERC1155Items.sol\":\"IERC1155ItemsFunctions\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"src/tokens/ERC1155/presets/items/IERC1155Items.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\ninterface IERC1155ItemsFunctions {\\n\\n /**\\n * Mint tokens.\\n * @param to Address to mint tokens to.\\n * @param tokenId Token ID to mint.\\n * @param amount Amount of tokens to mint.\\n * @param data Data to pass if receiver is contract.\\n */\\n function mint(address to, uint256 tokenId, uint256 amount, bytes memory data) external;\\n\\n /**\\n * Mint tokens.\\n * @param to Address to mint tokens to.\\n * @param tokenIds Token IDs to mint.\\n * @param amounts Amounts of tokens to mint.\\n * @param data Data to pass if receiver is contract.\\n */\\n function batchMint(address to, uint256[] memory tokenIds, uint256[] memory amounts, bytes memory data) external;\\n\\n}\\n\\ninterface IERC1155ItemsSignals {\\n\\n /**\\n * Invalid initialization error.\\n */\\n error InvalidInitialization();\\n\\n}\\n\\ninterface IERC1155Items is IERC1155ItemsFunctions, IERC1155ItemsSignals { }\\n\",\"keccak256\":\"0x4b05643201f0416f2beab08c2679e2a166a2e9b7f91021b9758fc9802f2c49ce\",\"license\":\"Apache-2.0\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": { + "batchMint(address,uint256[],uint256[],bytes)": { + "notice": "Mint tokens." + }, + "mint(address,uint256,uint256,bytes)": { + "notice": "Mint tokens." + } + }, + "version": 1 + } + }, + "IERC1155ItemsSignals": { + "abi": [ + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + } + ], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"errors\":{\"InvalidInitialization()\":[{\"notice\":\"Invalid initialization error.\"}]},\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/tokens/ERC1155/presets/items/IERC1155Items.sol\":\"IERC1155ItemsSignals\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"src/tokens/ERC1155/presets/items/IERC1155Items.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\ninterface IERC1155ItemsFunctions {\\n\\n /**\\n * Mint tokens.\\n * @param to Address to mint tokens to.\\n * @param tokenId Token ID to mint.\\n * @param amount Amount of tokens to mint.\\n * @param data Data to pass if receiver is contract.\\n */\\n function mint(address to, uint256 tokenId, uint256 amount, bytes memory data) external;\\n\\n /**\\n * Mint tokens.\\n * @param to Address to mint tokens to.\\n * @param tokenIds Token IDs to mint.\\n * @param amounts Amounts of tokens to mint.\\n * @param data Data to pass if receiver is contract.\\n */\\n function batchMint(address to, uint256[] memory tokenIds, uint256[] memory amounts, bytes memory data) external;\\n\\n}\\n\\ninterface IERC1155ItemsSignals {\\n\\n /**\\n * Invalid initialization error.\\n */\\n error InvalidInitialization();\\n\\n}\\n\\ninterface IERC1155Items is IERC1155ItemsFunctions, IERC1155ItemsSignals { }\\n\",\"keccak256\":\"0x4b05643201f0416f2beab08c2679e2a166a2e9b7f91021b9758fc9802f2c49ce\",\"license\":\"Apache-2.0\"}},\"version\":1}", + "userdoc": { + "errors": { + "InvalidInitialization()": [ + { + "notice": "Invalid initialization error." + } + ] + }, + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "src/tokens/ERC1155/presets/pack/ERC1155Pack.sol": { + "ERC1155Pack": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_erc1155Holder", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "AccountBalanceOverflow", + "type": "error" + }, + { + "inputs": [], + "name": "AllPacksOpened", + "type": "error" + }, + { + "inputs": [], + "name": "ArrayLengthsMismatch", + "type": "error" + }, + { + "inputs": [], + "name": "InsufficientBalance", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidArrayLength", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidCommit", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidProof", + "type": "error" + }, + { + "inputs": [], + "name": "NoCommit", + "type": "error" + }, + { + "inputs": [], + "name": "NotOwnerNorApproved", + "type": "error" + }, + { + "inputs": [], + "name": "PendingReveal", + "type": "error" + }, + { + "inputs": [], + "name": "TransferToNonERC1155ReceiverImplementer", + "type": "error" + }, + { + "inputs": [], + "name": "TransferToZeroAddress", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "isApproved", + "type": "bool" + } + ], + "name": "ApprovalForAll", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "packId", + "type": "uint256" + } + ], + "name": "Commit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "packId", + "type": "uint256" + } + ], + "name": "Reveal", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "ids", + "type": "uint256[]" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "name": "TransferBatch", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "TransferSingle", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "value", + "type": "string" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "URI", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "wallet", + "type": "address" + }, + { + "components": [ + { + "internalType": "address", + "name": "approvedSigner", + "type": "address" + }, + { + "internalType": "bytes4", + "name": "identityType", + "type": "bytes4" + }, + { + "internalType": "bytes32", + "name": "issuerHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "audienceHash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "applicationData", + "type": "bytes" + }, + { + "components": [ + { + "internalType": "string", + "name": "redirectUrl", + "type": "string" + }, + { + "internalType": "uint64", + "name": "issuedAt", + "type": "uint64" + } + ], + "internalType": "struct AuthData", + "name": "authData", + "type": "tuple" + } + ], + "internalType": "struct Attestation", + "name": "attestation", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call", + "name": "call", + "type": "tuple" + } + ], + "name": "acceptImplicitRequest", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "owners", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "ids", + "type": "uint256[]" + } + ], + "name": "balanceOfBatch", + "outputs": [ + { + "internalType": "uint256[]", + "name": "balances", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "baseURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "name": "batchBurn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "tokenIds", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "batchMint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "packId", + "type": "uint256" + } + ], + "name": "commit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "contractURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "erc1155Holder", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "uint256", + "name": "packId", + "type": "uint256" + } + ], + "name": "getRevealIdx", + "outputs": [ + { + "internalType": "uint256", + "name": "revealIdx", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "string", + "name": "tokenName", + "type": "string" + }, + { + "internalType": "string", + "name": "tokenBaseURI", + "type": "string" + }, + { + "internalType": "string", + "name": "tokenContractURI", + "type": "string" + }, + { + "internalType": "address", + "name": "royaltyReceiver", + "type": "address" + }, + { + "internalType": "uint96", + "name": "royaltyFeeNumerator", + "type": "uint96" + }, + { + "internalType": "address", + "name": "implicitModeValidator", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "implicitModeProjectId", + "type": "bytes32" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "result", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "merkleRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "uint256", + "name": "packId", + "type": "uint256" + } + ], + "name": "refundPack", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "remainingSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "components": [ + { + "internalType": "address[]", + "name": "tokenAddresses", + "type": "address[]" + }, + { + "internalType": "bool[]", + "name": "isERC721", + "type": "bool[]" + }, + { + "internalType": "uint256[][]", + "name": "tokenIds", + "type": "uint256[][]" + }, + { + "internalType": "uint256[][]", + "name": "amounts", + "type": "uint256[][]" + } + ], + "internalType": "struct IERC1155Pack.PackContent", + "name": "packContent", + "type": "tuple" + }, + { + "internalType": "bytes32[]", + "name": "proof", + "type": "bytes32[]" + }, + { + "internalType": "uint256", + "name": "packId", + "type": "uint256" + } + ], + "name": "reveal", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "salePrice", + "type": "uint256" + } + ], + "name": "royaltyInfo", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "ids", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "safeBatchTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "isApproved", + "type": "bool" + } + ], + "name": "setApprovalForAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "tokenBaseURI", + "type": "string" + } + ], + "name": "setBaseMetadataURI", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "tokenName", + "type": "string" + } + ], + "name": "setContractName", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "tokenContractURI", + "type": "string" + } + ], + "name": "setContractURI", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "uint96", + "name": "feeNumerator", + "type": "uint96" + } + ], + "name": "setDefaultRoyalty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "projectId", + "type": "bytes32" + } + ], + "name": "setImplicitModeProjectId", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "validator", + "type": "address" + } + ], + "name": "setImplicitModeValidator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_merkleRoot", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_supply", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "packId", + "type": "uint256" + } + ], + "name": "setPacksContent", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "uint96", + "name": "feeNumerator", + "type": "uint96" + } + ], + "name": "setTokenRoyalty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "supply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "tokenSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "uri", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "errors": { + "AccountBalanceOverflow()": [ + { + "details": "The recipient's balance has overflowed." + } + ], + "ArrayLengthsMismatch()": [ + { + "details": "The lengths of the input arrays are not the same." + } + ], + "InsufficientBalance()": [ + { + "details": "Insufficient balance." + } + ], + "NotOwnerNorApproved()": [ + { + "details": "Only the token owner or an approved account can manage the tokens." + } + ], + "TransferToNonERC1155ReceiverImplementer()": [ + { + "details": "Cannot safely transfer to a contract that does not implement the ERC1155Receiver interface." + } + ], + "TransferToZeroAddress()": [ + { + "details": "Cannot mint or transfer to the zero address." + } + ] + }, + "events": { + "ApprovalForAll(address,address,bool)": { + "details": "Emitted when `owner` enables or disables `operator` to manage all of their tokens." + }, + "RoleAdminChanged(bytes32,bytes32,bytes32)": { + "details": "Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this. _Available since v3.1._" + }, + "RoleGranted(bytes32,address,address)": { + "details": "Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}." + }, + "RoleRevoked(bytes32,address,address)": { + "details": "Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)" + }, + "TransferBatch(address,address,address,uint256[],uint256[])": { + "details": "Emitted when `amounts` of token `ids` are transferred from `from` to `to` by `operator`." + }, + "TransferSingle(address,address,address,uint256,uint256)": { + "details": "Emitted when `amount` of token `id` is transferred from `from` to `to` by `operator`." + }, + "URI(string,uint256)": { + "details": "Emitted when the Uniform Resource Identifier (URI) for token `id` is updated to `value`. This event is not used in the base contract. You may need to emit this event depending on your URI logic. See: https://eips.ethereum.org/EIPS/eip-1155#metadata" + } + }, + "kind": "dev", + "methods": { + "acceptImplicitRequest(address,(address,bytes4,bytes32,bytes32,bytes,(string,uint64)),(address,uint256,bytes,uint256,bool,bool,uint256))": { + "params": { + "attestation": "The attestation data", + "call": "The call to validate", + "wallet": "The wallet's address" + }, + "returns": { + "_0": "The hash of the implicit request if valid" + } + }, + "balanceOf(address,uint256)": { + "details": "Returns the amount of `id` owned by `owner`." + }, + "balanceOfBatch(address[],uint256[])": { + "details": "Returns the amounts of `ids` for `owners. Requirements: - `owners` and `ids` must have the same length." + }, + "batchBurn(uint256[],uint256[])": { + "params": { + "amounts": "Array of the amount to be burned", + "tokenIds": "Array of token ids to burn" + } + }, + "batchMint(address,uint256[],uint256[],bytes)": { + "params": { + "amounts": "Amounts of tokens to mint.", + "data": "Data to pass if receiver is contract.", + "to": "Address to mint tokens to.", + "tokenIds": "Token IDs to mint." + } + }, + "burn(uint256,uint256)": { + "params": { + "amount": "Amount of tokens to burn", + "tokenId": "Id of token to burn" + } + }, + "commit(uint256)": { + "params": { + "packId": "tokenId of pack." + } + }, + "getRevealIdx(address,uint256)": { + "params": { + "packId": "tokenId of pack.", + "user": "address of reward recipient." + } + }, + "getRoleAdmin(bytes32)": { + "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}." + }, + "getRoleMember(bytes32,uint256)": { + "details": "Returns one of the accounts that have `role`. `index` must be a value between 0 and {getRoleMemberCount}, non-inclusive. Role bearers are not sorted in any particular way, and their ordering may change at any point. WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure you perform all queries on the same block. See the following https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] for more information." + }, + "getRoleMemberCount(bytes32)": { + "details": "Returns the number of accounts that have `role`. Can be used together with {getRoleMember} to enumerate all bearers of a role." + }, + "grantRole(bytes32,address)": { + "details": "Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event." + }, + "hasRole(bytes32,address)": { + "details": "Returns `true` if `account` has been granted `role`." + }, + "initialize(address,string,string,string,address,uint96,address,bytes32)": { + "details": "This should be called immediately after deployment.", + "params": { + "implicitModeProjectId": "The implicit mode project id", + "implicitModeValidator": "The implicit mode validator address", + "owner": "Owner address", + "royaltyFeeNumerator": "The royalty fee numerator in basis points (e.g. 15% would be 1500)", + "royaltyReceiver": "Address of who should be sent the royalty payment", + "tokenBaseURI": "Base URI for token metadata", + "tokenContractURI": "Contract URI for token metadata", + "tokenName": "Token name" + } + }, + "isApprovedForAll(address,address)": { + "details": "Returns whether `operator` is approved to manage the tokens of `owner`." + }, + "mint(address,uint256,uint256,bytes)": { + "params": { + "amount": "Amount of tokens to mint.", + "data": "Data to pass if receiver is contract.", + "to": "Address to mint tokens to.", + "tokenId": "Token ID to mint." + } + }, + "refundPack(address,uint256)": { + "params": { + "packId": "tokenId of pack.", + "user": "address of pack owner." + } + }, + "renounceRole(bytes32,address)": { + "details": "Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event." + }, + "reveal(address,(address[],bool[],uint256[][],uint256[][]),bytes32[],uint256)": { + "params": { + "packContent": "reward selected with random index.", + "packId": "tokenId of pack.", + "proof": "Pack contents merkle proof.", + "user": "address of reward recipient." + } + }, + "revokeRole(bytes32,address)": { + "details": "Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event." + }, + "royaltyInfo(uint256,uint256)": { + "details": "Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of exchange. The royalty amount is denominated and should be paid in that same unit of exchange." + }, + "safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)": { + "details": "Transfers `amounts` of `ids` from `from` to `to`. Requirements: - `to` cannot be the zero address. - `from` must have at least `amount` of `id`. - `ids` and `amounts` must have the same length. - If the caller is not `from`, it must be approved to manage the tokens of `from`. - If `to` refers to a smart contract, it must implement {ERC1155-onERC1155BatchReceived}, which is called upon a batch transfer. Emits a {TransferBatch} event." + }, + "safeTransferFrom(address,address,uint256,uint256,bytes)": { + "details": "Transfers `amount` of `id` from `from` to `to`. Requirements: - `to` cannot be the zero address. - `from` must have at least `amount` of `id`. - If the caller is not `from`, it must be approved to manage the tokens of `from`. - If `to` refers to a smart contract, it must implement {ERC1155-onERC1155Received}, which is called upon a batch transfer. Emits a {TransferSingle} event." + }, + "setApprovalForAll(address,bool)": { + "details": "Sets whether `operator` is approved to manage the tokens of the caller. Emits a {ApprovalForAll} event." + }, + "setBaseMetadataURI(string)": { + "params": { + "tokenBaseURI": "New base URI of token's URI" + } + }, + "setContractName(string)": { + "params": { + "tokenName": "New contract name" + } + }, + "setContractURI(string)": { + "params": { + "tokenContractURI": "New contract URI of token's URI" + } + }, + "setDefaultRoyalty(address,uint96)": { + "params": { + "feeNumerator": "The royalty fee numerator in basis points (e.g. 15% would be 1500)", + "receiver": "Address of who should be sent the royalty payment" + } + }, + "setImplicitModeProjectId(bytes32)": { + "params": { + "projectId": "The project id." + } + }, + "setImplicitModeValidator(address)": { + "params": { + "validator": "The validator address." + } + }, + "setPacksContent(bytes32,uint256,uint256)": { + "details": "Updating these values before all the packs have been opened may lead to undesirable behavior.", + "params": { + "_merkleRoot": "merkle root built from all possible pack contents.", + "_supply": "total amount of packs.", + "packId": "tokenId of pack." + } + }, + "setTokenRoyalty(uint256,address,uint96)": { + "params": { + "feeNumerator": "The royalty fee numerator in basis points (e.g. 15% would be 1500)", + "receiver": "Address of who should be sent the royalty payment", + "tokenId": "The token id to set the royalty information for" + } + }, + "supportsInterface(bytes4)": { + "params": { + "interfaceId": "Interface id" + }, + "returns": { + "_0": "True if supported" + } + }, + "uri(uint256)": { + "details": "Returns the URI for token `id`. You can either return the same templated URI for all token IDs, (e.g. \"https://example.com/api/{id}.json\"), or return a unique URI for each `id`. See: https://eips.ethereum.org/EIPS/eip-1155#metadata" + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": { + "abi_decode_address_fromMemory": { + "entryPoint": 227, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_address_fromMemory": { + "entryPoint": 242, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "allocate_memory": { + "entryPoint": 157, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "allocate_unbounded": { + "entryPoint": 75, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "cleanup_address": { + "entryPoint": 194, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_uint160": { + "entryPoint": 183, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "constructor_ERC1155Pack": { + "entryPoint": 306, + "id": 9060, + "parameterSlots": 1, + "returnSlots": 0 + }, + "copy_arguments_for_constructor_object_ERC1155Pack": { + "entryPoint": 273, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "finalize_allocation": { + "entryPoint": 118, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "panic_error_0x41": { + "entryPoint": 96, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb": { + "entryPoint": 81, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b": { + "entryPoint": 178, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "round_up_to_mul_of": { + "entryPoint": 86, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "validator_revert_address": { + "entryPoint": 206, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + } + }, + "generatedSources": [], + "linkReferences": {}, + "object": "60a06040523461004657610019610014610111565b610132565b61002161004b565b615fc961013882396080518181816111d701528181613c440152613d710152615fc990f35b610051565b60405190565b600080fd5b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b9061008090610056565b810190811060018060401b0382111761009857604052565b610060565b906100b06100a961004b565b9283610076565b565b600080fd5b60018060a01b031690565b6100cb906100b7565b90565b6100d7816100c2565b036100de57565b600080fd5b905051906100f0826100ce565b565b9060208282031261010c57610109916000016100e3565b90565b6100b2565b61012f616101803803806101248161009d565b9283398101906100f2565b90565b60805256fe60806040526004361015610013575b611c2e565b61001e6000356102dc565b8062fdd58e146102d757806301ffc9a7146102d257806304634d8d146102cd57806306fdde03146102c85780630b5ee006146102c35780630bb310de146102be5780630e89341c146102b9578063167a59f7146102b457806318160ddd146102af57806320ec271b146102aa578063248a9ca3146102a55780632693ebf2146102a05780632a55205a1461029b5780632eb2c2d6146102965780632f2ff15d14610291578063354030231461028c57806336568abe146102875780633c70b3571461028257806347fda41a1461027d5780634e1273f41461027857806350336a0314610273578063513046831461026e5780635377ab8f146102695780635944c753146102645780636c0360eb1461025f578063731133e91461025a5780637e518ec8146102555780638ff83ac1146102505780639010d07c1461024b57806391d1485414610246578063938e3d7b146102415780639d043a661461023c578063a217fddf14610237578063a22cb46514610232578063b390c0ab1461022d578063b48ab8b614610228578063ca15c87314610223578063d547741f1461021e578063d67b333b14610219578063e8a3d48514610214578063e985e9c51461020f578063ed4c2ac71461020a578063f242432a146102055763f4f98ad50361000e57611bfb565b611bc1565b611b1d565b611ae7565b611a84565b611a3d565b61193b565b611906565b6118cf565b61180b565b6117d7565b611750565b6116dd565b611615565b6115df565b6115a9565b61153e565b611441565b61140a565b6112f9565b6112b5565b611244565b61120f565b6111a1565b61112d565b610fb8565b610f69565b610eda565b610ea5565b610e57565b610dec565b610c8f565b610bfb565b610b75565b610ad8565b6109a9565b61093a565b610905565b6108b3565b610861565b61074f565b6104f5565b610457565b6103aa565b60e01c90565b60405190565b600080fd5b600080fd5b600080fd5b60018060a01b031690565b61030b906102f7565b90565b61031781610302565b0361031e57565b600080fd5b905035906103308261030e565b565b90565b61033e81610332565b0361034557565b600080fd5b9050359061035782610335565b565b9190604083820312610382578061037661037f9260008601610323565b9360200161034a565b90565b6102ed565b61039090610332565b9052565b91906103a890600060208501940190610387565b565b346103db576103d76103c66103c0366004610359565b90611c38565b6103ce6102e2565b91829182610394565b0390f35b6102e8565b63ffffffff60e01b1690565b6103f5816103e0565b036103fc57565b600080fd5b9050359061040e826103ec565b565b9060208282031261042a5761042791600001610401565b90565b6102ed565b151590565b61043d9061042f565b9052565b919061045590600060208501940190610434565b565b346104875761048361047261046d366004610410565b611c61565b61047a6102e2565b91829182610441565b0390f35b6102e8565b6bffffffffffffffffffffffff1690565b6104a68161048c565b036104ad57565b600080fd5b905035906104bf8261049d565b565b91906040838203126104ea57806104de6104e79260008601610323565b936020016104b2565b90565b6102ed565b60000190565b346105245761050e6105083660046104c1565b90611ced565b6105166102e2565b80610520816104ef565b0390f35b6102e8565b600091031261053457565b6102ed565b634e487b7160e01b600052600060045260246000fd5b634e487b7160e01b600052602260045260246000fd5b9060016002830492168015610585575b602083101461058057565b61054f565b91607f1691610575565b60209181520190565b600052602060002090565b90600092918054906105be6105b783610565565b809461058f565b9160018116908160001461061757506001146105da575b505050565b6105e79192939450610598565b916000925b8184106105ff57505001903880806105d5565b600181602092959395548486015201910192906105ec565b92949550505060ff19168252151560200201903880806105d5565b9061063c916105a3565b90565b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b906106699061063f565b810190811067ffffffffffffffff82111761068357604052565b610649565b906106a86106a1926106986102e2565b93848092610632565b038361065f565b565b906000106106be576106bb90610688565b90565b610539565b6106d060086000906106aa565b90565b5190565b60209181520190565b60005b8381106106f4575050906000910152565b8060209183015181850152016106e3565b61072461072d6020936107329361071b816106d3565b938480936106d7565b958691016106e0565b61063f565b0190565b61074c9160208201916000818403910152610705565b90565b3461077f5761075f366004610529565b61077b61076a6106c3565b6107726102e2565b91829182610736565b0390f35b6102e8565b600080fd5b600080fd5b906107a161079a6102e2565b928361065f565b565b67ffffffffffffffff81116107c1576107bd60209161063f565b0190565b610649565b90826000939282370152565b909291926107e76107e2826107a3565b61078e565b9381855260208501908284011161080357610801926107c6565b565b610789565b9080601f8301121561082657816020610823933591016107d2565b90565b610784565b9060208282031261085c57600082013567ffffffffffffffff8111610857576108549201610808565b90565b6102f2565b6102ed565b3461088f5761087961087436600461082b565b611f2e565b6108816102e2565b8061088b816104ef565b0390f35b6102e8565b906020828203126108ae576108ab91600001610323565b90565b6102ed565b346108e1576108cb6108c6366004610894565b61200b565b6108d36102e2565b806108dd816104ef565b0390f35b6102e8565b90602082820312610900576108fd9160000161034a565b90565b6102ed565b346109355761093161092061091b3660046108e6565b612135565b6109286102e2565b91829182610736565b0390f35b6102e8565b346109695761095361094d366004610359565b90612254565b61095b6102e2565b80610965816104ef565b0390f35b6102e8565b1c90565b90565b61098590600861098a930261096e565b610972565b90565b906109989154610975565b90565b6109a660008061098d565b90565b346109d9576109b9366004610529565b6109d56109c461099b565b6109cc6102e2565b91829182610394565b0390f35b6102e8565b67ffffffffffffffff81116109f65760208091020190565b610649565b600080fd5b90929192610a15610a10826109de565b61078e565b9381855260208086019202830192818411610a5257915b838310610a395750505050565b60208091610a47848661034a565b815201920191610a2c565b6109fb565b9080601f83011215610a7557816020610a7293359101610a00565b90565b610784565b919091604081840312610ad357600081013567ffffffffffffffff8111610ace5783610aa7918301610a57565b92602082013567ffffffffffffffff8111610ac957610ac69201610a57565b90565b6102f2565b6102f2565b6102ed565b34610b0757610af1610aeb366004610a7a565b9061234f565b610af96102e2565b80610b03816104ef565b0390f35b6102e8565b90565b610b1881610b0c565b03610b1f57565b600080fd5b90503590610b3182610b0f565b565b90602082820312610b4d57610b4a91600001610b24565b90565b6102ed565b610b5b90610b0c565b9052565b9190610b7390600060208501940190610b52565b565b34610ba557610ba1610b90610b8b366004610b33565b6123a8565b610b986102e2565b91829182610b5f565b0390f35b6102e8565b90565b610bc1610bbc610bc692610332565b610baa565b610332565b90565b90610bd390610bad565b600052602052604060002090565b610bf890610bf3600191600092610bc9565b61098d565b90565b34610c2b57610c27610c16610c113660046108e6565b610be1565b610c1e6102e2565b91829182610394565b0390f35b6102e8565b9190604083820312610c595780610c4d610c56926000860161034a565b9360200161034a565b90565b6102ed565b610c6790610302565b9052565b916020610c8d929493610c8660408201966000830190610c5e565b0190610387565b565b34610cc157610ca8610ca2366004610c30565b9061259a565b90610cbd610cb46102e2565b92839283610c6b565b0390f35b6102e8565b600080fd5b909182601f83011215610d055781359167ffffffffffffffff8311610d00576020019260208302840111610cfb57565b6109fb565b610cc6565b610784565b909182601f83011215610d445781359167ffffffffffffffff8311610d3f576020019260018302840111610d3a57565b6109fb565b610cc6565b610784565b9160a083830312610de757610d618260008501610323565b92610d6f8360208301610323565b92604082013567ffffffffffffffff8111610de25781610d90918401610ccb565b929093606082013567ffffffffffffffff8111610ddd5783610db3918401610ccb565b929093608082013567ffffffffffffffff8111610dd857610dd49201610d0a565b9091565b6102f2565b6102f2565b6102f2565b6102ed565b34610e2457610e0e610dff366004610d49565b96959095949194939293612675565b610e166102e2565b80610e20816104ef565b0390f35b6102e8565b9190604083820312610e525780610e46610e4f9260008601610b24565b93602001610323565b90565b6102ed565b34610e8657610e70610e6a366004610e29565b90612911565b610e786102e2565b80610e82816104ef565b0390f35b6102e8565b610ea290610e9d600d91600092610bc9565b61098d565b90565b34610ed557610ed1610ec0610ebb3660046108e6565b610e8b565b610ec86102e2565b91829182610394565b0390f35b6102e8565b34610f0957610ef3610eed366004610e29565b906129c7565b610efb6102e2565b80610f05816104ef565b0390f35b6102e8565b90610f1890610bad565b600052602052604060002090565b90565b610f39906008610f3e930261096e565b610f26565b90565b90610f4c9154610f29565b90565b610f6690610f61600c91600092610f0e565b610f41565b90565b34610f9957610f95610f84610f7f3660046108e6565b610f4f565b610f8c6102e2565b91829182610b5f565b0390f35b6102e8565b610fb590610fb0600e91600092610bc9565b61098d565b90565b34610fe857610fe4610fd3610fce3660046108e6565b610f9e565b610fdb6102e2565b91829182610394565b0390f35b6102e8565b909182601f830112156110275781359167ffffffffffffffff831161102257602001926020830284011161101d57565b6109fb565b610cc6565b610784565b909160408284031261108757600082013567ffffffffffffffff81116110825783611058918401610fed565b929093602082013567ffffffffffffffff811161107d576110799201610ccb565b9091565b6102f2565b6102f2565b6102ed565b5190565b60209181520190565b60200190565b6110a890610332565b9052565b906110b98160209361109f565b0190565b60200190565b906110e06110da6110d38461108c565b8093611090565b92611099565b9060005b8181106110f15750505090565b90919261110a61110460019286516110ac565b946110bd565b91019190916110e4565b61112a91602082019160008184039101526110c3565b90565b346111615761115d61114c61114336600461102c565b929190916129fb565b6111546102e2565b91829182611114565b0390f35b6102e8565b909160608284031261119c576111996111828460008501610b24565b93611190816020860161034a565b9360400161034a565b90565b6102ed565b346111d0576111ba6111b4366004611166565b91612b51565b6111c26102e2565b806111cc816104ef565b0390f35b6102e8565b7f000000000000000000000000000000000000000000000000000000000000000090565b919061120d90600060208501940190610c5e565b565b3461123f5761121f366004610529565b61123b61122a6111d5565b6112326102e2565b918291826111f9565b0390f35b6102e8565b346112755761127161126061125a366004610359565b90612b5e565b6112686102e2565b91829182610394565b0390f35b6102e8565b90916060828403126112b0576112ad611296846000850161034a565b936112a48160208601610323565b936040016104b2565b90565b6102ed565b346112e4576112ce6112c836600461127a565b91612ba2565b6112d66102e2565b806112e0816104ef565b0390f35b6102e8565b6112f660096000906106aa565b90565b3461132957611309366004610529565b6113256113146112e9565b61131c6102e2565b91829182610736565b0390f35b6102e8565b67ffffffffffffffff811161134c5761134860209161063f565b0190565b610649565b909291926113666113618261132e565b61078e565b9381855260208501908284011161138257611380926107c6565b565b610789565b9080601f830112156113a5578160206113a293359101611351565b90565b610784565b90608082820312611405576113c28160008401610323565b926113d0826020850161034a565b926113de836040830161034a565b92606082013567ffffffffffffffff8111611400576113fd9201611387565b90565b6102f2565b6102ed565b3461143c5761142661141d3660046113aa565b92919091612c01565b61142e6102e2565b80611438816104ef565b0390f35b6102e8565b3461146f5761145961145436600461082b565b612c37565b6114616102e2565b8061146b816104ef565b0390f35b6102e8565b9190610100838203126115395761148e8160008501610323565b92602081013567ffffffffffffffff811161153457826114af918301610808565b92604082013567ffffffffffffffff811161152f57836114d0918401610808565b92606083013567ffffffffffffffff811161152a57816114f1918501610808565b926114ff8260808301610323565b926115276115108460a085016104b2565b9361151e8160c08601610323565b9360e001610b24565b90565b6102f2565b6102f2565b6102f2565b6102ed565b3461157657611560611551366004611474565b96959095949194939293612c42565b6115686102e2565b80611572816104ef565b0390f35b6102e8565b91906040838203126115a457806115986115a19260008601610b24565b9360200161034a565b90565b6102ed565b346115da576115d66115c56115bf36600461157b565b90612c89565b6115cd6102e2565b918291826111f9565b0390f35b6102e8565b346116105761160c6115fb6115f5366004610e29565b90612cf0565b6116036102e2565b91829182610441565b0390f35b6102e8565b346116435761162d61162836600461082b565b612d43565b6116356102e2565b8061163f816104ef565b0390f35b6102e8565b600080fd5b908160c091031261165b5790565b611648565b908160e091031261166e5790565b611648565b916060838303126116d85761168b8260008501610323565b92602081013567ffffffffffffffff81116116d357836116ac91830161164d565b92604082013567ffffffffffffffff81116116ce576116cb9201611660565b90565b6102f2565b6102f2565b6102ed565b3461170e5761170a6116f96116f3366004611673565b916130a6565b6117016102e2565b91829182610b5f565b0390f35b6102e8565b90565b60001b90565b61173061172b61173592611713565b611716565b610b0c565b90565b611742600061171c565b90565b61174d611738565b90565b3461178057611760366004610529565b61177c61176b611745565b6117736102e2565b91829182610b5f565b0390f35b6102e8565b61178e8161042f565b0361179557565b600080fd5b905035906117a782611785565b565b91906040838203126117d257806117c66117cf9260008601610323565b9360200161179a565b90565b6102ed565b34611806576117f06117ea3660046117a9565b90613147565b6117f86102e2565b80611802816104ef565b0390f35b6102e8565b3461183a5761182461181e366004610c30565b90613197565b61182c6102e2565b80611836816104ef565b0390f35b6102e8565b906080828203126118ca576118578160008401610323565b92602083013567ffffffffffffffff81116118c55782611878918501610a57565b92604081013567ffffffffffffffff81116118c05783611899918301610a57565b92606082013567ffffffffffffffff81116118bb576118b89201611387565b90565b6102f2565b6102f2565b6102f2565b6102ed565b34611901576118eb6118e236600461183f565b929190916131d4565b6118f36102e2565b806118fd816104ef565b0390f35b6102e8565b346119365761193261192161191c366004610b33565b6131e2565b6119296102e2565b91829182610394565b0390f35b6102e8565b3461196a5761195461194e366004610e29565b90613232565b61195c6102e2565b80611966816104ef565b0390f35b6102e8565b9081608091031261197d5790565b611648565b909182601f830112156119bc5781359167ffffffffffffffff83116119b75760200192602083028401116119b257565b6109fb565b610cc6565b610784565b919091608081840312611a38576119db8360008301610323565b92602082013567ffffffffffffffff8111611a3357816119fc91840161196f565b92604083013567ffffffffffffffff8111611a2e57611a2083611a2b928601611982565b93909460600161034a565b90565b6102f2565b6102f2565b6102ed565b34611a6f57611a59611a503660046119c1565b93929092613997565b611a616102e2565b80611a6b816104ef565b0390f35b6102e8565b611a81600a6000906106aa565b90565b34611ab457611a94366004610529565b611ab0611a9f611a74565b611aa76102e2565b91829182610736565b0390f35b6102e8565b9190604083820312611ae25780611ad6611adf9260008601610323565b93602001610323565b90565b6102ed565b34611b1857611b14611b03611afd366004611ab9565b90613e0e565b611b0b6102e2565b91829182610441565b0390f35b6102e8565b34611b4b57611b35611b30366004610b33565b613e5a565b611b3d6102e2565b80611b47816104ef565b0390f35b6102e8565b91909160a081840312611bbc57611b6a8360008301610323565b92611b788160208401610323565b92611b86826040850161034a565b92611b94836060830161034a565b92608082013567ffffffffffffffff8111611bb757611bb39201610d0a565b9091565b6102f2565b6102ed565b34611bf657611be0611bd4366004611b50565b94939093929192613e65565b611be86102e2565b80611bf2816104ef565b0390f35b6102e8565b34611c2957611c13611c0e3660046108e6565b614059565b611c1b6102e2565b80611c25816104ef565b0390f35b6102e8565b600080fd5b600090565b611c40611c33565b50679a31110384e0b0c960205260145260005260406000205490565b600090565b611c69611c5c565b5080611c84611c7e6337bc219560e01b6103e0565b916103e0565b14908115611c91575b5090565b611c9b9150614138565b38611c8d565b7f6db4061a20ca83a3be756ee172bd37a029093ac5afe4ce968c6d5435b43cb01190565b90611cdf91611cda611cd5611ca1565b61418e565b611ce1565b565b90611ceb916143a8565b565b90611cf791611cc5565b565b7fe02a0315b383857ac496e9d2b2546a699afaeb4e5e83a1fdef64376d0b74e5a590565b611d3690611d31611d2c611cf9565b61418e565b611f21565b565b601f602091010490565b1b90565b91906008611d62910291611d5c60001984611d42565b92611d42565b9181191691161790565b90565b9190611d85611d80611d8d93610bad565b611d6c565b908354611d46565b9055565b611da391611d9d611c33565b91611d6f565b565b5b818110611db1575050565b80611dbf6000600193611d91565b01611da6565b9190601f8111611dd5575b505050565b611de1611e0693610598565b906020611ded84611d38565b83019310611e0e575b611dff90611d38565b0190611da5565b388080611dd0565b9150611dff81929050611df6565b90611e2d906000199060080261096e565b191690565b81611e3c91611e1c565b906002021790565b90611e4e816106d3565b9067ffffffffffffffff8211611f1057611e7282611e6c8554610565565b85611dc5565b602090601f8311600114611ea757918091611e9693600092611e9b575b5050611e32565b90555b565b90915001513880611e8f565b601f19831691611eb685610598565b9260005b818110611ef857509160029391856001969410611ede575b50505002019055611e99565b611eee910151601f841690611e1c565b9055388080611ed2565b91936020600181928787015181550195019201611eba565b610649565b90611f1f91611e44565b565b611f2c906008611f15565b565b611f3790611d1d565b565b7f70649ec320b507febad3e8ef750e5f580b9ae32f9f50d4c7b121332c8197153090565b611f7690611f71611f6c611f39565b61418e565b611ff6565b565b611f8c611f87611f91926102f7565b610baa565b6102f7565b90565b611f9d90611f78565b90565b611fa990611f94565b90565b90611fbd60018060a01b0391611716565b9181191691161790565b611fd090611f94565b90565b90565b90611feb611fe6611ff292611fc7565b611fd3565b8254611fac565b9055565b61200261200991611fa0565b6006611fd6565b565b61201490611f5d565b565b606090565b905090565b906000929180549061203b61203483610565565b809461201b565b9160018116908160001461208f5750600114612057575b505050565b6120649192939450610598565b6000905b83821061207b5750500190388080612052565b600181602092548486015201910190612068565b92949550505060ff19168252801515020190388080612052565b6120ce6120c5926020926120bc816106d3565b9485809361201b565b938491016106e0565b0190565b60007f2e6a736f6e000000000000000000000000000000000000000000000000000000910152565b6121066005809261201b565b61210f816120d2565b0190565b9161212461212f9361212a93612020565b906120a9565b6120fa565b90565b90565b61217c90612141612016565b50612177612150600992614422565b9161216861215c6102e2565b93849260208401612113565b6020820181038252038261065f565b612132565b90565b61218890611f78565b90565b6121949061217f565b90565b906121a19061218b565b600052602052604060002090565b60001c90565b6121c16121c6916121af565b610972565b90565b6121d390546121b5565b90565b6121ea6121e56121ef92611713565b610baa565b610332565b90565b6121fe612203916121af565b610bad565b90565b90565b61221d61221861222292612206565b610baa565b610332565b90565b90612237612232836107a3565b61078e565b918252565b6122466000612225565b90565b61225161223c565b90565b9061227361226e612267600f8590612197565b8390610bc9565b6121c9565b8061228761228160006121d6565b91610332565b146123325761229681406121f2565b6122a96122a360006121d6565b91610332565b1415908115612315575b506122f8576122f6916122dc60006122d76122d0600f8590612197565b8590610bc9565b611d91565b906122e76001612209565b906122f0612249565b92614477565b565b600063156f904360e21b815280612311600482016104ef565b0390fd5b905061232a6123244392610332565b91610332565b1115386122b3565b6000637de832b560e11b81528061234b600482016104ef565b0390fd5b61235c91339190916144f2565b565b600090565b61236c90610b0c565b90565b9061237990612363565b600052602052604060002090565b612393612398916121af565b610f26565b90565b6123a59054612387565b90565b60016123c16123c7926123b961235e565b50600461236f565b0161239b565b90565b600090565b906123d990610bad565b600052602052604060002090565b60018060a01b031690565b6123fe612403916121af565b6123e7565b90565b61241090546123f2565b90565b9061241d90610302565b9052565b60a01c90565b6bffffffffffffffffffffffff1690565b61244461244991612421565b612427565b90565b6124569054612438565b90565b906124639061048c565b9052565b612471604061078e565b90565b906124ab6124a26000612485612467565b9461249c612494838301612406565b838801612413565b0161244c565b60208401612459565b565b6124b690612474565b90565b6124c39051610302565b90565b6124da6124d56124df92611713565b610baa565b6102f7565b90565b6124eb906124c6565b90565b6124f8905161048c565b90565b61250f61250a6125149261048c565b610baa565b610332565b90565b634e487b7160e01b600052601160045260246000fd5b61253c61254291939293610332565b92610332565b9161254e838202610332565b92818404149015171561255d57565b612517565b634e487b7160e01b600052601260045260246000fd5b61258461258a91610332565b91610332565b908115612595570490565b612562565b6125bd6125c2919392936125ac6123ca565b506125b5611c33565b5060036123cf565b6124ad565b916125cf600084016124b9565b6125ea6125e46125df60006124e2565b610302565b91610302565b14612637575b600061262c6126166126339361261061260b602089016124ee565b6124fb565b9061252d565b6126266126216145ea565b6124fb565b90612578565b93016124b9565b9190565b9150612633600061262c61261661264e60026124ad565b9593505050506125f0565b612664913691610a00565b90565b612672913691611351565b90565b969396959094919295612686614601565b6128bf575b8287036128b15760601b679a31110384e0b0c9179460601b679a31110384e0b0c91791856020528560601c958360601c9384156128a357873303612887575b8860051b805b61282757505050828660207f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb604051604081528b8d8160051b948286936040860152838d6060870137836060018286015260608486010190815201376080339380010190a461273d61460f565b61280a575b50813b612753575b50505050505050565b602080809786946000528060c06040519b8c9a63bc197c818c5233868d015260408c015260a060608c01528a8360051b998a9586948593015260e08d01378160c00160808c015260e0828c010192835284830137818060e0010160a08a01520101838152013780010161010401601c60405101600080515af1156127fb575b63bc197c8160e01b9051036127ed573880808080808061274a565b639c05499b6000526004601cfd5b3d156127d2573d6000823e3d90fd5b612821908690849086908a8c919287948b9661461d565b38612742565b60209003808b013583602052818801356000526040600020805480831161287957829003905582602052604060002090815490810190811061286b578291556126d0565b6301336cea6000526004601cfd5b63f4d678b86000526004601cfd5b336000526034600c20546126ca57634b6e7f186000526004601cfd5b63ea553b346000526004601cfd5b633b800a466000526004601cfd5b6128e284886128dc8b87906128d688948c96612659565b50612659565b50612667565b5061268b565b90612903916128fe6128f9826123a8565b61418e565b612905565b565b9061290f91614667565b565b9061291b916128e8565b565b60207f20726f6c657320666f722073656c660000000000000000000000000000000000917f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201520152565b612978602f6040926106d7565b6129818161291d565b0190565b61299b906020810190600081830391015261296b565b90565b156129a557565b6129ad6102e2565b62461bcd60e51b8152806129c360048201612985565b0390fd5b906129f4916129ef826129e96129e36129de614691565b610302565b91610302565b1461299e565b61469e565b565b606090565b93929190612a076129f6565b508203612a5e5760405193828552602085019260051b808481016040525b612a2f5750505050565b602090038082013560601b679a31110384e0b0c917602052808301356000528060406000205481860152612a25565b633b800a466000526004601cfd5b7fbaa5ee745de68a3095827d2ee7dd2043afc932834d02cc1b8be3da78577f6c1a90565b90612aab9291612aa6612aa1612a6c565b61418e565b612b10565b565b90612aba60001991611716565b9181191691161790565b612acd906121af565b90565b90612ae5612ae0612aec92612363565b612ac4565b8254612aad565b9055565b90612b05612b00612b0c92610bad565b611d6c565b8254612aad565b9055565b612b4f9291612b2d612b4a92612b28600c8690610f0e565b612ad0565b612b4281612b3d600d8690610bc9565b612af0565b91600e610bc9565b612af0565b565b90612b5c9291612a90565b565b90612b7191612b6b611c33565b5061470e565b905090565b90612b919291612b8c612b87611ca1565b61418e565b612b93565b565b91612ba0929190916148f4565b565b90612bad9291612b76565b565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a690565b90612bef939291612bea612be5612baf565b61418e565b612bf1565b565b91612bff9391909192614477565b565b90612c0d939291612bd3565b565b612c2890612c23612c1e611cf9565b61418e565b612c2a565b565b612c35906009611f15565b565b612c4090612c0f565b565b91612c6c97959391969492612c5f612c58612a6c565b8290614667565b9690919293949596614977565b565b90612c7890612363565b600052602052604060002090565b90565b90612ca9612ca4612cae93612c9c6123ca565b506005612c6e565b612c86565b6149c6565b90565b90612cbb9061218b565b600052602052604060002090565b60ff1690565b612cdb612ce0916121af565b612cc9565b90565b612ced9054612ccf565b90565b612d18916000612d0d612d1393612d05611c5c565b50600461236f565b01612cb1565b612ce3565b90565b612d3490612d2f612d2a611cf9565b61418e565b612d36565b565b612d4190600a611f15565b565b612d4c90612d1b565b565b60018060a01b031690565b612d65612d6a916121af565b612d4e565b90565b612d779054612d59565b90565b612d839061217f565b90565b600080fd5b60e01b90565b90505190612d9e82610b0f565b565b90602082820312612dba57612db791600001612d91565b90565b6102ed565b50612dce906020810190610323565b90565b612dda90610302565b9052565b50612ded906020810190610401565b90565b612df9906103e0565b9052565b50612e0c906020810190610b24565b90565b612e1890610b0c565b9052565b600080fd5b600080fd5b600080fd5b9035600160200382360303811215612e6c57016020813591019167ffffffffffffffff8211612e67576001820236038313612e6257565b612e21565b612e1c565b612e26565b60209181520190565b9190612e9481612e8d81612e9995612e71565b80956107c6565b61063f565b0190565b9035600160400382360303811215612eb3570190565b612e26565b9035600160200382360303811215612ef957016020813591019167ffffffffffffffff8211612ef4576001820236038313612eef57565b612e21565b612e1c565b612e26565b9190612f1881612f1181612f1d9561058f565b80956107c6565b61063f565b0190565b67ffffffffffffffff1690565b612f3781612f21565b03612f3e57565b600080fd5b90503590612f5082612f2e565b565b50612f61906020810190612f43565b90565b612f6d90612f21565b9052565b90612faf906020612fa7612f9d60408401612f8f6000880188612eb8565b908683036000880152612efe565b9482810190612f52565b910190612f64565b90565b61305c9161304e61304360c08301612fda612fd06000870187612dbf565b6000860190612dd1565b612ff4612fea6020870187612dde565b6020860190612df0565b61300e6130046040870187612dfd565b6040860190612e0f565b61302861301e6060870187612dfd565b6060860190612e0f565b6130356080860186612e2b565b908583036080870152612e7a565b9260a0810190612e9d565b9060a0818403910152612f71565b90565b93929061308b6040916130939461307e606089019260008a0190610c5e565b8782036020890152612fb2565b940190610b52565b565b61309d6102e2565b3d6000823e3d90fd5b91506020906130b361235e565b506130c66130c16006612d6d565b612d7a565b6130f2633808a90b9492946130fd6130de600761239b565b6130e66102e2565b97889687958695612d8b565b85526004850161305f565b03915afa90811561314257600091613114575b5090565b613135915060203d811161313b575b61312d818361065f565b810190612da0565b38613110565b503d613123565b613095565b901515679a31110384e0b0c96020523360145281600052806034600c205560005260601b60601c337f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160206000a3565b6131a491339190916149ff565b565b906131c29392916131bd6131b8612baf565b61418e565b6131c4565b565b916131d29391909192614a51565b565b906131e09392916131a6565b565b6132016131fc613206926131f4611c33565b506005612c6e565b612c86565b614b25565b90565b906132249161321f61321a826123a8565b61418e565b613226565b565b906132309161469e565b565b9061323c91613209565b565b903560016020038236030381121561327f57016020813591019167ffffffffffffffff821161327a57602082023603831361327557565b612e21565b612e1c565b612e26565b60209181520190565b90565b9061329d81602093612dd1565b0190565b60200190565b916132b5826132bb92613284565b9261328d565b90816000905b8282106132cf575050505090565b909192936132f16132eb6001926132e68886612dbf565b613290565b956132a1565b9201909291926132c1565b903560016020038236030381121561333d57016020813591019167ffffffffffffffff821161333857602082023603831361333357565b612e21565b612e1c565b612e26565b60209181520190565b90565b6133579061042f565b9052565b906133688160209361334e565b0190565b5061337b90602081019061179a565b90565b60200190565b916133928261339892613342565b9261334b565b90816000905b8282106133ac575050505090565b909192936133ce6133c86001926133c3888661336c565b61335b565b9561337e565b92019092919261339e565b903560016020038236030381121561341a57016020813591019167ffffffffffffffff821161341557602082023603831361341057565b612e21565b612e1c565b612e26565b60209181520190565b90565b60209181520190565b600080fd5b9037565b9091826134499161342b565b9160018060fb1b03811161346c57829160206134689202938491613439565b0190565b613434565b9061347c929161343d565b90565b90356001602003823603038112156134c057016020813591019167ffffffffffffffff82116134bb5760208202360383136134b657565b612e21565b612e1c565b612e26565b60200190565b91816134d69161341f565b90816134e760208302840194613428565b92836000925b8484106134fd5750505050505090565b9091929394956020613529613523838560019503885261351d8b8861347f565b90613471565b986134c5565b9401940192949391906134ed565b6135b5916135a761359c61358161356660808501613558600088018861323e565b9087830360008901526132a7565b61357360208701876132fc565b908683036020880152613384565b61358e60408601866133d9565b9085830360408701526134cb565b9260608101906133d9565b9160608185039101526134cb565b90565b916135dc926135cf60408201936000830190610387565b6020818403910152613537565b90565b60200190565b5190565b67ffffffffffffffff81116136015760208091020190565b610649565b9092919261361b613616826135e9565b61078e565b938185526020808601920283019281841161365857915b83831061363f5750505050565b6020809161364d8486610b24565b815201920191613632565b6109fb565b613668913691613606565b90565b61367490610332565b60008114613683576001900390565b612517565b9061369290610bad565b600052602052604060002090565b600080fd5b600080fd5b600080fd5b9035906001602003813603038212156136f1570180359067ffffffffffffffff82116136ec576020019160208202360383136136e757565b6136aa565b6136a5565b6136a0565b5090565b634e487b7160e01b600052603260045260246000fd5b9190811015613720576020020190565b6136fa565b3561372f8161030e565b90565b903590600160200381360303821215613774570180359067ffffffffffffffff821161376f5760200191602082023603831361376a57565b6136aa565b6136a5565b6136a0565b9035906001602003813603038212156137bb570180359067ffffffffffffffff82116137b6576020019160208202360383136137b157565b6136aa565b6136a5565b6136a0565b908210156137db5760206137d79202810190613779565b9091565b6136fa565b903590600160200381360303821215613822570180359067ffffffffffffffff821161381d5760200191602082023603831361381857565b6136aa565b6136a5565b6136a0565b9190811015613837576020020190565b6136fa565b3561384681611785565b90565b61385290611f78565b90565b61385e90613849565b90565b61386a9061217f565b90565b600091031261387857565b6102ed565b90918261388991611090565b9160018060fb1b0381116138ac57829160206138a89202938491613439565b0190565b613434565b60209181520190565b6138d96138e26020936138e7936138d0816135e5565b938480936138b1565b958691016106e0565b61063f565b0190565b936139186139349694926139269461390b608089019260008a0190610c5e565b87820360208901526110c3565b91858303604087015261387d565b9160608184039101526138ba565b90565b61394090611f78565b90565b61394c90613937565b90565b6139589061217f565b90565b906139658261108c565b811015613976576020809102010190565b6136fa565b6139859051610332565b90565b60016139949101610332565b90565b92613a13613a1991613a0e9397946139b087899061470e565b9590956139de8b916139cf6139c36102e2565b938492602084016135b8565b6020820181038252038261065f565b6139f06139ea826135e5565b916135df565b209192613a07613a02600c8c90610f0e565b61239b565b929361365d565b614b45565b1561042f565b613df157613aa390613a456000613a40613a39600f999698998890612197565b8990610bc9565b611d91565b613a6b613a54600e8890610bc9565b613a65613a60826121c9565b61366b565b90612af0565b613a9e613a8c613a85613a80600e8a90610bc9565b6121c9565b8890614b96565b91613a9960108990613688565b610bc9565b612af0565b613aab611c33565b925b83613ad6613ad0613acb613ac58660008101906136af565b906136f6565b610332565b91610332565b1015613db157613afc613af7613af08460008101906136af565b8791613710565b613725565b91613b1e613b18613b11836040810190613732565b88916137c0565b90612659565b95613b3f613b3a613b338460208101906137e0565b8991613827565b61383c565b600014613c3b57613b4e611c33565b5b80613b6a613b64613b5f8b61108c565b610332565b91610332565b1015613c2257613b81613b7c86613943565b61394f565b906340c10f1987613b9b613b968c859061395b565b61397b565b93803b15613c1d57613bc160008094613bcc613bb56102e2565b98899687958694612d8b565b845260048401610c6b565b03925af1918215613c1857613be692613beb575b50613988565b613b4f565b613c0b9060003d8111613c11575b613c03818361065f565b81019061386d565b38613be0565b503d613bf9565b613095565b612d86565b5094909550613c339192505b613988565b929390613aad565b949095919284927f0000000000000000000000000000000000000000000000000000000000000000613c7e613c78613c7360006124e2565b610302565b91610302565b141580613d96575b613d6d575b613cc6613cc1613cac613cbb89613ca06102e2565b928391602083016111f9565b6020820181038252038261065f565b93613855565b613861565b63b48ab8b6949194613ce6613cdf8b6060810190613732565b87916137c0565b909491833b15613d6857613d1c613d1193600097938894613d056102e2565b9b8c998a988997612d8b565b8752600487016138eb565b03925af1918215613d6357613c3392613d36575b50613c2e565b613d569060003d8111613d5c575b613d4e818361065f565b81019061386d565b38613d30565b503d613d44565b613095565b612d86565b92507f000000000000000000000000000000000000000000000000000000000000000092613c8b565b5033613daa613da488610302565b91610302565b1415613c86565b93925050907ff254aace0ef98d6ac1a0d84c95648f8e3f7a1881dbb43393709ecd004b00f10391613dec613de36102e2565b92839283610c6b565b0390a1565b60006309bde33960e01b815280613e0a600482016104ef565b0390fd5b613e16611c5c565b50679a31110384e0b0c96020526014526000526034600c205490565b613e4b90613e46613e41611f39565b61418e565b613e4d565b565b613e58906007612ad0565b565b613e6390613e32565b565b94909194613e71614601565b61400f575b60601b679a31110384e0b0c9179160601b679a31110384e0b0c917918060205260601c928260601c92831561400157843303613fe5575b8660005260406000208054808411613fd75783900390556020526040600020805490828201918210613fc95755806020528284337fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6260406000a4613f0f61460f565b613fa4575b823b613f23575b505050505050565b602094829160405197889663f23a6e618852338989015260408801526060870152608086015260a0808601528160c086015260e085013760c401906000601c8401915af115613f95575b63f23a6e6160e01b905103613f8757388080808080613f1b565b639c05499b6000526004601cfd5b3d15613f6d573d6000823e3d90fd5b613fad86614be5565b50613fb781614be5565b50613fc3858390612667565b50613f14565b6301336cea6000526004601cfd5b63f4d678b86000526004601cfd5b336000526034600c2054613ead57634b6e7f186000526004601cfd5b63ea553b346000526004601cfd5b61401886614be5565b5061402284614be5565b5061402e858390612667565b50613e76565b61404361404991939293610332565b92610332565b820180921161405457565b612517565b61407761407261406b600f3390612197565b8390610bc9565b6121c9565b61408a61408460006121d6565b91610332565b0361411b576140a4338261409e6001612209565b916149ff565b6140d66140bb436140b56001612209565b90614034565b6140d16140ca600f3390612197565b8490610bc9565b612af0565b336141166141047f5e1dd8c4451717d5ca4ffbefdada35e22e0871220b9ed9dd03a351f0938c5ed79261218b565b9261410d6102e2565b91829182610394565b0390a2565b600063156f904360e21b815280614134600482016104ef565b0390fd5b614140611c5c565b5063c79b8b5f60e01b61415b614155836103e0565b916103e0565b14801561417f575b90811561416f575b5090565b6141799150614c05565b3861416b565b5061418981614c05565b614163565b6141a09061419a614691565b90614d12565b565b60207f2073616c65507269636500000000000000000000000000000000000000000000917f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201520152565b6141fd602a6040926106d7565b614206816141a2565b0190565b61422090602081019060008183039101526141f0565b90565b1561422a57565b6142326102e2565b62461bcd60e51b8152806142486004820161420a565b0390fd5b60007f455243323938313a20696e76616c696420726563656976657200000000000000910152565b61428160196020926106d7565b61428a8161424c565b0190565b6142a49060208101906000818303910152614274565b90565b156142ae57565b6142b66102e2565b62461bcd60e51b8152806142cc6004820161428e565b0390fd5b6142da604061078e565b90565b90565b906142f56142f06142fc9261218b565b6142dd565b8254611fac565b9055565b60a01b90565b906143206bffffffffffffffffffffffff60a01b91614300565b9181191691161790565b61433e6143396143439261048c565b610baa565b61048c565b90565b90565b9061435e6143596143659261432a565b614346565b8254614306565b9055565b906143946020600061439a9461438c8282016143868488016124b9565b906142e0565b0192016124ee565b90614349565b565b906143a691614369565b565b90614419614420926143d4836143cd6143c76143c26145ea565b61048c565b9161048c565b1115614223565b6143fa816143f36143ed6143e860006124e2565b610302565b91610302565b14156142a7565b916144106144066142d0565b9360008501612413565b60208301612459565b600261439c565b565b9061442b612016565b506080604051019160208301604052600083528290600a6000198092955b01948181066030018653049384156144685790600a9190809291614449565b93505082602091039203918252565b6144c591926144916144cb956144b6939086849192614dab565b6144ae6144a7826144a260006121c9565b614034565b6000612af0565b926001610bc9565b916144c0836121c9565b614034565b90612af0565b565b6144dc6144e291939293610332565b92610332565b82039182116144ed57565b612517565b61450190939293828591614eac565b61450a8161108c565b9261451560006121d6565b9261451e611c33565b935b8461453361452d88610332565b91610332565b10156145a05761459461459a9161455361454e86899061395b565b61397b565b61458e886145886145798a61457361456e879560019361395b565b61397b565b90610bc9565b91614583836121c9565b6144cd565b90612af0565b90614034565b94613988565b93614520565b915093506145c492506145bd91506145b860006121c9565b6144cd565b6000612af0565b565b600090565b90565b6145e26145dd6145e7926145cb565b610baa565b61048c565b90565b6145f26145c6565b506145fe6127106145ce565b90565b614609611c5c565b50600090565b614617611c5c565b50600090565b5050949293909361462c61460f565b614639575b505050505050565b61464f6146559361465b97969092939596612659565b50612659565b50612667565b50388080808080614631565b9061468961468461468e9361467d818590614f0c565b6005612c6e565b612c86565b614ff3565b50565b6146996123ca565b503390565b906146c06146bb6146c5936146b481859061502e565b6005612c6e565b612c86565b6150c8565b50565b9160206146ea9294936146e360408201966000830190610b52565b0190610c5e565b565b6146f86146fe91610332565b91610332565b908115614709570690565b612562565b919091614719611c33565b50614722611c33565b50614737614732600e8590610bc9565b6121c9565b61474a61474460006121d6565b91610332565b146148535761476d614768614761600f8490612197565b8590610bc9565b6121c9565b8061478161477b60006121d6565b91610332565b14614836574090614791826121f2565b6147a461479e60006121d6565b91610332565b14614819576147f561480f916147dd614816946147ce6147c26102e2565b938492602084016146c8565b6020820181038252038261065f565b6147ef6147e9826135e5565b916135df565b206121f2565b614809614804600e8790610bc9565b6121c9565b906146ec565b9283614b96565b90565b600063b7b3378760e01b815280614832600482016104ef565b0390fd5b6000637de832b560e11b81528061484f600482016104ef565b0390fd5b6000630b56c82b60e31b81528061486c600482016104ef565b0390fd5b60007f455243323938313a20496e76616c696420706172616d65746572730000000000910152565b6148a5601b6020926106d7565b6148ae81614870565b0190565b6148c89060208101906000818303910152614898565b90565b156148d257565b6148da6102e2565b62461bcd60e51b8152806148f0600482016148b2565b0390fd5b6149709061496961497594936149248561491d6149176149126145ea565b61048c565b9161048c565b1115614223565b61494a8161494361493d61493860006124e2565b610302565b91610302565b14156148cb565b936149606149566142d0565b9560008701612413565b60208501612459565b60036123cf565b61439c565b565b95966149a5976149989695946149939489949091929394615103565b6143a8565b6149a0612baf565b614667565b565b90565b6149be6149b96149c392610332565b610baa565b6102f7565b90565b6149f26149ed6149fc936149e860006149f7956149e16123ca565b50016149a7565b6151d9565b6121f2565b6149aa565b61217f565b90565b614a3a614a4f93614a15614a49938583916151fb565b614a32614a2b82614a2660006121c9565b6144cd565b6000612af0565b926001610bc9565b91614a44836121c9565b6144cd565b90612af0565b565b92614a63919492939085859192615216565b614a6c8361108c565b91614a7760006121d6565b91614a80611c33565b5b80614a94614a8e87610332565b91610332565b1015614b0057614afb90614af6614abf614ab7614ab287859061395b565b61397b565b968790614034565b95614af0614ae16001614adb614ad68d889061395b565b61397b565b90610bc9565b91614aeb836121c9565b614034565b90612af0565b613988565b614a81565b50935050614b239150614b1c90614b1760006121c9565b614034565b6000612af0565b565b614b3d6000614b4292614b36611c33565b50016149a7565b615359565b90565b919091614b50611c5c565b508051614b5d575b501490565b9060208201915160051b8201905b8251811160051b9081526020835191185260206040600020920191818310614b6b5791505038614b58565b90614bb8614bb1614bbd92614ba9611c33565b506010613688565b8390610bc9565b6121c9565b80614bd1614bcb60006121d6565b91610332565b14600014614bde57505b90565b9050614bdb565b90614bee6129f6565b506040519160408301604052600183526020830152565b614c0d611c5c565b50614c1781615371565b8015614c3a575b908115614c2a575b5090565b614c349150615417565b38614c26565b50614c44816153b1565b614c1e565b90565b614c60614c5b614c6592614c49565b610baa565b610332565b90565b60007f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000910152565b614c9c6017809261201b565b614ca581614c68565b0190565b60007f206973206d697373696e6720726f6c6520000000000000000000000000000000910152565b614cdd6011809261201b565b614ce681614ca9565b0190565b614d04614d0f9392614cfe614d0993614c90565b906120a9565b614cd1565b906120a9565b90565b90614d27614d21838390612cf0565b1561042f565b614d2f575050565b614da791614d85614d5e614d4e614d48614d8a95615493565b936121f2565b614d586020614c4c565b9061566c565b91614d76614d6a6102e2565b93849260208401614cea565b6020820181038252038261065f565b612132565b614d926102e2565b91829162461bcd60e51b835260048301610736565b0390fd5b91929092614db7614601565b614e93575b8260601b8015614e8557679a31110384e0b0c960205283601452846000526040600020805490838201918210614e7757558160205260601c6000337fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604083a4614e2461460f565b614e5e575b614e32836157b8565b614e3d575b50505050565b614e5593614e4b60006124e2565b93909192936157c5565b38808080614e37565b614e6784614be5565b50614e7181614be5565b50614e29565b6301336cea6000526004601cfd5b63ea553b346000526004601cfd5b614e9c84614be5565b50614ea681614be5565b50614dbc565b9091614ec592614ebc60006124e2565b9290919261585e565b565b90614ed360ff91611716565b9181191691161790565b614ee69061042f565b90565b90565b90614f01614efc614f0892614edd565b614ee9565b8254614ec7565b9055565b614f20614f1a828490612cf0565b1561042f565b614f29575b5050565b614f4c6001614f476000614f3f6004869061236f565b018590612cb1565b614eec565b90614f55614691565b90614f92614f8c614f867f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d95612363565b9261218b565b9261218b565b92614f9b6102e2565b80614fa5816104ef565b0390a43880614f25565b614fb890611f78565b90565b614fcf614fca614fd4926102f7565b610baa565b610332565b90565b614feb614fe6614ff092610332565b611716565b610b0c565b90565b9061502661502061501b615016600061502b9661500e611c5c565b500194614faf565b614fbb565b614fd7565b916149a7565b615a4e565b90565b615039818390612cf0565b615042575b5050565b615065600061506060006150586004869061236f565b018590612cb1565b614eec565b9061506e614691565b906150ab6150a561509f7ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b95612363565b9261218b565b9261218b565b926150b46102e2565b806150be816104ef565b0390a4388061503e565b906150fb6150f56150f06150eb6000615100966150e3611c5c565b500194614faf565b614fbb565b614fd7565b916149a7565b615b0e565b90565b91909492615111600b612ce3565b615184576151316151389261512a615176986008611f15565b6009611f15565b600a611f15565b61514a615143611738565b8290614667565b61515c615155611ca1565b8290614667565b61516e615167611cf9565b8290614667565b919091615c18565b6151826001600b614eec565b565b600063f92ee8a960e01b81528061519d600482016104ef565b0390fd5b5490565b600052602060002090565b6151b9816151a1565b8210156151d4576151cb6001916151a5565b91020190600090565b6136fa565b6151f89160006151f2926151eb61235e565b50016151b0565b90610f41565b90565b90916152149261520b60006124e2565b92909192615c35565b565b91929092615222614601565b615354575b8051845103615346578260601b80156153385780679a31110384e0b0c917602052845160051b805b61530157506000604051604081527f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb81885160051b602001604082019081818c60045afa503d60400160208301523d01865160051b60200181818960045afa503d01039360601c933392a46152c261460f565b6152fc575b6152d0836157b8565b6152db575b50505050565b6152f3936152e960006124e2565b9390919293615d39565b388080806152d5565b6152c7565b808301519080870151600052604060002091825490810190811061532a5760209255038061524f565b6301336cea6000526004601cfd5b63ea553b346000526004601cfd5b633b800a466000526004601cfd5b615227565b600061536e91615367611c33565b50016151a1565b90565b615379611c5c565b50633e85e62f60e01b61539461538e836103e0565b916103e0565b149081156153a1575b5090565b6153ab9150615df0565b3861539d565b6153b9611c5c565b506153c381615e17565b8015615408575b80156153ed575b9081156153dd575b5090565b6153e79150615e57565b386153d9565b5060006154026153fc836103e0565b916103e0565b146153d1565b5061541281615e57565b6153ca565b61541f611c5c565b5061542981615e57565b908115615435575b5090565b61543f9150615e97565b38615431565b90565b60ff1690565b61546261545d61546792615445565b610baa565b615448565b90565b615474601461544e565b90565b61548b61548661549092615448565b610baa565b610332565b90565b6154b06154ab6154c6926154a5612016565b50614faf565b614fbb565b6154c06154bb61546a565b615477565b9061566c565b90565b90565b6154e06154db6154e5926154c9565b610baa565b610332565b90565b906154fa6154f58361132e565b61078e565b918252565b369037565b90615529615511836154e8565b9260208061551f869361132e565b92019103906154ff565b565b600360fc1b90565b9061553d826135e5565b81101561554f57600160209102010190565b6136fa565b600f60fb1b90565b6f181899199a1a9b1b9c1cb0b131b232b360811b90565b61557b61555c565b90565b90565b61559561559061559a9261557e565b610baa565b610332565b90565b60f81b90565b90565b6155ba6155b56155bf926155a3565b610baa565b615448565b90565b6155e1906155db6155d56155e694615448565b91610332565b9061096e565b610332565b90565b60007f537472696e67733a20686578206c656e67746820696e73756666696369656e74910152565b61561d602080926106d7565b615626816155e9565b0190565b6156409060208101906000818303910152615611565b90565b1561564a57565b6156526102e2565b62461bcd60e51b8152806156686004820161562a565b0390fd5b9190615676612016565b506157106157006156ac6156a7615697600261569287916154cc565b61252d565b6156a160026154cc565b90614034565b615504565b926156b561552b565b6156ce856156c860009360001a936121d6565b90615533565b536156d7615554565b6156f0856156ea60019360001a93612209565b90615533565b536156fb60026154cc565b61252d565b61570a6001612209565b90614034565b925b836157266157206001612209565b91610332565b111561578d57615734615573565b8161573f600f615581565b169160108310156157885761575b61577c92615782941a61559d565b61576b8591889060001a92615533565b5361577660046155a6565b906155c2565b9361366b565b92615712565b6136fa565b6157b59293506157b0906157aa6157a460006121d6565b91610332565b14615643565b612132565b90565b6157c0611c5c565b503b90565b919360209360405195869463f23a6e618652338787015260601b60601c60408601526060850152608084015260a08084015280518091818060c087015261584a575b505060c401906000601c8401915af11561583b575b63f23a6e6160e01b90510361582d57565b639c05499b6000526004601cfd5b3d1561581c573d6000823e3d90fd5b818660e08701920160045afa508038615807565b9193929061586a614601565b615996575b81518551036159885760601b9182679a31110384e0b0c9176020528060601b83811490151715615966575b50835160051b805b61593057507f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb6000939460405192839160408352805160051b60200180916040850192839160045afa503d60400160208401523d019081815160051b602001809260045afa503d01039260601c923392a461591b61460f565b615922575b565b61592a612249565b50615920565b80820151908086015160005260406000208054928381116159585760209303905503806158a2565b63f4d678b86000526004601cfd5b6000526034600c20541561597a573861589a565b634b6e7f186000526004601cfd5b633b800a466000526004601cfd5b61599e612249565b5061586f565b90565b600052602060002090565b5490565b6159bf816159b2565b8210156159da576159d16001916159a7565b91020190600090565b6136fa565b91906159f56159f06159fd93612363565b612ac4565b908354611d46565b9055565b9081549168010000000000000000831015615a315782615a29916001615a2f950181556159b6565b906159df565b565b610649565b90615a4090612363565b600052602052604060002090565b615a56611c5c565b50615a6b615a65828490615ed7565b1561042f565b600014615aae57615aa4615aa992615a8f615a88600085016159a4565b8290615a01565b6001615a9d600085016151a1565b9301615a36565b612af0565b600190565b5050600090565b634e487b7160e01b600052603160045260246000fd5b615add91615ad761235e565b916159df565b565b615ae8816159b2565b8015615b09576001900390615b06615b0083836159b6565b90615acb565b55565b615ab5565b615b16611c5c565b50615b2d615b28600183018490615a36565b6121c9565b9081615b42615b3c60006121d6565b91610332565b1415600014615c1057615bc2926001615bbd9284615b6b600096615b6585612209565b906144cd565b615b88615b798885016151a1565b615b8286612209565b906144cd565b80615b9b615b9584610332565b91610332565b03615bc7575b505050615bb7615bb28683016159a4565b615adf565b01615a36565b611d91565b600190565b615c0892615bfa615be6615be0615c03948c89016151b0565b90610f41565b93615bf485918c89016151b0565b906159df565b91858501615a36565b612af0565b388080615ba1565b505050600090565b90615c2e615c339392615c29611f39565b614667565b615f0d565b565b90929192615c41614601565b615d17575b60601b9081679a31110384e0b0c917602052818160601b148160601b151715615cf5575b5082600052604060002090815491828411615ce757836000930390558260205260601c337fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604084a4615cbb61460f565b615cc4575b5050565b615cd0615cd692614be5565b50614be5565b50615cdf612249565b503880615cc0565b63f4d678b86000526004601cfd5b6000526034600c205415615d095738615c6a565b634b6e7f186000526004601cfd5b615d2084614be5565b50615d2a83614be5565b50615d33612249565b50615c46565b919360209360405195869463bc197c818652338787015260601b60601c604086015260a06060860152805160051b8601809160c0870192839160045afa503d60a001908160808701523d019182815160051b8801809260045afa503d0160a08501523d01908181518601809260045afa50601c8301903d0103906000601c8401915af115615de1575b63bc197c8160e01b905103615dd357565b639c05499b6000526004601cfd5b3d15615dc2573d6000823e3d90fd5b615df8611c5c565b5060e01c630e89341c8114906301ffc9a763d9b67a2682149114171790565b615e1f611c5c565b5080615e3a615e3463152a902d60e11b6103e0565b916103e0565b14908115615e47575b5090565b615e519150615f2d565b38615e43565b615e5f611c5c565b5080615e7a615e74635a05180f60e01b6103e0565b916103e0565b14908115615e87575b5090565b615e919150615f53565b38615e83565b615e9f611c5c565b5080615eba615eb4634e821d3360e11b6103e0565b916103e0565b14908115615ec7575b5090565b615ed191506153b1565b38615ec3565b615ef5916001615ef092615ee9611c5c565b5001615a36565b6121c9565b615f08615f0260006121d6565b91610332565b141590565b90615f24615f1d615f2b93611fa0565b6006611fd6565b6007612ad0565b565b615f35611c5c565b50615f4f615f496301ffc9a760e01b6103e0565b916103e0565b1490565b615f5b611c5c565b5080615f76615f70637965db0b60e01b6103e0565b916103e0565b14908115615f83575b5090565b615f8d9150615e17565b38615f7f56fea264697066735822122023af99d012f9c0397549fa6d414ea97a8c70379f7b83dd92c49e8264e57f39ad64736f6c634300081b0033", + "opcodes": "PUSH1 0xA0 PUSH1 0x40 MSTORE CALLVALUE PUSH2 0x46 JUMPI PUSH2 0x19 PUSH2 0x14 PUSH2 0x111 JUMP JUMPDEST PUSH2 0x132 JUMP JUMPDEST PUSH2 0x21 PUSH2 0x4B JUMP JUMPDEST PUSH2 0x5FC9 PUSH2 0x138 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x11D7 ADD MSTORE DUP2 DUP2 PUSH2 0x3C44 ADD MSTORE PUSH2 0x3D71 ADD MSTORE PUSH2 0x5FC9 SWAP1 RETURN JUMPDEST PUSH2 0x51 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1F DUP1 NOT SWAP2 ADD AND SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH2 0x80 SWAP1 PUSH2 0x56 JUMP JUMPDEST DUP2 ADD SWAP1 DUP2 LT PUSH1 0x1 DUP1 PUSH1 0x40 SHL SUB DUP3 GT OR PUSH2 0x98 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH2 0x60 JUMP JUMPDEST SWAP1 PUSH2 0xB0 PUSH2 0xA9 PUSH2 0x4B JUMP JUMPDEST SWAP3 DUP4 PUSH2 0x76 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0xCB SWAP1 PUSH2 0xB7 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xD7 DUP2 PUSH2 0xC2 JUMP JUMPDEST SUB PUSH2 0xDE JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP MLOAD SWAP1 PUSH2 0xF0 DUP3 PUSH2 0xCE JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x10C JUMPI PUSH2 0x109 SWAP2 PUSH1 0x0 ADD PUSH2 0xE3 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xB2 JUMP JUMPDEST PUSH2 0x12F PUSH2 0x6101 DUP1 CODESIZE SUB DUP1 PUSH2 0x124 DUP2 PUSH2 0x9D JUMP JUMPDEST SWAP3 DUP4 CODECOPY DUP2 ADD SWAP1 PUSH2 0xF2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x80 MSTORE JUMP INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x13 JUMPI JUMPDEST PUSH2 0x1C2E JUMP JUMPDEST PUSH2 0x1E PUSH1 0x0 CALLDATALOAD PUSH2 0x2DC JUMP JUMPDEST DUP1 PUSH3 0xFDD58E EQ PUSH2 0x2D7 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x2D2 JUMPI DUP1 PUSH4 0x4634D8D EQ PUSH2 0x2CD JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x2C8 JUMPI DUP1 PUSH4 0xB5EE006 EQ PUSH2 0x2C3 JUMPI DUP1 PUSH4 0xBB310DE EQ PUSH2 0x2BE JUMPI DUP1 PUSH4 0xE89341C EQ PUSH2 0x2B9 JUMPI DUP1 PUSH4 0x167A59F7 EQ PUSH2 0x2B4 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x2AF JUMPI DUP1 PUSH4 0x20EC271B EQ PUSH2 0x2AA JUMPI DUP1 PUSH4 0x248A9CA3 EQ PUSH2 0x2A5 JUMPI DUP1 PUSH4 0x2693EBF2 EQ PUSH2 0x2A0 JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x29B JUMPI DUP1 PUSH4 0x2EB2C2D6 EQ PUSH2 0x296 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x291 JUMPI DUP1 PUSH4 0x35403023 EQ PUSH2 0x28C JUMPI DUP1 PUSH4 0x36568ABE EQ PUSH2 0x287 JUMPI DUP1 PUSH4 0x3C70B357 EQ PUSH2 0x282 JUMPI DUP1 PUSH4 0x47FDA41A EQ PUSH2 0x27D JUMPI DUP1 PUSH4 0x4E1273F4 EQ PUSH2 0x278 JUMPI DUP1 PUSH4 0x50336A03 EQ PUSH2 0x273 JUMPI DUP1 PUSH4 0x51304683 EQ PUSH2 0x26E JUMPI DUP1 PUSH4 0x5377AB8F EQ PUSH2 0x269 JUMPI DUP1 PUSH4 0x5944C753 EQ PUSH2 0x264 JUMPI DUP1 PUSH4 0x6C0360EB EQ PUSH2 0x25F JUMPI DUP1 PUSH4 0x731133E9 EQ PUSH2 0x25A JUMPI DUP1 PUSH4 0x7E518EC8 EQ PUSH2 0x255 JUMPI DUP1 PUSH4 0x8FF83AC1 EQ PUSH2 0x250 JUMPI DUP1 PUSH4 0x9010D07C EQ PUSH2 0x24B JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x246 JUMPI DUP1 PUSH4 0x938E3D7B EQ PUSH2 0x241 JUMPI DUP1 PUSH4 0x9D043A66 EQ PUSH2 0x23C JUMPI DUP1 PUSH4 0xA217FDDF EQ PUSH2 0x237 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x232 JUMPI DUP1 PUSH4 0xB390C0AB EQ PUSH2 0x22D JUMPI DUP1 PUSH4 0xB48AB8B6 EQ PUSH2 0x228 JUMPI DUP1 PUSH4 0xCA15C873 EQ PUSH2 0x223 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x21E JUMPI DUP1 PUSH4 0xD67B333B EQ PUSH2 0x219 JUMPI DUP1 PUSH4 0xE8A3D485 EQ PUSH2 0x214 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x20F JUMPI DUP1 PUSH4 0xED4C2AC7 EQ PUSH2 0x20A JUMPI DUP1 PUSH4 0xF242432A EQ PUSH2 0x205 JUMPI PUSH4 0xF4F98AD5 SUB PUSH2 0xE JUMPI PUSH2 0x1BFB JUMP JUMPDEST PUSH2 0x1BC1 JUMP JUMPDEST PUSH2 0x1B1D JUMP JUMPDEST PUSH2 0x1AE7 JUMP JUMPDEST PUSH2 0x1A84 JUMP JUMPDEST PUSH2 0x1A3D JUMP JUMPDEST PUSH2 0x193B JUMP JUMPDEST PUSH2 0x1906 JUMP JUMPDEST PUSH2 0x18CF JUMP JUMPDEST PUSH2 0x180B JUMP JUMPDEST PUSH2 0x17D7 JUMP JUMPDEST PUSH2 0x1750 JUMP JUMPDEST PUSH2 0x16DD JUMP JUMPDEST PUSH2 0x1615 JUMP JUMPDEST PUSH2 0x15DF JUMP JUMPDEST PUSH2 0x15A9 JUMP JUMPDEST PUSH2 0x153E JUMP JUMPDEST PUSH2 0x1441 JUMP JUMPDEST PUSH2 0x140A JUMP JUMPDEST PUSH2 0x12F9 JUMP JUMPDEST PUSH2 0x12B5 JUMP JUMPDEST PUSH2 0x1244 JUMP JUMPDEST PUSH2 0x120F JUMP JUMPDEST PUSH2 0x11A1 JUMP JUMPDEST PUSH2 0x112D JUMP JUMPDEST PUSH2 0xFB8 JUMP JUMPDEST PUSH2 0xF69 JUMP JUMPDEST PUSH2 0xEDA JUMP JUMPDEST PUSH2 0xEA5 JUMP JUMPDEST PUSH2 0xE57 JUMP JUMPDEST PUSH2 0xDEC JUMP JUMPDEST PUSH2 0xC8F JUMP JUMPDEST PUSH2 0xBFB JUMP JUMPDEST PUSH2 0xB75 JUMP JUMPDEST PUSH2 0xAD8 JUMP JUMPDEST PUSH2 0x9A9 JUMP JUMPDEST PUSH2 0x93A JUMP JUMPDEST PUSH2 0x905 JUMP JUMPDEST PUSH2 0x8B3 JUMP JUMPDEST PUSH2 0x861 JUMP JUMPDEST PUSH2 0x74F JUMP JUMPDEST PUSH2 0x4F5 JUMP JUMPDEST PUSH2 0x457 JUMP JUMPDEST PUSH2 0x3AA JUMP JUMPDEST PUSH1 0xE0 SHR SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x30B SWAP1 PUSH2 0x2F7 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x317 DUP2 PUSH2 0x302 JUMP JUMPDEST SUB PUSH2 0x31E JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x330 DUP3 PUSH2 0x30E JUMP JUMPDEST JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x33E DUP2 PUSH2 0x332 JUMP JUMPDEST SUB PUSH2 0x345 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x357 DUP3 PUSH2 0x335 JUMP JUMPDEST JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0x382 JUMPI DUP1 PUSH2 0x376 PUSH2 0x37F SWAP3 PUSH1 0x0 DUP7 ADD PUSH2 0x323 JUMP JUMPDEST SWAP4 PUSH1 0x20 ADD PUSH2 0x34A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST PUSH2 0x390 SWAP1 PUSH2 0x332 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x3A8 SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0x387 JUMP JUMPDEST JUMP JUMPDEST CALLVALUE PUSH2 0x3DB JUMPI PUSH2 0x3D7 PUSH2 0x3C6 PUSH2 0x3C0 CALLDATASIZE PUSH1 0x4 PUSH2 0x359 JUMP JUMPDEST SWAP1 PUSH2 0x1C38 JUMP JUMPDEST PUSH2 0x3CE PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x394 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL AND SWAP1 JUMP JUMPDEST PUSH2 0x3F5 DUP2 PUSH2 0x3E0 JUMP JUMPDEST SUB PUSH2 0x3FC JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x40E DUP3 PUSH2 0x3EC JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x42A JUMPI PUSH2 0x427 SWAP2 PUSH1 0x0 ADD PUSH2 0x401 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH2 0x43D SWAP1 PUSH2 0x42F JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x455 SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0x434 JUMP JUMPDEST JUMP JUMPDEST CALLVALUE PUSH2 0x487 JUMPI PUSH2 0x483 PUSH2 0x472 PUSH2 0x46D CALLDATASIZE PUSH1 0x4 PUSH2 0x410 JUMP JUMPDEST PUSH2 0x1C61 JUMP JUMPDEST PUSH2 0x47A PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x441 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0x4A6 DUP2 PUSH2 0x48C JUMP JUMPDEST SUB PUSH2 0x4AD JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x4BF DUP3 PUSH2 0x49D JUMP JUMPDEST JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0x4EA JUMPI DUP1 PUSH2 0x4DE PUSH2 0x4E7 SWAP3 PUSH1 0x0 DUP7 ADD PUSH2 0x323 JUMP JUMPDEST SWAP4 PUSH1 0x20 ADD PUSH2 0x4B2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST PUSH1 0x0 ADD SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x524 JUMPI PUSH2 0x50E PUSH2 0x508 CALLDATASIZE PUSH1 0x4 PUSH2 0x4C1 JUMP JUMPDEST SWAP1 PUSH2 0x1CED JUMP JUMPDEST PUSH2 0x516 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x520 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH1 0x0 SWAP2 SUB SLT PUSH2 0x534 JUMPI JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x1 PUSH1 0x2 DUP4 DIV SWAP3 AND DUP1 ISZERO PUSH2 0x585 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x580 JUMPI JUMP JUMPDEST PUSH2 0x54F JUMP JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x575 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x0 SWAP3 SWAP2 DUP1 SLOAD SWAP1 PUSH2 0x5BE PUSH2 0x5B7 DUP4 PUSH2 0x565 JUMP JUMPDEST DUP1 SWAP5 PUSH2 0x58F JUMP JUMPDEST SWAP2 PUSH1 0x1 DUP2 AND SWAP1 DUP2 PUSH1 0x0 EQ PUSH2 0x617 JUMPI POP PUSH1 0x1 EQ PUSH2 0x5DA JUMPI JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x5E7 SWAP2 SWAP3 SWAP4 SWAP5 POP PUSH2 0x598 JUMP JUMPDEST SWAP2 PUSH1 0x0 SWAP3 JUMPDEST DUP2 DUP5 LT PUSH2 0x5FF JUMPI POP POP ADD SWAP1 CODESIZE DUP1 DUP1 PUSH2 0x5D5 JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x20 SWAP3 SWAP6 SWAP4 SWAP6 SLOAD DUP5 DUP7 ADD MSTORE ADD SWAP2 ADD SWAP3 SWAP1 PUSH2 0x5EC JUMP JUMPDEST SWAP3 SWAP5 SWAP6 POP POP POP PUSH1 0xFF NOT AND DUP3 MSTORE ISZERO ISZERO PUSH1 0x20 MUL ADD SWAP1 CODESIZE DUP1 DUP1 PUSH2 0x5D5 JUMP JUMPDEST SWAP1 PUSH2 0x63C SWAP2 PUSH2 0x5A3 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1F DUP1 NOT SWAP2 ADD AND SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH2 0x669 SWAP1 PUSH2 0x63F JUMP JUMPDEST DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x683 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH2 0x649 JUMP JUMPDEST SWAP1 PUSH2 0x6A8 PUSH2 0x6A1 SWAP3 PUSH2 0x698 PUSH2 0x2E2 JUMP JUMPDEST SWAP4 DUP5 DUP1 SWAP3 PUSH2 0x632 JUMP JUMPDEST SUB DUP4 PUSH2 0x65F JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x0 LT PUSH2 0x6BE JUMPI PUSH2 0x6BB SWAP1 PUSH2 0x688 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x539 JUMP JUMPDEST PUSH2 0x6D0 PUSH1 0x8 PUSH1 0x0 SWAP1 PUSH2 0x6AA JUMP JUMPDEST SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x6F4 JUMPI POP POP SWAP1 PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP1 PUSH1 0x20 SWAP2 DUP4 ADD MLOAD DUP2 DUP6 ADD MSTORE ADD PUSH2 0x6E3 JUMP JUMPDEST PUSH2 0x724 PUSH2 0x72D PUSH1 0x20 SWAP4 PUSH2 0x732 SWAP4 PUSH2 0x71B DUP2 PUSH2 0x6D3 JUMP JUMPDEST SWAP4 DUP5 DUP1 SWAP4 PUSH2 0x6D7 JUMP JUMPDEST SWAP6 DUP7 SWAP2 ADD PUSH2 0x6E0 JUMP JUMPDEST PUSH2 0x63F JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x74C SWAP2 PUSH1 0x20 DUP3 ADD SWAP2 PUSH1 0x0 DUP2 DUP5 SUB SWAP2 ADD MSTORE PUSH2 0x705 JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x77F JUMPI PUSH2 0x75F CALLDATASIZE PUSH1 0x4 PUSH2 0x529 JUMP JUMPDEST PUSH2 0x77B PUSH2 0x76A PUSH2 0x6C3 JUMP JUMPDEST PUSH2 0x772 PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x736 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 PUSH2 0x7A1 PUSH2 0x79A PUSH2 0x2E2 JUMP JUMPDEST SWAP3 DUP4 PUSH2 0x65F JUMP JUMPDEST JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x7C1 JUMPI PUSH2 0x7BD PUSH1 0x20 SWAP2 PUSH2 0x63F JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x649 JUMP JUMPDEST SWAP1 DUP3 PUSH1 0x0 SWAP4 SWAP3 DUP3 CALLDATACOPY ADD MSTORE JUMP JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x7E7 PUSH2 0x7E2 DUP3 PUSH2 0x7A3 JUMP JUMPDEST PUSH2 0x78E JUMP JUMPDEST SWAP4 DUP2 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP1 DUP3 DUP5 ADD GT PUSH2 0x803 JUMPI PUSH2 0x801 SWAP3 PUSH2 0x7C6 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x789 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x826 JUMPI DUP2 PUSH1 0x20 PUSH2 0x823 SWAP4 CALLDATALOAD SWAP2 ADD PUSH2 0x7D2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x784 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x85C JUMPI PUSH1 0x0 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x857 JUMPI PUSH2 0x854 SWAP3 ADD PUSH2 0x808 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x88F JUMPI PUSH2 0x879 PUSH2 0x874 CALLDATASIZE PUSH1 0x4 PUSH2 0x82B JUMP JUMPDEST PUSH2 0x1F2E JUMP JUMPDEST PUSH2 0x881 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x88B DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x8AE JUMPI PUSH2 0x8AB SWAP2 PUSH1 0x0 ADD PUSH2 0x323 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x8E1 JUMPI PUSH2 0x8CB PUSH2 0x8C6 CALLDATASIZE PUSH1 0x4 PUSH2 0x894 JUMP JUMPDEST PUSH2 0x200B JUMP JUMPDEST PUSH2 0x8D3 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x8DD DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x900 JUMPI PUSH2 0x8FD SWAP2 PUSH1 0x0 ADD PUSH2 0x34A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x935 JUMPI PUSH2 0x931 PUSH2 0x920 PUSH2 0x91B CALLDATASIZE PUSH1 0x4 PUSH2 0x8E6 JUMP JUMPDEST PUSH2 0x2135 JUMP JUMPDEST PUSH2 0x928 PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x736 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST CALLVALUE PUSH2 0x969 JUMPI PUSH2 0x953 PUSH2 0x94D CALLDATASIZE PUSH1 0x4 PUSH2 0x359 JUMP JUMPDEST SWAP1 PUSH2 0x2254 JUMP JUMPDEST PUSH2 0x95B PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x965 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SHR SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x985 SWAP1 PUSH1 0x8 PUSH2 0x98A SWAP4 MUL PUSH2 0x96E JUMP JUMPDEST PUSH2 0x972 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x998 SWAP2 SLOAD PUSH2 0x975 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x9A6 PUSH1 0x0 DUP1 PUSH2 0x98D JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x9D9 JUMPI PUSH2 0x9B9 CALLDATASIZE PUSH1 0x4 PUSH2 0x529 JUMP JUMPDEST PUSH2 0x9D5 PUSH2 0x9C4 PUSH2 0x99B JUMP JUMPDEST PUSH2 0x9CC PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x394 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x9F6 JUMPI PUSH1 0x20 DUP1 SWAP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH2 0x649 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0xA15 PUSH2 0xA10 DUP3 PUSH2 0x9DE JUMP JUMPDEST PUSH2 0x78E JUMP JUMPDEST SWAP4 DUP2 DUP6 MSTORE PUSH1 0x20 DUP1 DUP7 ADD SWAP3 MUL DUP4 ADD SWAP3 DUP2 DUP5 GT PUSH2 0xA52 JUMPI SWAP2 JUMPDEST DUP4 DUP4 LT PUSH2 0xA39 JUMPI POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 SWAP2 PUSH2 0xA47 DUP5 DUP7 PUSH2 0x34A JUMP JUMPDEST DUP2 MSTORE ADD SWAP3 ADD SWAP2 PUSH2 0xA2C JUMP JUMPDEST PUSH2 0x9FB JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0xA75 JUMPI DUP2 PUSH1 0x20 PUSH2 0xA72 SWAP4 CALLDATALOAD SWAP2 ADD PUSH2 0xA00 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x784 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH1 0x40 DUP2 DUP5 SUB SLT PUSH2 0xAD3 JUMPI PUSH1 0x0 DUP2 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xACE JUMPI DUP4 PUSH2 0xAA7 SWAP2 DUP4 ADD PUSH2 0xA57 JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xAC9 JUMPI PUSH2 0xAC6 SWAP3 ADD PUSH2 0xA57 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0xB07 JUMPI PUSH2 0xAF1 PUSH2 0xAEB CALLDATASIZE PUSH1 0x4 PUSH2 0xA7A JUMP JUMPDEST SWAP1 PUSH2 0x234F JUMP JUMPDEST PUSH2 0xAF9 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0xB03 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xB18 DUP2 PUSH2 0xB0C JUMP JUMPDEST SUB PUSH2 0xB1F JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0xB31 DUP3 PUSH2 0xB0F JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0xB4D JUMPI PUSH2 0xB4A SWAP2 PUSH1 0x0 ADD PUSH2 0xB24 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST PUSH2 0xB5B SWAP1 PUSH2 0xB0C JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0xB73 SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0xB52 JUMP JUMPDEST JUMP JUMPDEST CALLVALUE PUSH2 0xBA5 JUMPI PUSH2 0xBA1 PUSH2 0xB90 PUSH2 0xB8B CALLDATASIZE PUSH1 0x4 PUSH2 0xB33 JUMP JUMPDEST PUSH2 0x23A8 JUMP JUMPDEST PUSH2 0xB98 PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xB5F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xBC1 PUSH2 0xBBC PUSH2 0xBC6 SWAP3 PUSH2 0x332 JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x332 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0xBD3 SWAP1 PUSH2 0xBAD JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH2 0xBF8 SWAP1 PUSH2 0xBF3 PUSH1 0x1 SWAP2 PUSH1 0x0 SWAP3 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x98D JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0xC2B JUMPI PUSH2 0xC27 PUSH2 0xC16 PUSH2 0xC11 CALLDATASIZE PUSH1 0x4 PUSH2 0x8E6 JUMP JUMPDEST PUSH2 0xBE1 JUMP JUMPDEST PUSH2 0xC1E PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x394 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0xC59 JUMPI DUP1 PUSH2 0xC4D PUSH2 0xC56 SWAP3 PUSH1 0x0 DUP7 ADD PUSH2 0x34A JUMP JUMPDEST SWAP4 PUSH1 0x20 ADD PUSH2 0x34A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST PUSH2 0xC67 SWAP1 PUSH2 0x302 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 PUSH1 0x20 PUSH2 0xC8D SWAP3 SWAP5 SWAP4 PUSH2 0xC86 PUSH1 0x40 DUP3 ADD SWAP7 PUSH1 0x0 DUP4 ADD SWAP1 PUSH2 0xC5E JUMP JUMPDEST ADD SWAP1 PUSH2 0x387 JUMP JUMPDEST JUMP JUMPDEST CALLVALUE PUSH2 0xCC1 JUMPI PUSH2 0xCA8 PUSH2 0xCA2 CALLDATASIZE PUSH1 0x4 PUSH2 0xC30 JUMP JUMPDEST SWAP1 PUSH2 0x259A JUMP JUMPDEST SWAP1 PUSH2 0xCBD PUSH2 0xCB4 PUSH2 0x2E2 JUMP JUMPDEST SWAP3 DUP4 SWAP3 DUP4 PUSH2 0xC6B JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP2 DUP3 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0xD05 JUMPI DUP2 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xD00 JUMPI PUSH1 0x20 ADD SWAP3 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH2 0xCFB JUMPI JUMP JUMPDEST PUSH2 0x9FB JUMP JUMPDEST PUSH2 0xCC6 JUMP JUMPDEST PUSH2 0x784 JUMP JUMPDEST SWAP1 SWAP2 DUP3 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0xD44 JUMPI DUP2 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xD3F JUMPI PUSH1 0x20 ADD SWAP3 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH2 0xD3A JUMPI JUMP JUMPDEST PUSH2 0x9FB JUMP JUMPDEST PUSH2 0xCC6 JUMP JUMPDEST PUSH2 0x784 JUMP JUMPDEST SWAP2 PUSH1 0xA0 DUP4 DUP4 SUB SLT PUSH2 0xDE7 JUMPI PUSH2 0xD61 DUP3 PUSH1 0x0 DUP6 ADD PUSH2 0x323 JUMP JUMPDEST SWAP3 PUSH2 0xD6F DUP4 PUSH1 0x20 DUP4 ADD PUSH2 0x323 JUMP JUMPDEST SWAP3 PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xDE2 JUMPI DUP2 PUSH2 0xD90 SWAP2 DUP5 ADD PUSH2 0xCCB JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xDDD JUMPI DUP4 PUSH2 0xDB3 SWAP2 DUP5 ADD PUSH2 0xCCB JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH1 0x80 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xDD8 JUMPI PUSH2 0xDD4 SWAP3 ADD PUSH2 0xD0A JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0xE24 JUMPI PUSH2 0xE0E PUSH2 0xDFF CALLDATASIZE PUSH1 0x4 PUSH2 0xD49 JUMP JUMPDEST SWAP7 SWAP6 SWAP1 SWAP6 SWAP5 SWAP2 SWAP5 SWAP4 SWAP3 SWAP4 PUSH2 0x2675 JUMP JUMPDEST PUSH2 0xE16 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0xE20 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0xE52 JUMPI DUP1 PUSH2 0xE46 PUSH2 0xE4F SWAP3 PUSH1 0x0 DUP7 ADD PUSH2 0xB24 JUMP JUMPDEST SWAP4 PUSH1 0x20 ADD PUSH2 0x323 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0xE86 JUMPI PUSH2 0xE70 PUSH2 0xE6A CALLDATASIZE PUSH1 0x4 PUSH2 0xE29 JUMP JUMPDEST SWAP1 PUSH2 0x2911 JUMP JUMPDEST PUSH2 0xE78 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0xE82 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH2 0xEA2 SWAP1 PUSH2 0xE9D PUSH1 0xD SWAP2 PUSH1 0x0 SWAP3 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x98D JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0xED5 JUMPI PUSH2 0xED1 PUSH2 0xEC0 PUSH2 0xEBB CALLDATASIZE PUSH1 0x4 PUSH2 0x8E6 JUMP JUMPDEST PUSH2 0xE8B JUMP JUMPDEST PUSH2 0xEC8 PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x394 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST CALLVALUE PUSH2 0xF09 JUMPI PUSH2 0xEF3 PUSH2 0xEED CALLDATASIZE PUSH1 0x4 PUSH2 0xE29 JUMP JUMPDEST SWAP1 PUSH2 0x29C7 JUMP JUMPDEST PUSH2 0xEFB PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0xF05 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP1 PUSH2 0xF18 SWAP1 PUSH2 0xBAD JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xF39 SWAP1 PUSH1 0x8 PUSH2 0xF3E SWAP4 MUL PUSH2 0x96E JUMP JUMPDEST PUSH2 0xF26 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0xF4C SWAP2 SLOAD PUSH2 0xF29 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xF66 SWAP1 PUSH2 0xF61 PUSH1 0xC SWAP2 PUSH1 0x0 SWAP3 PUSH2 0xF0E JUMP JUMPDEST PUSH2 0xF41 JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0xF99 JUMPI PUSH2 0xF95 PUSH2 0xF84 PUSH2 0xF7F CALLDATASIZE PUSH1 0x4 PUSH2 0x8E6 JUMP JUMPDEST PUSH2 0xF4F JUMP JUMPDEST PUSH2 0xF8C PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xB5F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH2 0xFB5 SWAP1 PUSH2 0xFB0 PUSH1 0xE SWAP2 PUSH1 0x0 SWAP3 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x98D JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0xFE8 JUMPI PUSH2 0xFE4 PUSH2 0xFD3 PUSH2 0xFCE CALLDATASIZE PUSH1 0x4 PUSH2 0x8E6 JUMP JUMPDEST PUSH2 0xF9E JUMP JUMPDEST PUSH2 0xFDB PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x394 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP1 SWAP2 DUP3 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x1027 JUMPI DUP2 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x1022 JUMPI PUSH1 0x20 ADD SWAP3 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH2 0x101D JUMPI JUMP JUMPDEST PUSH2 0x9FB JUMP JUMPDEST PUSH2 0xCC6 JUMP JUMPDEST PUSH2 0x784 JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x40 DUP3 DUP5 SUB SLT PUSH2 0x1087 JUMPI PUSH1 0x0 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1082 JUMPI DUP4 PUSH2 0x1058 SWAP2 DUP5 ADD PUSH2 0xFED JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x107D JUMPI PUSH2 0x1079 SWAP3 ADD PUSH2 0xCCB JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH2 0x10A8 SWAP1 PUSH2 0x332 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP1 PUSH2 0x10B9 DUP2 PUSH1 0x20 SWAP4 PUSH2 0x109F JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x10E0 PUSH2 0x10DA PUSH2 0x10D3 DUP5 PUSH2 0x108C JUMP JUMPDEST DUP1 SWAP4 PUSH2 0x1090 JUMP JUMPDEST SWAP3 PUSH2 0x1099 JUMP JUMPDEST SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x10F1 JUMPI POP POP POP SWAP1 JUMP JUMPDEST SWAP1 SWAP2 SWAP3 PUSH2 0x110A PUSH2 0x1104 PUSH1 0x1 SWAP3 DUP7 MLOAD PUSH2 0x10AC JUMP JUMPDEST SWAP5 PUSH2 0x10BD JUMP JUMPDEST SWAP2 ADD SWAP2 SWAP1 SWAP2 PUSH2 0x10E4 JUMP JUMPDEST PUSH2 0x112A SWAP2 PUSH1 0x20 DUP3 ADD SWAP2 PUSH1 0x0 DUP2 DUP5 SUB SWAP2 ADD MSTORE PUSH2 0x10C3 JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x1161 JUMPI PUSH2 0x115D PUSH2 0x114C PUSH2 0x1143 CALLDATASIZE PUSH1 0x4 PUSH2 0x102C JUMP JUMPDEST SWAP3 SWAP2 SWAP1 SWAP2 PUSH2 0x29FB JUMP JUMPDEST PUSH2 0x1154 PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x1114 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x60 DUP3 DUP5 SUB SLT PUSH2 0x119C JUMPI PUSH2 0x1199 PUSH2 0x1182 DUP5 PUSH1 0x0 DUP6 ADD PUSH2 0xB24 JUMP JUMPDEST SWAP4 PUSH2 0x1190 DUP2 PUSH1 0x20 DUP7 ADD PUSH2 0x34A JUMP JUMPDEST SWAP4 PUSH1 0x40 ADD PUSH2 0x34A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x11D0 JUMPI PUSH2 0x11BA PUSH2 0x11B4 CALLDATASIZE PUSH1 0x4 PUSH2 0x1166 JUMP JUMPDEST SWAP2 PUSH2 0x2B51 JUMP JUMPDEST PUSH2 0x11C2 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x11CC DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH32 0x0 SWAP1 JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x120D SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0xC5E JUMP JUMPDEST JUMP JUMPDEST CALLVALUE PUSH2 0x123F JUMPI PUSH2 0x121F CALLDATASIZE PUSH1 0x4 PUSH2 0x529 JUMP JUMPDEST PUSH2 0x123B PUSH2 0x122A PUSH2 0x11D5 JUMP JUMPDEST PUSH2 0x1232 PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x11F9 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST CALLVALUE PUSH2 0x1275 JUMPI PUSH2 0x1271 PUSH2 0x1260 PUSH2 0x125A CALLDATASIZE PUSH1 0x4 PUSH2 0x359 JUMP JUMPDEST SWAP1 PUSH2 0x2B5E JUMP JUMPDEST PUSH2 0x1268 PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x394 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x60 DUP3 DUP5 SUB SLT PUSH2 0x12B0 JUMPI PUSH2 0x12AD PUSH2 0x1296 DUP5 PUSH1 0x0 DUP6 ADD PUSH2 0x34A JUMP JUMPDEST SWAP4 PUSH2 0x12A4 DUP2 PUSH1 0x20 DUP7 ADD PUSH2 0x323 JUMP JUMPDEST SWAP4 PUSH1 0x40 ADD PUSH2 0x4B2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x12E4 JUMPI PUSH2 0x12CE PUSH2 0x12C8 CALLDATASIZE PUSH1 0x4 PUSH2 0x127A JUMP JUMPDEST SWAP2 PUSH2 0x2BA2 JUMP JUMPDEST PUSH2 0x12D6 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x12E0 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH2 0x12F6 PUSH1 0x9 PUSH1 0x0 SWAP1 PUSH2 0x6AA JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x1329 JUMPI PUSH2 0x1309 CALLDATASIZE PUSH1 0x4 PUSH2 0x529 JUMP JUMPDEST PUSH2 0x1325 PUSH2 0x1314 PUSH2 0x12E9 JUMP JUMPDEST PUSH2 0x131C PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x736 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x134C JUMPI PUSH2 0x1348 PUSH1 0x20 SWAP2 PUSH2 0x63F JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x649 JUMP JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x1366 PUSH2 0x1361 DUP3 PUSH2 0x132E JUMP JUMPDEST PUSH2 0x78E JUMP JUMPDEST SWAP4 DUP2 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP1 DUP3 DUP5 ADD GT PUSH2 0x1382 JUMPI PUSH2 0x1380 SWAP3 PUSH2 0x7C6 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x789 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x13A5 JUMPI DUP2 PUSH1 0x20 PUSH2 0x13A2 SWAP4 CALLDATALOAD SWAP2 ADD PUSH2 0x1351 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x784 JUMP JUMPDEST SWAP1 PUSH1 0x80 DUP3 DUP3 SUB SLT PUSH2 0x1405 JUMPI PUSH2 0x13C2 DUP2 PUSH1 0x0 DUP5 ADD PUSH2 0x323 JUMP JUMPDEST SWAP3 PUSH2 0x13D0 DUP3 PUSH1 0x20 DUP6 ADD PUSH2 0x34A JUMP JUMPDEST SWAP3 PUSH2 0x13DE DUP4 PUSH1 0x40 DUP4 ADD PUSH2 0x34A JUMP JUMPDEST SWAP3 PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1400 JUMPI PUSH2 0x13FD SWAP3 ADD PUSH2 0x1387 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x143C JUMPI PUSH2 0x1426 PUSH2 0x141D CALLDATASIZE PUSH1 0x4 PUSH2 0x13AA JUMP JUMPDEST SWAP3 SWAP2 SWAP1 SWAP2 PUSH2 0x2C01 JUMP JUMPDEST PUSH2 0x142E PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x1438 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST CALLVALUE PUSH2 0x146F JUMPI PUSH2 0x1459 PUSH2 0x1454 CALLDATASIZE PUSH1 0x4 PUSH2 0x82B JUMP JUMPDEST PUSH2 0x2C37 JUMP JUMPDEST PUSH2 0x1461 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x146B DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x100 DUP4 DUP3 SUB SLT PUSH2 0x1539 JUMPI PUSH2 0x148E DUP2 PUSH1 0x0 DUP6 ADD PUSH2 0x323 JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1534 JUMPI DUP3 PUSH2 0x14AF SWAP2 DUP4 ADD PUSH2 0x808 JUMP JUMPDEST SWAP3 PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x152F JUMPI DUP4 PUSH2 0x14D0 SWAP2 DUP5 ADD PUSH2 0x808 JUMP JUMPDEST SWAP3 PUSH1 0x60 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x152A JUMPI DUP2 PUSH2 0x14F1 SWAP2 DUP6 ADD PUSH2 0x808 JUMP JUMPDEST SWAP3 PUSH2 0x14FF DUP3 PUSH1 0x80 DUP4 ADD PUSH2 0x323 JUMP JUMPDEST SWAP3 PUSH2 0x1527 PUSH2 0x1510 DUP5 PUSH1 0xA0 DUP6 ADD PUSH2 0x4B2 JUMP JUMPDEST SWAP4 PUSH2 0x151E DUP2 PUSH1 0xC0 DUP7 ADD PUSH2 0x323 JUMP JUMPDEST SWAP4 PUSH1 0xE0 ADD PUSH2 0xB24 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x1576 JUMPI PUSH2 0x1560 PUSH2 0x1551 CALLDATASIZE PUSH1 0x4 PUSH2 0x1474 JUMP JUMPDEST SWAP7 SWAP6 SWAP1 SWAP6 SWAP5 SWAP2 SWAP5 SWAP4 SWAP3 SWAP4 PUSH2 0x2C42 JUMP JUMPDEST PUSH2 0x1568 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x1572 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0x15A4 JUMPI DUP1 PUSH2 0x1598 PUSH2 0x15A1 SWAP3 PUSH1 0x0 DUP7 ADD PUSH2 0xB24 JUMP JUMPDEST SWAP4 PUSH1 0x20 ADD PUSH2 0x34A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x15DA JUMPI PUSH2 0x15D6 PUSH2 0x15C5 PUSH2 0x15BF CALLDATASIZE PUSH1 0x4 PUSH2 0x157B JUMP JUMPDEST SWAP1 PUSH2 0x2C89 JUMP JUMPDEST PUSH2 0x15CD PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x11F9 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST CALLVALUE PUSH2 0x1610 JUMPI PUSH2 0x160C PUSH2 0x15FB PUSH2 0x15F5 CALLDATASIZE PUSH1 0x4 PUSH2 0xE29 JUMP JUMPDEST SWAP1 PUSH2 0x2CF0 JUMP JUMPDEST PUSH2 0x1603 PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x441 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST CALLVALUE PUSH2 0x1643 JUMPI PUSH2 0x162D PUSH2 0x1628 CALLDATASIZE PUSH1 0x4 PUSH2 0x82B JUMP JUMPDEST PUSH2 0x2D43 JUMP JUMPDEST PUSH2 0x1635 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x163F DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0xC0 SWAP2 SUB SLT PUSH2 0x165B JUMPI SWAP1 JUMP JUMPDEST PUSH2 0x1648 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0xE0 SWAP2 SUB SLT PUSH2 0x166E JUMPI SWAP1 JUMP JUMPDEST PUSH2 0x1648 JUMP JUMPDEST SWAP2 PUSH1 0x60 DUP4 DUP4 SUB SLT PUSH2 0x16D8 JUMPI PUSH2 0x168B DUP3 PUSH1 0x0 DUP6 ADD PUSH2 0x323 JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x16D3 JUMPI DUP4 PUSH2 0x16AC SWAP2 DUP4 ADD PUSH2 0x164D JUMP JUMPDEST SWAP3 PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x16CE JUMPI PUSH2 0x16CB SWAP3 ADD PUSH2 0x1660 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x170E JUMPI PUSH2 0x170A PUSH2 0x16F9 PUSH2 0x16F3 CALLDATASIZE PUSH1 0x4 PUSH2 0x1673 JUMP JUMPDEST SWAP2 PUSH2 0x30A6 JUMP JUMPDEST PUSH2 0x1701 PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xB5F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SHL SWAP1 JUMP JUMPDEST PUSH2 0x1730 PUSH2 0x172B PUSH2 0x1735 SWAP3 PUSH2 0x1713 JUMP JUMPDEST PUSH2 0x1716 JUMP JUMPDEST PUSH2 0xB0C JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1742 PUSH1 0x0 PUSH2 0x171C JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x174D PUSH2 0x1738 JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x1780 JUMPI PUSH2 0x1760 CALLDATASIZE PUSH1 0x4 PUSH2 0x529 JUMP JUMPDEST PUSH2 0x177C PUSH2 0x176B PUSH2 0x1745 JUMP JUMPDEST PUSH2 0x1773 PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xB5F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH2 0x178E DUP2 PUSH2 0x42F JUMP JUMPDEST SUB PUSH2 0x1795 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x17A7 DUP3 PUSH2 0x1785 JUMP JUMPDEST JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0x17D2 JUMPI DUP1 PUSH2 0x17C6 PUSH2 0x17CF SWAP3 PUSH1 0x0 DUP7 ADD PUSH2 0x323 JUMP JUMPDEST SWAP4 PUSH1 0x20 ADD PUSH2 0x179A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x1806 JUMPI PUSH2 0x17F0 PUSH2 0x17EA CALLDATASIZE PUSH1 0x4 PUSH2 0x17A9 JUMP JUMPDEST SWAP1 PUSH2 0x3147 JUMP JUMPDEST PUSH2 0x17F8 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x1802 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST CALLVALUE PUSH2 0x183A JUMPI PUSH2 0x1824 PUSH2 0x181E CALLDATASIZE PUSH1 0x4 PUSH2 0xC30 JUMP JUMPDEST SWAP1 PUSH2 0x3197 JUMP JUMPDEST PUSH2 0x182C PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x1836 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP1 PUSH1 0x80 DUP3 DUP3 SUB SLT PUSH2 0x18CA JUMPI PUSH2 0x1857 DUP2 PUSH1 0x0 DUP5 ADD PUSH2 0x323 JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x18C5 JUMPI DUP3 PUSH2 0x1878 SWAP2 DUP6 ADD PUSH2 0xA57 JUMP JUMPDEST SWAP3 PUSH1 0x40 DUP2 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x18C0 JUMPI DUP4 PUSH2 0x1899 SWAP2 DUP4 ADD PUSH2 0xA57 JUMP JUMPDEST SWAP3 PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x18BB JUMPI PUSH2 0x18B8 SWAP3 ADD PUSH2 0x1387 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x1901 JUMPI PUSH2 0x18EB PUSH2 0x18E2 CALLDATASIZE PUSH1 0x4 PUSH2 0x183F JUMP JUMPDEST SWAP3 SWAP2 SWAP1 SWAP2 PUSH2 0x31D4 JUMP JUMPDEST PUSH2 0x18F3 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x18FD DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST CALLVALUE PUSH2 0x1936 JUMPI PUSH2 0x1932 PUSH2 0x1921 PUSH2 0x191C CALLDATASIZE PUSH1 0x4 PUSH2 0xB33 JUMP JUMPDEST PUSH2 0x31E2 JUMP JUMPDEST PUSH2 0x1929 PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x394 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST CALLVALUE PUSH2 0x196A JUMPI PUSH2 0x1954 PUSH2 0x194E CALLDATASIZE PUSH1 0x4 PUSH2 0xE29 JUMP JUMPDEST SWAP1 PUSH2 0x3232 JUMP JUMPDEST PUSH2 0x195C PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x1966 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x80 SWAP2 SUB SLT PUSH2 0x197D JUMPI SWAP1 JUMP JUMPDEST PUSH2 0x1648 JUMP JUMPDEST SWAP1 SWAP2 DUP3 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x19BC JUMPI DUP2 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x19B7 JUMPI PUSH1 0x20 ADD SWAP3 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH2 0x19B2 JUMPI JUMP JUMPDEST PUSH2 0x9FB JUMP JUMPDEST PUSH2 0xCC6 JUMP JUMPDEST PUSH2 0x784 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH1 0x80 DUP2 DUP5 SUB SLT PUSH2 0x1A38 JUMPI PUSH2 0x19DB DUP4 PUSH1 0x0 DUP4 ADD PUSH2 0x323 JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1A33 JUMPI DUP2 PUSH2 0x19FC SWAP2 DUP5 ADD PUSH2 0x196F JUMP JUMPDEST SWAP3 PUSH1 0x40 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1A2E JUMPI PUSH2 0x1A20 DUP4 PUSH2 0x1A2B SWAP3 DUP7 ADD PUSH2 0x1982 JUMP JUMPDEST SWAP4 SWAP1 SWAP5 PUSH1 0x60 ADD PUSH2 0x34A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x1A6F JUMPI PUSH2 0x1A59 PUSH2 0x1A50 CALLDATASIZE PUSH1 0x4 PUSH2 0x19C1 JUMP JUMPDEST SWAP4 SWAP3 SWAP1 SWAP3 PUSH2 0x3997 JUMP JUMPDEST PUSH2 0x1A61 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x1A6B DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH2 0x1A81 PUSH1 0xA PUSH1 0x0 SWAP1 PUSH2 0x6AA JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x1AB4 JUMPI PUSH2 0x1A94 CALLDATASIZE PUSH1 0x4 PUSH2 0x529 JUMP JUMPDEST PUSH2 0x1AB0 PUSH2 0x1A9F PUSH2 0x1A74 JUMP JUMPDEST PUSH2 0x1AA7 PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x736 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0x1AE2 JUMPI DUP1 PUSH2 0x1AD6 PUSH2 0x1ADF SWAP3 PUSH1 0x0 DUP7 ADD PUSH2 0x323 JUMP JUMPDEST SWAP4 PUSH1 0x20 ADD PUSH2 0x323 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x1B18 JUMPI PUSH2 0x1B14 PUSH2 0x1B03 PUSH2 0x1AFD CALLDATASIZE PUSH1 0x4 PUSH2 0x1AB9 JUMP JUMPDEST SWAP1 PUSH2 0x3E0E JUMP JUMPDEST PUSH2 0x1B0B PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x441 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST CALLVALUE PUSH2 0x1B4B JUMPI PUSH2 0x1B35 PUSH2 0x1B30 CALLDATASIZE PUSH1 0x4 PUSH2 0xB33 JUMP JUMPDEST PUSH2 0x3E5A JUMP JUMPDEST PUSH2 0x1B3D PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x1B47 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH1 0xA0 DUP2 DUP5 SUB SLT PUSH2 0x1BBC JUMPI PUSH2 0x1B6A DUP4 PUSH1 0x0 DUP4 ADD PUSH2 0x323 JUMP JUMPDEST SWAP3 PUSH2 0x1B78 DUP2 PUSH1 0x20 DUP5 ADD PUSH2 0x323 JUMP JUMPDEST SWAP3 PUSH2 0x1B86 DUP3 PUSH1 0x40 DUP6 ADD PUSH2 0x34A JUMP JUMPDEST SWAP3 PUSH2 0x1B94 DUP4 PUSH1 0x60 DUP4 ADD PUSH2 0x34A JUMP JUMPDEST SWAP3 PUSH1 0x80 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1BB7 JUMPI PUSH2 0x1BB3 SWAP3 ADD PUSH2 0xD0A JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x1BF6 JUMPI PUSH2 0x1BE0 PUSH2 0x1BD4 CALLDATASIZE PUSH1 0x4 PUSH2 0x1B50 JUMP JUMPDEST SWAP5 SWAP4 SWAP1 SWAP4 SWAP3 SWAP2 SWAP3 PUSH2 0x3E65 JUMP JUMPDEST PUSH2 0x1BE8 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x1BF2 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST CALLVALUE PUSH2 0x1C29 JUMPI PUSH2 0x1C13 PUSH2 0x1C0E CALLDATASIZE PUSH1 0x4 PUSH2 0x8E6 JUMP JUMPDEST PUSH2 0x4059 JUMP JUMPDEST PUSH2 0x1C1B PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x1C25 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x1C40 PUSH2 0x1C33 JUMP JUMPDEST POP PUSH8 0x9A31110384E0B0C9 PUSH1 0x20 MSTORE PUSH1 0x14 MSTORE PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x1C69 PUSH2 0x1C5C JUMP JUMPDEST POP DUP1 PUSH2 0x1C84 PUSH2 0x1C7E PUSH4 0x37BC2195 PUSH1 0xE0 SHL PUSH2 0x3E0 JUMP JUMPDEST SWAP2 PUSH2 0x3E0 JUMP JUMPDEST EQ SWAP1 DUP2 ISZERO PUSH2 0x1C91 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x1C9B SWAP2 POP PUSH2 0x4138 JUMP JUMPDEST CODESIZE PUSH2 0x1C8D JUMP JUMPDEST PUSH32 0x6DB4061A20CA83A3BE756EE172BD37A029093AC5AFE4CE968C6D5435B43CB011 SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x1CDF SWAP2 PUSH2 0x1CDA PUSH2 0x1CD5 PUSH2 0x1CA1 JUMP JUMPDEST PUSH2 0x418E JUMP JUMPDEST PUSH2 0x1CE1 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x1CEB SWAP2 PUSH2 0x43A8 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x1CF7 SWAP2 PUSH2 0x1CC5 JUMP JUMPDEST JUMP JUMPDEST PUSH32 0xE02A0315B383857AC496E9D2B2546A699AFAEB4E5E83A1FDEF64376D0B74E5A5 SWAP1 JUMP JUMPDEST PUSH2 0x1D36 SWAP1 PUSH2 0x1D31 PUSH2 0x1D2C PUSH2 0x1CF9 JUMP JUMPDEST PUSH2 0x418E JUMP JUMPDEST PUSH2 0x1F21 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x1F PUSH1 0x20 SWAP2 ADD DIV SWAP1 JUMP JUMPDEST SHL SWAP1 JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x8 PUSH2 0x1D62 SWAP2 MUL SWAP2 PUSH2 0x1D5C PUSH1 0x0 NOT DUP5 PUSH2 0x1D42 JUMP JUMPDEST SWAP3 PUSH2 0x1D42 JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x1D85 PUSH2 0x1D80 PUSH2 0x1D8D SWAP4 PUSH2 0xBAD JUMP JUMPDEST PUSH2 0x1D6C JUMP JUMPDEST SWAP1 DUP4 SLOAD PUSH2 0x1D46 JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x1DA3 SWAP2 PUSH2 0x1D9D PUSH2 0x1C33 JUMP JUMPDEST SWAP2 PUSH2 0x1D6F JUMP JUMPDEST JUMP JUMPDEST JUMPDEST DUP2 DUP2 LT PUSH2 0x1DB1 JUMPI POP POP JUMP JUMPDEST DUP1 PUSH2 0x1DBF PUSH1 0x0 PUSH1 0x1 SWAP4 PUSH2 0x1D91 JUMP JUMPDEST ADD PUSH2 0x1DA6 JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x1F DUP2 GT PUSH2 0x1DD5 JUMPI JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x1DE1 PUSH2 0x1E06 SWAP4 PUSH2 0x598 JUMP JUMPDEST SWAP1 PUSH1 0x20 PUSH2 0x1DED DUP5 PUSH2 0x1D38 JUMP JUMPDEST DUP4 ADD SWAP4 LT PUSH2 0x1E0E JUMPI JUMPDEST PUSH2 0x1DFF SWAP1 PUSH2 0x1D38 JUMP JUMPDEST ADD SWAP1 PUSH2 0x1DA5 JUMP JUMPDEST CODESIZE DUP1 DUP1 PUSH2 0x1DD0 JUMP JUMPDEST SWAP2 POP PUSH2 0x1DFF DUP2 SWAP3 SWAP1 POP PUSH2 0x1DF6 JUMP JUMPDEST SWAP1 PUSH2 0x1E2D SWAP1 PUSH1 0x0 NOT SWAP1 PUSH1 0x8 MUL PUSH2 0x96E JUMP JUMPDEST NOT AND SWAP1 JUMP JUMPDEST DUP2 PUSH2 0x1E3C SWAP2 PUSH2 0x1E1C JUMP JUMPDEST SWAP1 PUSH1 0x2 MUL OR SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x1E4E DUP2 PUSH2 0x6D3 JUMP JUMPDEST SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x1F10 JUMPI PUSH2 0x1E72 DUP3 PUSH2 0x1E6C DUP6 SLOAD PUSH2 0x565 JUMP JUMPDEST DUP6 PUSH2 0x1DC5 JUMP JUMPDEST PUSH1 0x20 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x1EA7 JUMPI SWAP2 DUP1 SWAP2 PUSH2 0x1E96 SWAP4 PUSH1 0x0 SWAP3 PUSH2 0x1E9B JUMPI JUMPDEST POP POP PUSH2 0x1E32 JUMP JUMPDEST SWAP1 SSTORE JUMPDEST JUMP JUMPDEST SWAP1 SWAP2 POP ADD MLOAD CODESIZE DUP1 PUSH2 0x1E8F JUMP JUMPDEST PUSH1 0x1F NOT DUP4 AND SWAP2 PUSH2 0x1EB6 DUP6 PUSH2 0x598 JUMP JUMPDEST SWAP3 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x1EF8 JUMPI POP SWAP2 PUSH1 0x2 SWAP4 SWAP2 DUP6 PUSH1 0x1 SWAP7 SWAP5 LT PUSH2 0x1EDE JUMPI JUMPDEST POP POP POP MUL ADD SWAP1 SSTORE PUSH2 0x1E99 JUMP JUMPDEST PUSH2 0x1EEE SWAP2 ADD MLOAD PUSH1 0x1F DUP5 AND SWAP1 PUSH2 0x1E1C JUMP JUMPDEST SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x1ED2 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD MLOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x1EBA JUMP JUMPDEST PUSH2 0x649 JUMP JUMPDEST SWAP1 PUSH2 0x1F1F SWAP2 PUSH2 0x1E44 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x1F2C SWAP1 PUSH1 0x8 PUSH2 0x1F15 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x1F37 SWAP1 PUSH2 0x1D1D JUMP JUMPDEST JUMP JUMPDEST PUSH32 0x70649EC320B507FEBAD3E8EF750E5F580B9AE32F9F50D4C7B121332C81971530 SWAP1 JUMP JUMPDEST PUSH2 0x1F76 SWAP1 PUSH2 0x1F71 PUSH2 0x1F6C PUSH2 0x1F39 JUMP JUMPDEST PUSH2 0x418E JUMP JUMPDEST PUSH2 0x1FF6 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x1F8C PUSH2 0x1F87 PUSH2 0x1F91 SWAP3 PUSH2 0x2F7 JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x2F7 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1F9D SWAP1 PUSH2 0x1F78 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1FA9 SWAP1 PUSH2 0x1F94 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x1FBD PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB SWAP2 PUSH2 0x1716 JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST PUSH2 0x1FD0 SWAP1 PUSH2 0x1F94 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x1FEB PUSH2 0x1FE6 PUSH2 0x1FF2 SWAP3 PUSH2 0x1FC7 JUMP JUMPDEST PUSH2 0x1FD3 JUMP JUMPDEST DUP3 SLOAD PUSH2 0x1FAC JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x2002 PUSH2 0x2009 SWAP2 PUSH2 0x1FA0 JUMP JUMPDEST PUSH1 0x6 PUSH2 0x1FD6 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x2014 SWAP1 PUSH2 0x1F5D JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x60 SWAP1 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x0 SWAP3 SWAP2 DUP1 SLOAD SWAP1 PUSH2 0x203B PUSH2 0x2034 DUP4 PUSH2 0x565 JUMP JUMPDEST DUP1 SWAP5 PUSH2 0x201B JUMP JUMPDEST SWAP2 PUSH1 0x1 DUP2 AND SWAP1 DUP2 PUSH1 0x0 EQ PUSH2 0x208F JUMPI POP PUSH1 0x1 EQ PUSH2 0x2057 JUMPI JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x2064 SWAP2 SWAP3 SWAP4 SWAP5 POP PUSH2 0x598 JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMPDEST DUP4 DUP3 LT PUSH2 0x207B JUMPI POP POP ADD SWAP1 CODESIZE DUP1 DUP1 PUSH2 0x2052 JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x20 SWAP3 SLOAD DUP5 DUP7 ADD MSTORE ADD SWAP2 ADD SWAP1 PUSH2 0x2068 JUMP JUMPDEST SWAP3 SWAP5 SWAP6 POP POP POP PUSH1 0xFF NOT AND DUP3 MSTORE DUP1 ISZERO ISZERO MUL ADD SWAP1 CODESIZE DUP1 DUP1 PUSH2 0x2052 JUMP JUMPDEST PUSH2 0x20CE PUSH2 0x20C5 SWAP3 PUSH1 0x20 SWAP3 PUSH2 0x20BC DUP2 PUSH2 0x6D3 JUMP JUMPDEST SWAP5 DUP6 DUP1 SWAP4 PUSH2 0x201B JUMP JUMPDEST SWAP4 DUP5 SWAP2 ADD PUSH2 0x6E0 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x2E6A736F6E000000000000000000000000000000000000000000000000000000 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x2106 PUSH1 0x5 DUP1 SWAP3 PUSH2 0x201B JUMP JUMPDEST PUSH2 0x210F DUP2 PUSH2 0x20D2 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST SWAP2 PUSH2 0x2124 PUSH2 0x212F SWAP4 PUSH2 0x212A SWAP4 PUSH2 0x2020 JUMP JUMPDEST SWAP1 PUSH2 0x20A9 JUMP JUMPDEST PUSH2 0x20FA JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x217C SWAP1 PUSH2 0x2141 PUSH2 0x2016 JUMP JUMPDEST POP PUSH2 0x2177 PUSH2 0x2150 PUSH1 0x9 SWAP3 PUSH2 0x4422 JUMP JUMPDEST SWAP2 PUSH2 0x2168 PUSH2 0x215C PUSH2 0x2E2 JUMP JUMPDEST SWAP4 DUP5 SWAP3 PUSH1 0x20 DUP5 ADD PUSH2 0x2113 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE SUB DUP3 PUSH2 0x65F JUMP JUMPDEST PUSH2 0x2132 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2188 SWAP1 PUSH2 0x1F78 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2194 SWAP1 PUSH2 0x217F JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x21A1 SWAP1 PUSH2 0x218B JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x0 SHR SWAP1 JUMP JUMPDEST PUSH2 0x21C1 PUSH2 0x21C6 SWAP2 PUSH2 0x21AF JUMP JUMPDEST PUSH2 0x972 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x21D3 SWAP1 SLOAD PUSH2 0x21B5 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x21EA PUSH2 0x21E5 PUSH2 0x21EF SWAP3 PUSH2 0x1713 JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x332 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x21FE PUSH2 0x2203 SWAP2 PUSH2 0x21AF JUMP JUMPDEST PUSH2 0xBAD JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x221D PUSH2 0x2218 PUSH2 0x2222 SWAP3 PUSH2 0x2206 JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x332 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2237 PUSH2 0x2232 DUP4 PUSH2 0x7A3 JUMP JUMPDEST PUSH2 0x78E JUMP JUMPDEST SWAP2 DUP3 MSTORE JUMP JUMPDEST PUSH2 0x2246 PUSH1 0x0 PUSH2 0x2225 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2251 PUSH2 0x223C JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2273 PUSH2 0x226E PUSH2 0x2267 PUSH1 0xF DUP6 SWAP1 PUSH2 0x2197 JUMP JUMPDEST DUP4 SWAP1 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x21C9 JUMP JUMPDEST DUP1 PUSH2 0x2287 PUSH2 0x2281 PUSH1 0x0 PUSH2 0x21D6 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST EQ PUSH2 0x2332 JUMPI PUSH2 0x2296 DUP2 BLOCKHASH PUSH2 0x21F2 JUMP JUMPDEST PUSH2 0x22A9 PUSH2 0x22A3 PUSH1 0x0 PUSH2 0x21D6 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST EQ ISZERO SWAP1 DUP2 ISZERO PUSH2 0x2315 JUMPI JUMPDEST POP PUSH2 0x22F8 JUMPI PUSH2 0x22F6 SWAP2 PUSH2 0x22DC PUSH1 0x0 PUSH2 0x22D7 PUSH2 0x22D0 PUSH1 0xF DUP6 SWAP1 PUSH2 0x2197 JUMP JUMPDEST DUP6 SWAP1 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x1D91 JUMP JUMPDEST SWAP1 PUSH2 0x22E7 PUSH1 0x1 PUSH2 0x2209 JUMP JUMPDEST SWAP1 PUSH2 0x22F0 PUSH2 0x2249 JUMP JUMPDEST SWAP3 PUSH2 0x4477 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 PUSH4 0x156F9043 PUSH1 0xE2 SHL DUP2 MSTORE DUP1 PUSH2 0x2311 PUSH1 0x4 DUP3 ADD PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP1 POP PUSH2 0x232A PUSH2 0x2324 NUMBER SWAP3 PUSH2 0x332 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST GT ISZERO CODESIZE PUSH2 0x22B3 JUMP JUMPDEST PUSH1 0x0 PUSH4 0x7DE832B5 PUSH1 0xE1 SHL DUP2 MSTORE DUP1 PUSH2 0x234B PUSH1 0x4 DUP3 ADD PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x235C SWAP2 CALLER SWAP2 SWAP1 SWAP2 PUSH2 0x44F2 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x236C SWAP1 PUSH2 0xB0C JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2379 SWAP1 PUSH2 0x2363 JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH2 0x2393 PUSH2 0x2398 SWAP2 PUSH2 0x21AF JUMP JUMPDEST PUSH2 0xF26 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x23A5 SWAP1 SLOAD PUSH2 0x2387 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH2 0x23C1 PUSH2 0x23C7 SWAP3 PUSH2 0x23B9 PUSH2 0x235E JUMP JUMPDEST POP PUSH1 0x4 PUSH2 0x236F JUMP JUMPDEST ADD PUSH2 0x239B JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x23D9 SWAP1 PUSH2 0xBAD JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x23FE PUSH2 0x2403 SWAP2 PUSH2 0x21AF JUMP JUMPDEST PUSH2 0x23E7 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2410 SWAP1 SLOAD PUSH2 0x23F2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x241D SWAP1 PUSH2 0x302 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST PUSH1 0xA0 SHR SWAP1 JUMP JUMPDEST PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0x2444 PUSH2 0x2449 SWAP2 PUSH2 0x2421 JUMP JUMPDEST PUSH2 0x2427 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2456 SWAP1 SLOAD PUSH2 0x2438 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2463 SWAP1 PUSH2 0x48C JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST PUSH2 0x2471 PUSH1 0x40 PUSH2 0x78E JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x24AB PUSH2 0x24A2 PUSH1 0x0 PUSH2 0x2485 PUSH2 0x2467 JUMP JUMPDEST SWAP5 PUSH2 0x249C PUSH2 0x2494 DUP4 DUP4 ADD PUSH2 0x2406 JUMP JUMPDEST DUP4 DUP9 ADD PUSH2 0x2413 JUMP JUMPDEST ADD PUSH2 0x244C JUMP JUMPDEST PUSH1 0x20 DUP5 ADD PUSH2 0x2459 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x24B6 SWAP1 PUSH2 0x2474 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x24C3 SWAP1 MLOAD PUSH2 0x302 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x24DA PUSH2 0x24D5 PUSH2 0x24DF SWAP3 PUSH2 0x1713 JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x2F7 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x24EB SWAP1 PUSH2 0x24C6 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x24F8 SWAP1 MLOAD PUSH2 0x48C JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x250F PUSH2 0x250A PUSH2 0x2514 SWAP3 PUSH2 0x48C JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x332 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x253C PUSH2 0x2542 SWAP2 SWAP4 SWAP3 SWAP4 PUSH2 0x332 JUMP JUMPDEST SWAP3 PUSH2 0x332 JUMP JUMPDEST SWAP2 PUSH2 0x254E DUP4 DUP3 MUL PUSH2 0x332 JUMP JUMPDEST SWAP3 DUP2 DUP5 DIV EQ SWAP1 ISZERO OR ISZERO PUSH2 0x255D JUMPI JUMP JUMPDEST PUSH2 0x2517 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x2584 PUSH2 0x258A SWAP2 PUSH2 0x332 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST SWAP1 DUP2 ISZERO PUSH2 0x2595 JUMPI DIV SWAP1 JUMP JUMPDEST PUSH2 0x2562 JUMP JUMPDEST PUSH2 0x25BD PUSH2 0x25C2 SWAP2 SWAP4 SWAP3 SWAP4 PUSH2 0x25AC PUSH2 0x23CA JUMP JUMPDEST POP PUSH2 0x25B5 PUSH2 0x1C33 JUMP JUMPDEST POP PUSH1 0x3 PUSH2 0x23CF JUMP JUMPDEST PUSH2 0x24AD JUMP JUMPDEST SWAP2 PUSH2 0x25CF PUSH1 0x0 DUP5 ADD PUSH2 0x24B9 JUMP JUMPDEST PUSH2 0x25EA PUSH2 0x25E4 PUSH2 0x25DF PUSH1 0x0 PUSH2 0x24E2 JUMP JUMPDEST PUSH2 0x302 JUMP JUMPDEST SWAP2 PUSH2 0x302 JUMP JUMPDEST EQ PUSH2 0x2637 JUMPI JUMPDEST PUSH1 0x0 PUSH2 0x262C PUSH2 0x2616 PUSH2 0x2633 SWAP4 PUSH2 0x2610 PUSH2 0x260B PUSH1 0x20 DUP10 ADD PUSH2 0x24EE JUMP JUMPDEST PUSH2 0x24FB JUMP JUMPDEST SWAP1 PUSH2 0x252D JUMP JUMPDEST PUSH2 0x2626 PUSH2 0x2621 PUSH2 0x45EA JUMP JUMPDEST PUSH2 0x24FB JUMP JUMPDEST SWAP1 PUSH2 0x2578 JUMP JUMPDEST SWAP4 ADD PUSH2 0x24B9 JUMP JUMPDEST SWAP2 SWAP1 JUMP JUMPDEST SWAP2 POP PUSH2 0x2633 PUSH1 0x0 PUSH2 0x262C PUSH2 0x2616 PUSH2 0x264E PUSH1 0x2 PUSH2 0x24AD JUMP JUMPDEST SWAP6 SWAP4 POP POP POP POP PUSH2 0x25F0 JUMP JUMPDEST PUSH2 0x2664 SWAP2 CALLDATASIZE SWAP2 PUSH2 0xA00 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2672 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x1351 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP7 SWAP4 SWAP7 SWAP6 SWAP1 SWAP5 SWAP2 SWAP3 SWAP6 PUSH2 0x2686 PUSH2 0x4601 JUMP JUMPDEST PUSH2 0x28BF JUMPI JUMPDEST DUP3 DUP8 SUB PUSH2 0x28B1 JUMPI PUSH1 0x60 SHL PUSH8 0x9A31110384E0B0C9 OR SWAP5 PUSH1 0x60 SHL PUSH8 0x9A31110384E0B0C9 OR SWAP2 DUP6 PUSH1 0x20 MSTORE DUP6 PUSH1 0x60 SHR SWAP6 DUP4 PUSH1 0x60 SHR SWAP4 DUP5 ISZERO PUSH2 0x28A3 JUMPI DUP8 CALLER SUB PUSH2 0x2887 JUMPI JUMPDEST DUP9 PUSH1 0x5 SHL DUP1 JUMPDEST PUSH2 0x2827 JUMPI POP POP POP DUP3 DUP7 PUSH1 0x20 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH1 0x40 MLOAD PUSH1 0x40 DUP2 MSTORE DUP12 DUP14 DUP2 PUSH1 0x5 SHL SWAP5 DUP3 DUP7 SWAP4 PUSH1 0x40 DUP7 ADD MSTORE DUP4 DUP14 PUSH1 0x60 DUP8 ADD CALLDATACOPY DUP4 PUSH1 0x60 ADD DUP3 DUP7 ADD MSTORE PUSH1 0x60 DUP5 DUP7 ADD ADD SWAP1 DUP2 MSTORE ADD CALLDATACOPY PUSH1 0x80 CALLER SWAP4 DUP1 ADD ADD SWAP1 LOG4 PUSH2 0x273D PUSH2 0x460F JUMP JUMPDEST PUSH2 0x280A JUMPI JUMPDEST POP DUP2 EXTCODESIZE PUSH2 0x2753 JUMPI JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP1 SWAP8 DUP7 SWAP5 PUSH1 0x0 MSTORE DUP1 PUSH1 0xC0 PUSH1 0x40 MLOAD SWAP12 DUP13 SWAP11 PUSH4 0xBC197C81 DUP13 MSTORE CALLER DUP7 DUP14 ADD MSTORE PUSH1 0x40 DUP13 ADD MSTORE PUSH1 0xA0 PUSH1 0x60 DUP13 ADD MSTORE DUP11 DUP4 PUSH1 0x5 SHL SWAP10 DUP11 SWAP6 DUP7 SWAP5 DUP6 SWAP4 ADD MSTORE PUSH1 0xE0 DUP14 ADD CALLDATACOPY DUP2 PUSH1 0xC0 ADD PUSH1 0x80 DUP13 ADD MSTORE PUSH1 0xE0 DUP3 DUP13 ADD ADD SWAP3 DUP4 MSTORE DUP5 DUP4 ADD CALLDATACOPY DUP2 DUP1 PUSH1 0xE0 ADD ADD PUSH1 0xA0 DUP11 ADD MSTORE ADD ADD DUP4 DUP2 MSTORE ADD CALLDATACOPY DUP1 ADD ADD PUSH2 0x104 ADD PUSH1 0x1C PUSH1 0x40 MLOAD ADD PUSH1 0x0 DUP1 MLOAD GAS CALL ISZERO PUSH2 0x27FB JUMPI JUMPDEST PUSH4 0xBC197C81 PUSH1 0xE0 SHL SWAP1 MLOAD SUB PUSH2 0x27ED JUMPI CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x274A JUMP JUMPDEST PUSH4 0x9C05499B PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x27D2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH2 0x2821 SWAP1 DUP7 SWAP1 DUP5 SWAP1 DUP7 SWAP1 DUP11 DUP13 SWAP2 SWAP3 DUP8 SWAP5 DUP12 SWAP7 PUSH2 0x461D JUMP JUMPDEST CODESIZE PUSH2 0x2742 JUMP JUMPDEST PUSH1 0x20 SWAP1 SUB DUP1 DUP12 ADD CALLDATALOAD DUP4 PUSH1 0x20 MSTORE DUP2 DUP9 ADD CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP1 SLOAD DUP1 DUP4 GT PUSH2 0x2879 JUMPI DUP3 SWAP1 SUB SWAP1 SSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD SWAP1 DUP2 ADD SWAP1 DUP2 LT PUSH2 0x286B JUMPI DUP3 SWAP2 SSTORE PUSH2 0x26D0 JUMP JUMPDEST PUSH4 0x1336CEA PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0xF4D678B8 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST CALLER PUSH1 0x0 MSTORE PUSH1 0x34 PUSH1 0xC KECCAK256 SLOAD PUSH2 0x26CA JUMPI PUSH4 0x4B6E7F18 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0xEA553B34 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0x3B800A46 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH2 0x28E2 DUP5 DUP9 PUSH2 0x28DC DUP12 DUP8 SWAP1 PUSH2 0x28D6 DUP9 SWAP5 DUP13 SWAP7 PUSH2 0x2659 JUMP JUMPDEST POP PUSH2 0x2659 JUMP JUMPDEST POP PUSH2 0x2667 JUMP JUMPDEST POP PUSH2 0x268B JUMP JUMPDEST SWAP1 PUSH2 0x2903 SWAP2 PUSH2 0x28FE PUSH2 0x28F9 DUP3 PUSH2 0x23A8 JUMP JUMPDEST PUSH2 0x418E JUMP JUMPDEST PUSH2 0x2905 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x290F SWAP2 PUSH2 0x4667 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x291B SWAP2 PUSH2 0x28E8 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x20 PUSH32 0x20726F6C657320666F722073656C660000000000000000000000000000000000 SWAP2 PUSH32 0x416363657373436F6E74726F6C3A2063616E206F6E6C792072656E6F756E6365 PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x2978 PUSH1 0x2F PUSH1 0x40 SWAP3 PUSH2 0x6D7 JUMP JUMPDEST PUSH2 0x2981 DUP2 PUSH2 0x291D JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x299B SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x296B JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x29A5 JUMPI JUMP JUMPDEST PUSH2 0x29AD PUSH2 0x2E2 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x29C3 PUSH1 0x4 DUP3 ADD PUSH2 0x2985 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP1 PUSH2 0x29F4 SWAP2 PUSH2 0x29EF DUP3 PUSH2 0x29E9 PUSH2 0x29E3 PUSH2 0x29DE PUSH2 0x4691 JUMP JUMPDEST PUSH2 0x302 JUMP JUMPDEST SWAP2 PUSH2 0x302 JUMP JUMPDEST EQ PUSH2 0x299E JUMP JUMPDEST PUSH2 0x469E JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x60 SWAP1 JUMP JUMPDEST SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2A07 PUSH2 0x29F6 JUMP JUMPDEST POP DUP3 SUB PUSH2 0x2A5E JUMPI PUSH1 0x40 MLOAD SWAP4 DUP3 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP3 PUSH1 0x5 SHL DUP1 DUP5 DUP2 ADD PUSH1 0x40 MSTORE JUMPDEST PUSH2 0x2A2F JUMPI POP POP POP POP JUMP JUMPDEST PUSH1 0x20 SWAP1 SUB DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x60 SHL PUSH8 0x9A31110384E0B0C9 OR PUSH1 0x20 MSTORE DUP1 DUP4 ADD CALLDATALOAD PUSH1 0x0 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP2 DUP7 ADD MSTORE PUSH2 0x2A25 JUMP JUMPDEST PUSH4 0x3B800A46 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH32 0xBAA5EE745DE68A3095827D2EE7DD2043AFC932834D02CC1B8BE3DA78577F6C1A SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2AAB SWAP3 SWAP2 PUSH2 0x2AA6 PUSH2 0x2AA1 PUSH2 0x2A6C JUMP JUMPDEST PUSH2 0x418E JUMP JUMPDEST PUSH2 0x2B10 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x2ABA PUSH1 0x0 NOT SWAP2 PUSH2 0x1716 JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST PUSH2 0x2ACD SWAP1 PUSH2 0x21AF JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2AE5 PUSH2 0x2AE0 PUSH2 0x2AEC SWAP3 PUSH2 0x2363 JUMP JUMPDEST PUSH2 0x2AC4 JUMP JUMPDEST DUP3 SLOAD PUSH2 0x2AAD JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST SWAP1 PUSH2 0x2B05 PUSH2 0x2B00 PUSH2 0x2B0C SWAP3 PUSH2 0xBAD JUMP JUMPDEST PUSH2 0x1D6C JUMP JUMPDEST DUP3 SLOAD PUSH2 0x2AAD JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x2B4F SWAP3 SWAP2 PUSH2 0x2B2D PUSH2 0x2B4A SWAP3 PUSH2 0x2B28 PUSH1 0xC DUP7 SWAP1 PUSH2 0xF0E JUMP JUMPDEST PUSH2 0x2AD0 JUMP JUMPDEST PUSH2 0x2B42 DUP2 PUSH2 0x2B3D PUSH1 0xD DUP7 SWAP1 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x2AF0 JUMP JUMPDEST SWAP2 PUSH1 0xE PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x2AF0 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x2B5C SWAP3 SWAP2 PUSH2 0x2A90 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x2B71 SWAP2 PUSH2 0x2B6B PUSH2 0x1C33 JUMP JUMPDEST POP PUSH2 0x470E JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2B91 SWAP3 SWAP2 PUSH2 0x2B8C PUSH2 0x2B87 PUSH2 0x1CA1 JUMP JUMPDEST PUSH2 0x418E JUMP JUMPDEST PUSH2 0x2B93 JUMP JUMPDEST JUMP JUMPDEST SWAP2 PUSH2 0x2BA0 SWAP3 SWAP2 SWAP1 SWAP2 PUSH2 0x48F4 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x2BAD SWAP3 SWAP2 PUSH2 0x2B76 JUMP JUMPDEST JUMP JUMPDEST PUSH32 0x9F2DF0FED2C77648DE5860A4CC508CD0818C85B8B8A1AB4CEEEF8D981C8956A6 SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2BEF SWAP4 SWAP3 SWAP2 PUSH2 0x2BEA PUSH2 0x2BE5 PUSH2 0x2BAF JUMP JUMPDEST PUSH2 0x418E JUMP JUMPDEST PUSH2 0x2BF1 JUMP JUMPDEST JUMP JUMPDEST SWAP2 PUSH2 0x2BFF SWAP4 SWAP2 SWAP1 SWAP2 SWAP3 PUSH2 0x4477 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x2C0D SWAP4 SWAP3 SWAP2 PUSH2 0x2BD3 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x2C28 SWAP1 PUSH2 0x2C23 PUSH2 0x2C1E PUSH2 0x1CF9 JUMP JUMPDEST PUSH2 0x418E JUMP JUMPDEST PUSH2 0x2C2A JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x2C35 SWAP1 PUSH1 0x9 PUSH2 0x1F15 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x2C40 SWAP1 PUSH2 0x2C0F JUMP JUMPDEST JUMP JUMPDEST SWAP2 PUSH2 0x2C6C SWAP8 SWAP6 SWAP4 SWAP2 SWAP7 SWAP5 SWAP3 PUSH2 0x2C5F PUSH2 0x2C58 PUSH2 0x2A6C JUMP JUMPDEST DUP3 SWAP1 PUSH2 0x4667 JUMP JUMPDEST SWAP7 SWAP1 SWAP2 SWAP3 SWAP4 SWAP5 SWAP6 SWAP7 PUSH2 0x4977 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x2C78 SWAP1 PUSH2 0x2363 JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2CA9 PUSH2 0x2CA4 PUSH2 0x2CAE SWAP4 PUSH2 0x2C9C PUSH2 0x23CA JUMP JUMPDEST POP PUSH1 0x5 PUSH2 0x2C6E JUMP JUMPDEST PUSH2 0x2C86 JUMP JUMPDEST PUSH2 0x49C6 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2CBB SWAP1 PUSH2 0x218B JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH2 0x2CDB PUSH2 0x2CE0 SWAP2 PUSH2 0x21AF JUMP JUMPDEST PUSH2 0x2CC9 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2CED SWAP1 SLOAD PUSH2 0x2CCF JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2D18 SWAP2 PUSH1 0x0 PUSH2 0x2D0D PUSH2 0x2D13 SWAP4 PUSH2 0x2D05 PUSH2 0x1C5C JUMP JUMPDEST POP PUSH1 0x4 PUSH2 0x236F JUMP JUMPDEST ADD PUSH2 0x2CB1 JUMP JUMPDEST PUSH2 0x2CE3 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2D34 SWAP1 PUSH2 0x2D2F PUSH2 0x2D2A PUSH2 0x1CF9 JUMP JUMPDEST PUSH2 0x418E JUMP JUMPDEST PUSH2 0x2D36 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x2D41 SWAP1 PUSH1 0xA PUSH2 0x1F15 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x2D4C SWAP1 PUSH2 0x2D1B JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x2D65 PUSH2 0x2D6A SWAP2 PUSH2 0x21AF JUMP JUMPDEST PUSH2 0x2D4E JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2D77 SWAP1 SLOAD PUSH2 0x2D59 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2D83 SWAP1 PUSH2 0x217F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0xE0 SHL SWAP1 JUMP JUMPDEST SWAP1 POP MLOAD SWAP1 PUSH2 0x2D9E DUP3 PUSH2 0xB0F JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x2DBA JUMPI PUSH2 0x2DB7 SWAP2 PUSH1 0x0 ADD PUSH2 0x2D91 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST POP PUSH2 0x2DCE SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x323 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2DDA SWAP1 PUSH2 0x302 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST POP PUSH2 0x2DED SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x401 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2DF9 SWAP1 PUSH2 0x3E0 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST POP PUSH2 0x2E0C SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0xB24 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2E18 SWAP1 PUSH2 0xB0C JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SUB DUP3 CALLDATASIZE SUB SUB DUP2 SLT ISZERO PUSH2 0x2E6C JUMPI ADD PUSH1 0x20 DUP2 CALLDATALOAD SWAP2 ADD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2E67 JUMPI PUSH1 0x1 DUP3 MUL CALLDATASIZE SUB DUP4 SGT PUSH2 0x2E62 JUMPI JUMP JUMPDEST PUSH2 0x2E21 JUMP JUMPDEST PUSH2 0x2E1C JUMP JUMPDEST PUSH2 0x2E26 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x2E94 DUP2 PUSH2 0x2E8D DUP2 PUSH2 0x2E99 SWAP6 PUSH2 0x2E71 JUMP JUMPDEST DUP1 SWAP6 PUSH2 0x7C6 JUMP JUMPDEST PUSH2 0x63F JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST SWAP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x40 SUB DUP3 CALLDATASIZE SUB SUB DUP2 SLT ISZERO PUSH2 0x2EB3 JUMPI ADD SWAP1 JUMP JUMPDEST PUSH2 0x2E26 JUMP JUMPDEST SWAP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SUB DUP3 CALLDATASIZE SUB SUB DUP2 SLT ISZERO PUSH2 0x2EF9 JUMPI ADD PUSH1 0x20 DUP2 CALLDATALOAD SWAP2 ADD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2EF4 JUMPI PUSH1 0x1 DUP3 MUL CALLDATASIZE SUB DUP4 SGT PUSH2 0x2EEF JUMPI JUMP JUMPDEST PUSH2 0x2E21 JUMP JUMPDEST PUSH2 0x2E1C JUMP JUMPDEST PUSH2 0x2E26 JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x2F18 DUP2 PUSH2 0x2F11 DUP2 PUSH2 0x2F1D SWAP6 PUSH2 0x58F JUMP JUMPDEST DUP1 SWAP6 PUSH2 0x7C6 JUMP JUMPDEST PUSH2 0x63F JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0x2F37 DUP2 PUSH2 0x2F21 JUMP JUMPDEST SUB PUSH2 0x2F3E JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x2F50 DUP3 PUSH2 0x2F2E JUMP JUMPDEST JUMP JUMPDEST POP PUSH2 0x2F61 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x2F43 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2F6D SWAP1 PUSH2 0x2F21 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP1 PUSH2 0x2FAF SWAP1 PUSH1 0x20 PUSH2 0x2FA7 PUSH2 0x2F9D PUSH1 0x40 DUP5 ADD PUSH2 0x2F8F PUSH1 0x0 DUP9 ADD DUP9 PUSH2 0x2EB8 JUMP JUMPDEST SWAP1 DUP7 DUP4 SUB PUSH1 0x0 DUP9 ADD MSTORE PUSH2 0x2EFE JUMP JUMPDEST SWAP5 DUP3 DUP2 ADD SWAP1 PUSH2 0x2F52 JUMP JUMPDEST SWAP2 ADD SWAP1 PUSH2 0x2F64 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x305C SWAP2 PUSH2 0x304E PUSH2 0x3043 PUSH1 0xC0 DUP4 ADD PUSH2 0x2FDA PUSH2 0x2FD0 PUSH1 0x0 DUP8 ADD DUP8 PUSH2 0x2DBF JUMP JUMPDEST PUSH1 0x0 DUP7 ADD SWAP1 PUSH2 0x2DD1 JUMP JUMPDEST PUSH2 0x2FF4 PUSH2 0x2FEA PUSH1 0x20 DUP8 ADD DUP8 PUSH2 0x2DDE JUMP JUMPDEST PUSH1 0x20 DUP7 ADD SWAP1 PUSH2 0x2DF0 JUMP JUMPDEST PUSH2 0x300E PUSH2 0x3004 PUSH1 0x40 DUP8 ADD DUP8 PUSH2 0x2DFD JUMP JUMPDEST PUSH1 0x40 DUP7 ADD SWAP1 PUSH2 0x2E0F JUMP JUMPDEST PUSH2 0x3028 PUSH2 0x301E PUSH1 0x60 DUP8 ADD DUP8 PUSH2 0x2DFD JUMP JUMPDEST PUSH1 0x60 DUP7 ADD SWAP1 PUSH2 0x2E0F JUMP JUMPDEST PUSH2 0x3035 PUSH1 0x80 DUP7 ADD DUP7 PUSH2 0x2E2B JUMP JUMPDEST SWAP1 DUP6 DUP4 SUB PUSH1 0x80 DUP8 ADD MSTORE PUSH2 0x2E7A JUMP JUMPDEST SWAP3 PUSH1 0xA0 DUP2 ADD SWAP1 PUSH2 0x2E9D JUMP JUMPDEST SWAP1 PUSH1 0xA0 DUP2 DUP5 SUB SWAP2 ADD MSTORE PUSH2 0x2F71 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP4 SWAP3 SWAP1 PUSH2 0x308B PUSH1 0x40 SWAP2 PUSH2 0x3093 SWAP5 PUSH2 0x307E PUSH1 0x60 DUP10 ADD SWAP3 PUSH1 0x0 DUP11 ADD SWAP1 PUSH2 0xC5E JUMP JUMPDEST DUP8 DUP3 SUB PUSH1 0x20 DUP10 ADD MSTORE PUSH2 0x2FB2 JUMP JUMPDEST SWAP5 ADD SWAP1 PUSH2 0xB52 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x309D PUSH2 0x2E2 JUMP JUMPDEST RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST SWAP2 POP PUSH1 0x20 SWAP1 PUSH2 0x30B3 PUSH2 0x235E JUMP JUMPDEST POP PUSH2 0x30C6 PUSH2 0x30C1 PUSH1 0x6 PUSH2 0x2D6D JUMP JUMPDEST PUSH2 0x2D7A JUMP JUMPDEST PUSH2 0x30F2 PUSH4 0x3808A90B SWAP5 SWAP3 SWAP5 PUSH2 0x30FD PUSH2 0x30DE PUSH1 0x7 PUSH2 0x239B JUMP JUMPDEST PUSH2 0x30E6 PUSH2 0x2E2 JUMP JUMPDEST SWAP8 DUP9 SWAP7 DUP8 SWAP6 DUP7 SWAP6 PUSH2 0x2D8B JUMP JUMPDEST DUP6 MSTORE PUSH1 0x4 DUP6 ADD PUSH2 0x305F JUMP JUMPDEST SUB SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x3142 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3114 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x3135 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x313B JUMPI JUMPDEST PUSH2 0x312D DUP2 DUP4 PUSH2 0x65F JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x2DA0 JUMP JUMPDEST CODESIZE PUSH2 0x3110 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x3123 JUMP JUMPDEST PUSH2 0x3095 JUMP JUMPDEST SWAP1 ISZERO ISZERO PUSH8 0x9A31110384E0B0C9 PUSH1 0x20 MSTORE CALLER PUSH1 0x14 MSTORE DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x34 PUSH1 0xC KECCAK256 SSTORE PUSH1 0x0 MSTORE PUSH1 0x60 SHL PUSH1 0x60 SHR CALLER PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 PUSH1 0x20 PUSH1 0x0 LOG3 JUMP JUMPDEST PUSH2 0x31A4 SWAP2 CALLER SWAP2 SWAP1 SWAP2 PUSH2 0x49FF JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x31C2 SWAP4 SWAP3 SWAP2 PUSH2 0x31BD PUSH2 0x31B8 PUSH2 0x2BAF JUMP JUMPDEST PUSH2 0x418E JUMP JUMPDEST PUSH2 0x31C4 JUMP JUMPDEST JUMP JUMPDEST SWAP2 PUSH2 0x31D2 SWAP4 SWAP2 SWAP1 SWAP2 SWAP3 PUSH2 0x4A51 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x31E0 SWAP4 SWAP3 SWAP2 PUSH2 0x31A6 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x3201 PUSH2 0x31FC PUSH2 0x3206 SWAP3 PUSH2 0x31F4 PUSH2 0x1C33 JUMP JUMPDEST POP PUSH1 0x5 PUSH2 0x2C6E JUMP JUMPDEST PUSH2 0x2C86 JUMP JUMPDEST PUSH2 0x4B25 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x3224 SWAP2 PUSH2 0x321F PUSH2 0x321A DUP3 PUSH2 0x23A8 JUMP JUMPDEST PUSH2 0x418E JUMP JUMPDEST PUSH2 0x3226 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x3230 SWAP2 PUSH2 0x469E JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x323C SWAP2 PUSH2 0x3209 JUMP JUMPDEST JUMP JUMPDEST SWAP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SUB DUP3 CALLDATASIZE SUB SUB DUP2 SLT ISZERO PUSH2 0x327F JUMPI ADD PUSH1 0x20 DUP2 CALLDATALOAD SWAP2 ADD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x327A JUMPI PUSH1 0x20 DUP3 MUL CALLDATASIZE SUB DUP4 SGT PUSH2 0x3275 JUMPI JUMP JUMPDEST PUSH2 0x2E21 JUMP JUMPDEST PUSH2 0x2E1C JUMP JUMPDEST PUSH2 0x2E26 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x329D DUP2 PUSH1 0x20 SWAP4 PUSH2 0x2DD1 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP2 PUSH2 0x32B5 DUP3 PUSH2 0x32BB SWAP3 PUSH2 0x3284 JUMP JUMPDEST SWAP3 PUSH2 0x328D JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x0 SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x32CF JUMPI POP POP POP POP SWAP1 JUMP JUMPDEST SWAP1 SWAP2 SWAP3 SWAP4 PUSH2 0x32F1 PUSH2 0x32EB PUSH1 0x1 SWAP3 PUSH2 0x32E6 DUP9 DUP7 PUSH2 0x2DBF JUMP JUMPDEST PUSH2 0x3290 JUMP JUMPDEST SWAP6 PUSH2 0x32A1 JUMP JUMPDEST SWAP3 ADD SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x32C1 JUMP JUMPDEST SWAP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SUB DUP3 CALLDATASIZE SUB SUB DUP2 SLT ISZERO PUSH2 0x333D JUMPI ADD PUSH1 0x20 DUP2 CALLDATALOAD SWAP2 ADD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x3338 JUMPI PUSH1 0x20 DUP3 MUL CALLDATASIZE SUB DUP4 SGT PUSH2 0x3333 JUMPI JUMP JUMPDEST PUSH2 0x2E21 JUMP JUMPDEST PUSH2 0x2E1C JUMP JUMPDEST PUSH2 0x2E26 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3357 SWAP1 PUSH2 0x42F JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP1 PUSH2 0x3368 DUP2 PUSH1 0x20 SWAP4 PUSH2 0x334E JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST POP PUSH2 0x337B SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x179A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP2 PUSH2 0x3392 DUP3 PUSH2 0x3398 SWAP3 PUSH2 0x3342 JUMP JUMPDEST SWAP3 PUSH2 0x334B JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x0 SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x33AC JUMPI POP POP POP POP SWAP1 JUMP JUMPDEST SWAP1 SWAP2 SWAP3 SWAP4 PUSH2 0x33CE PUSH2 0x33C8 PUSH1 0x1 SWAP3 PUSH2 0x33C3 DUP9 DUP7 PUSH2 0x336C JUMP JUMPDEST PUSH2 0x335B JUMP JUMPDEST SWAP6 PUSH2 0x337E JUMP JUMPDEST SWAP3 ADD SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x339E JUMP JUMPDEST SWAP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SUB DUP3 CALLDATASIZE SUB SUB DUP2 SLT ISZERO PUSH2 0x341A JUMPI ADD PUSH1 0x20 DUP2 CALLDATALOAD SWAP2 ADD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x3415 JUMPI PUSH1 0x20 DUP3 MUL CALLDATASIZE SUB DUP4 SGT PUSH2 0x3410 JUMPI JUMP JUMPDEST PUSH2 0x2E21 JUMP JUMPDEST PUSH2 0x2E1C JUMP JUMPDEST PUSH2 0x2E26 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 CALLDATACOPY JUMP JUMPDEST SWAP1 SWAP2 DUP3 PUSH2 0x3449 SWAP2 PUSH2 0x342B JUMP JUMPDEST SWAP2 PUSH1 0x1 DUP1 PUSH1 0xFB SHL SUB DUP2 GT PUSH2 0x346C JUMPI DUP3 SWAP2 PUSH1 0x20 PUSH2 0x3468 SWAP3 MUL SWAP4 DUP5 SWAP2 PUSH2 0x3439 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x3434 JUMP JUMPDEST SWAP1 PUSH2 0x347C SWAP3 SWAP2 PUSH2 0x343D JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SUB DUP3 CALLDATASIZE SUB SUB DUP2 SLT ISZERO PUSH2 0x34C0 JUMPI ADD PUSH1 0x20 DUP2 CALLDATALOAD SWAP2 ADD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x34BB JUMPI PUSH1 0x20 DUP3 MUL CALLDATASIZE SUB DUP4 SGT PUSH2 0x34B6 JUMPI JUMP JUMPDEST PUSH2 0x2E21 JUMP JUMPDEST PUSH2 0x2E1C JUMP JUMPDEST PUSH2 0x2E26 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH2 0x34D6 SWAP2 PUSH2 0x341F JUMP JUMPDEST SWAP1 DUP2 PUSH2 0x34E7 PUSH1 0x20 DUP4 MUL DUP5 ADD SWAP5 PUSH2 0x3428 JUMP JUMPDEST SWAP3 DUP4 PUSH1 0x0 SWAP3 JUMPDEST DUP5 DUP5 LT PUSH2 0x34FD JUMPI POP POP POP POP POP POP SWAP1 JUMP JUMPDEST SWAP1 SWAP2 SWAP3 SWAP4 SWAP5 SWAP6 PUSH1 0x20 PUSH2 0x3529 PUSH2 0x3523 DUP4 DUP6 PUSH1 0x1 SWAP6 SUB DUP9 MSTORE PUSH2 0x351D DUP12 DUP9 PUSH2 0x347F JUMP JUMPDEST SWAP1 PUSH2 0x3471 JUMP JUMPDEST SWAP9 PUSH2 0x34C5 JUMP JUMPDEST SWAP5 ADD SWAP5 ADD SWAP3 SWAP5 SWAP4 SWAP2 SWAP1 PUSH2 0x34ED JUMP JUMPDEST PUSH2 0x35B5 SWAP2 PUSH2 0x35A7 PUSH2 0x359C PUSH2 0x3581 PUSH2 0x3566 PUSH1 0x80 DUP6 ADD PUSH2 0x3558 PUSH1 0x0 DUP9 ADD DUP9 PUSH2 0x323E JUMP JUMPDEST SWAP1 DUP8 DUP4 SUB PUSH1 0x0 DUP10 ADD MSTORE PUSH2 0x32A7 JUMP JUMPDEST PUSH2 0x3573 PUSH1 0x20 DUP8 ADD DUP8 PUSH2 0x32FC JUMP JUMPDEST SWAP1 DUP7 DUP4 SUB PUSH1 0x20 DUP9 ADD MSTORE PUSH2 0x3384 JUMP JUMPDEST PUSH2 0x358E PUSH1 0x40 DUP7 ADD DUP7 PUSH2 0x33D9 JUMP JUMPDEST SWAP1 DUP6 DUP4 SUB PUSH1 0x40 DUP8 ADD MSTORE PUSH2 0x34CB JUMP JUMPDEST SWAP3 PUSH1 0x60 DUP2 ADD SWAP1 PUSH2 0x33D9 JUMP JUMPDEST SWAP2 PUSH1 0x60 DUP2 DUP6 SUB SWAP2 ADD MSTORE PUSH2 0x34CB JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP2 PUSH2 0x35DC SWAP3 PUSH2 0x35CF PUSH1 0x40 DUP3 ADD SWAP4 PUSH1 0x0 DUP4 ADD SWAP1 PUSH2 0x387 JUMP JUMPDEST PUSH1 0x20 DUP2 DUP5 SUB SWAP2 ADD MSTORE PUSH2 0x3537 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3601 JUMPI PUSH1 0x20 DUP1 SWAP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH2 0x649 JUMP JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x361B PUSH2 0x3616 DUP3 PUSH2 0x35E9 JUMP JUMPDEST PUSH2 0x78E JUMP JUMPDEST SWAP4 DUP2 DUP6 MSTORE PUSH1 0x20 DUP1 DUP7 ADD SWAP3 MUL DUP4 ADD SWAP3 DUP2 DUP5 GT PUSH2 0x3658 JUMPI SWAP2 JUMPDEST DUP4 DUP4 LT PUSH2 0x363F JUMPI POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 SWAP2 PUSH2 0x364D DUP5 DUP7 PUSH2 0xB24 JUMP JUMPDEST DUP2 MSTORE ADD SWAP3 ADD SWAP2 PUSH2 0x3632 JUMP JUMPDEST PUSH2 0x9FB JUMP JUMPDEST PUSH2 0x3668 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3606 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3674 SWAP1 PUSH2 0x332 JUMP JUMPDEST PUSH1 0x0 DUP2 EQ PUSH2 0x3683 JUMPI PUSH1 0x1 SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH2 0x2517 JUMP JUMPDEST SWAP1 PUSH2 0x3692 SWAP1 PUSH2 0xBAD JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 CALLDATALOAD SWAP1 PUSH1 0x1 PUSH1 0x20 SUB DUP2 CALLDATASIZE SUB SUB DUP3 SLT ISZERO PUSH2 0x36F1 JUMPI ADD DUP1 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x36EC JUMPI PUSH1 0x20 ADD SWAP2 PUSH1 0x20 DUP3 MUL CALLDATASIZE SUB DUP4 SGT PUSH2 0x36E7 JUMPI JUMP JUMPDEST PUSH2 0x36AA JUMP JUMPDEST PUSH2 0x36A5 JUMP JUMPDEST PUSH2 0x36A0 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x3720 JUMPI PUSH1 0x20 MUL ADD SWAP1 JUMP JUMPDEST PUSH2 0x36FA JUMP JUMPDEST CALLDATALOAD PUSH2 0x372F DUP2 PUSH2 0x30E JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 CALLDATALOAD SWAP1 PUSH1 0x1 PUSH1 0x20 SUB DUP2 CALLDATASIZE SUB SUB DUP3 SLT ISZERO PUSH2 0x3774 JUMPI ADD DUP1 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x376F JUMPI PUSH1 0x20 ADD SWAP2 PUSH1 0x20 DUP3 MUL CALLDATASIZE SUB DUP4 SGT PUSH2 0x376A JUMPI JUMP JUMPDEST PUSH2 0x36AA JUMP JUMPDEST PUSH2 0x36A5 JUMP JUMPDEST PUSH2 0x36A0 JUMP JUMPDEST SWAP1 CALLDATALOAD SWAP1 PUSH1 0x1 PUSH1 0x20 SUB DUP2 CALLDATASIZE SUB SUB DUP3 SLT ISZERO PUSH2 0x37BB JUMPI ADD DUP1 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x37B6 JUMPI PUSH1 0x20 ADD SWAP2 PUSH1 0x20 DUP3 MUL CALLDATASIZE SUB DUP4 SGT PUSH2 0x37B1 JUMPI JUMP JUMPDEST PUSH2 0x36AA JUMP JUMPDEST PUSH2 0x36A5 JUMP JUMPDEST PUSH2 0x36A0 JUMP JUMPDEST SWAP1 DUP3 LT ISZERO PUSH2 0x37DB JUMPI PUSH1 0x20 PUSH2 0x37D7 SWAP3 MUL DUP2 ADD SWAP1 PUSH2 0x3779 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH2 0x36FA JUMP JUMPDEST SWAP1 CALLDATALOAD SWAP1 PUSH1 0x1 PUSH1 0x20 SUB DUP2 CALLDATASIZE SUB SUB DUP3 SLT ISZERO PUSH2 0x3822 JUMPI ADD DUP1 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x381D JUMPI PUSH1 0x20 ADD SWAP2 PUSH1 0x20 DUP3 MUL CALLDATASIZE SUB DUP4 SGT PUSH2 0x3818 JUMPI JUMP JUMPDEST PUSH2 0x36AA JUMP JUMPDEST PUSH2 0x36A5 JUMP JUMPDEST PUSH2 0x36A0 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x3837 JUMPI PUSH1 0x20 MUL ADD SWAP1 JUMP JUMPDEST PUSH2 0x36FA JUMP JUMPDEST CALLDATALOAD PUSH2 0x3846 DUP2 PUSH2 0x1785 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3852 SWAP1 PUSH2 0x1F78 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x385E SWAP1 PUSH2 0x3849 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x386A SWAP1 PUSH2 0x217F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP2 SUB SLT PUSH2 0x3878 JUMPI JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST SWAP1 SWAP2 DUP3 PUSH2 0x3889 SWAP2 PUSH2 0x1090 JUMP JUMPDEST SWAP2 PUSH1 0x1 DUP1 PUSH1 0xFB SHL SUB DUP2 GT PUSH2 0x38AC JUMPI DUP3 SWAP2 PUSH1 0x20 PUSH2 0x38A8 SWAP3 MUL SWAP4 DUP5 SWAP2 PUSH2 0x3439 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x3434 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH2 0x38D9 PUSH2 0x38E2 PUSH1 0x20 SWAP4 PUSH2 0x38E7 SWAP4 PUSH2 0x38D0 DUP2 PUSH2 0x35E5 JUMP JUMPDEST SWAP4 DUP5 DUP1 SWAP4 PUSH2 0x38B1 JUMP JUMPDEST SWAP6 DUP7 SWAP2 ADD PUSH2 0x6E0 JUMP JUMPDEST PUSH2 0x63F JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST SWAP4 PUSH2 0x3918 PUSH2 0x3934 SWAP7 SWAP5 SWAP3 PUSH2 0x3926 SWAP5 PUSH2 0x390B PUSH1 0x80 DUP10 ADD SWAP3 PUSH1 0x0 DUP11 ADD SWAP1 PUSH2 0xC5E JUMP JUMPDEST DUP8 DUP3 SUB PUSH1 0x20 DUP10 ADD MSTORE PUSH2 0x10C3 JUMP JUMPDEST SWAP2 DUP6 DUP4 SUB PUSH1 0x40 DUP8 ADD MSTORE PUSH2 0x387D JUMP JUMPDEST SWAP2 PUSH1 0x60 DUP2 DUP5 SUB SWAP2 ADD MSTORE PUSH2 0x38BA JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3940 SWAP1 PUSH2 0x1F78 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x394C SWAP1 PUSH2 0x3937 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3958 SWAP1 PUSH2 0x217F JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x3965 DUP3 PUSH2 0x108C JUMP JUMPDEST DUP2 LT ISZERO PUSH2 0x3976 JUMPI PUSH1 0x20 DUP1 SWAP2 MUL ADD ADD SWAP1 JUMP JUMPDEST PUSH2 0x36FA JUMP JUMPDEST PUSH2 0x3985 SWAP1 MLOAD PUSH2 0x332 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH2 0x3994 SWAP2 ADD PUSH2 0x332 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP3 PUSH2 0x3A13 PUSH2 0x3A19 SWAP2 PUSH2 0x3A0E SWAP4 SWAP8 SWAP5 PUSH2 0x39B0 DUP8 DUP10 SWAP1 PUSH2 0x470E JUMP JUMPDEST SWAP6 SWAP1 SWAP6 PUSH2 0x39DE DUP12 SWAP2 PUSH2 0x39CF PUSH2 0x39C3 PUSH2 0x2E2 JUMP JUMPDEST SWAP4 DUP5 SWAP3 PUSH1 0x20 DUP5 ADD PUSH2 0x35B8 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE SUB DUP3 PUSH2 0x65F JUMP JUMPDEST PUSH2 0x39F0 PUSH2 0x39EA DUP3 PUSH2 0x35E5 JUMP JUMPDEST SWAP2 PUSH2 0x35DF JUMP JUMPDEST KECCAK256 SWAP2 SWAP3 PUSH2 0x3A07 PUSH2 0x3A02 PUSH1 0xC DUP13 SWAP1 PUSH2 0xF0E JUMP JUMPDEST PUSH2 0x239B JUMP JUMPDEST SWAP3 SWAP4 PUSH2 0x365D JUMP JUMPDEST PUSH2 0x4B45 JUMP JUMPDEST ISZERO PUSH2 0x42F JUMP JUMPDEST PUSH2 0x3DF1 JUMPI PUSH2 0x3AA3 SWAP1 PUSH2 0x3A45 PUSH1 0x0 PUSH2 0x3A40 PUSH2 0x3A39 PUSH1 0xF SWAP10 SWAP7 SWAP9 SWAP10 DUP9 SWAP1 PUSH2 0x2197 JUMP JUMPDEST DUP10 SWAP1 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x1D91 JUMP JUMPDEST PUSH2 0x3A6B PUSH2 0x3A54 PUSH1 0xE DUP9 SWAP1 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x3A65 PUSH2 0x3A60 DUP3 PUSH2 0x21C9 JUMP JUMPDEST PUSH2 0x366B JUMP JUMPDEST SWAP1 PUSH2 0x2AF0 JUMP JUMPDEST PUSH2 0x3A9E PUSH2 0x3A8C PUSH2 0x3A85 PUSH2 0x3A80 PUSH1 0xE DUP11 SWAP1 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x21C9 JUMP JUMPDEST DUP9 SWAP1 PUSH2 0x4B96 JUMP JUMPDEST SWAP2 PUSH2 0x3A99 PUSH1 0x10 DUP10 SWAP1 PUSH2 0x3688 JUMP JUMPDEST PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x2AF0 JUMP JUMPDEST PUSH2 0x3AAB PUSH2 0x1C33 JUMP JUMPDEST SWAP3 JUMPDEST DUP4 PUSH2 0x3AD6 PUSH2 0x3AD0 PUSH2 0x3ACB PUSH2 0x3AC5 DUP7 PUSH1 0x0 DUP2 ADD SWAP1 PUSH2 0x36AF JUMP JUMPDEST SWAP1 PUSH2 0x36F6 JUMP JUMPDEST PUSH2 0x332 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST LT ISZERO PUSH2 0x3DB1 JUMPI PUSH2 0x3AFC PUSH2 0x3AF7 PUSH2 0x3AF0 DUP5 PUSH1 0x0 DUP2 ADD SWAP1 PUSH2 0x36AF JUMP JUMPDEST DUP8 SWAP2 PUSH2 0x3710 JUMP JUMPDEST PUSH2 0x3725 JUMP JUMPDEST SWAP2 PUSH2 0x3B1E PUSH2 0x3B18 PUSH2 0x3B11 DUP4 PUSH1 0x40 DUP2 ADD SWAP1 PUSH2 0x3732 JUMP JUMPDEST DUP9 SWAP2 PUSH2 0x37C0 JUMP JUMPDEST SWAP1 PUSH2 0x2659 JUMP JUMPDEST SWAP6 PUSH2 0x3B3F PUSH2 0x3B3A PUSH2 0x3B33 DUP5 PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x37E0 JUMP JUMPDEST DUP10 SWAP2 PUSH2 0x3827 JUMP JUMPDEST PUSH2 0x383C JUMP JUMPDEST PUSH1 0x0 EQ PUSH2 0x3C3B JUMPI PUSH2 0x3B4E PUSH2 0x1C33 JUMP JUMPDEST JUMPDEST DUP1 PUSH2 0x3B6A PUSH2 0x3B64 PUSH2 0x3B5F DUP12 PUSH2 0x108C JUMP JUMPDEST PUSH2 0x332 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST LT ISZERO PUSH2 0x3C22 JUMPI PUSH2 0x3B81 PUSH2 0x3B7C DUP7 PUSH2 0x3943 JUMP JUMPDEST PUSH2 0x394F JUMP JUMPDEST SWAP1 PUSH4 0x40C10F19 DUP8 PUSH2 0x3B9B PUSH2 0x3B96 DUP13 DUP6 SWAP1 PUSH2 0x395B JUMP JUMPDEST PUSH2 0x397B JUMP JUMPDEST SWAP4 DUP1 EXTCODESIZE ISZERO PUSH2 0x3C1D JUMPI PUSH2 0x3BC1 PUSH1 0x0 DUP1 SWAP5 PUSH2 0x3BCC PUSH2 0x3BB5 PUSH2 0x2E2 JUMP JUMPDEST SWAP9 DUP10 SWAP7 DUP8 SWAP6 DUP7 SWAP5 PUSH2 0x2D8B JUMP JUMPDEST DUP5 MSTORE PUSH1 0x4 DUP5 ADD PUSH2 0xC6B JUMP JUMPDEST SUB SWAP3 GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x3C18 JUMPI PUSH2 0x3BE6 SWAP3 PUSH2 0x3BEB JUMPI JUMPDEST POP PUSH2 0x3988 JUMP JUMPDEST PUSH2 0x3B4F JUMP JUMPDEST PUSH2 0x3C0B SWAP1 PUSH1 0x0 RETURNDATASIZE DUP2 GT PUSH2 0x3C11 JUMPI JUMPDEST PUSH2 0x3C03 DUP2 DUP4 PUSH2 0x65F JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x386D JUMP JUMPDEST CODESIZE PUSH2 0x3BE0 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x3BF9 JUMP JUMPDEST PUSH2 0x3095 JUMP JUMPDEST PUSH2 0x2D86 JUMP JUMPDEST POP SWAP5 SWAP1 SWAP6 POP PUSH2 0x3C33 SWAP2 SWAP3 POP JUMPDEST PUSH2 0x3988 JUMP JUMPDEST SWAP3 SWAP4 SWAP1 PUSH2 0x3AAD JUMP JUMPDEST SWAP5 SWAP1 SWAP6 SWAP2 SWAP3 DUP5 SWAP3 PUSH32 0x0 PUSH2 0x3C7E PUSH2 0x3C78 PUSH2 0x3C73 PUSH1 0x0 PUSH2 0x24E2 JUMP JUMPDEST PUSH2 0x302 JUMP JUMPDEST SWAP2 PUSH2 0x302 JUMP JUMPDEST EQ ISZERO DUP1 PUSH2 0x3D96 JUMPI JUMPDEST PUSH2 0x3D6D JUMPI JUMPDEST PUSH2 0x3CC6 PUSH2 0x3CC1 PUSH2 0x3CAC PUSH2 0x3CBB DUP10 PUSH2 0x3CA0 PUSH2 0x2E2 JUMP JUMPDEST SWAP3 DUP4 SWAP2 PUSH1 0x20 DUP4 ADD PUSH2 0x11F9 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE SUB DUP3 PUSH2 0x65F JUMP JUMPDEST SWAP4 PUSH2 0x3855 JUMP JUMPDEST PUSH2 0x3861 JUMP JUMPDEST PUSH4 0xB48AB8B6 SWAP5 SWAP2 SWAP5 PUSH2 0x3CE6 PUSH2 0x3CDF DUP12 PUSH1 0x60 DUP2 ADD SWAP1 PUSH2 0x3732 JUMP JUMPDEST DUP8 SWAP2 PUSH2 0x37C0 JUMP JUMPDEST SWAP1 SWAP5 SWAP2 DUP4 EXTCODESIZE ISZERO PUSH2 0x3D68 JUMPI PUSH2 0x3D1C PUSH2 0x3D11 SWAP4 PUSH1 0x0 SWAP8 SWAP4 DUP9 SWAP5 PUSH2 0x3D05 PUSH2 0x2E2 JUMP JUMPDEST SWAP12 DUP13 SWAP10 DUP11 SWAP9 DUP10 SWAP8 PUSH2 0x2D8B JUMP JUMPDEST DUP8 MSTORE PUSH1 0x4 DUP8 ADD PUSH2 0x38EB JUMP JUMPDEST SUB SWAP3 GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x3D63 JUMPI PUSH2 0x3C33 SWAP3 PUSH2 0x3D36 JUMPI JUMPDEST POP PUSH2 0x3C2E JUMP JUMPDEST PUSH2 0x3D56 SWAP1 PUSH1 0x0 RETURNDATASIZE DUP2 GT PUSH2 0x3D5C JUMPI JUMPDEST PUSH2 0x3D4E DUP2 DUP4 PUSH2 0x65F JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x386D JUMP JUMPDEST CODESIZE PUSH2 0x3D30 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x3D44 JUMP JUMPDEST PUSH2 0x3095 JUMP JUMPDEST PUSH2 0x2D86 JUMP JUMPDEST SWAP3 POP PUSH32 0x0 SWAP3 PUSH2 0x3C8B JUMP JUMPDEST POP CALLER PUSH2 0x3DAA PUSH2 0x3DA4 DUP9 PUSH2 0x302 JUMP JUMPDEST SWAP2 PUSH2 0x302 JUMP JUMPDEST EQ ISZERO PUSH2 0x3C86 JUMP JUMPDEST SWAP4 SWAP3 POP POP SWAP1 PUSH32 0xF254AACE0EF98D6AC1A0D84C95648F8E3F7A1881DBB43393709ECD004B00F103 SWAP2 PUSH2 0x3DEC PUSH2 0x3DE3 PUSH2 0x2E2 JUMP JUMPDEST SWAP3 DUP4 SWAP3 DUP4 PUSH2 0xC6B JUMP JUMPDEST SUB SWAP1 LOG1 JUMP JUMPDEST PUSH1 0x0 PUSH4 0x9BDE339 PUSH1 0xE0 SHL DUP2 MSTORE DUP1 PUSH2 0x3E0A PUSH1 0x4 DUP3 ADD PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x3E16 PUSH2 0x1C5C JUMP JUMPDEST POP PUSH8 0x9A31110384E0B0C9 PUSH1 0x20 MSTORE PUSH1 0x14 MSTORE PUSH1 0x0 MSTORE PUSH1 0x34 PUSH1 0xC KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH2 0x3E4B SWAP1 PUSH2 0x3E46 PUSH2 0x3E41 PUSH2 0x1F39 JUMP JUMPDEST PUSH2 0x418E JUMP JUMPDEST PUSH2 0x3E4D JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x3E58 SWAP1 PUSH1 0x7 PUSH2 0x2AD0 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x3E63 SWAP1 PUSH2 0x3E32 JUMP JUMPDEST JUMP JUMPDEST SWAP5 SWAP1 SWAP2 SWAP5 PUSH2 0x3E71 PUSH2 0x4601 JUMP JUMPDEST PUSH2 0x400F JUMPI JUMPDEST PUSH1 0x60 SHL PUSH8 0x9A31110384E0B0C9 OR SWAP2 PUSH1 0x60 SHL PUSH8 0x9A31110384E0B0C9 OR SWAP2 DUP1 PUSH1 0x20 MSTORE PUSH1 0x60 SHR SWAP3 DUP3 PUSH1 0x60 SHR SWAP3 DUP4 ISZERO PUSH2 0x4001 JUMPI DUP5 CALLER SUB PUSH2 0x3FE5 JUMPI JUMPDEST DUP7 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP1 SLOAD DUP1 DUP5 GT PUSH2 0x3FD7 JUMPI DUP4 SWAP1 SUB SWAP1 SSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP1 SLOAD SWAP1 DUP3 DUP3 ADD SWAP2 DUP3 LT PUSH2 0x3FC9 JUMPI SSTORE DUP1 PUSH1 0x20 MSTORE DUP3 DUP5 CALLER PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 PUSH1 0x0 LOG4 PUSH2 0x3F0F PUSH2 0x460F JUMP JUMPDEST PUSH2 0x3FA4 JUMPI JUMPDEST DUP3 EXTCODESIZE PUSH2 0x3F23 JUMPI JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 SWAP5 DUP3 SWAP2 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP7 PUSH4 0xF23A6E61 DUP9 MSTORE CALLER DUP10 DUP10 ADD MSTORE PUSH1 0x40 DUP9 ADD MSTORE PUSH1 0x60 DUP8 ADD MSTORE PUSH1 0x80 DUP7 ADD MSTORE PUSH1 0xA0 DUP1 DUP7 ADD MSTORE DUP2 PUSH1 0xC0 DUP7 ADD MSTORE PUSH1 0xE0 DUP6 ADD CALLDATACOPY PUSH1 0xC4 ADD SWAP1 PUSH1 0x0 PUSH1 0x1C DUP5 ADD SWAP2 GAS CALL ISZERO PUSH2 0x3F95 JUMPI JUMPDEST PUSH4 0xF23A6E61 PUSH1 0xE0 SHL SWAP1 MLOAD SUB PUSH2 0x3F87 JUMPI CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x3F1B JUMP JUMPDEST PUSH4 0x9C05499B PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x3F6D JUMPI RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH2 0x3FAD DUP7 PUSH2 0x4BE5 JUMP JUMPDEST POP PUSH2 0x3FB7 DUP2 PUSH2 0x4BE5 JUMP JUMPDEST POP PUSH2 0x3FC3 DUP6 DUP4 SWAP1 PUSH2 0x2667 JUMP JUMPDEST POP PUSH2 0x3F14 JUMP JUMPDEST PUSH4 0x1336CEA PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0xF4D678B8 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST CALLER PUSH1 0x0 MSTORE PUSH1 0x34 PUSH1 0xC KECCAK256 SLOAD PUSH2 0x3EAD JUMPI PUSH4 0x4B6E7F18 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0xEA553B34 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH2 0x4018 DUP7 PUSH2 0x4BE5 JUMP JUMPDEST POP PUSH2 0x4022 DUP5 PUSH2 0x4BE5 JUMP JUMPDEST POP PUSH2 0x402E DUP6 DUP4 SWAP1 PUSH2 0x2667 JUMP JUMPDEST POP PUSH2 0x3E76 JUMP JUMPDEST PUSH2 0x4043 PUSH2 0x4049 SWAP2 SWAP4 SWAP3 SWAP4 PUSH2 0x332 JUMP JUMPDEST SWAP3 PUSH2 0x332 JUMP JUMPDEST DUP3 ADD DUP1 SWAP3 GT PUSH2 0x4054 JUMPI JUMP JUMPDEST PUSH2 0x2517 JUMP JUMPDEST PUSH2 0x4077 PUSH2 0x4072 PUSH2 0x406B PUSH1 0xF CALLER SWAP1 PUSH2 0x2197 JUMP JUMPDEST DUP4 SWAP1 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x21C9 JUMP JUMPDEST PUSH2 0x408A PUSH2 0x4084 PUSH1 0x0 PUSH2 0x21D6 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST SUB PUSH2 0x411B JUMPI PUSH2 0x40A4 CALLER DUP3 PUSH2 0x409E PUSH1 0x1 PUSH2 0x2209 JUMP JUMPDEST SWAP2 PUSH2 0x49FF JUMP JUMPDEST PUSH2 0x40D6 PUSH2 0x40BB NUMBER PUSH2 0x40B5 PUSH1 0x1 PUSH2 0x2209 JUMP JUMPDEST SWAP1 PUSH2 0x4034 JUMP JUMPDEST PUSH2 0x40D1 PUSH2 0x40CA PUSH1 0xF CALLER SWAP1 PUSH2 0x2197 JUMP JUMPDEST DUP5 SWAP1 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x2AF0 JUMP JUMPDEST CALLER PUSH2 0x4116 PUSH2 0x4104 PUSH32 0x5E1DD8C4451717D5CA4FFBEFDADA35E22E0871220B9ED9DD03A351F0938C5ED7 SWAP3 PUSH2 0x218B JUMP JUMPDEST SWAP3 PUSH2 0x410D PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x394 JUMP JUMPDEST SUB SWAP1 LOG2 JUMP JUMPDEST PUSH1 0x0 PUSH4 0x156F9043 PUSH1 0xE2 SHL DUP2 MSTORE DUP1 PUSH2 0x4134 PUSH1 0x4 DUP3 ADD PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x4140 PUSH2 0x1C5C JUMP JUMPDEST POP PUSH4 0xC79B8B5F PUSH1 0xE0 SHL PUSH2 0x415B PUSH2 0x4155 DUP4 PUSH2 0x3E0 JUMP JUMPDEST SWAP2 PUSH2 0x3E0 JUMP JUMPDEST EQ DUP1 ISZERO PUSH2 0x417F JUMPI JUMPDEST SWAP1 DUP2 ISZERO PUSH2 0x416F JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x4179 SWAP2 POP PUSH2 0x4C05 JUMP JUMPDEST CODESIZE PUSH2 0x416B JUMP JUMPDEST POP PUSH2 0x4189 DUP2 PUSH2 0x4C05 JUMP JUMPDEST PUSH2 0x4163 JUMP JUMPDEST PUSH2 0x41A0 SWAP1 PUSH2 0x419A PUSH2 0x4691 JUMP JUMPDEST SWAP1 PUSH2 0x4D12 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x20 PUSH32 0x2073616C65507269636500000000000000000000000000000000000000000000 SWAP2 PUSH32 0x455243323938313A20726F79616C7479206665652077696C6C20657863656564 PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x41FD PUSH1 0x2A PUSH1 0x40 SWAP3 PUSH2 0x6D7 JUMP JUMPDEST PUSH2 0x4206 DUP2 PUSH2 0x41A2 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x4220 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x41F0 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x422A JUMPI JUMP JUMPDEST PUSH2 0x4232 PUSH2 0x2E2 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x4248 PUSH1 0x4 DUP3 ADD PUSH2 0x420A JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH32 0x455243323938313A20696E76616C696420726563656976657200000000000000 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x4281 PUSH1 0x19 PUSH1 0x20 SWAP3 PUSH2 0x6D7 JUMP JUMPDEST PUSH2 0x428A DUP2 PUSH2 0x424C JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x42A4 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x4274 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x42AE JUMPI JUMP JUMPDEST PUSH2 0x42B6 PUSH2 0x2E2 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x42CC PUSH1 0x4 DUP3 ADD PUSH2 0x428E JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x42DA PUSH1 0x40 PUSH2 0x78E JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x42F5 PUSH2 0x42F0 PUSH2 0x42FC SWAP3 PUSH2 0x218B JUMP JUMPDEST PUSH2 0x42DD JUMP JUMPDEST DUP3 SLOAD PUSH2 0x1FAC JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH1 0xA0 SHL SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x4320 PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xA0 SHL SWAP2 PUSH2 0x4300 JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST PUSH2 0x433E PUSH2 0x4339 PUSH2 0x4343 SWAP3 PUSH2 0x48C JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x48C JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x435E PUSH2 0x4359 PUSH2 0x4365 SWAP3 PUSH2 0x432A JUMP JUMPDEST PUSH2 0x4346 JUMP JUMPDEST DUP3 SLOAD PUSH2 0x4306 JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST SWAP1 PUSH2 0x4394 PUSH1 0x20 PUSH1 0x0 PUSH2 0x439A SWAP5 PUSH2 0x438C DUP3 DUP3 ADD PUSH2 0x4386 DUP5 DUP9 ADD PUSH2 0x24B9 JUMP JUMPDEST SWAP1 PUSH2 0x42E0 JUMP JUMPDEST ADD SWAP3 ADD PUSH2 0x24EE JUMP JUMPDEST SWAP1 PUSH2 0x4349 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x43A6 SWAP2 PUSH2 0x4369 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x4419 PUSH2 0x4420 SWAP3 PUSH2 0x43D4 DUP4 PUSH2 0x43CD PUSH2 0x43C7 PUSH2 0x43C2 PUSH2 0x45EA JUMP JUMPDEST PUSH2 0x48C JUMP JUMPDEST SWAP2 PUSH2 0x48C JUMP JUMPDEST GT ISZERO PUSH2 0x4223 JUMP JUMPDEST PUSH2 0x43FA DUP2 PUSH2 0x43F3 PUSH2 0x43ED PUSH2 0x43E8 PUSH1 0x0 PUSH2 0x24E2 JUMP JUMPDEST PUSH2 0x302 JUMP JUMPDEST SWAP2 PUSH2 0x302 JUMP JUMPDEST EQ ISZERO PUSH2 0x42A7 JUMP JUMPDEST SWAP2 PUSH2 0x4410 PUSH2 0x4406 PUSH2 0x42D0 JUMP JUMPDEST SWAP4 PUSH1 0x0 DUP6 ADD PUSH2 0x2413 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD PUSH2 0x2459 JUMP JUMPDEST PUSH1 0x2 PUSH2 0x439C JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x442B PUSH2 0x2016 JUMP JUMPDEST POP PUSH1 0x80 PUSH1 0x40 MLOAD ADD SWAP2 PUSH1 0x20 DUP4 ADD PUSH1 0x40 MSTORE PUSH1 0x0 DUP4 MSTORE DUP3 SWAP1 PUSH1 0xA PUSH1 0x0 NOT DUP1 SWAP3 SWAP6 JUMPDEST ADD SWAP5 DUP2 DUP2 MOD PUSH1 0x30 ADD DUP7 MSTORE8 DIV SWAP4 DUP5 ISZERO PUSH2 0x4468 JUMPI SWAP1 PUSH1 0xA SWAP2 SWAP1 DUP1 SWAP3 SWAP2 PUSH2 0x4449 JUMP JUMPDEST SWAP4 POP POP DUP3 PUSH1 0x20 SWAP2 SUB SWAP3 SUB SWAP2 DUP3 MSTORE JUMP JUMPDEST PUSH2 0x44C5 SWAP2 SWAP3 PUSH2 0x4491 PUSH2 0x44CB SWAP6 PUSH2 0x44B6 SWAP4 SWAP1 DUP7 DUP5 SWAP2 SWAP3 PUSH2 0x4DAB JUMP JUMPDEST PUSH2 0x44AE PUSH2 0x44A7 DUP3 PUSH2 0x44A2 PUSH1 0x0 PUSH2 0x21C9 JUMP JUMPDEST PUSH2 0x4034 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2AF0 JUMP JUMPDEST SWAP3 PUSH1 0x1 PUSH2 0xBC9 JUMP JUMPDEST SWAP2 PUSH2 0x44C0 DUP4 PUSH2 0x21C9 JUMP JUMPDEST PUSH2 0x4034 JUMP JUMPDEST SWAP1 PUSH2 0x2AF0 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x44DC PUSH2 0x44E2 SWAP2 SWAP4 SWAP3 SWAP4 PUSH2 0x332 JUMP JUMPDEST SWAP3 PUSH2 0x332 JUMP JUMPDEST DUP3 SUB SWAP2 DUP3 GT PUSH2 0x44ED JUMPI JUMP JUMPDEST PUSH2 0x2517 JUMP JUMPDEST PUSH2 0x4501 SWAP1 SWAP4 SWAP3 SWAP4 DUP3 DUP6 SWAP2 PUSH2 0x4EAC JUMP JUMPDEST PUSH2 0x450A DUP2 PUSH2 0x108C JUMP JUMPDEST SWAP3 PUSH2 0x4515 PUSH1 0x0 PUSH2 0x21D6 JUMP JUMPDEST SWAP3 PUSH2 0x451E PUSH2 0x1C33 JUMP JUMPDEST SWAP4 JUMPDEST DUP5 PUSH2 0x4533 PUSH2 0x452D DUP9 PUSH2 0x332 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST LT ISZERO PUSH2 0x45A0 JUMPI PUSH2 0x4594 PUSH2 0x459A SWAP2 PUSH2 0x4553 PUSH2 0x454E DUP7 DUP10 SWAP1 PUSH2 0x395B JUMP JUMPDEST PUSH2 0x397B JUMP JUMPDEST PUSH2 0x458E DUP9 PUSH2 0x4588 PUSH2 0x4579 DUP11 PUSH2 0x4573 PUSH2 0x456E DUP8 SWAP6 PUSH1 0x1 SWAP4 PUSH2 0x395B JUMP JUMPDEST PUSH2 0x397B JUMP JUMPDEST SWAP1 PUSH2 0xBC9 JUMP JUMPDEST SWAP2 PUSH2 0x4583 DUP4 PUSH2 0x21C9 JUMP JUMPDEST PUSH2 0x44CD JUMP JUMPDEST SWAP1 PUSH2 0x2AF0 JUMP JUMPDEST SWAP1 PUSH2 0x4034 JUMP JUMPDEST SWAP5 PUSH2 0x3988 JUMP JUMPDEST SWAP4 PUSH2 0x4520 JUMP JUMPDEST SWAP2 POP SWAP4 POP PUSH2 0x45C4 SWAP3 POP PUSH2 0x45BD SWAP2 POP PUSH2 0x45B8 PUSH1 0x0 PUSH2 0x21C9 JUMP JUMPDEST PUSH2 0x44CD JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2AF0 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x45E2 PUSH2 0x45DD PUSH2 0x45E7 SWAP3 PUSH2 0x45CB JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x48C JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x45F2 PUSH2 0x45C6 JUMP JUMPDEST POP PUSH2 0x45FE PUSH2 0x2710 PUSH2 0x45CE JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x4609 PUSH2 0x1C5C JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x4617 PUSH2 0x1C5C JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST POP POP SWAP5 SWAP3 SWAP4 SWAP1 SWAP4 PUSH2 0x462C PUSH2 0x460F JUMP JUMPDEST PUSH2 0x4639 JUMPI JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x464F PUSH2 0x4655 SWAP4 PUSH2 0x465B SWAP8 SWAP7 SWAP1 SWAP3 SWAP4 SWAP6 SWAP7 PUSH2 0x2659 JUMP JUMPDEST POP PUSH2 0x2659 JUMP JUMPDEST POP PUSH2 0x2667 JUMP JUMPDEST POP CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x4631 JUMP JUMPDEST SWAP1 PUSH2 0x4689 PUSH2 0x4684 PUSH2 0x468E SWAP4 PUSH2 0x467D DUP2 DUP6 SWAP1 PUSH2 0x4F0C JUMP JUMPDEST PUSH1 0x5 PUSH2 0x2C6E JUMP JUMPDEST PUSH2 0x2C86 JUMP JUMPDEST PUSH2 0x4FF3 JUMP JUMPDEST POP JUMP JUMPDEST PUSH2 0x4699 PUSH2 0x23CA JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x46C0 PUSH2 0x46BB PUSH2 0x46C5 SWAP4 PUSH2 0x46B4 DUP2 DUP6 SWAP1 PUSH2 0x502E JUMP JUMPDEST PUSH1 0x5 PUSH2 0x2C6E JUMP JUMPDEST PUSH2 0x2C86 JUMP JUMPDEST PUSH2 0x50C8 JUMP JUMPDEST POP JUMP JUMPDEST SWAP2 PUSH1 0x20 PUSH2 0x46EA SWAP3 SWAP5 SWAP4 PUSH2 0x46E3 PUSH1 0x40 DUP3 ADD SWAP7 PUSH1 0x0 DUP4 ADD SWAP1 PUSH2 0xB52 JUMP JUMPDEST ADD SWAP1 PUSH2 0xC5E JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x46F8 PUSH2 0x46FE SWAP2 PUSH2 0x332 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST SWAP1 DUP2 ISZERO PUSH2 0x4709 JUMPI MOD SWAP1 JUMP JUMPDEST PUSH2 0x2562 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH2 0x4719 PUSH2 0x1C33 JUMP JUMPDEST POP PUSH2 0x4722 PUSH2 0x1C33 JUMP JUMPDEST POP PUSH2 0x4737 PUSH2 0x4732 PUSH1 0xE DUP6 SWAP1 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x21C9 JUMP JUMPDEST PUSH2 0x474A PUSH2 0x4744 PUSH1 0x0 PUSH2 0x21D6 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST EQ PUSH2 0x4853 JUMPI PUSH2 0x476D PUSH2 0x4768 PUSH2 0x4761 PUSH1 0xF DUP5 SWAP1 PUSH2 0x2197 JUMP JUMPDEST DUP6 SWAP1 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x21C9 JUMP JUMPDEST DUP1 PUSH2 0x4781 PUSH2 0x477B PUSH1 0x0 PUSH2 0x21D6 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST EQ PUSH2 0x4836 JUMPI BLOCKHASH SWAP1 PUSH2 0x4791 DUP3 PUSH2 0x21F2 JUMP JUMPDEST PUSH2 0x47A4 PUSH2 0x479E PUSH1 0x0 PUSH2 0x21D6 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST EQ PUSH2 0x4819 JUMPI PUSH2 0x47F5 PUSH2 0x480F SWAP2 PUSH2 0x47DD PUSH2 0x4816 SWAP5 PUSH2 0x47CE PUSH2 0x47C2 PUSH2 0x2E2 JUMP JUMPDEST SWAP4 DUP5 SWAP3 PUSH1 0x20 DUP5 ADD PUSH2 0x46C8 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE SUB DUP3 PUSH2 0x65F JUMP JUMPDEST PUSH2 0x47EF PUSH2 0x47E9 DUP3 PUSH2 0x35E5 JUMP JUMPDEST SWAP2 PUSH2 0x35DF JUMP JUMPDEST KECCAK256 PUSH2 0x21F2 JUMP JUMPDEST PUSH2 0x4809 PUSH2 0x4804 PUSH1 0xE DUP8 SWAP1 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x21C9 JUMP JUMPDEST SWAP1 PUSH2 0x46EC JUMP JUMPDEST SWAP3 DUP4 PUSH2 0x4B96 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH4 0xB7B33787 PUSH1 0xE0 SHL DUP2 MSTORE DUP1 PUSH2 0x4832 PUSH1 0x4 DUP3 ADD PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH4 0x7DE832B5 PUSH1 0xE1 SHL DUP2 MSTORE DUP1 PUSH2 0x484F PUSH1 0x4 DUP3 ADD PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH4 0xB56C82B PUSH1 0xE3 SHL DUP2 MSTORE DUP1 PUSH2 0x486C PUSH1 0x4 DUP3 ADD PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH32 0x455243323938313A20496E76616C696420706172616D65746572730000000000 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x48A5 PUSH1 0x1B PUSH1 0x20 SWAP3 PUSH2 0x6D7 JUMP JUMPDEST PUSH2 0x48AE DUP2 PUSH2 0x4870 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x48C8 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x4898 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x48D2 JUMPI JUMP JUMPDEST PUSH2 0x48DA PUSH2 0x2E2 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x48F0 PUSH1 0x4 DUP3 ADD PUSH2 0x48B2 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x4970 SWAP1 PUSH2 0x4969 PUSH2 0x4975 SWAP5 SWAP4 PUSH2 0x4924 DUP6 PUSH2 0x491D PUSH2 0x4917 PUSH2 0x4912 PUSH2 0x45EA JUMP JUMPDEST PUSH2 0x48C JUMP JUMPDEST SWAP2 PUSH2 0x48C JUMP JUMPDEST GT ISZERO PUSH2 0x4223 JUMP JUMPDEST PUSH2 0x494A DUP2 PUSH2 0x4943 PUSH2 0x493D PUSH2 0x4938 PUSH1 0x0 PUSH2 0x24E2 JUMP JUMPDEST PUSH2 0x302 JUMP JUMPDEST SWAP2 PUSH2 0x302 JUMP JUMPDEST EQ ISZERO PUSH2 0x48CB JUMP JUMPDEST SWAP4 PUSH2 0x4960 PUSH2 0x4956 PUSH2 0x42D0 JUMP JUMPDEST SWAP6 PUSH1 0x0 DUP8 ADD PUSH2 0x2413 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD PUSH2 0x2459 JUMP JUMPDEST PUSH1 0x3 PUSH2 0x23CF JUMP JUMPDEST PUSH2 0x439C JUMP JUMPDEST JUMP JUMPDEST SWAP6 SWAP7 PUSH2 0x49A5 SWAP8 PUSH2 0x4998 SWAP7 SWAP6 SWAP5 PUSH2 0x4993 SWAP5 DUP10 SWAP5 SWAP1 SWAP2 SWAP3 SWAP4 SWAP5 PUSH2 0x5103 JUMP JUMPDEST PUSH2 0x43A8 JUMP JUMPDEST PUSH2 0x49A0 PUSH2 0x2BAF JUMP JUMPDEST PUSH2 0x4667 JUMP JUMPDEST JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x49BE PUSH2 0x49B9 PUSH2 0x49C3 SWAP3 PUSH2 0x332 JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x2F7 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x49F2 PUSH2 0x49ED PUSH2 0x49FC SWAP4 PUSH2 0x49E8 PUSH1 0x0 PUSH2 0x49F7 SWAP6 PUSH2 0x49E1 PUSH2 0x23CA JUMP JUMPDEST POP ADD PUSH2 0x49A7 JUMP JUMPDEST PUSH2 0x51D9 JUMP JUMPDEST PUSH2 0x21F2 JUMP JUMPDEST PUSH2 0x49AA JUMP JUMPDEST PUSH2 0x217F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x4A3A PUSH2 0x4A4F SWAP4 PUSH2 0x4A15 PUSH2 0x4A49 SWAP4 DUP6 DUP4 SWAP2 PUSH2 0x51FB JUMP JUMPDEST PUSH2 0x4A32 PUSH2 0x4A2B DUP3 PUSH2 0x4A26 PUSH1 0x0 PUSH2 0x21C9 JUMP JUMPDEST PUSH2 0x44CD JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2AF0 JUMP JUMPDEST SWAP3 PUSH1 0x1 PUSH2 0xBC9 JUMP JUMPDEST SWAP2 PUSH2 0x4A44 DUP4 PUSH2 0x21C9 JUMP JUMPDEST PUSH2 0x44CD JUMP JUMPDEST SWAP1 PUSH2 0x2AF0 JUMP JUMPDEST JUMP JUMPDEST SWAP3 PUSH2 0x4A63 SWAP2 SWAP5 SWAP3 SWAP4 SWAP1 DUP6 DUP6 SWAP2 SWAP3 PUSH2 0x5216 JUMP JUMPDEST PUSH2 0x4A6C DUP4 PUSH2 0x108C JUMP JUMPDEST SWAP2 PUSH2 0x4A77 PUSH1 0x0 PUSH2 0x21D6 JUMP JUMPDEST SWAP2 PUSH2 0x4A80 PUSH2 0x1C33 JUMP JUMPDEST JUMPDEST DUP1 PUSH2 0x4A94 PUSH2 0x4A8E DUP8 PUSH2 0x332 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST LT ISZERO PUSH2 0x4B00 JUMPI PUSH2 0x4AFB SWAP1 PUSH2 0x4AF6 PUSH2 0x4ABF PUSH2 0x4AB7 PUSH2 0x4AB2 DUP8 DUP6 SWAP1 PUSH2 0x395B JUMP JUMPDEST PUSH2 0x397B JUMP JUMPDEST SWAP7 DUP8 SWAP1 PUSH2 0x4034 JUMP JUMPDEST SWAP6 PUSH2 0x4AF0 PUSH2 0x4AE1 PUSH1 0x1 PUSH2 0x4ADB PUSH2 0x4AD6 DUP14 DUP9 SWAP1 PUSH2 0x395B JUMP JUMPDEST PUSH2 0x397B JUMP JUMPDEST SWAP1 PUSH2 0xBC9 JUMP JUMPDEST SWAP2 PUSH2 0x4AEB DUP4 PUSH2 0x21C9 JUMP JUMPDEST PUSH2 0x4034 JUMP JUMPDEST SWAP1 PUSH2 0x2AF0 JUMP JUMPDEST PUSH2 0x3988 JUMP JUMPDEST PUSH2 0x4A81 JUMP JUMPDEST POP SWAP4 POP POP PUSH2 0x4B23 SWAP2 POP PUSH2 0x4B1C SWAP1 PUSH2 0x4B17 PUSH1 0x0 PUSH2 0x21C9 JUMP JUMPDEST PUSH2 0x4034 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2AF0 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x4B3D PUSH1 0x0 PUSH2 0x4B42 SWAP3 PUSH2 0x4B36 PUSH2 0x1C33 JUMP JUMPDEST POP ADD PUSH2 0x49A7 JUMP JUMPDEST PUSH2 0x5359 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH2 0x4B50 PUSH2 0x1C5C JUMP JUMPDEST POP DUP1 MLOAD PUSH2 0x4B5D JUMPI JUMPDEST POP EQ SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 ADD SWAP2 MLOAD PUSH1 0x5 SHL DUP3 ADD SWAP1 JUMPDEST DUP3 MLOAD DUP2 GT PUSH1 0x5 SHL SWAP1 DUP2 MSTORE PUSH1 0x20 DUP4 MLOAD SWAP2 XOR MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP3 ADD SWAP2 DUP2 DUP4 LT PUSH2 0x4B6B JUMPI SWAP2 POP POP CODESIZE PUSH2 0x4B58 JUMP JUMPDEST SWAP1 PUSH2 0x4BB8 PUSH2 0x4BB1 PUSH2 0x4BBD SWAP3 PUSH2 0x4BA9 PUSH2 0x1C33 JUMP JUMPDEST POP PUSH1 0x10 PUSH2 0x3688 JUMP JUMPDEST DUP4 SWAP1 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x21C9 JUMP JUMPDEST DUP1 PUSH2 0x4BD1 PUSH2 0x4BCB PUSH1 0x0 PUSH2 0x21D6 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0x4BDE JUMPI POP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 POP PUSH2 0x4BDB JUMP JUMPDEST SWAP1 PUSH2 0x4BEE PUSH2 0x29F6 JUMP JUMPDEST POP PUSH1 0x40 MLOAD SWAP2 PUSH1 0x40 DUP4 ADD PUSH1 0x40 MSTORE PUSH1 0x1 DUP4 MSTORE PUSH1 0x20 DUP4 ADD MSTORE JUMP JUMPDEST PUSH2 0x4C0D PUSH2 0x1C5C JUMP JUMPDEST POP PUSH2 0x4C17 DUP2 PUSH2 0x5371 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x4C3A JUMPI JUMPDEST SWAP1 DUP2 ISZERO PUSH2 0x4C2A JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x4C34 SWAP2 POP PUSH2 0x5417 JUMP JUMPDEST CODESIZE PUSH2 0x4C26 JUMP JUMPDEST POP PUSH2 0x4C44 DUP2 PUSH2 0x53B1 JUMP JUMPDEST PUSH2 0x4C1E JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x4C60 PUSH2 0x4C5B PUSH2 0x4C65 SWAP3 PUSH2 0x4C49 JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x332 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x416363657373436F6E74726F6C3A206163636F756E7420000000000000000000 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x4C9C PUSH1 0x17 DUP1 SWAP3 PUSH2 0x201B JUMP JUMPDEST PUSH2 0x4CA5 DUP2 PUSH2 0x4C68 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x206973206D697373696E6720726F6C6520000000000000000000000000000000 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x4CDD PUSH1 0x11 DUP1 SWAP3 PUSH2 0x201B JUMP JUMPDEST PUSH2 0x4CE6 DUP2 PUSH2 0x4CA9 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x4D04 PUSH2 0x4D0F SWAP4 SWAP3 PUSH2 0x4CFE PUSH2 0x4D09 SWAP4 PUSH2 0x4C90 JUMP JUMPDEST SWAP1 PUSH2 0x20A9 JUMP JUMPDEST PUSH2 0x4CD1 JUMP JUMPDEST SWAP1 PUSH2 0x20A9 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x4D27 PUSH2 0x4D21 DUP4 DUP4 SWAP1 PUSH2 0x2CF0 JUMP JUMPDEST ISZERO PUSH2 0x42F JUMP JUMPDEST PUSH2 0x4D2F JUMPI POP POP JUMP JUMPDEST PUSH2 0x4DA7 SWAP2 PUSH2 0x4D85 PUSH2 0x4D5E PUSH2 0x4D4E PUSH2 0x4D48 PUSH2 0x4D8A SWAP6 PUSH2 0x5493 JUMP JUMPDEST SWAP4 PUSH2 0x21F2 JUMP JUMPDEST PUSH2 0x4D58 PUSH1 0x20 PUSH2 0x4C4C JUMP JUMPDEST SWAP1 PUSH2 0x566C JUMP JUMPDEST SWAP2 PUSH2 0x4D76 PUSH2 0x4D6A PUSH2 0x2E2 JUMP JUMPDEST SWAP4 DUP5 SWAP3 PUSH1 0x20 DUP5 ADD PUSH2 0x4CEA JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE SUB DUP3 PUSH2 0x65F JUMP JUMPDEST PUSH2 0x2132 JUMP JUMPDEST PUSH2 0x4D92 PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 PUSH3 0x461BCD PUSH1 0xE5 SHL DUP4 MSTORE PUSH1 0x4 DUP4 ADD PUSH2 0x736 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP2 SWAP3 SWAP1 SWAP3 PUSH2 0x4DB7 PUSH2 0x4601 JUMP JUMPDEST PUSH2 0x4E93 JUMPI JUMPDEST DUP3 PUSH1 0x60 SHL DUP1 ISZERO PUSH2 0x4E85 JUMPI PUSH8 0x9A31110384E0B0C9 PUSH1 0x20 MSTORE DUP4 PUSH1 0x14 MSTORE DUP5 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP1 SLOAD SWAP1 DUP4 DUP3 ADD SWAP2 DUP3 LT PUSH2 0x4E77 JUMPI SSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x60 SHR PUSH1 0x0 CALLER PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP4 LOG4 PUSH2 0x4E24 PUSH2 0x460F JUMP JUMPDEST PUSH2 0x4E5E JUMPI JUMPDEST PUSH2 0x4E32 DUP4 PUSH2 0x57B8 JUMP JUMPDEST PUSH2 0x4E3D JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x4E55 SWAP4 PUSH2 0x4E4B PUSH1 0x0 PUSH2 0x24E2 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 SWAP3 SWAP4 PUSH2 0x57C5 JUMP JUMPDEST CODESIZE DUP1 DUP1 DUP1 PUSH2 0x4E37 JUMP JUMPDEST PUSH2 0x4E67 DUP5 PUSH2 0x4BE5 JUMP JUMPDEST POP PUSH2 0x4E71 DUP2 PUSH2 0x4BE5 JUMP JUMPDEST POP PUSH2 0x4E29 JUMP JUMPDEST PUSH4 0x1336CEA PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0xEA553B34 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH2 0x4E9C DUP5 PUSH2 0x4BE5 JUMP JUMPDEST POP PUSH2 0x4EA6 DUP2 PUSH2 0x4BE5 JUMP JUMPDEST POP PUSH2 0x4DBC JUMP JUMPDEST SWAP1 SWAP2 PUSH2 0x4EC5 SWAP3 PUSH2 0x4EBC PUSH1 0x0 PUSH2 0x24E2 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 SWAP3 PUSH2 0x585E JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x4ED3 PUSH1 0xFF SWAP2 PUSH2 0x1716 JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST PUSH2 0x4EE6 SWAP1 PUSH2 0x42F JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x4F01 PUSH2 0x4EFC PUSH2 0x4F08 SWAP3 PUSH2 0x4EDD JUMP JUMPDEST PUSH2 0x4EE9 JUMP JUMPDEST DUP3 SLOAD PUSH2 0x4EC7 JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x4F20 PUSH2 0x4F1A DUP3 DUP5 SWAP1 PUSH2 0x2CF0 JUMP JUMPDEST ISZERO PUSH2 0x42F JUMP JUMPDEST PUSH2 0x4F29 JUMPI JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x4F4C PUSH1 0x1 PUSH2 0x4F47 PUSH1 0x0 PUSH2 0x4F3F PUSH1 0x4 DUP7 SWAP1 PUSH2 0x236F JUMP JUMPDEST ADD DUP6 SWAP1 PUSH2 0x2CB1 JUMP JUMPDEST PUSH2 0x4EEC JUMP JUMPDEST SWAP1 PUSH2 0x4F55 PUSH2 0x4691 JUMP JUMPDEST SWAP1 PUSH2 0x4F92 PUSH2 0x4F8C PUSH2 0x4F86 PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP6 PUSH2 0x2363 JUMP JUMPDEST SWAP3 PUSH2 0x218B JUMP JUMPDEST SWAP3 PUSH2 0x218B JUMP JUMPDEST SWAP3 PUSH2 0x4F9B PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x4FA5 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 LOG4 CODESIZE DUP1 PUSH2 0x4F25 JUMP JUMPDEST PUSH2 0x4FB8 SWAP1 PUSH2 0x1F78 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x4FCF PUSH2 0x4FCA PUSH2 0x4FD4 SWAP3 PUSH2 0x2F7 JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x332 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x4FEB PUSH2 0x4FE6 PUSH2 0x4FF0 SWAP3 PUSH2 0x332 JUMP JUMPDEST PUSH2 0x1716 JUMP JUMPDEST PUSH2 0xB0C JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x5026 PUSH2 0x5020 PUSH2 0x501B PUSH2 0x5016 PUSH1 0x0 PUSH2 0x502B SWAP7 PUSH2 0x500E PUSH2 0x1C5C JUMP JUMPDEST POP ADD SWAP5 PUSH2 0x4FAF JUMP JUMPDEST PUSH2 0x4FBB JUMP JUMPDEST PUSH2 0x4FD7 JUMP JUMPDEST SWAP2 PUSH2 0x49A7 JUMP JUMPDEST PUSH2 0x5A4E JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x5039 DUP2 DUP4 SWAP1 PUSH2 0x2CF0 JUMP JUMPDEST PUSH2 0x5042 JUMPI JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x5065 PUSH1 0x0 PUSH2 0x5060 PUSH1 0x0 PUSH2 0x5058 PUSH1 0x4 DUP7 SWAP1 PUSH2 0x236F JUMP JUMPDEST ADD DUP6 SWAP1 PUSH2 0x2CB1 JUMP JUMPDEST PUSH2 0x4EEC JUMP JUMPDEST SWAP1 PUSH2 0x506E PUSH2 0x4691 JUMP JUMPDEST SWAP1 PUSH2 0x50AB PUSH2 0x50A5 PUSH2 0x509F PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP6 PUSH2 0x2363 JUMP JUMPDEST SWAP3 PUSH2 0x218B JUMP JUMPDEST SWAP3 PUSH2 0x218B JUMP JUMPDEST SWAP3 PUSH2 0x50B4 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x50BE DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 LOG4 CODESIZE DUP1 PUSH2 0x503E JUMP JUMPDEST SWAP1 PUSH2 0x50FB PUSH2 0x50F5 PUSH2 0x50F0 PUSH2 0x50EB PUSH1 0x0 PUSH2 0x5100 SWAP7 PUSH2 0x50E3 PUSH2 0x1C5C JUMP JUMPDEST POP ADD SWAP5 PUSH2 0x4FAF JUMP JUMPDEST PUSH2 0x4FBB JUMP JUMPDEST PUSH2 0x4FD7 JUMP JUMPDEST SWAP2 PUSH2 0x49A7 JUMP JUMPDEST PUSH2 0x5B0E JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP2 SWAP1 SWAP5 SWAP3 PUSH2 0x5111 PUSH1 0xB PUSH2 0x2CE3 JUMP JUMPDEST PUSH2 0x5184 JUMPI PUSH2 0x5131 PUSH2 0x5138 SWAP3 PUSH2 0x512A PUSH2 0x5176 SWAP9 PUSH1 0x8 PUSH2 0x1F15 JUMP JUMPDEST PUSH1 0x9 PUSH2 0x1F15 JUMP JUMPDEST PUSH1 0xA PUSH2 0x1F15 JUMP JUMPDEST PUSH2 0x514A PUSH2 0x5143 PUSH2 0x1738 JUMP JUMPDEST DUP3 SWAP1 PUSH2 0x4667 JUMP JUMPDEST PUSH2 0x515C PUSH2 0x5155 PUSH2 0x1CA1 JUMP JUMPDEST DUP3 SWAP1 PUSH2 0x4667 JUMP JUMPDEST PUSH2 0x516E PUSH2 0x5167 PUSH2 0x1CF9 JUMP JUMPDEST DUP3 SWAP1 PUSH2 0x4667 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH2 0x5C18 JUMP JUMPDEST PUSH2 0x5182 PUSH1 0x1 PUSH1 0xB PUSH2 0x4EEC JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 PUSH4 0xF92EE8A9 PUSH1 0xE0 SHL DUP2 MSTORE DUP1 PUSH2 0x519D PUSH1 0x4 DUP3 ADD PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH2 0x51B9 DUP2 PUSH2 0x51A1 JUMP JUMPDEST DUP3 LT ISZERO PUSH2 0x51D4 JUMPI PUSH2 0x51CB PUSH1 0x1 SWAP2 PUSH2 0x51A5 JUMP JUMPDEST SWAP2 MUL ADD SWAP1 PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x36FA JUMP JUMPDEST PUSH2 0x51F8 SWAP2 PUSH1 0x0 PUSH2 0x51F2 SWAP3 PUSH2 0x51EB PUSH2 0x235E JUMP JUMPDEST POP ADD PUSH2 0x51B0 JUMP JUMPDEST SWAP1 PUSH2 0xF41 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 SWAP2 PUSH2 0x5214 SWAP3 PUSH2 0x520B PUSH1 0x0 PUSH2 0x24E2 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 SWAP3 PUSH2 0x5C35 JUMP JUMPDEST JUMP JUMPDEST SWAP2 SWAP3 SWAP1 SWAP3 PUSH2 0x5222 PUSH2 0x4601 JUMP JUMPDEST PUSH2 0x5354 JUMPI JUMPDEST DUP1 MLOAD DUP5 MLOAD SUB PUSH2 0x5346 JUMPI DUP3 PUSH1 0x60 SHL DUP1 ISZERO PUSH2 0x5338 JUMPI DUP1 PUSH8 0x9A31110384E0B0C9 OR PUSH1 0x20 MSTORE DUP5 MLOAD PUSH1 0x5 SHL DUP1 JUMPDEST PUSH2 0x5301 JUMPI POP PUSH1 0x0 PUSH1 0x40 MLOAD PUSH1 0x40 DUP2 MSTORE PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB DUP2 DUP9 MLOAD PUSH1 0x5 SHL PUSH1 0x20 ADD PUSH1 0x40 DUP3 ADD SWAP1 DUP2 DUP2 DUP13 PUSH1 0x4 GAS STATICCALL POP RETURNDATASIZE PUSH1 0x40 ADD PUSH1 0x20 DUP4 ADD MSTORE RETURNDATASIZE ADD DUP7 MLOAD PUSH1 0x5 SHL PUSH1 0x20 ADD DUP2 DUP2 DUP10 PUSH1 0x4 GAS STATICCALL POP RETURNDATASIZE ADD SUB SWAP4 PUSH1 0x60 SHR SWAP4 CALLER SWAP3 LOG4 PUSH2 0x52C2 PUSH2 0x460F JUMP JUMPDEST PUSH2 0x52FC JUMPI JUMPDEST PUSH2 0x52D0 DUP4 PUSH2 0x57B8 JUMP JUMPDEST PUSH2 0x52DB JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x52F3 SWAP4 PUSH2 0x52E9 PUSH1 0x0 PUSH2 0x24E2 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 SWAP3 SWAP4 PUSH2 0x5D39 JUMP JUMPDEST CODESIZE DUP1 DUP1 DUP1 PUSH2 0x52D5 JUMP JUMPDEST PUSH2 0x52C7 JUMP JUMPDEST DUP1 DUP4 ADD MLOAD SWAP1 DUP1 DUP8 ADD MLOAD PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 DUP3 SLOAD SWAP1 DUP2 ADD SWAP1 DUP2 LT PUSH2 0x532A JUMPI PUSH1 0x20 SWAP3 SSTORE SUB DUP1 PUSH2 0x524F JUMP JUMPDEST PUSH4 0x1336CEA PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0xEA553B34 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0x3B800A46 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH2 0x5227 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x536E SWAP2 PUSH2 0x5367 PUSH2 0x1C33 JUMP JUMPDEST POP ADD PUSH2 0x51A1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x5379 PUSH2 0x1C5C JUMP JUMPDEST POP PUSH4 0x3E85E62F PUSH1 0xE0 SHL PUSH2 0x5394 PUSH2 0x538E DUP4 PUSH2 0x3E0 JUMP JUMPDEST SWAP2 PUSH2 0x3E0 JUMP JUMPDEST EQ SWAP1 DUP2 ISZERO PUSH2 0x53A1 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x53AB SWAP2 POP PUSH2 0x5DF0 JUMP JUMPDEST CODESIZE PUSH2 0x539D JUMP JUMPDEST PUSH2 0x53B9 PUSH2 0x1C5C JUMP JUMPDEST POP PUSH2 0x53C3 DUP2 PUSH2 0x5E17 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x5408 JUMPI JUMPDEST DUP1 ISZERO PUSH2 0x53ED JUMPI JUMPDEST SWAP1 DUP2 ISZERO PUSH2 0x53DD JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x53E7 SWAP2 POP PUSH2 0x5E57 JUMP JUMPDEST CODESIZE PUSH2 0x53D9 JUMP JUMPDEST POP PUSH1 0x0 PUSH2 0x5402 PUSH2 0x53FC DUP4 PUSH2 0x3E0 JUMP JUMPDEST SWAP2 PUSH2 0x3E0 JUMP JUMPDEST EQ PUSH2 0x53D1 JUMP JUMPDEST POP PUSH2 0x5412 DUP2 PUSH2 0x5E57 JUMP JUMPDEST PUSH2 0x53CA JUMP JUMPDEST PUSH2 0x541F PUSH2 0x1C5C JUMP JUMPDEST POP PUSH2 0x5429 DUP2 PUSH2 0x5E57 JUMP JUMPDEST SWAP1 DUP2 ISZERO PUSH2 0x5435 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x543F SWAP2 POP PUSH2 0x5E97 JUMP JUMPDEST CODESIZE PUSH2 0x5431 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH2 0x5462 PUSH2 0x545D PUSH2 0x5467 SWAP3 PUSH2 0x5445 JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x5448 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x5474 PUSH1 0x14 PUSH2 0x544E JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x548B PUSH2 0x5486 PUSH2 0x5490 SWAP3 PUSH2 0x5448 JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x332 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x54B0 PUSH2 0x54AB PUSH2 0x54C6 SWAP3 PUSH2 0x54A5 PUSH2 0x2016 JUMP JUMPDEST POP PUSH2 0x4FAF JUMP JUMPDEST PUSH2 0x4FBB JUMP JUMPDEST PUSH2 0x54C0 PUSH2 0x54BB PUSH2 0x546A JUMP JUMPDEST PUSH2 0x5477 JUMP JUMPDEST SWAP1 PUSH2 0x566C JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x54E0 PUSH2 0x54DB PUSH2 0x54E5 SWAP3 PUSH2 0x54C9 JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x332 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x54FA PUSH2 0x54F5 DUP4 PUSH2 0x132E JUMP JUMPDEST PUSH2 0x78E JUMP JUMPDEST SWAP2 DUP3 MSTORE JUMP JUMPDEST CALLDATASIZE SWAP1 CALLDATACOPY JUMP JUMPDEST SWAP1 PUSH2 0x5529 PUSH2 0x5511 DUP4 PUSH2 0x54E8 JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP1 PUSH2 0x551F DUP7 SWAP4 PUSH2 0x132E JUMP JUMPDEST SWAP3 ADD SWAP2 SUB SWAP1 PUSH2 0x54FF JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x3 PUSH1 0xFC SHL SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x553D DUP3 PUSH2 0x35E5 JUMP JUMPDEST DUP2 LT ISZERO PUSH2 0x554F JUMPI PUSH1 0x1 PUSH1 0x20 SWAP2 MUL ADD ADD SWAP1 JUMP JUMPDEST PUSH2 0x36FA JUMP JUMPDEST PUSH1 0xF PUSH1 0xFB SHL SWAP1 JUMP JUMPDEST PUSH16 0x181899199A1A9B1B9C1CB0B131B232B3 PUSH1 0x81 SHL SWAP1 JUMP JUMPDEST PUSH2 0x557B PUSH2 0x555C JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x5595 PUSH2 0x5590 PUSH2 0x559A SWAP3 PUSH2 0x557E JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x332 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xF8 SHL SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x55BA PUSH2 0x55B5 PUSH2 0x55BF SWAP3 PUSH2 0x55A3 JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x5448 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x55E1 SWAP1 PUSH2 0x55DB PUSH2 0x55D5 PUSH2 0x55E6 SWAP5 PUSH2 0x5448 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST SWAP1 PUSH2 0x96E JUMP JUMPDEST PUSH2 0x332 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x537472696E67733A20686578206C656E67746820696E73756666696369656E74 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x561D PUSH1 0x20 DUP1 SWAP3 PUSH2 0x6D7 JUMP JUMPDEST PUSH2 0x5626 DUP2 PUSH2 0x55E9 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x5640 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x5611 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x564A JUMPI JUMP JUMPDEST PUSH2 0x5652 PUSH2 0x2E2 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x5668 PUSH1 0x4 DUP3 ADD PUSH2 0x562A JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP2 SWAP1 PUSH2 0x5676 PUSH2 0x2016 JUMP JUMPDEST POP PUSH2 0x5710 PUSH2 0x5700 PUSH2 0x56AC PUSH2 0x56A7 PUSH2 0x5697 PUSH1 0x2 PUSH2 0x5692 DUP8 SWAP2 PUSH2 0x54CC JUMP JUMPDEST PUSH2 0x252D JUMP JUMPDEST PUSH2 0x56A1 PUSH1 0x2 PUSH2 0x54CC JUMP JUMPDEST SWAP1 PUSH2 0x4034 JUMP JUMPDEST PUSH2 0x5504 JUMP JUMPDEST SWAP3 PUSH2 0x56B5 PUSH2 0x552B JUMP JUMPDEST PUSH2 0x56CE DUP6 PUSH2 0x56C8 PUSH1 0x0 SWAP4 PUSH1 0x0 BYTE SWAP4 PUSH2 0x21D6 JUMP JUMPDEST SWAP1 PUSH2 0x5533 JUMP JUMPDEST MSTORE8 PUSH2 0x56D7 PUSH2 0x5554 JUMP JUMPDEST PUSH2 0x56F0 DUP6 PUSH2 0x56EA PUSH1 0x1 SWAP4 PUSH1 0x0 BYTE SWAP4 PUSH2 0x2209 JUMP JUMPDEST SWAP1 PUSH2 0x5533 JUMP JUMPDEST MSTORE8 PUSH2 0x56FB PUSH1 0x2 PUSH2 0x54CC JUMP JUMPDEST PUSH2 0x252D JUMP JUMPDEST PUSH2 0x570A PUSH1 0x1 PUSH2 0x2209 JUMP JUMPDEST SWAP1 PUSH2 0x4034 JUMP JUMPDEST SWAP3 JUMPDEST DUP4 PUSH2 0x5726 PUSH2 0x5720 PUSH1 0x1 PUSH2 0x2209 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST GT ISZERO PUSH2 0x578D JUMPI PUSH2 0x5734 PUSH2 0x5573 JUMP JUMPDEST DUP2 PUSH2 0x573F PUSH1 0xF PUSH2 0x5581 JUMP JUMPDEST AND SWAP2 PUSH1 0x10 DUP4 LT ISZERO PUSH2 0x5788 JUMPI PUSH2 0x575B PUSH2 0x577C SWAP3 PUSH2 0x5782 SWAP5 BYTE PUSH2 0x559D JUMP JUMPDEST PUSH2 0x576B DUP6 SWAP2 DUP9 SWAP1 PUSH1 0x0 BYTE SWAP3 PUSH2 0x5533 JUMP JUMPDEST MSTORE8 PUSH2 0x5776 PUSH1 0x4 PUSH2 0x55A6 JUMP JUMPDEST SWAP1 PUSH2 0x55C2 JUMP JUMPDEST SWAP4 PUSH2 0x366B JUMP JUMPDEST SWAP3 PUSH2 0x5712 JUMP JUMPDEST PUSH2 0x36FA JUMP JUMPDEST PUSH2 0x57B5 SWAP3 SWAP4 POP PUSH2 0x57B0 SWAP1 PUSH2 0x57AA PUSH2 0x57A4 PUSH1 0x0 PUSH2 0x21D6 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST EQ PUSH2 0x5643 JUMP JUMPDEST PUSH2 0x2132 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x57C0 PUSH2 0x1C5C JUMP JUMPDEST POP EXTCODESIZE SWAP1 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 SWAP4 PUSH1 0x40 MLOAD SWAP6 DUP7 SWAP5 PUSH4 0xF23A6E61 DUP7 MSTORE CALLER DUP8 DUP8 ADD MSTORE PUSH1 0x60 SHL PUSH1 0x60 SHR PUSH1 0x40 DUP7 ADD MSTORE PUSH1 0x60 DUP6 ADD MSTORE PUSH1 0x80 DUP5 ADD MSTORE PUSH1 0xA0 DUP1 DUP5 ADD MSTORE DUP1 MLOAD DUP1 SWAP2 DUP2 DUP1 PUSH1 0xC0 DUP8 ADD MSTORE PUSH2 0x584A JUMPI JUMPDEST POP POP PUSH1 0xC4 ADD SWAP1 PUSH1 0x0 PUSH1 0x1C DUP5 ADD SWAP2 GAS CALL ISZERO PUSH2 0x583B JUMPI JUMPDEST PUSH4 0xF23A6E61 PUSH1 0xE0 SHL SWAP1 MLOAD SUB PUSH2 0x582D JUMPI JUMP JUMPDEST PUSH4 0x9C05499B PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x581C JUMPI RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST DUP2 DUP7 PUSH1 0xE0 DUP8 ADD SWAP3 ADD PUSH1 0x4 GAS STATICCALL POP DUP1 CODESIZE PUSH2 0x5807 JUMP JUMPDEST SWAP2 SWAP4 SWAP3 SWAP1 PUSH2 0x586A PUSH2 0x4601 JUMP JUMPDEST PUSH2 0x5996 JUMPI JUMPDEST DUP2 MLOAD DUP6 MLOAD SUB PUSH2 0x5988 JUMPI PUSH1 0x60 SHL SWAP2 DUP3 PUSH8 0x9A31110384E0B0C9 OR PUSH1 0x20 MSTORE DUP1 PUSH1 0x60 SHL DUP4 DUP2 EQ SWAP1 ISZERO OR ISZERO PUSH2 0x5966 JUMPI JUMPDEST POP DUP4 MLOAD PUSH1 0x5 SHL DUP1 JUMPDEST PUSH2 0x5930 JUMPI POP PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH1 0x0 SWAP4 SWAP5 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP2 PUSH1 0x40 DUP4 MSTORE DUP1 MLOAD PUSH1 0x5 SHL PUSH1 0x20 ADD DUP1 SWAP2 PUSH1 0x40 DUP6 ADD SWAP3 DUP4 SWAP2 PUSH1 0x4 GAS STATICCALL POP RETURNDATASIZE PUSH1 0x40 ADD PUSH1 0x20 DUP5 ADD MSTORE RETURNDATASIZE ADD SWAP1 DUP2 DUP2 MLOAD PUSH1 0x5 SHL PUSH1 0x20 ADD DUP1 SWAP3 PUSH1 0x4 GAS STATICCALL POP RETURNDATASIZE ADD SUB SWAP3 PUSH1 0x60 SHR SWAP3 CALLER SWAP3 LOG4 PUSH2 0x591B PUSH2 0x460F JUMP JUMPDEST PUSH2 0x5922 JUMPI JUMPDEST JUMP JUMPDEST PUSH2 0x592A PUSH2 0x2249 JUMP JUMPDEST POP PUSH2 0x5920 JUMP JUMPDEST DUP1 DUP3 ADD MLOAD SWAP1 DUP1 DUP7 ADD MLOAD PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP1 SLOAD SWAP3 DUP4 DUP2 GT PUSH2 0x5958 JUMPI PUSH1 0x20 SWAP4 SUB SWAP1 SSTORE SUB DUP1 PUSH2 0x58A2 JUMP JUMPDEST PUSH4 0xF4D678B8 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x34 PUSH1 0xC KECCAK256 SLOAD ISZERO PUSH2 0x597A JUMPI CODESIZE PUSH2 0x589A JUMP JUMPDEST PUSH4 0x4B6E7F18 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0x3B800A46 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH2 0x599E PUSH2 0x2249 JUMP JUMPDEST POP PUSH2 0x586F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD SWAP1 JUMP JUMPDEST PUSH2 0x59BF DUP2 PUSH2 0x59B2 JUMP JUMPDEST DUP3 LT ISZERO PUSH2 0x59DA JUMPI PUSH2 0x59D1 PUSH1 0x1 SWAP2 PUSH2 0x59A7 JUMP JUMPDEST SWAP2 MUL ADD SWAP1 PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x36FA JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x59F5 PUSH2 0x59F0 PUSH2 0x59FD SWAP4 PUSH2 0x2363 JUMP JUMPDEST PUSH2 0x2AC4 JUMP JUMPDEST SWAP1 DUP4 SLOAD PUSH2 0x1D46 JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST SWAP1 DUP2 SLOAD SWAP2 PUSH9 0x10000000000000000 DUP4 LT ISZERO PUSH2 0x5A31 JUMPI DUP3 PUSH2 0x5A29 SWAP2 PUSH1 0x1 PUSH2 0x5A2F SWAP6 ADD DUP2 SSTORE PUSH2 0x59B6 JUMP JUMPDEST SWAP1 PUSH2 0x59DF JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x649 JUMP JUMPDEST SWAP1 PUSH2 0x5A40 SWAP1 PUSH2 0x2363 JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH2 0x5A56 PUSH2 0x1C5C JUMP JUMPDEST POP PUSH2 0x5A6B PUSH2 0x5A65 DUP3 DUP5 SWAP1 PUSH2 0x5ED7 JUMP JUMPDEST ISZERO PUSH2 0x42F JUMP JUMPDEST PUSH1 0x0 EQ PUSH2 0x5AAE JUMPI PUSH2 0x5AA4 PUSH2 0x5AA9 SWAP3 PUSH2 0x5A8F PUSH2 0x5A88 PUSH1 0x0 DUP6 ADD PUSH2 0x59A4 JUMP JUMPDEST DUP3 SWAP1 PUSH2 0x5A01 JUMP JUMPDEST PUSH1 0x1 PUSH2 0x5A9D PUSH1 0x0 DUP6 ADD PUSH2 0x51A1 JUMP JUMPDEST SWAP4 ADD PUSH2 0x5A36 JUMP JUMPDEST PUSH2 0x2AF0 JUMP JUMPDEST PUSH1 0x1 SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x31 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x5ADD SWAP2 PUSH2 0x5AD7 PUSH2 0x235E JUMP JUMPDEST SWAP2 PUSH2 0x59DF JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x5AE8 DUP2 PUSH2 0x59B2 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x5B09 JUMPI PUSH1 0x1 SWAP1 SUB SWAP1 PUSH2 0x5B06 PUSH2 0x5B00 DUP4 DUP4 PUSH2 0x59B6 JUMP JUMPDEST SWAP1 PUSH2 0x5ACB JUMP JUMPDEST SSTORE JUMP JUMPDEST PUSH2 0x5AB5 JUMP JUMPDEST PUSH2 0x5B16 PUSH2 0x1C5C JUMP JUMPDEST POP PUSH2 0x5B2D PUSH2 0x5B28 PUSH1 0x1 DUP4 ADD DUP5 SWAP1 PUSH2 0x5A36 JUMP JUMPDEST PUSH2 0x21C9 JUMP JUMPDEST SWAP1 DUP2 PUSH2 0x5B42 PUSH2 0x5B3C PUSH1 0x0 PUSH2 0x21D6 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST EQ ISZERO PUSH1 0x0 EQ PUSH2 0x5C10 JUMPI PUSH2 0x5BC2 SWAP3 PUSH1 0x1 PUSH2 0x5BBD SWAP3 DUP5 PUSH2 0x5B6B PUSH1 0x0 SWAP7 PUSH2 0x5B65 DUP6 PUSH2 0x2209 JUMP JUMPDEST SWAP1 PUSH2 0x44CD JUMP JUMPDEST PUSH2 0x5B88 PUSH2 0x5B79 DUP9 DUP6 ADD PUSH2 0x51A1 JUMP JUMPDEST PUSH2 0x5B82 DUP7 PUSH2 0x2209 JUMP JUMPDEST SWAP1 PUSH2 0x44CD JUMP JUMPDEST DUP1 PUSH2 0x5B9B PUSH2 0x5B95 DUP5 PUSH2 0x332 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST SUB PUSH2 0x5BC7 JUMPI JUMPDEST POP POP POP PUSH2 0x5BB7 PUSH2 0x5BB2 DUP7 DUP4 ADD PUSH2 0x59A4 JUMP JUMPDEST PUSH2 0x5ADF JUMP JUMPDEST ADD PUSH2 0x5A36 JUMP JUMPDEST PUSH2 0x1D91 JUMP JUMPDEST PUSH1 0x1 SWAP1 JUMP JUMPDEST PUSH2 0x5C08 SWAP3 PUSH2 0x5BFA PUSH2 0x5BE6 PUSH2 0x5BE0 PUSH2 0x5C03 SWAP5 DUP13 DUP10 ADD PUSH2 0x51B0 JUMP JUMPDEST SWAP1 PUSH2 0xF41 JUMP JUMPDEST SWAP4 PUSH2 0x5BF4 DUP6 SWAP2 DUP13 DUP10 ADD PUSH2 0x51B0 JUMP JUMPDEST SWAP1 PUSH2 0x59DF JUMP JUMPDEST SWAP2 DUP6 DUP6 ADD PUSH2 0x5A36 JUMP JUMPDEST PUSH2 0x2AF0 JUMP JUMPDEST CODESIZE DUP1 DUP1 PUSH2 0x5BA1 JUMP JUMPDEST POP POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x5C2E PUSH2 0x5C33 SWAP4 SWAP3 PUSH2 0x5C29 PUSH2 0x1F39 JUMP JUMPDEST PUSH2 0x4667 JUMP JUMPDEST PUSH2 0x5F0D JUMP JUMPDEST JUMP JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x5C41 PUSH2 0x4601 JUMP JUMPDEST PUSH2 0x5D17 JUMPI JUMPDEST PUSH1 0x60 SHL SWAP1 DUP2 PUSH8 0x9A31110384E0B0C9 OR PUSH1 0x20 MSTORE DUP2 DUP2 PUSH1 0x60 SHL EQ DUP2 PUSH1 0x60 SHL ISZERO OR ISZERO PUSH2 0x5CF5 JUMPI JUMPDEST POP DUP3 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD SWAP2 DUP3 DUP5 GT PUSH2 0x5CE7 JUMPI DUP4 PUSH1 0x0 SWAP4 SUB SWAP1 SSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x60 SHR CALLER PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP5 LOG4 PUSH2 0x5CBB PUSH2 0x460F JUMP JUMPDEST PUSH2 0x5CC4 JUMPI JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x5CD0 PUSH2 0x5CD6 SWAP3 PUSH2 0x4BE5 JUMP JUMPDEST POP PUSH2 0x4BE5 JUMP JUMPDEST POP PUSH2 0x5CDF PUSH2 0x2249 JUMP JUMPDEST POP CODESIZE DUP1 PUSH2 0x5CC0 JUMP JUMPDEST PUSH4 0xF4D678B8 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x34 PUSH1 0xC KECCAK256 SLOAD ISZERO PUSH2 0x5D09 JUMPI CODESIZE PUSH2 0x5C6A JUMP JUMPDEST PUSH4 0x4B6E7F18 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH2 0x5D20 DUP5 PUSH2 0x4BE5 JUMP JUMPDEST POP PUSH2 0x5D2A DUP4 PUSH2 0x4BE5 JUMP JUMPDEST POP PUSH2 0x5D33 PUSH2 0x2249 JUMP JUMPDEST POP PUSH2 0x5C46 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 SWAP4 PUSH1 0x40 MLOAD SWAP6 DUP7 SWAP5 PUSH4 0xBC197C81 DUP7 MSTORE CALLER DUP8 DUP8 ADD MSTORE PUSH1 0x60 SHL PUSH1 0x60 SHR PUSH1 0x40 DUP7 ADD MSTORE PUSH1 0xA0 PUSH1 0x60 DUP7 ADD MSTORE DUP1 MLOAD PUSH1 0x5 SHL DUP7 ADD DUP1 SWAP2 PUSH1 0xC0 DUP8 ADD SWAP3 DUP4 SWAP2 PUSH1 0x4 GAS STATICCALL POP RETURNDATASIZE PUSH1 0xA0 ADD SWAP1 DUP2 PUSH1 0x80 DUP8 ADD MSTORE RETURNDATASIZE ADD SWAP2 DUP3 DUP2 MLOAD PUSH1 0x5 SHL DUP9 ADD DUP1 SWAP3 PUSH1 0x4 GAS STATICCALL POP RETURNDATASIZE ADD PUSH1 0xA0 DUP6 ADD MSTORE RETURNDATASIZE ADD SWAP1 DUP2 DUP2 MLOAD DUP7 ADD DUP1 SWAP3 PUSH1 0x4 GAS STATICCALL POP PUSH1 0x1C DUP4 ADD SWAP1 RETURNDATASIZE ADD SUB SWAP1 PUSH1 0x0 PUSH1 0x1C DUP5 ADD SWAP2 GAS CALL ISZERO PUSH2 0x5DE1 JUMPI JUMPDEST PUSH4 0xBC197C81 PUSH1 0xE0 SHL SWAP1 MLOAD SUB PUSH2 0x5DD3 JUMPI JUMP JUMPDEST PUSH4 0x9C05499B PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x5DC2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH2 0x5DF8 PUSH2 0x1C5C JUMP JUMPDEST POP PUSH1 0xE0 SHR PUSH4 0xE89341C DUP2 EQ SWAP1 PUSH4 0x1FFC9A7 PUSH4 0xD9B67A26 DUP3 EQ SWAP2 EQ OR OR SWAP1 JUMP JUMPDEST PUSH2 0x5E1F PUSH2 0x1C5C JUMP JUMPDEST POP DUP1 PUSH2 0x5E3A PUSH2 0x5E34 PUSH4 0x152A902D PUSH1 0xE1 SHL PUSH2 0x3E0 JUMP JUMPDEST SWAP2 PUSH2 0x3E0 JUMP JUMPDEST EQ SWAP1 DUP2 ISZERO PUSH2 0x5E47 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x5E51 SWAP2 POP PUSH2 0x5F2D JUMP JUMPDEST CODESIZE PUSH2 0x5E43 JUMP JUMPDEST PUSH2 0x5E5F PUSH2 0x1C5C JUMP JUMPDEST POP DUP1 PUSH2 0x5E7A PUSH2 0x5E74 PUSH4 0x5A05180F PUSH1 0xE0 SHL PUSH2 0x3E0 JUMP JUMPDEST SWAP2 PUSH2 0x3E0 JUMP JUMPDEST EQ SWAP1 DUP2 ISZERO PUSH2 0x5E87 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x5E91 SWAP2 POP PUSH2 0x5F53 JUMP JUMPDEST CODESIZE PUSH2 0x5E83 JUMP JUMPDEST PUSH2 0x5E9F PUSH2 0x1C5C JUMP JUMPDEST POP DUP1 PUSH2 0x5EBA PUSH2 0x5EB4 PUSH4 0x4E821D33 PUSH1 0xE1 SHL PUSH2 0x3E0 JUMP JUMPDEST SWAP2 PUSH2 0x3E0 JUMP JUMPDEST EQ SWAP1 DUP2 ISZERO PUSH2 0x5EC7 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x5ED1 SWAP2 POP PUSH2 0x53B1 JUMP JUMPDEST CODESIZE PUSH2 0x5EC3 JUMP JUMPDEST PUSH2 0x5EF5 SWAP2 PUSH1 0x1 PUSH2 0x5EF0 SWAP3 PUSH2 0x5EE9 PUSH2 0x1C5C JUMP JUMPDEST POP ADD PUSH2 0x5A36 JUMP JUMPDEST PUSH2 0x21C9 JUMP JUMPDEST PUSH2 0x5F08 PUSH2 0x5F02 PUSH1 0x0 PUSH2 0x21D6 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST EQ ISZERO SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x5F24 PUSH2 0x5F1D PUSH2 0x5F2B SWAP4 PUSH2 0x1FA0 JUMP JUMPDEST PUSH1 0x6 PUSH2 0x1FD6 JUMP JUMPDEST PUSH1 0x7 PUSH2 0x2AD0 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x5F35 PUSH2 0x1C5C JUMP JUMPDEST POP PUSH2 0x5F4F PUSH2 0x5F49 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL PUSH2 0x3E0 JUMP JUMPDEST SWAP2 PUSH2 0x3E0 JUMP JUMPDEST EQ SWAP1 JUMP JUMPDEST PUSH2 0x5F5B PUSH2 0x1C5C JUMP JUMPDEST POP DUP1 PUSH2 0x5F76 PUSH2 0x5F70 PUSH4 0x7965DB0B PUSH1 0xE0 SHL PUSH2 0x3E0 JUMP JUMPDEST SWAP2 PUSH2 0x3E0 JUMP JUMPDEST EQ SWAP1 DUP2 ISZERO PUSH2 0x5F83 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x5F8D SWAP2 POP PUSH2 0x5E17 JUMP JUMPDEST CODESIZE PUSH2 0x5F7F JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x23 0xAF SWAP10 0xD0 SLT 0xF9 0xC0 CODECOPY PUSH22 0x49FA6D414EA97A8C70379F7B83DD92C49E8264E57F39 0xAD PUSH5 0x736F6C6343 STOP ADDMOD SHL STOP CALLER ", + "sourceMap": "399:5363:43:-:0;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;:::i;:::-;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;:::o;892:97::-;952:30;;892:97::o" + }, + "deployedBytecode": { + "functionDebugData": { + "abi_decode": { + "entryPoint": 1321, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_decode_address": { + "entryPoint": 803, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_addresst_address": { + "entryPoint": 6841, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_addresst_addresst_array_uint256_dyn_calldatat_array_uint256_dyn_calldatat_bytes_calldata": { + "entryPoint": 3401, + "id": null, + "parameterSlots": 2, + "returnSlots": 8 + }, + "abi_decode_addresst_addresst_uint256t_uint256t_bytes_calldata": { + "entryPoint": 6992, + "id": null, + "parameterSlots": 2, + "returnSlots": 6 + }, + "abi_decode_addresst_array_uint256_dynt_array_uint256_dynt_bytes": { + "entryPoint": 6207, + "id": null, + "parameterSlots": 2, + "returnSlots": 4 + }, + "abi_decode_addresst_bool": { + "entryPoint": 6057, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_addresst_stringt_stringt_stringt_addresst_uint96t_addresst_bytes32": { + "entryPoint": 5236, + "id": null, + "parameterSlots": 2, + "returnSlots": 8 + }, + "abi_decode_addresst_struct_Attestation_calldatat_struct_Call_calldata": { + "entryPoint": 5747, + "id": null, + "parameterSlots": 2, + "returnSlots": 3 + }, + "abi_decode_addresst_struct_PackContent_calldatat_array_bytes32_dyn_calldatat_uint256": { + "entryPoint": 6593, + "id": null, + "parameterSlots": 2, + "returnSlots": 5 + }, + "abi_decode_addresst_uint256": { + "entryPoint": 857, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_addresst_uint256t_uint256t_bytes": { + "entryPoint": 5034, + "id": null, + "parameterSlots": 2, + "returnSlots": 4 + }, + "abi_decode_addresst_uint96": { + "entryPoint": 1217, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_array_address_dyn_calldata": { + "entryPoint": 4077, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_array_address_dyn_calldatat_array_uint256_dyn_calldata": { + "entryPoint": 4140, + "id": null, + "parameterSlots": 2, + "returnSlots": 4 + }, + "abi_decode_array_bytes32_dyn_calldata": { + "entryPoint": 6530, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_array_uint256_dyn": { + "entryPoint": 2647, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_array_uint256_dyn_calldata": { + "entryPoint": 3275, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_array_uint256_dynt_array_uint256_dyn": { + "entryPoint": 2682, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_available_length_array_bytes32_dyn": { + "entryPoint": 13830, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_decode_available_length_array_uint256_dyn": { + "entryPoint": 2560, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_decode_available_length_bytes": { + "entryPoint": 4945, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_decode_available_length_string": { + "entryPoint": 2002, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_decode_bool": { + "entryPoint": 6042, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_bytes": { + "entryPoint": 4999, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_bytes32": { + "entryPoint": 2867, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_bytes32_fromMemory": { + "entryPoint": 11680, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_bytes32t_address": { + "entryPoint": 3625, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_bytes32t_uint256": { + "entryPoint": 5499, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_bytes32t_uint256t_uint256": { + "entryPoint": 4454, + "id": null, + "parameterSlots": 2, + "returnSlots": 3 + }, + "abi_decode_bytes4": { + "entryPoint": 1040, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_bytes_calldata": { + "entryPoint": 3338, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_fromMemory": { + "entryPoint": 14445, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_decode_string": { + "entryPoint": 2091, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_string_memory_ptr": { + "entryPoint": 2056, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_struct_Attestation_calldata": { + "entryPoint": 5709, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_struct_Call_calldata": { + "entryPoint": 5728, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_struct_PackContent_calldata": { + "entryPoint": 6511, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_t_bytes32": { + "entryPoint": 2852, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_t_bytes32_fromMemory": { + "entryPoint": 11665, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_t_bytes4": { + "entryPoint": 1025, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_address": { + "entryPoint": 2196, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_uint256": { + "entryPoint": 2278, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_uint256": { + "entryPoint": 842, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_uint256t_addresst_uint96": { + "entryPoint": 4730, + "id": null, + "parameterSlots": 2, + "returnSlots": 3 + }, + "abi_decode_uint256t_uint256": { + "entryPoint": 3120, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_uint64": { + "entryPoint": 12099, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_uint96": { + "entryPoint": 1202, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encodeUpdatedPos_address": { + "entryPoint": 12944, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encodeUpdatedPos_array_uint256_dyn_calldata": { + "entryPoint": 13425, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encodeUpdatedPos_bool": { + "entryPoint": 13147, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encodeUpdatedPos_string_storage": { + "entryPoint": 1586, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encodeUpdatedPos_uint256": { + "entryPoint": 4268, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_address": { + "entryPoint": 3166, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_address_array_uint256_dyn_array_uint256_dyn_calldata_bytes": { + "entryPoint": 14571, + "id": null, + "parameterSlots": 6, + "returnSlots": 1 + }, + "abi_encode_address_struct_Attestation_calldata_bytes32": { + "entryPoint": 12383, + "id": null, + "parameterSlots": 4, + "returnSlots": 1 + }, + "abi_encode_address_to_address": { + "entryPoint": 11729, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_address_uint256": { + "entryPoint": 3179, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_array_address_dyn_calldata": { + "entryPoint": 12967, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_array_array_uint256_dyn_calldata_dyn_calldata": { + "entryPoint": 13515, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_array_bool_dyn_calldata": { + "entryPoint": 13188, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_array_uint256_dyn": { + "entryPoint": 4372, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_array_uint256_dyn_calldata": { + "entryPoint": 13373, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_array_uint256_dyn_calldata_ptr": { + "entryPoint": 14461, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_array_uint256_dyn_memory_ptr": { + "entryPoint": 4291, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_bool": { + "entryPoint": 13134, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_bool_to_bool": { + "entryPoint": 1076, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_bytes": { + "entryPoint": 14522, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_bytes32": { + "entryPoint": 11791, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_bytes32_address": { + "entryPoint": 18120, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_bytes32_to_bytes32": { + "entryPoint": 2898, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_bytes4": { + "entryPoint": 11760, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_bytes_calldata": { + "entryPoint": 11898, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_packed_string_storage_string_stringliteral": { + "entryPoint": 8467, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_packed_stringliteral_da0d_string_stringliteral_f986_string": { + "entryPoint": 19690, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_string": { + "entryPoint": 1846, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_string_calldata": { + "entryPoint": 12030, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_string_memory_ptr": { + "entryPoint": 8361, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_string_storage": { + "entryPoint": 1443, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_string_storage_to_string_nonPadded_inplace": { + "entryPoint": 8224, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_string_to_string": { + "entryPoint": 1797, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_stringliteral": { + "entryPoint": 8442, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_stringliteral_04fc": { + "entryPoint": 22033, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_stringliteral_d20a": { + "entryPoint": 18584, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_stringliteral_da0d": { + "entryPoint": 19600, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_stringliteral_dcda": { + "entryPoint": 16880, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_stringliteral_f66a": { + "entryPoint": 17012, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_stringliteral_f986": { + "entryPoint": 19665, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_stringliteral_fb06": { + "entryPoint": 10603, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_struct_Attestation_calldata": { + "entryPoint": 12210, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_struct_AuthData_calldata": { + "entryPoint": 12145, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_struct_PackContent_calldata": { + "entryPoint": 13623, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple": { + "entryPoint": 1263, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple_address": { + "entryPoint": 4601, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_bool": { + "entryPoint": 1089, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_bytes32": { + "entryPoint": 2911, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_stringliteral_04fc": { + "entryPoint": 22058, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple_stringliteral_d20a": { + "entryPoint": 18610, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple_stringliteral_dcda": { + "entryPoint": 16906, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple_stringliteral_f66a": { + "entryPoint": 17038, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple_stringliteral_fb06": { + "entryPoint": 10629, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_uint256": { + "entryPoint": 916, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_uint256_struct_PackContent_calldata": { + "entryPoint": 13752, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_uint256_to_uint256": { + "entryPoint": 4255, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_uint256_to_uint256_fromStack": { + "entryPoint": 903, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_uint64": { + "entryPoint": 12132, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "access_calldata_tail_array_address_dyn_calldata": { + "entryPoint": 13999, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "access_calldata_tail_array_array_uint256_dyn_calldata_dyn_calldata": { + "entryPoint": 14130, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "access_calldata_tail_array_bool_dyn_calldata": { + "entryPoint": 14304, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "access_calldata_tail_array_uint256_dyn_calldata": { + "entryPoint": 14201, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "allocate_and_zero_memory_array_bytes": { + "entryPoint": 21764, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "allocate_memory": { + "entryPoint": 1934, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "allocate_memory_array_bytes": { + "entryPoint": 21736, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "allocate_memory_array_string": { + "entryPoint": 8741, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "allocate_memory_struct_struct_RoyaltyInfo": { + "entryPoint": 9319, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "allocate_memory_struct_struct_RoyaltyInfo_storage_ptr": { + "entryPoint": 17104, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "allocate_unbounded": { + "entryPoint": 738, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "array_allocation_size_array_bytes32_dyn": { + "entryPoint": 13801, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_allocation_size_array_uint256_dyn": { + "entryPoint": 2526, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_allocation_size_bytes": { + "entryPoint": 4910, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_allocation_size_string": { + "entryPoint": 1955, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_dataslot_array_address_dyn_calldata": { + "entryPoint": 12941, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_dataslot_array_array_uint256_dyn_calldata_dyn_calldata": { + "entryPoint": 13352, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_dataslot_array_bool_dyn_calldata": { + "entryPoint": 13131, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_dataslot_array_bytes32_dyn_storage": { + "entryPoint": 20901, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_dataslot_array_bytes32_dyn_storage_ptr": { + "entryPoint": 22951, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_dataslot_array_uint256_dyn": { + "entryPoint": 4249, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_dataslot_bytes": { + "entryPoint": 13791, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_dataslot_string_storage": { + "entryPoint": 1432, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_length_array_address_dyn_calldata": { + "entryPoint": 14070, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "array_length_array_bytes32_dyn_storage": { + "entryPoint": 20897, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_length_array_bytes32_dyn_storage_ptr": { + "entryPoint": 22962, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_length_array_uint256_dyn": { + "entryPoint": 4236, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_length_bytes": { + "entryPoint": 13797, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_length_string": { + "entryPoint": 1747, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_nextElement_array_address_dyn_calldata": { + "entryPoint": 12961, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_nextElement_array_array_uint256_dyn_calldata_dyn_calldata": { + "entryPoint": 13509, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_nextElement_array_bool_dyn_calldata": { + "entryPoint": 13182, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_nextElement_array_uint256_dyn": { + "entryPoint": 4285, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_pop_array_bytes32_dyn_storage_ptr": { + "entryPoint": 23263, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "array_push_from_bytes32_to_array_bytes32_dyn_storage_ptr": { + "entryPoint": 23041, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "array_storeLengthForEncoding_array_address_dyn": { + "entryPoint": 12932, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "array_storeLengthForEncoding_array_array_uint256_dyn_dyn": { + "entryPoint": 13343, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "array_storeLengthForEncoding_array_bool_dyn": { + "entryPoint": 13122, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "array_storeLengthForEncoding_array_uint256_dyn": { + "entryPoint": 13355, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "array_storeLengthForEncoding_array_uint256_dyn_fromStack": { + "entryPoint": 4240, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "array_storeLengthForEncoding_bytes": { + "entryPoint": 14513, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "array_storeLengthForEncoding_bytes_memory_ptr": { + "entryPoint": 11889, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "array_storeLengthForEncoding_string": { + "entryPoint": 1423, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "array_storeLengthForEncoding_string_fromStack": { + "entryPoint": 1751, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "array_storeLengthForEncoding_string_nonPadded_inplace": { + "entryPoint": 8219, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "calldata_access_address": { + "entryPoint": 11711, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "calldata_access_array_address_dyn_calldata": { + "entryPoint": 12862, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "calldata_access_array_array_uint256_dyn_calldata_dyn_calldata": { + "entryPoint": 13273, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "calldata_access_array_bool_dyn_calldata": { + "entryPoint": 13052, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "calldata_access_array_uint256_dyn_calldata": { + "entryPoint": 13439, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "calldata_access_bool": { + "entryPoint": 13164, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "calldata_access_bytes32": { + "entryPoint": 11773, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "calldata_access_bytes4": { + "entryPoint": 11742, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "calldata_access_bytes_calldata": { + "entryPoint": 11819, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "calldata_access_string_calldata": { + "entryPoint": 11960, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "calldata_access_struct_AuthData_calldata": { + "entryPoint": 11933, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "calldata_access_uint64": { + "entryPoint": 12114, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "calldata_array_index_access_address_dyn_calldata": { + "entryPoint": 14096, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "calldata_array_index_access_bool_dyn_calldata": { + "entryPoint": 14375, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "calldata_array_index_access_uint256_dyn_calldata_dyn_calldata": { + "entryPoint": 14272, + "id": null, + "parameterSlots": 3, + "returnSlots": 2 + }, + "checked_add_uint256": { + "entryPoint": 16436, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "checked_div_uint256": { + "entryPoint": 9592, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "checked_mul_uint256": { + "entryPoint": 9517, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "checked_sub_uint256": { + "entryPoint": 17613, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "clean_up_bytearray_end_slots_string_storage": { + "entryPoint": 7621, + "id": null, + "parameterSlots": 3, + "returnSlots": 0 + }, + "cleanup_address": { + "entryPoint": 770, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_bool": { + "entryPoint": 1071, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_bytes32": { + "entryPoint": 2828, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_bytes4": { + "entryPoint": 992, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_from_storage_address": { + "entryPoint": 9191, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_from_storage_bool": { + "entryPoint": 11465, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_from_storage_bytes32": { + "entryPoint": 3878, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_from_storage_contract_IImplicitProjectValidation": { + "entryPoint": 11598, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_from_storage_uint256": { + "entryPoint": 2418, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_from_storage_uint96": { + "entryPoint": 9255, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_rational_0_by": { + "entryPoint": 5907, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_rational_15_by": { + "entryPoint": 21886, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_rational_1_by": { + "entryPoint": 8710, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_rational_2_by": { + "entryPoint": 21705, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_rational_by": { + "entryPoint": 21923, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_rational_by_1": { + "entryPoint": 17867, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_t_rational_by": { + "entryPoint": 19529, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_t_rational_by_1": { + "entryPoint": 21573, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_uint160": { + "entryPoint": 759, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_uint256": { + "entryPoint": 818, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_uint64": { + "entryPoint": 12065, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_uint8": { + "entryPoint": 21576, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_uint96": { + "entryPoint": 1164, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "clear_storage_range_bytes1": { + "entryPoint": 7589, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "constant_ADDRESS_LENGTH": { + "entryPoint": 21610, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "constant_DEFAULT_ADMIN_ROLE": { + "entryPoint": 5944, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "constant_IMPLICIT_MODE_ADMIN_ROLE": { + "entryPoint": 7993, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "constant_METADATA_ADMIN_ROLE": { + "entryPoint": 7417, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "constant_MINTER_ROLE": { + "entryPoint": 11183, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "constant_PACK_ADMIN_ROLE": { + "entryPoint": 10860, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "constant_ROYALTY_ADMIN_ROLE": { + "entryPoint": 7329, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "constant_SYMBOLS": { + "entryPoint": 21875, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "convert_address_to_address": { + "entryPoint": 8587, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_address_to_contract_IERC1155ItemsFunctions": { + "entryPoint": 14421, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_address_to_contract_IERC721ItemsFunctions": { + "entryPoint": 14659, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_address_to_contract_IImplicitProjectValidation": { + "entryPoint": 8096, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_address_to_uint160": { + "entryPoint": 20399, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_array_array_bytes32_dyn_calldata_to_array_bytes32_dyn": { + "entryPoint": 13917, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "convert_array_array_bytes32_dyn_storage_to_array_bytes32_dyn_ptr": { + "entryPoint": 22948, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_array_array_uint256_dyn_calldata_to_array_uint256_dyn": { + "entryPoint": 9817, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "convert_array_bytes_calldata_to_bytes": { + "entryPoint": 9831, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "convert_array_bytes_to_string": { + "entryPoint": 8498, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_bool_to_bool": { + "entryPoint": 20189, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_bytes32_to_bytes32": { + "entryPoint": 9059, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_bytes32_to_uint256": { + "entryPoint": 8690, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_contract_IERC1155ItemsFunctions_to_address": { + "entryPoint": 14433, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_contract_IERC721ItemsFunctions_to_address": { + "entryPoint": 14671, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_contract_IImplicitProjectValidation_to_address": { + "entryPoint": 11642, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_contract_IImplicitProjectValidation_to_contract_IImplicitProjectValidation": { + "entryPoint": 8135, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_0_by_1_to_uint256": { + "entryPoint": 8662, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_1_by_1_to_uint256": { + "entryPoint": 8713, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_2_by_1_to_uint256": { + "entryPoint": 21708, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_by_to_address": { + "entryPoint": 9442, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_by_to_bytes32": { + "entryPoint": 5916, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_by_to_uint160": { + "entryPoint": 9414, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_by_to_uint256": { + "entryPoint": 21889, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_by_to_uint8": { + "entryPoint": 21926, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_by_to_uint96": { + "entryPoint": 17870, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_stringliteral_0448_to_bytes1": { + "entryPoint": 21803, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "convert_stringliteral_c5d2_to_bytes": { + "entryPoint": 8777, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "convert_stringliteral_cb29_to_bytes16": { + "entryPoint": 21852, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "convert_stringliteral_to_bytes1": { + "entryPoint": 21844, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "convert_struct_AddressSet_storage_to_struct_AddressSet_ptr": { + "entryPoint": 11398, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_struct_RoyaltyInfo_storage_to_struct_RoyaltyInfo": { + "entryPoint": 9389, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_struct_Set_storage_to_struct_Set_ptr": { + "entryPoint": 18855, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_t_rational_by_to_t_uint256": { + "entryPoint": 19532, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_t_rational_by_to_t_uint8": { + "entryPoint": 21582, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint160_to_address": { + "entryPoint": 8575, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint160_to_contract_IERC1155ItemsFunctions": { + "entryPoint": 14409, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint160_to_contract_IERC721ItemsFunctions": { + "entryPoint": 14647, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint160_to_contract_IImplicitProjectValidation": { + "entryPoint": 8084, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint160_to_uint160": { + "entryPoint": 8056, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint160_to_uint256": { + "entryPoint": 20411, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint256_to_bytes32": { + "entryPoint": 20439, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint256_to_uint160": { + "entryPoint": 18858, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint256_to_uint256": { + "entryPoint": 2989, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint8_to_uint256": { + "entryPoint": 21623, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint96_to_uint256": { + "entryPoint": 9467, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint96_to_uint96": { + "entryPoint": 17194, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "copy_array_from_storage_to_memory_string": { + "entryPoint": 1672, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "copy_byte_array_to_storage_from_string_to_string": { + "entryPoint": 7748, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "copy_calldata_to_memory": { + "entryPoint": 13369, + "id": null, + "parameterSlots": 3, + "returnSlots": 0 + }, + "copy_calldata_to_memory_with_cleanup": { + "entryPoint": 1990, + "id": null, + "parameterSlots": 3, + "returnSlots": 0 + }, + "copy_literal_to_memory_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470": { + "entryPoint": 8764, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "copy_memory_to_memory_with_cleanup": { + "entryPoint": 1760, + "id": null, + "parameterSlots": 3, + "returnSlots": 0 + }, + "copy_struct_to_storage_from_struct_RoyaltyInfo_to_struct_RoyaltyInfo": { + "entryPoint": 17257, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "decrement_uint256": { + "entryPoint": 13931, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "divide_by_ceil": { + "entryPoint": 7480, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "external_fun_DEFAULT_ADMIN_ROLE": { + "entryPoint": 5968, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_acceptImplicitRequest": { + "entryPoint": 5853, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_balanceOf": { + "entryPoint": 938, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_balanceOfBatch": { + "entryPoint": 4397, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_baseURI": { + "entryPoint": 4857, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_batchBurn": { + "entryPoint": 2776, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_batchMint": { + "entryPoint": 6351, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_burn": { + "entryPoint": 6155, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_commit": { + "entryPoint": 7163, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_contractURI": { + "entryPoint": 6788, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_erc1155Holder": { + "entryPoint": 4623, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_getRevealIdx": { + "entryPoint": 4676, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_getRoleAdmin": { + "entryPoint": 2933, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_getRoleMember": { + "entryPoint": 5545, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_getRoleMemberCount": { + "entryPoint": 6406, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_grantRole": { + "entryPoint": 3671, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_hasRole": { + "entryPoint": 5599, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_initialize": { + "entryPoint": 5438, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_isApprovedForAll": { + "entryPoint": 6887, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_merkleRoot": { + "entryPoint": 3945, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_mint": { + "entryPoint": 5130, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_name": { + "entryPoint": 1871, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_refundPack": { + "entryPoint": 2362, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_remainingSupply": { + "entryPoint": 4024, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_renounceRole": { + "entryPoint": 3802, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_reveal": { + "entryPoint": 6717, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_revokeRole": { + "entryPoint": 6459, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_royaltyInfo": { + "entryPoint": 3215, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_safeBatchTransferFrom": { + "entryPoint": 3564, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_safeTransferFrom": { + "entryPoint": 7105, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_setApprovalForAll": { + "entryPoint": 6103, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_setBaseMetadataURI": { + "entryPoint": 5185, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_setContractName": { + "entryPoint": 2145, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_setContractURI": { + "entryPoint": 5653, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_setDefaultRoyalty": { + "entryPoint": 1269, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_setImplicitModeProjectId": { + "entryPoint": 6941, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_setImplicitModeValidator": { + "entryPoint": 2227, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_setPacksContent": { + "entryPoint": 4513, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_setTokenRoyalty": { + "entryPoint": 4789, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_supply": { + "entryPoint": 3749, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_supportsInterface": { + "entryPoint": 1111, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_tokenSupply": { + "entryPoint": 3067, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_totalSupply": { + "entryPoint": 2473, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_uri": { + "entryPoint": 2309, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "extract_byte_array_length": { + "entryPoint": 1381, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "extract_from_storage_value_dynamict_bytes32": { + "entryPoint": 3881, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "extract_from_storage_value_dynamict_uint256": { + "entryPoint": 2421, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "extract_from_storage_value_offsett_address": { + "entryPoint": 9202, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "extract_from_storage_value_offsett_bool": { + "entryPoint": 11471, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "extract_from_storage_value_offsett_bytes32": { + "entryPoint": 9095, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "extract_from_storage_value_offsett_contract_IImplicitProjectValidation": { + "entryPoint": 11609, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "extract_from_storage_value_offsett_uint256": { + "entryPoint": 8629, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "extract_from_storage_value_offsett_uint96": { + "entryPoint": 9272, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "extract_used_part_and_set_length_of_short_byte_array": { + "entryPoint": 7730, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "finalize_allocation": { + "entryPoint": 1631, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun__batchBurn": { + "entryPoint": 20140, + "id": 5620, + "parameterSlots": 3, + "returnSlots": 0 + }, + "fun__batchMint": { + "entryPoint": 21014, + "id": 5524, + "parameterSlots": 4, + "returnSlots": 0 + }, + "fun__burn": { + "entryPoint": 23605, + "id": 5597, + "parameterSlots": 4, + "returnSlots": 0 + }, + "fun__checkRole": { + "entryPoint": 16782, + "id": 92, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun__grantRole": { + "entryPoint": 20236, + "id": 283, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun__mint": { + "entryPoint": 17527, + "id": 8617, + "parameterSlots": 4, + "returnSlots": 0 + }, + "fun__revokeRole": { + "entryPoint": 18078, + "id": 439, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun__setTokenRoyalty": { + "entryPoint": 18676, + "id": 1327, + "parameterSlots": 3, + "returnSlots": 0 + }, + "fun_acceptImplicitRequest": { + "entryPoint": 12454, + "id": 5098, + "parameterSlots": 3, + "returnSlots": 1 + }, + "fun_add": { + "entryPoint": 23118, + "id": 3172, + "parameterSlots": 2, + "returnSlots": 1 + }, + "fun_add_3472": { + "entryPoint": 20467, + "id": 3472, + "parameterSlots": 2, + "returnSlots": 1 + }, + "fun_afterTokenTransferCalldata": { + "entryPoint": 17949, + "id": 5933, + "parameterSlots": 8, + "returnSlots": 0 + }, + "fun_at": { + "entryPoint": 20953, + "id": 3306, + "parameterSlots": 2, + "returnSlots": 1 + }, + "fun_at_3568": { + "entryPoint": 18886, + "id": 3568, + "parameterSlots": 2, + "returnSlots": 1 + }, + "fun_balanceOf": { + "entryPoint": 7224, + "id": 5257, + "parameterSlots": 2, + "returnSlots": 1 + }, + "fun_balanceOfBatch": { + "entryPoint": 10747, + "id": 5386, + "parameterSlots": 4, + "returnSlots": 1 + }, + "fun_batchBurn": { + "entryPoint": 17650, + "id": 8780, + "parameterSlots": 3, + "returnSlots": 0 + }, + "fun_batchBurn_5666": { + "entryPoint": 22622, + "id": 5666, + "parameterSlots": 4, + "returnSlots": 0 + }, + "fun_batchBurn_8537": { + "entryPoint": 9039, + "id": 8537, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun_batchMint": { + "entryPoint": 19025, + "id": 8685, + "parameterSlots": 4, + "returnSlots": 0 + }, + "fun_batchMint_8936": { + "entryPoint": 12756, + "id": 8936, + "parameterSlots": 4, + "returnSlots": 0 + }, + "fun_batchMint_inner": { + "entryPoint": 12740, + "id": null, + "parameterSlots": 4, + "returnSlots": 0 + }, + "fun_burn": { + "entryPoint": 18943, + "id": 8715, + "parameterSlots": 3, + "returnSlots": 0 + }, + "fun_burn_5545": { + "entryPoint": 20987, + "id": 5545, + "parameterSlots": 3, + "returnSlots": 0 + }, + "fun_burn_8517": { + "entryPoint": 12695, + "id": 8517, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun_checkOnERC1155BatchReceived": { + "entryPoint": 23865, + "id": 5977, + "parameterSlots": 5, + "returnSlots": 0 + }, + "fun_checkOnERC1155Received": { + "entryPoint": 22469, + "id": 5959, + "parameterSlots": 5, + "returnSlots": 0 + }, + "fun_checkRole": { + "entryPoint": 19730, + "id": 131, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun_commit": { + "entryPoint": 16473, + "id": 9177, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_contains": { + "entryPoint": 24279, + "id": 3275, + "parameterSlots": 2, + "returnSlots": 1 + }, + "fun_feeDenominator": { + "entryPoint": 17898, + "id": 1247, + "parameterSlots": 0, + "returnSlots": 1 + }, + "fun_getIndexOrDefault": { + "entryPoint": 19350, + "id": 9543, + "parameterSlots": 2, + "returnSlots": 1 + }, + "fun_getRevealIdx": { + "entryPoint": 18190, + "id": 9518, + "parameterSlots": 2, + "returnSlots": 2 + }, + "fun_getRevealIdx_9435": { + "entryPoint": 11102, + "id": 9435, + "parameterSlots": 2, + "returnSlots": 1 + }, + "fun_getRoleAdmin": { + "entryPoint": 9128, + "id": 146, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_getRoleMember": { + "entryPoint": 11401, + "id": 375, + "parameterSlots": 2, + "returnSlots": 1 + }, + "fun_getRoleMemberCount": { + "entryPoint": 12770, + "id": 391, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_grantRole": { + "entryPoint": 18023, + "id": 415, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun_grantRole_166": { + "entryPoint": 10513, + "id": 166, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun_grantRole_inner": { + "entryPoint": 10501, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun_hasCode": { + "entryPoint": 22456, + "id": 5943, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_hasRole": { + "entryPoint": 11504, + "id": 79, + "parameterSlots": 2, + "returnSlots": 1 + }, + "fun_initialize": { + "entryPoint": 20739, + "id": 8436, + "parameterSlots": 6, + "returnSlots": 0 + }, + "fun_initializeImplicitMode": { + "entryPoint": 23576, + "id": 10071, + "parameterSlots": 3, + "returnSlots": 0 + }, + "fun_initializeSignalsImplicitMode": { + "entryPoint": 24333, + "id": 5070, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun_initialize_8888": { + "entryPoint": 18807, + "id": 8888, + "parameterSlots": 8, + "returnSlots": 0 + }, + "fun_initialize_9100": { + "entryPoint": 11330, + "id": 9100, + "parameterSlots": 8, + "returnSlots": 0 + }, + "fun_isApprovedForAll": { + "entryPoint": 15886, + "id": 5269, + "parameterSlots": 2, + "returnSlots": 1 + }, + "fun_length": { + "entryPoint": 21337, + "id": 3289, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_length_3541": { + "entryPoint": 19237, + "id": 3541, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_mint": { + "entryPoint": 19883, + "id": 5463, + "parameterSlots": 4, + "returnSlots": 0 + }, + "fun_mint_8911": { + "entryPoint": 11265, + "id": 8911, + "parameterSlots": 4, + "returnSlots": 0 + }, + "fun_mint_inner": { + "entryPoint": 11249, + "id": null, + "parameterSlots": 4, + "returnSlots": 0 + }, + "fun_msgSender": { + "entryPoint": 18065, + "id": 1682, + "parameterSlots": 0, + "returnSlots": 1 + }, + "fun_refundPack": { + "entryPoint": 8788, + "id": 9414, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun_remove": { + "entryPoint": 23310, + "id": 3256, + "parameterSlots": 2, + "returnSlots": 1 + }, + "fun_remove_3499": { + "entryPoint": 20680, + "id": 3499, + "parameterSlots": 2, + "returnSlots": 1 + }, + "fun_renounceRole": { + "entryPoint": 10695, + "id": 209, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun_reveal": { + "entryPoint": 14743, + "id": 9357, + "parameterSlots": 5, + "returnSlots": 0 + }, + "fun_revokeRole": { + "entryPoint": 12850, + "id": 186, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun_revokeRole_314": { + "entryPoint": 20526, + "id": 314, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun_revokeRole_inner": { + "entryPoint": 12838, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun_royaltyInfo": { + "entryPoint": 9626, + "id": 1238, + "parameterSlots": 2, + "returnSlots": 2 + }, + "fun_safeBatchTransferFrom": { + "entryPoint": 9845, + "id": 5371, + "parameterSlots": 8, + "returnSlots": 0 + }, + "fun_safeTransferFrom": { + "entryPoint": 15973, + "id": 5328, + "parameterSlots": 6, + "returnSlots": 0 + }, + "fun_setApprovalForAll": { + "entryPoint": 12615, + "id": 5279, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun_setBaseMetadataURI": { + "entryPoint": 11319, + "id": 8473, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_setBaseMetadataURI_inner": { + "entryPoint": 11306, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_setContractName": { + "entryPoint": 7982, + "id": 8487, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_setContractName_inner": { + "entryPoint": 7969, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_setContractURI": { + "entryPoint": 11587, + "id": 8501, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_setContractURI_inner": { + "entryPoint": 11574, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_setDefaultRoyalty": { + "entryPoint": 17320, + "id": 1281, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun_setDefaultRoyalty_9954": { + "entryPoint": 7405, + "id": 9954, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun_setDefaultRoyalty_inner": { + "entryPoint": 7393, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun_setImplicitModeProjectId": { + "entryPoint": 15962, + "id": 10101, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_setImplicitModeProjectId_inner": { + "entryPoint": 15949, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_setImplicitModeValidator": { + "entryPoint": 8203, + "id": 10087, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_setImplicitModeValidator_inner": { + "entryPoint": 8182, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_setPacksContent": { + "entryPoint": 11089, + "id": 9132, + "parameterSlots": 3, + "returnSlots": 0 + }, + "fun_setPacksContent_inner": { + "entryPoint": 11024, + "id": null, + "parameterSlots": 3, + "returnSlots": 0 + }, + "fun_setTokenRoyalty": { + "entryPoint": 11170, + "id": 9974, + "parameterSlots": 3, + "returnSlots": 0 + }, + "fun_setTokenRoyalty_inner": { + "entryPoint": 11155, + "id": null, + "parameterSlots": 3, + "returnSlots": 0 + }, + "fun_single": { + "entryPoint": 19429, + "id": 5988, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_supportsInterface": { + "entryPoint": 21425, + "id": 10008, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_supportsInterface_10123": { + "entryPoint": 21527, + "id": 10123, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_supportsInterface_1188": { + "entryPoint": 24087, + "id": 1188, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_supportsInterface_2135": { + "entryPoint": 24365, + "id": 2135, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_supportsInterface_356": { + "entryPoint": 24151, + "id": 356, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_supportsInterface_5133": { + "entryPoint": 24215, + "id": 5133, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_supportsInterface_5396": { + "entryPoint": 24048, + "id": 5396, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_supportsInterface_60": { + "entryPoint": 24403, + "id": 60, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_supportsInterface_8565": { + "entryPoint": 19461, + "id": 8565, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_supportsInterface_8803": { + "entryPoint": 21361, + "id": 8803, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_supportsInterface_8964": { + "entryPoint": 16696, + "id": 8964, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_supportsInterface_9564": { + "entryPoint": 7265, + "id": 9564, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_toHexString": { + "entryPoint": 21651, + "id": 2086, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_toHexString_2066": { + "entryPoint": 22124, + "id": 2066, + "parameterSlots": 2, + "returnSlots": 1 + }, + "fun_toString": { + "entryPoint": 17442, + "id": 6719, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_uri": { + "entryPoint": 8501, + "id": 8459, + "parameterSlots": 1, + "returnSlots": 1 + }, + "fun_useAfterTokenTransfer": { + "entryPoint": 17935, + "id": 5887, + "parameterSlots": 0, + "returnSlots": 1 + }, + "fun_useBeforeTokenTransfer": { + "entryPoint": 17921, + "id": 5861, + "parameterSlots": 0, + "returnSlots": 1 + }, + "fun_verify": { + "entryPoint": 19269, + "id": 7554, + "parameterSlots": 3, + "returnSlots": 1 + }, + "getter_fun_DEFAULT_ADMIN_ROLE": { + "entryPoint": 5957, + "id": 27, + "parameterSlots": 0, + "returnSlots": 1 + }, + "getter_fun_baseURI": { + "entryPoint": 4841, + "id": 8372, + "parameterSlots": 0, + "returnSlots": 1 + }, + "getter_fun_contractURI": { + "entryPoint": 6772, + "id": 8374, + "parameterSlots": 0, + "returnSlots": 1 + }, + "getter_fun_erc1155Holder": { + "entryPoint": 4565, + "id": 9026, + "parameterSlots": 0, + "returnSlots": 1 + }, + "getter_fun_merkleRoot": { + "entryPoint": 3919, + "id": 9030, + "parameterSlots": 1, + "returnSlots": 1 + }, + "getter_fun_name": { + "entryPoint": 1731, + "id": 8370, + "parameterSlots": 0, + "returnSlots": 1 + }, + "getter_fun_remainingSupply": { + "entryPoint": 3998, + "id": 9038, + "parameterSlots": 1, + "returnSlots": 1 + }, + "getter_fun_supply": { + "entryPoint": 3723, + "id": 9034, + "parameterSlots": 1, + "returnSlots": 1 + }, + "getter_fun_tokenSupply": { + "entryPoint": 3041, + "id": 8584, + "parameterSlots": 1, + "returnSlots": 1 + }, + "getter_fun_totalSupply": { + "entryPoint": 2459, + "id": 8580, + "parameterSlots": 0, + "returnSlots": 1 + }, + "identity": { + "entryPoint": 2986, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "increment_wrapping_uint256": { + "entryPoint": 14728, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "mapping_index_access_mapping_address_bool_of_address": { + "entryPoint": 11441, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "mapping_index_access_mapping_address_mapping_uint256_uint256_of_address": { + "entryPoint": 8599, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "mapping_index_access_mapping_bytes32_struct_AddressSet_storage_of_bytes32": { + "entryPoint": 11374, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "mapping_index_access_mapping_bytes32_struct_RoleData_storage_of_bytes32": { + "entryPoint": 9071, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "mapping_index_access_mapping_bytes32_uint256_of_bytes32": { + "entryPoint": 23094, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "mapping_index_access_mapping_uint256_bytes32_of_uint256": { + "entryPoint": 3854, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "mapping_index_access_mapping_uint256_mapping_uint256_uint256_of_uint256": { + "entryPoint": 13960, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "mapping_index_access_mapping_uint256_struct_RoyaltyInfo_storage_of_uint256": { + "entryPoint": 9167, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "mapping_index_access_mapping_uint256_uint256_of_uint256": { + "entryPoint": 3017, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "mask_bytes_dynamic": { + "entryPoint": 7708, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "memory_array_index_access_bytes": { + "entryPoint": 21811, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "memory_array_index_access_uint256_dyn": { + "entryPoint": 14683, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "mod_uint256": { + "entryPoint": 18156, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "modifier_onlyRole": { + "entryPoint": 11219, + "id": 38, + "parameterSlots": 4, + "returnSlots": 0 + }, + "modifier_onlyRole_10078": { + "entryPoint": 8029, + "id": 38, + "parameterSlots": 1, + "returnSlots": 0 + }, + "modifier_onlyRole_10094": { + "entryPoint": 15922, + "id": 38, + "parameterSlots": 1, + "returnSlots": 0 + }, + "modifier_onlyRole_158": { + "entryPoint": 10472, + "id": 38, + "parameterSlots": 2, + "returnSlots": 0 + }, + "modifier_onlyRole_178": { + "entryPoint": 12809, + "id": 38, + "parameterSlots": 2, + "returnSlots": 0 + }, + "modifier_onlyRole_8466": { + "entryPoint": 11279, + "id": 38, + "parameterSlots": 1, + "returnSlots": 0 + }, + "modifier_onlyRole_8480": { + "entryPoint": 7453, + "id": 38, + "parameterSlots": 1, + "returnSlots": 0 + }, + "modifier_onlyRole_8494": { + "entryPoint": 11547, + "id": 38, + "parameterSlots": 1, + "returnSlots": 0 + }, + "modifier_onlyRole_8926": { + "entryPoint": 12710, + "id": 38, + "parameterSlots": 4, + "returnSlots": 0 + }, + "modifier_onlyRole_9111": { + "entryPoint": 10896, + "id": 38, + "parameterSlots": 3, + "returnSlots": 0 + }, + "modifier_onlyRole_9946": { + "entryPoint": 7365, + "id": 38, + "parameterSlots": 2, + "returnSlots": 0 + }, + "modifier_onlyRole_9965": { + "entryPoint": 11126, + "id": 38, + "parameterSlots": 3, + "returnSlots": 0 + }, + "panic_error_0x00": { + "entryPoint": 1337, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "panic_error_0x11": { + "entryPoint": 9495, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "panic_error_0x12": { + "entryPoint": 9570, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "panic_error_0x22": { + "entryPoint": 1359, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "panic_error_0x31": { + "entryPoint": 23221, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "panic_error_0x32": { + "entryPoint": 14074, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "panic_error_0x41": { + "entryPoint": 1609, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "prepare_store_address": { + "entryPoint": 17117, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "prepare_store_bool": { + "entryPoint": 20201, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "prepare_store_bytes32": { + "entryPoint": 10948, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "prepare_store_contract_IImplicitProjectValidation": { + "entryPoint": 8147, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "prepare_store_uint256": { + "entryPoint": 7532, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "prepare_store_uint96": { + "entryPoint": 17222, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "read_from_calldatat_address": { + "entryPoint": 14117, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "read_from_calldatat_bool": { + "entryPoint": 14396, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "read_from_memoryt_address": { + "entryPoint": 9401, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "read_from_memoryt_uint256": { + "entryPoint": 14715, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "read_from_memoryt_uint96": { + "entryPoint": 9454, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "read_from_storage_dynamic_split_string": { + "entryPoint": 1706, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "read_from_storage_reference_type_struct_RoyaltyInfo": { + "entryPoint": 9332, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "read_from_storage_split_dynamic_bytes32": { + "entryPoint": 3905, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "read_from_storage_split_dynamic_uint256": { + "entryPoint": 2445, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "read_from_storage_split_offset_address": { + "entryPoint": 9222, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "read_from_storage_split_offset_bool": { + "entryPoint": 11491, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "read_from_storage_split_offset_bytes32": { + "entryPoint": 9115, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "read_from_storage_split_offset_contract_IImplicitProjectValidation": { + "entryPoint": 11629, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "read_from_storage_split_offset_uint256": { + "entryPoint": 8649, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "read_from_storage_split_offset_uint96": { + "entryPoint": 9292, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "require_helper_stringliteral_04fc": { + "entryPoint": 22083, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "require_helper_stringliteral_d20a": { + "entryPoint": 18635, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "require_helper_stringliteral_dcda": { + "entryPoint": 16931, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "require_helper_stringliteral_f66a": { + "entryPoint": 17063, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "require_helper_stringliteral_fb06": { + "entryPoint": 10654, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "revert_error_0803104b3ab68501accf02de57372b8e5e6e1582158b771d3f89279dc6822fe2": { + "entryPoint": 11804, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_0cc013b6b3b6beabea4e3a74a6d380f0df81852ca99887912475e1f66b2a2c20": { + "entryPoint": 11654, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_15abf5612cd996bc235ba1e55a4a30ac60e6bb601ff7ba4ad3f179b6be8d0490": { + "entryPoint": 3270, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_1b9f4a0a5773e33b91aa01db23bf8c55fce1411167c872835e7fa00a4f17d46d": { + "entryPoint": 1924, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_1e55d03107e9c4f1b5e21c76a16fba166a461117ab153bcce65e6a4ea8e5fc8a": { + "entryPoint": 13989, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_21fe6b43b4db61d76a176e95bf1a6b9ede4c301f93a4246f41fecb96e160861d": { + "entryPoint": 5704, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_356d538aaf70fba12156cc466564b792649f8f3befb07b071c91142253e175ad": { + "entryPoint": 13984, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_3894daff73bdbb8963c284e167b207f7abade3c031c50828ea230a16bdbc0f20": { + "entryPoint": 11809, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74": { + "entryPoint": 7214, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_81385d8c0b31fffe14be1da910c8bd3a80be4cfa248e04f42ec0faea3132a8ef": { + "entryPoint": 2555, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_977805620ff29572292dee35f70b0f3f3f73d3fdd0e9f4d7a901c2e43ab18a2e": { + "entryPoint": 13994, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_987264b3b1d58a9c7f8255e93e81c77d86d6299019c33110a076957a3e06e2ae": { + "entryPoint": 1929, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db": { + "entryPoint": 754, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb": { + "entryPoint": 744, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_d0468cefdb41083d2ff66f1e66140f10c9da08cd905521a779422e76a84d11ec": { + "entryPoint": 13364, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_db64ea6d4a12deece376118739de8d9f517a2db5b58ea2ca332ea908c04c71d4": { + "entryPoint": 11814, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b": { + "entryPoint": 749, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_forward": { + "entryPoint": 12437, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "round_up_to_mul_of": { + "entryPoint": 1599, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_left": { + "entryPoint": 5910, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_left_160": { + "entryPoint": 17152, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_left_224": { + "entryPoint": 11659, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_left_248": { + "entryPoint": 21917, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_left_dynamic": { + "entryPoint": 7490, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "shift_right_0_unsigned": { + "entryPoint": 8623, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_right_224_unsigned": { + "entryPoint": 732, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_right_uint256_uint8": { + "entryPoint": 21954, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "shift_right_unsigned": { + "entryPoint": 9249, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_right_unsigned_dynamic": { + "entryPoint": 2414, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "storage_array_index_access_bytes32_dyn": { + "entryPoint": 20912, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "storage_array_index_access_bytes32_dyn_ptr": { + "entryPoint": 22966, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "storage_set_to_zero_bytes32": { + "entryPoint": 23243, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "storage_set_to_zero_uint256": { + "entryPoint": 7569, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "store_literal_in_memory_04fc88320d7c9f639317c75102c103ff0044d3075a5c627e24e76e5bbb2733c2": { + "entryPoint": 21993, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "store_literal_in_memory_94311adc0a0cd4e10be11b23bd4316b8cffa4adf693e8f96f5c075aa439a7972": { + "entryPoint": 8402, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "store_literal_in_memory_d20a09dd8b4080dbbc254e38d9f607ef83a2c7a38b671ae8f8f162ffe46e2084": { + "entryPoint": 18544, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "store_literal_in_memory_da0d07ce4a2849fbfc4cb9d6f939e9bd93016c372ca4a5ff14fe06caf3d67874": { + "entryPoint": 19560, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "store_literal_in_memory_dcda5bd52710522f2cc94635314fdacbfec7cf9b64adb69f4a07b374f938990d": { + "entryPoint": 16802, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "store_literal_in_memory_f66a1010ca1024f054dcd95a016427c9d452e7f1ceb553ccd3a5e37073a6ffff": { + "entryPoint": 16972, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "store_literal_in_memory_f986ce851518a691bccd44ea42a5a185d1b866ef6cb07984a09b81694d20ab69": { + "entryPoint": 19625, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "store_literal_in_memory_fb06fa8ff2141e8ed74502f6792273793f25f0e9d3cf15344f3f5a0d4948fd4b": { + "entryPoint": 10525, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "update_byte_slice_1_shift": { + "entryPoint": 20167, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "update_byte_slice_20_shift": { + "entryPoint": 8108, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "update_byte_slice_dynamic32": { + "entryPoint": 7494, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "update_byte_slice_shift": { + "entryPoint": 17158, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "update_byte_slice_shift_0": { + "entryPoint": 10925, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "update_storage_value_bytes32_to_bytes32": { + "entryPoint": 23007, + "id": null, + "parameterSlots": 3, + "returnSlots": 0 + }, + "update_storage_value_offsett_address_to_address": { + "entryPoint": 17120, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "update_storage_value_offsett_bool_to_bool": { + "entryPoint": 20204, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "update_storage_value_offsett_bytes32_to_bytes32": { + "entryPoint": 10960, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "update_storage_value_offsett_contract_IImplicitProjectValidation_to_contract_IImplicitProjectValidation": { + "entryPoint": 8150, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "update_storage_value_offsett_string_to_string": { + "entryPoint": 7957, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "update_storage_value_offsett_struct_RoyaltyInfo_to_struct_RoyaltyInfo": { + "entryPoint": 17308, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "update_storage_value_offsett_uint256_to_uint256": { + "entryPoint": 10992, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "update_storage_value_offsett_uint96_to_uint96": { + "entryPoint": 17225, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "update_storage_value_uint256_to_uint256": { + "entryPoint": 7535, + "id": null, + "parameterSlots": 3, + "returnSlots": 0 + }, + "validator_revert_address": { + "entryPoint": 782, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "validator_revert_bool": { + "entryPoint": 6021, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "validator_revert_bytes32": { + "entryPoint": 2831, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "validator_revert_bytes4": { + "entryPoint": 1004, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "validator_revert_uint256": { + "entryPoint": 821, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "validator_revert_uint64": { + "entryPoint": 12078, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "validator_revert_uint96": { + "entryPoint": 1181, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "write_to_memory_address": { + "entryPoint": 9235, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "write_to_memory_uint96": { + "entryPoint": 9305, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "zero_memory_chunk_bytes1": { + "entryPoint": 21759, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "zero_value_for_split_address": { + "entryPoint": 9162, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "zero_value_for_split_array_uint256_dyn": { + "entryPoint": 10742, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "zero_value_for_split_bool": { + "entryPoint": 7260, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "zero_value_for_split_bytes32": { + "entryPoint": 9054, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "zero_value_for_split_string": { + "entryPoint": 8214, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "zero_value_for_split_uint256": { + "entryPoint": 7219, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "zero_value_for_split_uint96": { + "entryPoint": 17862, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + } + }, + "generatedSources": [], + "immutableReferences": { + "9026": [ + { + "length": 32, + "start": 4567 + }, + { + "length": 32, + "start": 15428 + }, + { + "length": 32, + "start": 15729 + } + ] + }, + "linkReferences": {}, + "object": "60806040526004361015610013575b611c2e565b61001e6000356102dc565b8062fdd58e146102d757806301ffc9a7146102d257806304634d8d146102cd57806306fdde03146102c85780630b5ee006146102c35780630bb310de146102be5780630e89341c146102b9578063167a59f7146102b457806318160ddd146102af57806320ec271b146102aa578063248a9ca3146102a55780632693ebf2146102a05780632a55205a1461029b5780632eb2c2d6146102965780632f2ff15d14610291578063354030231461028c57806336568abe146102875780633c70b3571461028257806347fda41a1461027d5780634e1273f41461027857806350336a0314610273578063513046831461026e5780635377ab8f146102695780635944c753146102645780636c0360eb1461025f578063731133e91461025a5780637e518ec8146102555780638ff83ac1146102505780639010d07c1461024b57806391d1485414610246578063938e3d7b146102415780639d043a661461023c578063a217fddf14610237578063a22cb46514610232578063b390c0ab1461022d578063b48ab8b614610228578063ca15c87314610223578063d547741f1461021e578063d67b333b14610219578063e8a3d48514610214578063e985e9c51461020f578063ed4c2ac71461020a578063f242432a146102055763f4f98ad50361000e57611bfb565b611bc1565b611b1d565b611ae7565b611a84565b611a3d565b61193b565b611906565b6118cf565b61180b565b6117d7565b611750565b6116dd565b611615565b6115df565b6115a9565b61153e565b611441565b61140a565b6112f9565b6112b5565b611244565b61120f565b6111a1565b61112d565b610fb8565b610f69565b610eda565b610ea5565b610e57565b610dec565b610c8f565b610bfb565b610b75565b610ad8565b6109a9565b61093a565b610905565b6108b3565b610861565b61074f565b6104f5565b610457565b6103aa565b60e01c90565b60405190565b600080fd5b600080fd5b600080fd5b60018060a01b031690565b61030b906102f7565b90565b61031781610302565b0361031e57565b600080fd5b905035906103308261030e565b565b90565b61033e81610332565b0361034557565b600080fd5b9050359061035782610335565b565b9190604083820312610382578061037661037f9260008601610323565b9360200161034a565b90565b6102ed565b61039090610332565b9052565b91906103a890600060208501940190610387565b565b346103db576103d76103c66103c0366004610359565b90611c38565b6103ce6102e2565b91829182610394565b0390f35b6102e8565b63ffffffff60e01b1690565b6103f5816103e0565b036103fc57565b600080fd5b9050359061040e826103ec565b565b9060208282031261042a5761042791600001610401565b90565b6102ed565b151590565b61043d9061042f565b9052565b919061045590600060208501940190610434565b565b346104875761048361047261046d366004610410565b611c61565b61047a6102e2565b91829182610441565b0390f35b6102e8565b6bffffffffffffffffffffffff1690565b6104a68161048c565b036104ad57565b600080fd5b905035906104bf8261049d565b565b91906040838203126104ea57806104de6104e79260008601610323565b936020016104b2565b90565b6102ed565b60000190565b346105245761050e6105083660046104c1565b90611ced565b6105166102e2565b80610520816104ef565b0390f35b6102e8565b600091031261053457565b6102ed565b634e487b7160e01b600052600060045260246000fd5b634e487b7160e01b600052602260045260246000fd5b9060016002830492168015610585575b602083101461058057565b61054f565b91607f1691610575565b60209181520190565b600052602060002090565b90600092918054906105be6105b783610565565b809461058f565b9160018116908160001461061757506001146105da575b505050565b6105e79192939450610598565b916000925b8184106105ff57505001903880806105d5565b600181602092959395548486015201910192906105ec565b92949550505060ff19168252151560200201903880806105d5565b9061063c916105a3565b90565b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b906106699061063f565b810190811067ffffffffffffffff82111761068357604052565b610649565b906106a86106a1926106986102e2565b93848092610632565b038361065f565b565b906000106106be576106bb90610688565b90565b610539565b6106d060086000906106aa565b90565b5190565b60209181520190565b60005b8381106106f4575050906000910152565b8060209183015181850152016106e3565b61072461072d6020936107329361071b816106d3565b938480936106d7565b958691016106e0565b61063f565b0190565b61074c9160208201916000818403910152610705565b90565b3461077f5761075f366004610529565b61077b61076a6106c3565b6107726102e2565b91829182610736565b0390f35b6102e8565b600080fd5b600080fd5b906107a161079a6102e2565b928361065f565b565b67ffffffffffffffff81116107c1576107bd60209161063f565b0190565b610649565b90826000939282370152565b909291926107e76107e2826107a3565b61078e565b9381855260208501908284011161080357610801926107c6565b565b610789565b9080601f8301121561082657816020610823933591016107d2565b90565b610784565b9060208282031261085c57600082013567ffffffffffffffff8111610857576108549201610808565b90565b6102f2565b6102ed565b3461088f5761087961087436600461082b565b611f2e565b6108816102e2565b8061088b816104ef565b0390f35b6102e8565b906020828203126108ae576108ab91600001610323565b90565b6102ed565b346108e1576108cb6108c6366004610894565b61200b565b6108d36102e2565b806108dd816104ef565b0390f35b6102e8565b90602082820312610900576108fd9160000161034a565b90565b6102ed565b346109355761093161092061091b3660046108e6565b612135565b6109286102e2565b91829182610736565b0390f35b6102e8565b346109695761095361094d366004610359565b90612254565b61095b6102e2565b80610965816104ef565b0390f35b6102e8565b1c90565b90565b61098590600861098a930261096e565b610972565b90565b906109989154610975565b90565b6109a660008061098d565b90565b346109d9576109b9366004610529565b6109d56109c461099b565b6109cc6102e2565b91829182610394565b0390f35b6102e8565b67ffffffffffffffff81116109f65760208091020190565b610649565b600080fd5b90929192610a15610a10826109de565b61078e565b9381855260208086019202830192818411610a5257915b838310610a395750505050565b60208091610a47848661034a565b815201920191610a2c565b6109fb565b9080601f83011215610a7557816020610a7293359101610a00565b90565b610784565b919091604081840312610ad357600081013567ffffffffffffffff8111610ace5783610aa7918301610a57565b92602082013567ffffffffffffffff8111610ac957610ac69201610a57565b90565b6102f2565b6102f2565b6102ed565b34610b0757610af1610aeb366004610a7a565b9061234f565b610af96102e2565b80610b03816104ef565b0390f35b6102e8565b90565b610b1881610b0c565b03610b1f57565b600080fd5b90503590610b3182610b0f565b565b90602082820312610b4d57610b4a91600001610b24565b90565b6102ed565b610b5b90610b0c565b9052565b9190610b7390600060208501940190610b52565b565b34610ba557610ba1610b90610b8b366004610b33565b6123a8565b610b986102e2565b91829182610b5f565b0390f35b6102e8565b90565b610bc1610bbc610bc692610332565b610baa565b610332565b90565b90610bd390610bad565b600052602052604060002090565b610bf890610bf3600191600092610bc9565b61098d565b90565b34610c2b57610c27610c16610c113660046108e6565b610be1565b610c1e6102e2565b91829182610394565b0390f35b6102e8565b9190604083820312610c595780610c4d610c56926000860161034a565b9360200161034a565b90565b6102ed565b610c6790610302565b9052565b916020610c8d929493610c8660408201966000830190610c5e565b0190610387565b565b34610cc157610ca8610ca2366004610c30565b9061259a565b90610cbd610cb46102e2565b92839283610c6b565b0390f35b6102e8565b600080fd5b909182601f83011215610d055781359167ffffffffffffffff8311610d00576020019260208302840111610cfb57565b6109fb565b610cc6565b610784565b909182601f83011215610d445781359167ffffffffffffffff8311610d3f576020019260018302840111610d3a57565b6109fb565b610cc6565b610784565b9160a083830312610de757610d618260008501610323565b92610d6f8360208301610323565b92604082013567ffffffffffffffff8111610de25781610d90918401610ccb565b929093606082013567ffffffffffffffff8111610ddd5783610db3918401610ccb565b929093608082013567ffffffffffffffff8111610dd857610dd49201610d0a565b9091565b6102f2565b6102f2565b6102f2565b6102ed565b34610e2457610e0e610dff366004610d49565b96959095949194939293612675565b610e166102e2565b80610e20816104ef565b0390f35b6102e8565b9190604083820312610e525780610e46610e4f9260008601610b24565b93602001610323565b90565b6102ed565b34610e8657610e70610e6a366004610e29565b90612911565b610e786102e2565b80610e82816104ef565b0390f35b6102e8565b610ea290610e9d600d91600092610bc9565b61098d565b90565b34610ed557610ed1610ec0610ebb3660046108e6565b610e8b565b610ec86102e2565b91829182610394565b0390f35b6102e8565b34610f0957610ef3610eed366004610e29565b906129c7565b610efb6102e2565b80610f05816104ef565b0390f35b6102e8565b90610f1890610bad565b600052602052604060002090565b90565b610f39906008610f3e930261096e565b610f26565b90565b90610f4c9154610f29565b90565b610f6690610f61600c91600092610f0e565b610f41565b90565b34610f9957610f95610f84610f7f3660046108e6565b610f4f565b610f8c6102e2565b91829182610b5f565b0390f35b6102e8565b610fb590610fb0600e91600092610bc9565b61098d565b90565b34610fe857610fe4610fd3610fce3660046108e6565b610f9e565b610fdb6102e2565b91829182610394565b0390f35b6102e8565b909182601f830112156110275781359167ffffffffffffffff831161102257602001926020830284011161101d57565b6109fb565b610cc6565b610784565b909160408284031261108757600082013567ffffffffffffffff81116110825783611058918401610fed565b929093602082013567ffffffffffffffff811161107d576110799201610ccb565b9091565b6102f2565b6102f2565b6102ed565b5190565b60209181520190565b60200190565b6110a890610332565b9052565b906110b98160209361109f565b0190565b60200190565b906110e06110da6110d38461108c565b8093611090565b92611099565b9060005b8181106110f15750505090565b90919261110a61110460019286516110ac565b946110bd565b91019190916110e4565b61112a91602082019160008184039101526110c3565b90565b346111615761115d61114c61114336600461102c565b929190916129fb565b6111546102e2565b91829182611114565b0390f35b6102e8565b909160608284031261119c576111996111828460008501610b24565b93611190816020860161034a565b9360400161034a565b90565b6102ed565b346111d0576111ba6111b4366004611166565b91612b51565b6111c26102e2565b806111cc816104ef565b0390f35b6102e8565b7f000000000000000000000000000000000000000000000000000000000000000090565b919061120d90600060208501940190610c5e565b565b3461123f5761121f366004610529565b61123b61122a6111d5565b6112326102e2565b918291826111f9565b0390f35b6102e8565b346112755761127161126061125a366004610359565b90612b5e565b6112686102e2565b91829182610394565b0390f35b6102e8565b90916060828403126112b0576112ad611296846000850161034a565b936112a48160208601610323565b936040016104b2565b90565b6102ed565b346112e4576112ce6112c836600461127a565b91612ba2565b6112d66102e2565b806112e0816104ef565b0390f35b6102e8565b6112f660096000906106aa565b90565b3461132957611309366004610529565b6113256113146112e9565b61131c6102e2565b91829182610736565b0390f35b6102e8565b67ffffffffffffffff811161134c5761134860209161063f565b0190565b610649565b909291926113666113618261132e565b61078e565b9381855260208501908284011161138257611380926107c6565b565b610789565b9080601f830112156113a5578160206113a293359101611351565b90565b610784565b90608082820312611405576113c28160008401610323565b926113d0826020850161034a565b926113de836040830161034a565b92606082013567ffffffffffffffff8111611400576113fd9201611387565b90565b6102f2565b6102ed565b3461143c5761142661141d3660046113aa565b92919091612c01565b61142e6102e2565b80611438816104ef565b0390f35b6102e8565b3461146f5761145961145436600461082b565b612c37565b6114616102e2565b8061146b816104ef565b0390f35b6102e8565b9190610100838203126115395761148e8160008501610323565b92602081013567ffffffffffffffff811161153457826114af918301610808565b92604082013567ffffffffffffffff811161152f57836114d0918401610808565b92606083013567ffffffffffffffff811161152a57816114f1918501610808565b926114ff8260808301610323565b926115276115108460a085016104b2565b9361151e8160c08601610323565b9360e001610b24565b90565b6102f2565b6102f2565b6102f2565b6102ed565b3461157657611560611551366004611474565b96959095949194939293612c42565b6115686102e2565b80611572816104ef565b0390f35b6102e8565b91906040838203126115a457806115986115a19260008601610b24565b9360200161034a565b90565b6102ed565b346115da576115d66115c56115bf36600461157b565b90612c89565b6115cd6102e2565b918291826111f9565b0390f35b6102e8565b346116105761160c6115fb6115f5366004610e29565b90612cf0565b6116036102e2565b91829182610441565b0390f35b6102e8565b346116435761162d61162836600461082b565b612d43565b6116356102e2565b8061163f816104ef565b0390f35b6102e8565b600080fd5b908160c091031261165b5790565b611648565b908160e091031261166e5790565b611648565b916060838303126116d85761168b8260008501610323565b92602081013567ffffffffffffffff81116116d357836116ac91830161164d565b92604082013567ffffffffffffffff81116116ce576116cb9201611660565b90565b6102f2565b6102f2565b6102ed565b3461170e5761170a6116f96116f3366004611673565b916130a6565b6117016102e2565b91829182610b5f565b0390f35b6102e8565b90565b60001b90565b61173061172b61173592611713565b611716565b610b0c565b90565b611742600061171c565b90565b61174d611738565b90565b3461178057611760366004610529565b61177c61176b611745565b6117736102e2565b91829182610b5f565b0390f35b6102e8565b61178e8161042f565b0361179557565b600080fd5b905035906117a782611785565b565b91906040838203126117d257806117c66117cf9260008601610323565b9360200161179a565b90565b6102ed565b34611806576117f06117ea3660046117a9565b90613147565b6117f86102e2565b80611802816104ef565b0390f35b6102e8565b3461183a5761182461181e366004610c30565b90613197565b61182c6102e2565b80611836816104ef565b0390f35b6102e8565b906080828203126118ca576118578160008401610323565b92602083013567ffffffffffffffff81116118c55782611878918501610a57565b92604081013567ffffffffffffffff81116118c05783611899918301610a57565b92606082013567ffffffffffffffff81116118bb576118b89201611387565b90565b6102f2565b6102f2565b6102f2565b6102ed565b34611901576118eb6118e236600461183f565b929190916131d4565b6118f36102e2565b806118fd816104ef565b0390f35b6102e8565b346119365761193261192161191c366004610b33565b6131e2565b6119296102e2565b91829182610394565b0390f35b6102e8565b3461196a5761195461194e366004610e29565b90613232565b61195c6102e2565b80611966816104ef565b0390f35b6102e8565b9081608091031261197d5790565b611648565b909182601f830112156119bc5781359167ffffffffffffffff83116119b75760200192602083028401116119b257565b6109fb565b610cc6565b610784565b919091608081840312611a38576119db8360008301610323565b92602082013567ffffffffffffffff8111611a3357816119fc91840161196f565b92604083013567ffffffffffffffff8111611a2e57611a2083611a2b928601611982565b93909460600161034a565b90565b6102f2565b6102f2565b6102ed565b34611a6f57611a59611a503660046119c1565b93929092613997565b611a616102e2565b80611a6b816104ef565b0390f35b6102e8565b611a81600a6000906106aa565b90565b34611ab457611a94366004610529565b611ab0611a9f611a74565b611aa76102e2565b91829182610736565b0390f35b6102e8565b9190604083820312611ae25780611ad6611adf9260008601610323565b93602001610323565b90565b6102ed565b34611b1857611b14611b03611afd366004611ab9565b90613e0e565b611b0b6102e2565b91829182610441565b0390f35b6102e8565b34611b4b57611b35611b30366004610b33565b613e5a565b611b3d6102e2565b80611b47816104ef565b0390f35b6102e8565b91909160a081840312611bbc57611b6a8360008301610323565b92611b788160208401610323565b92611b86826040850161034a565b92611b94836060830161034a565b92608082013567ffffffffffffffff8111611bb757611bb39201610d0a565b9091565b6102f2565b6102ed565b34611bf657611be0611bd4366004611b50565b94939093929192613e65565b611be86102e2565b80611bf2816104ef565b0390f35b6102e8565b34611c2957611c13611c0e3660046108e6565b614059565b611c1b6102e2565b80611c25816104ef565b0390f35b6102e8565b600080fd5b600090565b611c40611c33565b50679a31110384e0b0c960205260145260005260406000205490565b600090565b611c69611c5c565b5080611c84611c7e6337bc219560e01b6103e0565b916103e0565b14908115611c91575b5090565b611c9b9150614138565b38611c8d565b7f6db4061a20ca83a3be756ee172bd37a029093ac5afe4ce968c6d5435b43cb01190565b90611cdf91611cda611cd5611ca1565b61418e565b611ce1565b565b90611ceb916143a8565b565b90611cf791611cc5565b565b7fe02a0315b383857ac496e9d2b2546a699afaeb4e5e83a1fdef64376d0b74e5a590565b611d3690611d31611d2c611cf9565b61418e565b611f21565b565b601f602091010490565b1b90565b91906008611d62910291611d5c60001984611d42565b92611d42565b9181191691161790565b90565b9190611d85611d80611d8d93610bad565b611d6c565b908354611d46565b9055565b611da391611d9d611c33565b91611d6f565b565b5b818110611db1575050565b80611dbf6000600193611d91565b01611da6565b9190601f8111611dd5575b505050565b611de1611e0693610598565b906020611ded84611d38565b83019310611e0e575b611dff90611d38565b0190611da5565b388080611dd0565b9150611dff81929050611df6565b90611e2d906000199060080261096e565b191690565b81611e3c91611e1c565b906002021790565b90611e4e816106d3565b9067ffffffffffffffff8211611f1057611e7282611e6c8554610565565b85611dc5565b602090601f8311600114611ea757918091611e9693600092611e9b575b5050611e32565b90555b565b90915001513880611e8f565b601f19831691611eb685610598565b9260005b818110611ef857509160029391856001969410611ede575b50505002019055611e99565b611eee910151601f841690611e1c565b9055388080611ed2565b91936020600181928787015181550195019201611eba565b610649565b90611f1f91611e44565b565b611f2c906008611f15565b565b611f3790611d1d565b565b7f70649ec320b507febad3e8ef750e5f580b9ae32f9f50d4c7b121332c8197153090565b611f7690611f71611f6c611f39565b61418e565b611ff6565b565b611f8c611f87611f91926102f7565b610baa565b6102f7565b90565b611f9d90611f78565b90565b611fa990611f94565b90565b90611fbd60018060a01b0391611716565b9181191691161790565b611fd090611f94565b90565b90565b90611feb611fe6611ff292611fc7565b611fd3565b8254611fac565b9055565b61200261200991611fa0565b6006611fd6565b565b61201490611f5d565b565b606090565b905090565b906000929180549061203b61203483610565565b809461201b565b9160018116908160001461208f5750600114612057575b505050565b6120649192939450610598565b6000905b83821061207b5750500190388080612052565b600181602092548486015201910190612068565b92949550505060ff19168252801515020190388080612052565b6120ce6120c5926020926120bc816106d3565b9485809361201b565b938491016106e0565b0190565b60007f2e6a736f6e000000000000000000000000000000000000000000000000000000910152565b6121066005809261201b565b61210f816120d2565b0190565b9161212461212f9361212a93612020565b906120a9565b6120fa565b90565b90565b61217c90612141612016565b50612177612150600992614422565b9161216861215c6102e2565b93849260208401612113565b6020820181038252038261065f565b612132565b90565b61218890611f78565b90565b6121949061217f565b90565b906121a19061218b565b600052602052604060002090565b60001c90565b6121c16121c6916121af565b610972565b90565b6121d390546121b5565b90565b6121ea6121e56121ef92611713565b610baa565b610332565b90565b6121fe612203916121af565b610bad565b90565b90565b61221d61221861222292612206565b610baa565b610332565b90565b90612237612232836107a3565b61078e565b918252565b6122466000612225565b90565b61225161223c565b90565b9061227361226e612267600f8590612197565b8390610bc9565b6121c9565b8061228761228160006121d6565b91610332565b146123325761229681406121f2565b6122a96122a360006121d6565b91610332565b1415908115612315575b506122f8576122f6916122dc60006122d76122d0600f8590612197565b8590610bc9565b611d91565b906122e76001612209565b906122f0612249565b92614477565b565b600063156f904360e21b815280612311600482016104ef565b0390fd5b905061232a6123244392610332565b91610332565b1115386122b3565b6000637de832b560e11b81528061234b600482016104ef565b0390fd5b61235c91339190916144f2565b565b600090565b61236c90610b0c565b90565b9061237990612363565b600052602052604060002090565b612393612398916121af565b610f26565b90565b6123a59054612387565b90565b60016123c16123c7926123b961235e565b50600461236f565b0161239b565b90565b600090565b906123d990610bad565b600052602052604060002090565b60018060a01b031690565b6123fe612403916121af565b6123e7565b90565b61241090546123f2565b90565b9061241d90610302565b9052565b60a01c90565b6bffffffffffffffffffffffff1690565b61244461244991612421565b612427565b90565b6124569054612438565b90565b906124639061048c565b9052565b612471604061078e565b90565b906124ab6124a26000612485612467565b9461249c612494838301612406565b838801612413565b0161244c565b60208401612459565b565b6124b690612474565b90565b6124c39051610302565b90565b6124da6124d56124df92611713565b610baa565b6102f7565b90565b6124eb906124c6565b90565b6124f8905161048c565b90565b61250f61250a6125149261048c565b610baa565b610332565b90565b634e487b7160e01b600052601160045260246000fd5b61253c61254291939293610332565b92610332565b9161254e838202610332565b92818404149015171561255d57565b612517565b634e487b7160e01b600052601260045260246000fd5b61258461258a91610332565b91610332565b908115612595570490565b612562565b6125bd6125c2919392936125ac6123ca565b506125b5611c33565b5060036123cf565b6124ad565b916125cf600084016124b9565b6125ea6125e46125df60006124e2565b610302565b91610302565b14612637575b600061262c6126166126339361261061260b602089016124ee565b6124fb565b9061252d565b6126266126216145ea565b6124fb565b90612578565b93016124b9565b9190565b9150612633600061262c61261661264e60026124ad565b9593505050506125f0565b612664913691610a00565b90565b612672913691611351565b90565b969396959094919295612686614601565b6128bf575b8287036128b15760601b679a31110384e0b0c9179460601b679a31110384e0b0c91791856020528560601c958360601c9384156128a357873303612887575b8860051b805b61282757505050828660207f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb604051604081528b8d8160051b948286936040860152838d6060870137836060018286015260608486010190815201376080339380010190a461273d61460f565b61280a575b50813b612753575b50505050505050565b602080809786946000528060c06040519b8c9a63bc197c818c5233868d015260408c015260a060608c01528a8360051b998a9586948593015260e08d01378160c00160808c015260e0828c010192835284830137818060e0010160a08a01520101838152013780010161010401601c60405101600080515af1156127fb575b63bc197c8160e01b9051036127ed573880808080808061274a565b639c05499b6000526004601cfd5b3d156127d2573d6000823e3d90fd5b612821908690849086908a8c919287948b9661461d565b38612742565b60209003808b013583602052818801356000526040600020805480831161287957829003905582602052604060002090815490810190811061286b578291556126d0565b6301336cea6000526004601cfd5b63f4d678b86000526004601cfd5b336000526034600c20546126ca57634b6e7f186000526004601cfd5b63ea553b346000526004601cfd5b633b800a466000526004601cfd5b6128e284886128dc8b87906128d688948c96612659565b50612659565b50612667565b5061268b565b90612903916128fe6128f9826123a8565b61418e565b612905565b565b9061290f91614667565b565b9061291b916128e8565b565b60207f20726f6c657320666f722073656c660000000000000000000000000000000000917f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201520152565b612978602f6040926106d7565b6129818161291d565b0190565b61299b906020810190600081830391015261296b565b90565b156129a557565b6129ad6102e2565b62461bcd60e51b8152806129c360048201612985565b0390fd5b906129f4916129ef826129e96129e36129de614691565b610302565b91610302565b1461299e565b61469e565b565b606090565b93929190612a076129f6565b508203612a5e5760405193828552602085019260051b808481016040525b612a2f5750505050565b602090038082013560601b679a31110384e0b0c917602052808301356000528060406000205481860152612a25565b633b800a466000526004601cfd5b7fbaa5ee745de68a3095827d2ee7dd2043afc932834d02cc1b8be3da78577f6c1a90565b90612aab9291612aa6612aa1612a6c565b61418e565b612b10565b565b90612aba60001991611716565b9181191691161790565b612acd906121af565b90565b90612ae5612ae0612aec92612363565b612ac4565b8254612aad565b9055565b90612b05612b00612b0c92610bad565b611d6c565b8254612aad565b9055565b612b4f9291612b2d612b4a92612b28600c8690610f0e565b612ad0565b612b4281612b3d600d8690610bc9565b612af0565b91600e610bc9565b612af0565b565b90612b5c9291612a90565b565b90612b7191612b6b611c33565b5061470e565b905090565b90612b919291612b8c612b87611ca1565b61418e565b612b93565b565b91612ba0929190916148f4565b565b90612bad9291612b76565b565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a690565b90612bef939291612bea612be5612baf565b61418e565b612bf1565b565b91612bff9391909192614477565b565b90612c0d939291612bd3565b565b612c2890612c23612c1e611cf9565b61418e565b612c2a565b565b612c35906009611f15565b565b612c4090612c0f565b565b91612c6c97959391969492612c5f612c58612a6c565b8290614667565b9690919293949596614977565b565b90612c7890612363565b600052602052604060002090565b90565b90612ca9612ca4612cae93612c9c6123ca565b506005612c6e565b612c86565b6149c6565b90565b90612cbb9061218b565b600052602052604060002090565b60ff1690565b612cdb612ce0916121af565b612cc9565b90565b612ced9054612ccf565b90565b612d18916000612d0d612d1393612d05611c5c565b50600461236f565b01612cb1565b612ce3565b90565b612d3490612d2f612d2a611cf9565b61418e565b612d36565b565b612d4190600a611f15565b565b612d4c90612d1b565b565b60018060a01b031690565b612d65612d6a916121af565b612d4e565b90565b612d779054612d59565b90565b612d839061217f565b90565b600080fd5b60e01b90565b90505190612d9e82610b0f565b565b90602082820312612dba57612db791600001612d91565b90565b6102ed565b50612dce906020810190610323565b90565b612dda90610302565b9052565b50612ded906020810190610401565b90565b612df9906103e0565b9052565b50612e0c906020810190610b24565b90565b612e1890610b0c565b9052565b600080fd5b600080fd5b600080fd5b9035600160200382360303811215612e6c57016020813591019167ffffffffffffffff8211612e67576001820236038313612e6257565b612e21565b612e1c565b612e26565b60209181520190565b9190612e9481612e8d81612e9995612e71565b80956107c6565b61063f565b0190565b9035600160400382360303811215612eb3570190565b612e26565b9035600160200382360303811215612ef957016020813591019167ffffffffffffffff8211612ef4576001820236038313612eef57565b612e21565b612e1c565b612e26565b9190612f1881612f1181612f1d9561058f565b80956107c6565b61063f565b0190565b67ffffffffffffffff1690565b612f3781612f21565b03612f3e57565b600080fd5b90503590612f5082612f2e565b565b50612f61906020810190612f43565b90565b612f6d90612f21565b9052565b90612faf906020612fa7612f9d60408401612f8f6000880188612eb8565b908683036000880152612efe565b9482810190612f52565b910190612f64565b90565b61305c9161304e61304360c08301612fda612fd06000870187612dbf565b6000860190612dd1565b612ff4612fea6020870187612dde565b6020860190612df0565b61300e6130046040870187612dfd565b6040860190612e0f565b61302861301e6060870187612dfd565b6060860190612e0f565b6130356080860186612e2b565b908583036080870152612e7a565b9260a0810190612e9d565b9060a0818403910152612f71565b90565b93929061308b6040916130939461307e606089019260008a0190610c5e565b8782036020890152612fb2565b940190610b52565b565b61309d6102e2565b3d6000823e3d90fd5b91506020906130b361235e565b506130c66130c16006612d6d565b612d7a565b6130f2633808a90b9492946130fd6130de600761239b565b6130e66102e2565b97889687958695612d8b565b85526004850161305f565b03915afa90811561314257600091613114575b5090565b613135915060203d811161313b575b61312d818361065f565b810190612da0565b38613110565b503d613123565b613095565b901515679a31110384e0b0c96020523360145281600052806034600c205560005260601b60601c337f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160206000a3565b6131a491339190916149ff565b565b906131c29392916131bd6131b8612baf565b61418e565b6131c4565b565b916131d29391909192614a51565b565b906131e09392916131a6565b565b6132016131fc613206926131f4611c33565b506005612c6e565b612c86565b614b25565b90565b906132249161321f61321a826123a8565b61418e565b613226565b565b906132309161469e565b565b9061323c91613209565b565b903560016020038236030381121561327f57016020813591019167ffffffffffffffff821161327a57602082023603831361327557565b612e21565b612e1c565b612e26565b60209181520190565b90565b9061329d81602093612dd1565b0190565b60200190565b916132b5826132bb92613284565b9261328d565b90816000905b8282106132cf575050505090565b909192936132f16132eb6001926132e68886612dbf565b613290565b956132a1565b9201909291926132c1565b903560016020038236030381121561333d57016020813591019167ffffffffffffffff821161333857602082023603831361333357565b612e21565b612e1c565b612e26565b60209181520190565b90565b6133579061042f565b9052565b906133688160209361334e565b0190565b5061337b90602081019061179a565b90565b60200190565b916133928261339892613342565b9261334b565b90816000905b8282106133ac575050505090565b909192936133ce6133c86001926133c3888661336c565b61335b565b9561337e565b92019092919261339e565b903560016020038236030381121561341a57016020813591019167ffffffffffffffff821161341557602082023603831361341057565b612e21565b612e1c565b612e26565b60209181520190565b90565b60209181520190565b600080fd5b9037565b9091826134499161342b565b9160018060fb1b03811161346c57829160206134689202938491613439565b0190565b613434565b9061347c929161343d565b90565b90356001602003823603038112156134c057016020813591019167ffffffffffffffff82116134bb5760208202360383136134b657565b612e21565b612e1c565b612e26565b60200190565b91816134d69161341f565b90816134e760208302840194613428565b92836000925b8484106134fd5750505050505090565b9091929394956020613529613523838560019503885261351d8b8861347f565b90613471565b986134c5565b9401940192949391906134ed565b6135b5916135a761359c61358161356660808501613558600088018861323e565b9087830360008901526132a7565b61357360208701876132fc565b908683036020880152613384565b61358e60408601866133d9565b9085830360408701526134cb565b9260608101906133d9565b9160608185039101526134cb565b90565b916135dc926135cf60408201936000830190610387565b6020818403910152613537565b90565b60200190565b5190565b67ffffffffffffffff81116136015760208091020190565b610649565b9092919261361b613616826135e9565b61078e565b938185526020808601920283019281841161365857915b83831061363f5750505050565b6020809161364d8486610b24565b815201920191613632565b6109fb565b613668913691613606565b90565b61367490610332565b60008114613683576001900390565b612517565b9061369290610bad565b600052602052604060002090565b600080fd5b600080fd5b600080fd5b9035906001602003813603038212156136f1570180359067ffffffffffffffff82116136ec576020019160208202360383136136e757565b6136aa565b6136a5565b6136a0565b5090565b634e487b7160e01b600052603260045260246000fd5b9190811015613720576020020190565b6136fa565b3561372f8161030e565b90565b903590600160200381360303821215613774570180359067ffffffffffffffff821161376f5760200191602082023603831361376a57565b6136aa565b6136a5565b6136a0565b9035906001602003813603038212156137bb570180359067ffffffffffffffff82116137b6576020019160208202360383136137b157565b6136aa565b6136a5565b6136a0565b908210156137db5760206137d79202810190613779565b9091565b6136fa565b903590600160200381360303821215613822570180359067ffffffffffffffff821161381d5760200191602082023603831361381857565b6136aa565b6136a5565b6136a0565b9190811015613837576020020190565b6136fa565b3561384681611785565b90565b61385290611f78565b90565b61385e90613849565b90565b61386a9061217f565b90565b600091031261387857565b6102ed565b90918261388991611090565b9160018060fb1b0381116138ac57829160206138a89202938491613439565b0190565b613434565b60209181520190565b6138d96138e26020936138e7936138d0816135e5565b938480936138b1565b958691016106e0565b61063f565b0190565b936139186139349694926139269461390b608089019260008a0190610c5e565b87820360208901526110c3565b91858303604087015261387d565b9160608184039101526138ba565b90565b61394090611f78565b90565b61394c90613937565b90565b6139589061217f565b90565b906139658261108c565b811015613976576020809102010190565b6136fa565b6139859051610332565b90565b60016139949101610332565b90565b92613a13613a1991613a0e9397946139b087899061470e565b9590956139de8b916139cf6139c36102e2565b938492602084016135b8565b6020820181038252038261065f565b6139f06139ea826135e5565b916135df565b209192613a07613a02600c8c90610f0e565b61239b565b929361365d565b614b45565b1561042f565b613df157613aa390613a456000613a40613a39600f999698998890612197565b8990610bc9565b611d91565b613a6b613a54600e8890610bc9565b613a65613a60826121c9565b61366b565b90612af0565b613a9e613a8c613a85613a80600e8a90610bc9565b6121c9565b8890614b96565b91613a9960108990613688565b610bc9565b612af0565b613aab611c33565b925b83613ad6613ad0613acb613ac58660008101906136af565b906136f6565b610332565b91610332565b1015613db157613afc613af7613af08460008101906136af565b8791613710565b613725565b91613b1e613b18613b11836040810190613732565b88916137c0565b90612659565b95613b3f613b3a613b338460208101906137e0565b8991613827565b61383c565b600014613c3b57613b4e611c33565b5b80613b6a613b64613b5f8b61108c565b610332565b91610332565b1015613c2257613b81613b7c86613943565b61394f565b906340c10f1987613b9b613b968c859061395b565b61397b565b93803b15613c1d57613bc160008094613bcc613bb56102e2565b98899687958694612d8b565b845260048401610c6b565b03925af1918215613c1857613be692613beb575b50613988565b613b4f565b613c0b9060003d8111613c11575b613c03818361065f565b81019061386d565b38613be0565b503d613bf9565b613095565b612d86565b5094909550613c339192505b613988565b929390613aad565b949095919284927f0000000000000000000000000000000000000000000000000000000000000000613c7e613c78613c7360006124e2565b610302565b91610302565b141580613d96575b613d6d575b613cc6613cc1613cac613cbb89613ca06102e2565b928391602083016111f9565b6020820181038252038261065f565b93613855565b613861565b63b48ab8b6949194613ce6613cdf8b6060810190613732565b87916137c0565b909491833b15613d6857613d1c613d1193600097938894613d056102e2565b9b8c998a988997612d8b565b8752600487016138eb565b03925af1918215613d6357613c3392613d36575b50613c2e565b613d569060003d8111613d5c575b613d4e818361065f565b81019061386d565b38613d30565b503d613d44565b613095565b612d86565b92507f000000000000000000000000000000000000000000000000000000000000000092613c8b565b5033613daa613da488610302565b91610302565b1415613c86565b93925050907ff254aace0ef98d6ac1a0d84c95648f8e3f7a1881dbb43393709ecd004b00f10391613dec613de36102e2565b92839283610c6b565b0390a1565b60006309bde33960e01b815280613e0a600482016104ef565b0390fd5b613e16611c5c565b50679a31110384e0b0c96020526014526000526034600c205490565b613e4b90613e46613e41611f39565b61418e565b613e4d565b565b613e58906007612ad0565b565b613e6390613e32565b565b94909194613e71614601565b61400f575b60601b679a31110384e0b0c9179160601b679a31110384e0b0c917918060205260601c928260601c92831561400157843303613fe5575b8660005260406000208054808411613fd75783900390556020526040600020805490828201918210613fc95755806020528284337fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6260406000a4613f0f61460f565b613fa4575b823b613f23575b505050505050565b602094829160405197889663f23a6e618852338989015260408801526060870152608086015260a0808601528160c086015260e085013760c401906000601c8401915af115613f95575b63f23a6e6160e01b905103613f8757388080808080613f1b565b639c05499b6000526004601cfd5b3d15613f6d573d6000823e3d90fd5b613fad86614be5565b50613fb781614be5565b50613fc3858390612667565b50613f14565b6301336cea6000526004601cfd5b63f4d678b86000526004601cfd5b336000526034600c2054613ead57634b6e7f186000526004601cfd5b63ea553b346000526004601cfd5b61401886614be5565b5061402284614be5565b5061402e858390612667565b50613e76565b61404361404991939293610332565b92610332565b820180921161405457565b612517565b61407761407261406b600f3390612197565b8390610bc9565b6121c9565b61408a61408460006121d6565b91610332565b0361411b576140a4338261409e6001612209565b916149ff565b6140d66140bb436140b56001612209565b90614034565b6140d16140ca600f3390612197565b8490610bc9565b612af0565b336141166141047f5e1dd8c4451717d5ca4ffbefdada35e22e0871220b9ed9dd03a351f0938c5ed79261218b565b9261410d6102e2565b91829182610394565b0390a2565b600063156f904360e21b815280614134600482016104ef565b0390fd5b614140611c5c565b5063c79b8b5f60e01b61415b614155836103e0565b916103e0565b14801561417f575b90811561416f575b5090565b6141799150614c05565b3861416b565b5061418981614c05565b614163565b6141a09061419a614691565b90614d12565b565b60207f2073616c65507269636500000000000000000000000000000000000000000000917f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201520152565b6141fd602a6040926106d7565b614206816141a2565b0190565b61422090602081019060008183039101526141f0565b90565b1561422a57565b6142326102e2565b62461bcd60e51b8152806142486004820161420a565b0390fd5b60007f455243323938313a20696e76616c696420726563656976657200000000000000910152565b61428160196020926106d7565b61428a8161424c565b0190565b6142a49060208101906000818303910152614274565b90565b156142ae57565b6142b66102e2565b62461bcd60e51b8152806142cc6004820161428e565b0390fd5b6142da604061078e565b90565b90565b906142f56142f06142fc9261218b565b6142dd565b8254611fac565b9055565b60a01b90565b906143206bffffffffffffffffffffffff60a01b91614300565b9181191691161790565b61433e6143396143439261048c565b610baa565b61048c565b90565b90565b9061435e6143596143659261432a565b614346565b8254614306565b9055565b906143946020600061439a9461438c8282016143868488016124b9565b906142e0565b0192016124ee565b90614349565b565b906143a691614369565b565b90614419614420926143d4836143cd6143c76143c26145ea565b61048c565b9161048c565b1115614223565b6143fa816143f36143ed6143e860006124e2565b610302565b91610302565b14156142a7565b916144106144066142d0565b9360008501612413565b60208301612459565b600261439c565b565b9061442b612016565b506080604051019160208301604052600083528290600a6000198092955b01948181066030018653049384156144685790600a9190809291614449565b93505082602091039203918252565b6144c591926144916144cb956144b6939086849192614dab565b6144ae6144a7826144a260006121c9565b614034565b6000612af0565b926001610bc9565b916144c0836121c9565b614034565b90612af0565b565b6144dc6144e291939293610332565b92610332565b82039182116144ed57565b612517565b61450190939293828591614eac565b61450a8161108c565b9261451560006121d6565b9261451e611c33565b935b8461453361452d88610332565b91610332565b10156145a05761459461459a9161455361454e86899061395b565b61397b565b61458e886145886145798a61457361456e879560019361395b565b61397b565b90610bc9565b91614583836121c9565b6144cd565b90612af0565b90614034565b94613988565b93614520565b915093506145c492506145bd91506145b860006121c9565b6144cd565b6000612af0565b565b600090565b90565b6145e26145dd6145e7926145cb565b610baa565b61048c565b90565b6145f26145c6565b506145fe6127106145ce565b90565b614609611c5c565b50600090565b614617611c5c565b50600090565b5050949293909361462c61460f565b614639575b505050505050565b61464f6146559361465b97969092939596612659565b50612659565b50612667565b50388080808080614631565b9061468961468461468e9361467d818590614f0c565b6005612c6e565b612c86565b614ff3565b50565b6146996123ca565b503390565b906146c06146bb6146c5936146b481859061502e565b6005612c6e565b612c86565b6150c8565b50565b9160206146ea9294936146e360408201966000830190610b52565b0190610c5e565b565b6146f86146fe91610332565b91610332565b908115614709570690565b612562565b919091614719611c33565b50614722611c33565b50614737614732600e8590610bc9565b6121c9565b61474a61474460006121d6565b91610332565b146148535761476d614768614761600f8490612197565b8590610bc9565b6121c9565b8061478161477b60006121d6565b91610332565b14614836574090614791826121f2565b6147a461479e60006121d6565b91610332565b14614819576147f561480f916147dd614816946147ce6147c26102e2565b938492602084016146c8565b6020820181038252038261065f565b6147ef6147e9826135e5565b916135df565b206121f2565b614809614804600e8790610bc9565b6121c9565b906146ec565b9283614b96565b90565b600063b7b3378760e01b815280614832600482016104ef565b0390fd5b6000637de832b560e11b81528061484f600482016104ef565b0390fd5b6000630b56c82b60e31b81528061486c600482016104ef565b0390fd5b60007f455243323938313a20496e76616c696420706172616d65746572730000000000910152565b6148a5601b6020926106d7565b6148ae81614870565b0190565b6148c89060208101906000818303910152614898565b90565b156148d257565b6148da6102e2565b62461bcd60e51b8152806148f0600482016148b2565b0390fd5b6149709061496961497594936149248561491d6149176149126145ea565b61048c565b9161048c565b1115614223565b61494a8161494361493d61493860006124e2565b610302565b91610302565b14156148cb565b936149606149566142d0565b9560008701612413565b60208501612459565b60036123cf565b61439c565b565b95966149a5976149989695946149939489949091929394615103565b6143a8565b6149a0612baf565b614667565b565b90565b6149be6149b96149c392610332565b610baa565b6102f7565b90565b6149f26149ed6149fc936149e860006149f7956149e16123ca565b50016149a7565b6151d9565b6121f2565b6149aa565b61217f565b90565b614a3a614a4f93614a15614a49938583916151fb565b614a32614a2b82614a2660006121c9565b6144cd565b6000612af0565b926001610bc9565b91614a44836121c9565b6144cd565b90612af0565b565b92614a63919492939085859192615216565b614a6c8361108c565b91614a7760006121d6565b91614a80611c33565b5b80614a94614a8e87610332565b91610332565b1015614b0057614afb90614af6614abf614ab7614ab287859061395b565b61397b565b968790614034565b95614af0614ae16001614adb614ad68d889061395b565b61397b565b90610bc9565b91614aeb836121c9565b614034565b90612af0565b613988565b614a81565b50935050614b239150614b1c90614b1760006121c9565b614034565b6000612af0565b565b614b3d6000614b4292614b36611c33565b50016149a7565b615359565b90565b919091614b50611c5c565b508051614b5d575b501490565b9060208201915160051b8201905b8251811160051b9081526020835191185260206040600020920191818310614b6b5791505038614b58565b90614bb8614bb1614bbd92614ba9611c33565b506010613688565b8390610bc9565b6121c9565b80614bd1614bcb60006121d6565b91610332565b14600014614bde57505b90565b9050614bdb565b90614bee6129f6565b506040519160408301604052600183526020830152565b614c0d611c5c565b50614c1781615371565b8015614c3a575b908115614c2a575b5090565b614c349150615417565b38614c26565b50614c44816153b1565b614c1e565b90565b614c60614c5b614c6592614c49565b610baa565b610332565b90565b60007f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000910152565b614c9c6017809261201b565b614ca581614c68565b0190565b60007f206973206d697373696e6720726f6c6520000000000000000000000000000000910152565b614cdd6011809261201b565b614ce681614ca9565b0190565b614d04614d0f9392614cfe614d0993614c90565b906120a9565b614cd1565b906120a9565b90565b90614d27614d21838390612cf0565b1561042f565b614d2f575050565b614da791614d85614d5e614d4e614d48614d8a95615493565b936121f2565b614d586020614c4c565b9061566c565b91614d76614d6a6102e2565b93849260208401614cea565b6020820181038252038261065f565b612132565b614d926102e2565b91829162461bcd60e51b835260048301610736565b0390fd5b91929092614db7614601565b614e93575b8260601b8015614e8557679a31110384e0b0c960205283601452846000526040600020805490838201918210614e7757558160205260601c6000337fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604083a4614e2461460f565b614e5e575b614e32836157b8565b614e3d575b50505050565b614e5593614e4b60006124e2565b93909192936157c5565b38808080614e37565b614e6784614be5565b50614e7181614be5565b50614e29565b6301336cea6000526004601cfd5b63ea553b346000526004601cfd5b614e9c84614be5565b50614ea681614be5565b50614dbc565b9091614ec592614ebc60006124e2565b9290919261585e565b565b90614ed360ff91611716565b9181191691161790565b614ee69061042f565b90565b90565b90614f01614efc614f0892614edd565b614ee9565b8254614ec7565b9055565b614f20614f1a828490612cf0565b1561042f565b614f29575b5050565b614f4c6001614f476000614f3f6004869061236f565b018590612cb1565b614eec565b90614f55614691565b90614f92614f8c614f867f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d95612363565b9261218b565b9261218b565b92614f9b6102e2565b80614fa5816104ef565b0390a43880614f25565b614fb890611f78565b90565b614fcf614fca614fd4926102f7565b610baa565b610332565b90565b614feb614fe6614ff092610332565b611716565b610b0c565b90565b9061502661502061501b615016600061502b9661500e611c5c565b500194614faf565b614fbb565b614fd7565b916149a7565b615a4e565b90565b615039818390612cf0565b615042575b5050565b615065600061506060006150586004869061236f565b018590612cb1565b614eec565b9061506e614691565b906150ab6150a561509f7ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b95612363565b9261218b565b9261218b565b926150b46102e2565b806150be816104ef565b0390a4388061503e565b906150fb6150f56150f06150eb6000615100966150e3611c5c565b500194614faf565b614fbb565b614fd7565b916149a7565b615b0e565b90565b91909492615111600b612ce3565b615184576151316151389261512a615176986008611f15565b6009611f15565b600a611f15565b61514a615143611738565b8290614667565b61515c615155611ca1565b8290614667565b61516e615167611cf9565b8290614667565b919091615c18565b6151826001600b614eec565b565b600063f92ee8a960e01b81528061519d600482016104ef565b0390fd5b5490565b600052602060002090565b6151b9816151a1565b8210156151d4576151cb6001916151a5565b91020190600090565b6136fa565b6151f89160006151f2926151eb61235e565b50016151b0565b90610f41565b90565b90916152149261520b60006124e2565b92909192615c35565b565b91929092615222614601565b615354575b8051845103615346578260601b80156153385780679a31110384e0b0c917602052845160051b805b61530157506000604051604081527f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb81885160051b602001604082019081818c60045afa503d60400160208301523d01865160051b60200181818960045afa503d01039360601c933392a46152c261460f565b6152fc575b6152d0836157b8565b6152db575b50505050565b6152f3936152e960006124e2565b9390919293615d39565b388080806152d5565b6152c7565b808301519080870151600052604060002091825490810190811061532a5760209255038061524f565b6301336cea6000526004601cfd5b63ea553b346000526004601cfd5b633b800a466000526004601cfd5b615227565b600061536e91615367611c33565b50016151a1565b90565b615379611c5c565b50633e85e62f60e01b61539461538e836103e0565b916103e0565b149081156153a1575b5090565b6153ab9150615df0565b3861539d565b6153b9611c5c565b506153c381615e17565b8015615408575b80156153ed575b9081156153dd575b5090565b6153e79150615e57565b386153d9565b5060006154026153fc836103e0565b916103e0565b146153d1565b5061541281615e57565b6153ca565b61541f611c5c565b5061542981615e57565b908115615435575b5090565b61543f9150615e97565b38615431565b90565b60ff1690565b61546261545d61546792615445565b610baa565b615448565b90565b615474601461544e565b90565b61548b61548661549092615448565b610baa565b610332565b90565b6154b06154ab6154c6926154a5612016565b50614faf565b614fbb565b6154c06154bb61546a565b615477565b9061566c565b90565b90565b6154e06154db6154e5926154c9565b610baa565b610332565b90565b906154fa6154f58361132e565b61078e565b918252565b369037565b90615529615511836154e8565b9260208061551f869361132e565b92019103906154ff565b565b600360fc1b90565b9061553d826135e5565b81101561554f57600160209102010190565b6136fa565b600f60fb1b90565b6f181899199a1a9b1b9c1cb0b131b232b360811b90565b61557b61555c565b90565b90565b61559561559061559a9261557e565b610baa565b610332565b90565b60f81b90565b90565b6155ba6155b56155bf926155a3565b610baa565b615448565b90565b6155e1906155db6155d56155e694615448565b91610332565b9061096e565b610332565b90565b60007f537472696e67733a20686578206c656e67746820696e73756666696369656e74910152565b61561d602080926106d7565b615626816155e9565b0190565b6156409060208101906000818303910152615611565b90565b1561564a57565b6156526102e2565b62461bcd60e51b8152806156686004820161562a565b0390fd5b9190615676612016565b506157106157006156ac6156a7615697600261569287916154cc565b61252d565b6156a160026154cc565b90614034565b615504565b926156b561552b565b6156ce856156c860009360001a936121d6565b90615533565b536156d7615554565b6156f0856156ea60019360001a93612209565b90615533565b536156fb60026154cc565b61252d565b61570a6001612209565b90614034565b925b836157266157206001612209565b91610332565b111561578d57615734615573565b8161573f600f615581565b169160108310156157885761575b61577c92615782941a61559d565b61576b8591889060001a92615533565b5361577660046155a6565b906155c2565b9361366b565b92615712565b6136fa565b6157b59293506157b0906157aa6157a460006121d6565b91610332565b14615643565b612132565b90565b6157c0611c5c565b503b90565b919360209360405195869463f23a6e618652338787015260601b60601c60408601526060850152608084015260a08084015280518091818060c087015261584a575b505060c401906000601c8401915af11561583b575b63f23a6e6160e01b90510361582d57565b639c05499b6000526004601cfd5b3d1561581c573d6000823e3d90fd5b818660e08701920160045afa508038615807565b9193929061586a614601565b615996575b81518551036159885760601b9182679a31110384e0b0c9176020528060601b83811490151715615966575b50835160051b805b61593057507f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb6000939460405192839160408352805160051b60200180916040850192839160045afa503d60400160208401523d019081815160051b602001809260045afa503d01039260601c923392a461591b61460f565b615922575b565b61592a612249565b50615920565b80820151908086015160005260406000208054928381116159585760209303905503806158a2565b63f4d678b86000526004601cfd5b6000526034600c20541561597a573861589a565b634b6e7f186000526004601cfd5b633b800a466000526004601cfd5b61599e612249565b5061586f565b90565b600052602060002090565b5490565b6159bf816159b2565b8210156159da576159d16001916159a7565b91020190600090565b6136fa565b91906159f56159f06159fd93612363565b612ac4565b908354611d46565b9055565b9081549168010000000000000000831015615a315782615a29916001615a2f950181556159b6565b906159df565b565b610649565b90615a4090612363565b600052602052604060002090565b615a56611c5c565b50615a6b615a65828490615ed7565b1561042f565b600014615aae57615aa4615aa992615a8f615a88600085016159a4565b8290615a01565b6001615a9d600085016151a1565b9301615a36565b612af0565b600190565b5050600090565b634e487b7160e01b600052603160045260246000fd5b615add91615ad761235e565b916159df565b565b615ae8816159b2565b8015615b09576001900390615b06615b0083836159b6565b90615acb565b55565b615ab5565b615b16611c5c565b50615b2d615b28600183018490615a36565b6121c9565b9081615b42615b3c60006121d6565b91610332565b1415600014615c1057615bc2926001615bbd9284615b6b600096615b6585612209565b906144cd565b615b88615b798885016151a1565b615b8286612209565b906144cd565b80615b9b615b9584610332565b91610332565b03615bc7575b505050615bb7615bb28683016159a4565b615adf565b01615a36565b611d91565b600190565b615c0892615bfa615be6615be0615c03948c89016151b0565b90610f41565b93615bf485918c89016151b0565b906159df565b91858501615a36565b612af0565b388080615ba1565b505050600090565b90615c2e615c339392615c29611f39565b614667565b615f0d565b565b90929192615c41614601565b615d17575b60601b9081679a31110384e0b0c917602052818160601b148160601b151715615cf5575b5082600052604060002090815491828411615ce757836000930390558260205260601c337fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604084a4615cbb61460f565b615cc4575b5050565b615cd0615cd692614be5565b50614be5565b50615cdf612249565b503880615cc0565b63f4d678b86000526004601cfd5b6000526034600c205415615d095738615c6a565b634b6e7f186000526004601cfd5b615d2084614be5565b50615d2a83614be5565b50615d33612249565b50615c46565b919360209360405195869463bc197c818652338787015260601b60601c604086015260a06060860152805160051b8601809160c0870192839160045afa503d60a001908160808701523d019182815160051b8801809260045afa503d0160a08501523d01908181518601809260045afa50601c8301903d0103906000601c8401915af115615de1575b63bc197c8160e01b905103615dd357565b639c05499b6000526004601cfd5b3d15615dc2573d6000823e3d90fd5b615df8611c5c565b5060e01c630e89341c8114906301ffc9a763d9b67a2682149114171790565b615e1f611c5c565b5080615e3a615e3463152a902d60e11b6103e0565b916103e0565b14908115615e47575b5090565b615e519150615f2d565b38615e43565b615e5f611c5c565b5080615e7a615e74635a05180f60e01b6103e0565b916103e0565b14908115615e87575b5090565b615e919150615f53565b38615e83565b615e9f611c5c565b5080615eba615eb4634e821d3360e11b6103e0565b916103e0565b14908115615ec7575b5090565b615ed191506153b1565b38615ec3565b615ef5916001615ef092615ee9611c5c565b5001615a36565b6121c9565b615f08615f0260006121d6565b91610332565b141590565b90615f24615f1d615f2b93611fa0565b6006611fd6565b6007612ad0565b565b615f35611c5c565b50615f4f615f496301ffc9a760e01b6103e0565b916103e0565b1490565b615f5b611c5c565b5080615f76615f70637965db0b60e01b6103e0565b916103e0565b14908115615f83575b5090565b615f8d9150615e17565b38615f7f56fea264697066735822122023af99d012f9c0397549fa6d414ea97a8c70379f7b83dd92c49e8264e57f39ad64736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x13 JUMPI JUMPDEST PUSH2 0x1C2E JUMP JUMPDEST PUSH2 0x1E PUSH1 0x0 CALLDATALOAD PUSH2 0x2DC JUMP JUMPDEST DUP1 PUSH3 0xFDD58E EQ PUSH2 0x2D7 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x2D2 JUMPI DUP1 PUSH4 0x4634D8D EQ PUSH2 0x2CD JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x2C8 JUMPI DUP1 PUSH4 0xB5EE006 EQ PUSH2 0x2C3 JUMPI DUP1 PUSH4 0xBB310DE EQ PUSH2 0x2BE JUMPI DUP1 PUSH4 0xE89341C EQ PUSH2 0x2B9 JUMPI DUP1 PUSH4 0x167A59F7 EQ PUSH2 0x2B4 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x2AF JUMPI DUP1 PUSH4 0x20EC271B EQ PUSH2 0x2AA JUMPI DUP1 PUSH4 0x248A9CA3 EQ PUSH2 0x2A5 JUMPI DUP1 PUSH4 0x2693EBF2 EQ PUSH2 0x2A0 JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x29B JUMPI DUP1 PUSH4 0x2EB2C2D6 EQ PUSH2 0x296 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x291 JUMPI DUP1 PUSH4 0x35403023 EQ PUSH2 0x28C JUMPI DUP1 PUSH4 0x36568ABE EQ PUSH2 0x287 JUMPI DUP1 PUSH4 0x3C70B357 EQ PUSH2 0x282 JUMPI DUP1 PUSH4 0x47FDA41A EQ PUSH2 0x27D JUMPI DUP1 PUSH4 0x4E1273F4 EQ PUSH2 0x278 JUMPI DUP1 PUSH4 0x50336A03 EQ PUSH2 0x273 JUMPI DUP1 PUSH4 0x51304683 EQ PUSH2 0x26E JUMPI DUP1 PUSH4 0x5377AB8F EQ PUSH2 0x269 JUMPI DUP1 PUSH4 0x5944C753 EQ PUSH2 0x264 JUMPI DUP1 PUSH4 0x6C0360EB EQ PUSH2 0x25F JUMPI DUP1 PUSH4 0x731133E9 EQ PUSH2 0x25A JUMPI DUP1 PUSH4 0x7E518EC8 EQ PUSH2 0x255 JUMPI DUP1 PUSH4 0x8FF83AC1 EQ PUSH2 0x250 JUMPI DUP1 PUSH4 0x9010D07C EQ PUSH2 0x24B JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x246 JUMPI DUP1 PUSH4 0x938E3D7B EQ PUSH2 0x241 JUMPI DUP1 PUSH4 0x9D043A66 EQ PUSH2 0x23C JUMPI DUP1 PUSH4 0xA217FDDF EQ PUSH2 0x237 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x232 JUMPI DUP1 PUSH4 0xB390C0AB EQ PUSH2 0x22D JUMPI DUP1 PUSH4 0xB48AB8B6 EQ PUSH2 0x228 JUMPI DUP1 PUSH4 0xCA15C873 EQ PUSH2 0x223 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x21E JUMPI DUP1 PUSH4 0xD67B333B EQ PUSH2 0x219 JUMPI DUP1 PUSH4 0xE8A3D485 EQ PUSH2 0x214 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x20F JUMPI DUP1 PUSH4 0xED4C2AC7 EQ PUSH2 0x20A JUMPI DUP1 PUSH4 0xF242432A EQ PUSH2 0x205 JUMPI PUSH4 0xF4F98AD5 SUB PUSH2 0xE JUMPI PUSH2 0x1BFB JUMP JUMPDEST PUSH2 0x1BC1 JUMP JUMPDEST PUSH2 0x1B1D JUMP JUMPDEST PUSH2 0x1AE7 JUMP JUMPDEST PUSH2 0x1A84 JUMP JUMPDEST PUSH2 0x1A3D JUMP JUMPDEST PUSH2 0x193B JUMP JUMPDEST PUSH2 0x1906 JUMP JUMPDEST PUSH2 0x18CF JUMP JUMPDEST PUSH2 0x180B JUMP JUMPDEST PUSH2 0x17D7 JUMP JUMPDEST PUSH2 0x1750 JUMP JUMPDEST PUSH2 0x16DD JUMP JUMPDEST PUSH2 0x1615 JUMP JUMPDEST PUSH2 0x15DF JUMP JUMPDEST PUSH2 0x15A9 JUMP JUMPDEST PUSH2 0x153E JUMP JUMPDEST PUSH2 0x1441 JUMP JUMPDEST PUSH2 0x140A JUMP JUMPDEST PUSH2 0x12F9 JUMP JUMPDEST PUSH2 0x12B5 JUMP JUMPDEST PUSH2 0x1244 JUMP JUMPDEST PUSH2 0x120F JUMP JUMPDEST PUSH2 0x11A1 JUMP JUMPDEST PUSH2 0x112D JUMP JUMPDEST PUSH2 0xFB8 JUMP JUMPDEST PUSH2 0xF69 JUMP JUMPDEST PUSH2 0xEDA JUMP JUMPDEST PUSH2 0xEA5 JUMP JUMPDEST PUSH2 0xE57 JUMP JUMPDEST PUSH2 0xDEC JUMP JUMPDEST PUSH2 0xC8F JUMP JUMPDEST PUSH2 0xBFB JUMP JUMPDEST PUSH2 0xB75 JUMP JUMPDEST PUSH2 0xAD8 JUMP JUMPDEST PUSH2 0x9A9 JUMP JUMPDEST PUSH2 0x93A JUMP JUMPDEST PUSH2 0x905 JUMP JUMPDEST PUSH2 0x8B3 JUMP JUMPDEST PUSH2 0x861 JUMP JUMPDEST PUSH2 0x74F JUMP JUMPDEST PUSH2 0x4F5 JUMP JUMPDEST PUSH2 0x457 JUMP JUMPDEST PUSH2 0x3AA JUMP JUMPDEST PUSH1 0xE0 SHR SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x30B SWAP1 PUSH2 0x2F7 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x317 DUP2 PUSH2 0x302 JUMP JUMPDEST SUB PUSH2 0x31E JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x330 DUP3 PUSH2 0x30E JUMP JUMPDEST JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x33E DUP2 PUSH2 0x332 JUMP JUMPDEST SUB PUSH2 0x345 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x357 DUP3 PUSH2 0x335 JUMP JUMPDEST JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0x382 JUMPI DUP1 PUSH2 0x376 PUSH2 0x37F SWAP3 PUSH1 0x0 DUP7 ADD PUSH2 0x323 JUMP JUMPDEST SWAP4 PUSH1 0x20 ADD PUSH2 0x34A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST PUSH2 0x390 SWAP1 PUSH2 0x332 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x3A8 SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0x387 JUMP JUMPDEST JUMP JUMPDEST CALLVALUE PUSH2 0x3DB JUMPI PUSH2 0x3D7 PUSH2 0x3C6 PUSH2 0x3C0 CALLDATASIZE PUSH1 0x4 PUSH2 0x359 JUMP JUMPDEST SWAP1 PUSH2 0x1C38 JUMP JUMPDEST PUSH2 0x3CE PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x394 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL AND SWAP1 JUMP JUMPDEST PUSH2 0x3F5 DUP2 PUSH2 0x3E0 JUMP JUMPDEST SUB PUSH2 0x3FC JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x40E DUP3 PUSH2 0x3EC JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x42A JUMPI PUSH2 0x427 SWAP2 PUSH1 0x0 ADD PUSH2 0x401 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH2 0x43D SWAP1 PUSH2 0x42F JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x455 SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0x434 JUMP JUMPDEST JUMP JUMPDEST CALLVALUE PUSH2 0x487 JUMPI PUSH2 0x483 PUSH2 0x472 PUSH2 0x46D CALLDATASIZE PUSH1 0x4 PUSH2 0x410 JUMP JUMPDEST PUSH2 0x1C61 JUMP JUMPDEST PUSH2 0x47A PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x441 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0x4A6 DUP2 PUSH2 0x48C JUMP JUMPDEST SUB PUSH2 0x4AD JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x4BF DUP3 PUSH2 0x49D JUMP JUMPDEST JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0x4EA JUMPI DUP1 PUSH2 0x4DE PUSH2 0x4E7 SWAP3 PUSH1 0x0 DUP7 ADD PUSH2 0x323 JUMP JUMPDEST SWAP4 PUSH1 0x20 ADD PUSH2 0x4B2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST PUSH1 0x0 ADD SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x524 JUMPI PUSH2 0x50E PUSH2 0x508 CALLDATASIZE PUSH1 0x4 PUSH2 0x4C1 JUMP JUMPDEST SWAP1 PUSH2 0x1CED JUMP JUMPDEST PUSH2 0x516 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x520 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH1 0x0 SWAP2 SUB SLT PUSH2 0x534 JUMPI JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x1 PUSH1 0x2 DUP4 DIV SWAP3 AND DUP1 ISZERO PUSH2 0x585 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x580 JUMPI JUMP JUMPDEST PUSH2 0x54F JUMP JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x575 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x0 SWAP3 SWAP2 DUP1 SLOAD SWAP1 PUSH2 0x5BE PUSH2 0x5B7 DUP4 PUSH2 0x565 JUMP JUMPDEST DUP1 SWAP5 PUSH2 0x58F JUMP JUMPDEST SWAP2 PUSH1 0x1 DUP2 AND SWAP1 DUP2 PUSH1 0x0 EQ PUSH2 0x617 JUMPI POP PUSH1 0x1 EQ PUSH2 0x5DA JUMPI JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x5E7 SWAP2 SWAP3 SWAP4 SWAP5 POP PUSH2 0x598 JUMP JUMPDEST SWAP2 PUSH1 0x0 SWAP3 JUMPDEST DUP2 DUP5 LT PUSH2 0x5FF JUMPI POP POP ADD SWAP1 CODESIZE DUP1 DUP1 PUSH2 0x5D5 JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x20 SWAP3 SWAP6 SWAP4 SWAP6 SLOAD DUP5 DUP7 ADD MSTORE ADD SWAP2 ADD SWAP3 SWAP1 PUSH2 0x5EC JUMP JUMPDEST SWAP3 SWAP5 SWAP6 POP POP POP PUSH1 0xFF NOT AND DUP3 MSTORE ISZERO ISZERO PUSH1 0x20 MUL ADD SWAP1 CODESIZE DUP1 DUP1 PUSH2 0x5D5 JUMP JUMPDEST SWAP1 PUSH2 0x63C SWAP2 PUSH2 0x5A3 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1F DUP1 NOT SWAP2 ADD AND SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH2 0x669 SWAP1 PUSH2 0x63F JUMP JUMPDEST DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x683 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH2 0x649 JUMP JUMPDEST SWAP1 PUSH2 0x6A8 PUSH2 0x6A1 SWAP3 PUSH2 0x698 PUSH2 0x2E2 JUMP JUMPDEST SWAP4 DUP5 DUP1 SWAP3 PUSH2 0x632 JUMP JUMPDEST SUB DUP4 PUSH2 0x65F JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x0 LT PUSH2 0x6BE JUMPI PUSH2 0x6BB SWAP1 PUSH2 0x688 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x539 JUMP JUMPDEST PUSH2 0x6D0 PUSH1 0x8 PUSH1 0x0 SWAP1 PUSH2 0x6AA JUMP JUMPDEST SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x6F4 JUMPI POP POP SWAP1 PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP1 PUSH1 0x20 SWAP2 DUP4 ADD MLOAD DUP2 DUP6 ADD MSTORE ADD PUSH2 0x6E3 JUMP JUMPDEST PUSH2 0x724 PUSH2 0x72D PUSH1 0x20 SWAP4 PUSH2 0x732 SWAP4 PUSH2 0x71B DUP2 PUSH2 0x6D3 JUMP JUMPDEST SWAP4 DUP5 DUP1 SWAP4 PUSH2 0x6D7 JUMP JUMPDEST SWAP6 DUP7 SWAP2 ADD PUSH2 0x6E0 JUMP JUMPDEST PUSH2 0x63F JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x74C SWAP2 PUSH1 0x20 DUP3 ADD SWAP2 PUSH1 0x0 DUP2 DUP5 SUB SWAP2 ADD MSTORE PUSH2 0x705 JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x77F JUMPI PUSH2 0x75F CALLDATASIZE PUSH1 0x4 PUSH2 0x529 JUMP JUMPDEST PUSH2 0x77B PUSH2 0x76A PUSH2 0x6C3 JUMP JUMPDEST PUSH2 0x772 PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x736 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 PUSH2 0x7A1 PUSH2 0x79A PUSH2 0x2E2 JUMP JUMPDEST SWAP3 DUP4 PUSH2 0x65F JUMP JUMPDEST JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x7C1 JUMPI PUSH2 0x7BD PUSH1 0x20 SWAP2 PUSH2 0x63F JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x649 JUMP JUMPDEST SWAP1 DUP3 PUSH1 0x0 SWAP4 SWAP3 DUP3 CALLDATACOPY ADD MSTORE JUMP JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x7E7 PUSH2 0x7E2 DUP3 PUSH2 0x7A3 JUMP JUMPDEST PUSH2 0x78E JUMP JUMPDEST SWAP4 DUP2 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP1 DUP3 DUP5 ADD GT PUSH2 0x803 JUMPI PUSH2 0x801 SWAP3 PUSH2 0x7C6 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x789 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x826 JUMPI DUP2 PUSH1 0x20 PUSH2 0x823 SWAP4 CALLDATALOAD SWAP2 ADD PUSH2 0x7D2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x784 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x85C JUMPI PUSH1 0x0 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x857 JUMPI PUSH2 0x854 SWAP3 ADD PUSH2 0x808 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x88F JUMPI PUSH2 0x879 PUSH2 0x874 CALLDATASIZE PUSH1 0x4 PUSH2 0x82B JUMP JUMPDEST PUSH2 0x1F2E JUMP JUMPDEST PUSH2 0x881 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x88B DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x8AE JUMPI PUSH2 0x8AB SWAP2 PUSH1 0x0 ADD PUSH2 0x323 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x8E1 JUMPI PUSH2 0x8CB PUSH2 0x8C6 CALLDATASIZE PUSH1 0x4 PUSH2 0x894 JUMP JUMPDEST PUSH2 0x200B JUMP JUMPDEST PUSH2 0x8D3 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x8DD DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x900 JUMPI PUSH2 0x8FD SWAP2 PUSH1 0x0 ADD PUSH2 0x34A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x935 JUMPI PUSH2 0x931 PUSH2 0x920 PUSH2 0x91B CALLDATASIZE PUSH1 0x4 PUSH2 0x8E6 JUMP JUMPDEST PUSH2 0x2135 JUMP JUMPDEST PUSH2 0x928 PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x736 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST CALLVALUE PUSH2 0x969 JUMPI PUSH2 0x953 PUSH2 0x94D CALLDATASIZE PUSH1 0x4 PUSH2 0x359 JUMP JUMPDEST SWAP1 PUSH2 0x2254 JUMP JUMPDEST PUSH2 0x95B PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x965 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SHR SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x985 SWAP1 PUSH1 0x8 PUSH2 0x98A SWAP4 MUL PUSH2 0x96E JUMP JUMPDEST PUSH2 0x972 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x998 SWAP2 SLOAD PUSH2 0x975 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x9A6 PUSH1 0x0 DUP1 PUSH2 0x98D JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x9D9 JUMPI PUSH2 0x9B9 CALLDATASIZE PUSH1 0x4 PUSH2 0x529 JUMP JUMPDEST PUSH2 0x9D5 PUSH2 0x9C4 PUSH2 0x99B JUMP JUMPDEST PUSH2 0x9CC PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x394 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x9F6 JUMPI PUSH1 0x20 DUP1 SWAP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH2 0x649 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0xA15 PUSH2 0xA10 DUP3 PUSH2 0x9DE JUMP JUMPDEST PUSH2 0x78E JUMP JUMPDEST SWAP4 DUP2 DUP6 MSTORE PUSH1 0x20 DUP1 DUP7 ADD SWAP3 MUL DUP4 ADD SWAP3 DUP2 DUP5 GT PUSH2 0xA52 JUMPI SWAP2 JUMPDEST DUP4 DUP4 LT PUSH2 0xA39 JUMPI POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 SWAP2 PUSH2 0xA47 DUP5 DUP7 PUSH2 0x34A JUMP JUMPDEST DUP2 MSTORE ADD SWAP3 ADD SWAP2 PUSH2 0xA2C JUMP JUMPDEST PUSH2 0x9FB JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0xA75 JUMPI DUP2 PUSH1 0x20 PUSH2 0xA72 SWAP4 CALLDATALOAD SWAP2 ADD PUSH2 0xA00 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x784 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH1 0x40 DUP2 DUP5 SUB SLT PUSH2 0xAD3 JUMPI PUSH1 0x0 DUP2 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xACE JUMPI DUP4 PUSH2 0xAA7 SWAP2 DUP4 ADD PUSH2 0xA57 JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xAC9 JUMPI PUSH2 0xAC6 SWAP3 ADD PUSH2 0xA57 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0xB07 JUMPI PUSH2 0xAF1 PUSH2 0xAEB CALLDATASIZE PUSH1 0x4 PUSH2 0xA7A JUMP JUMPDEST SWAP1 PUSH2 0x234F JUMP JUMPDEST PUSH2 0xAF9 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0xB03 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xB18 DUP2 PUSH2 0xB0C JUMP JUMPDEST SUB PUSH2 0xB1F JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0xB31 DUP3 PUSH2 0xB0F JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0xB4D JUMPI PUSH2 0xB4A SWAP2 PUSH1 0x0 ADD PUSH2 0xB24 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST PUSH2 0xB5B SWAP1 PUSH2 0xB0C JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0xB73 SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0xB52 JUMP JUMPDEST JUMP JUMPDEST CALLVALUE PUSH2 0xBA5 JUMPI PUSH2 0xBA1 PUSH2 0xB90 PUSH2 0xB8B CALLDATASIZE PUSH1 0x4 PUSH2 0xB33 JUMP JUMPDEST PUSH2 0x23A8 JUMP JUMPDEST PUSH2 0xB98 PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xB5F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xBC1 PUSH2 0xBBC PUSH2 0xBC6 SWAP3 PUSH2 0x332 JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x332 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0xBD3 SWAP1 PUSH2 0xBAD JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH2 0xBF8 SWAP1 PUSH2 0xBF3 PUSH1 0x1 SWAP2 PUSH1 0x0 SWAP3 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x98D JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0xC2B JUMPI PUSH2 0xC27 PUSH2 0xC16 PUSH2 0xC11 CALLDATASIZE PUSH1 0x4 PUSH2 0x8E6 JUMP JUMPDEST PUSH2 0xBE1 JUMP JUMPDEST PUSH2 0xC1E PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x394 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0xC59 JUMPI DUP1 PUSH2 0xC4D PUSH2 0xC56 SWAP3 PUSH1 0x0 DUP7 ADD PUSH2 0x34A JUMP JUMPDEST SWAP4 PUSH1 0x20 ADD PUSH2 0x34A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST PUSH2 0xC67 SWAP1 PUSH2 0x302 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 PUSH1 0x20 PUSH2 0xC8D SWAP3 SWAP5 SWAP4 PUSH2 0xC86 PUSH1 0x40 DUP3 ADD SWAP7 PUSH1 0x0 DUP4 ADD SWAP1 PUSH2 0xC5E JUMP JUMPDEST ADD SWAP1 PUSH2 0x387 JUMP JUMPDEST JUMP JUMPDEST CALLVALUE PUSH2 0xCC1 JUMPI PUSH2 0xCA8 PUSH2 0xCA2 CALLDATASIZE PUSH1 0x4 PUSH2 0xC30 JUMP JUMPDEST SWAP1 PUSH2 0x259A JUMP JUMPDEST SWAP1 PUSH2 0xCBD PUSH2 0xCB4 PUSH2 0x2E2 JUMP JUMPDEST SWAP3 DUP4 SWAP3 DUP4 PUSH2 0xC6B JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP2 DUP3 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0xD05 JUMPI DUP2 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xD00 JUMPI PUSH1 0x20 ADD SWAP3 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH2 0xCFB JUMPI JUMP JUMPDEST PUSH2 0x9FB JUMP JUMPDEST PUSH2 0xCC6 JUMP JUMPDEST PUSH2 0x784 JUMP JUMPDEST SWAP1 SWAP2 DUP3 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0xD44 JUMPI DUP2 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xD3F JUMPI PUSH1 0x20 ADD SWAP3 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH2 0xD3A JUMPI JUMP JUMPDEST PUSH2 0x9FB JUMP JUMPDEST PUSH2 0xCC6 JUMP JUMPDEST PUSH2 0x784 JUMP JUMPDEST SWAP2 PUSH1 0xA0 DUP4 DUP4 SUB SLT PUSH2 0xDE7 JUMPI PUSH2 0xD61 DUP3 PUSH1 0x0 DUP6 ADD PUSH2 0x323 JUMP JUMPDEST SWAP3 PUSH2 0xD6F DUP4 PUSH1 0x20 DUP4 ADD PUSH2 0x323 JUMP JUMPDEST SWAP3 PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xDE2 JUMPI DUP2 PUSH2 0xD90 SWAP2 DUP5 ADD PUSH2 0xCCB JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xDDD JUMPI DUP4 PUSH2 0xDB3 SWAP2 DUP5 ADD PUSH2 0xCCB JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH1 0x80 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xDD8 JUMPI PUSH2 0xDD4 SWAP3 ADD PUSH2 0xD0A JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0xE24 JUMPI PUSH2 0xE0E PUSH2 0xDFF CALLDATASIZE PUSH1 0x4 PUSH2 0xD49 JUMP JUMPDEST SWAP7 SWAP6 SWAP1 SWAP6 SWAP5 SWAP2 SWAP5 SWAP4 SWAP3 SWAP4 PUSH2 0x2675 JUMP JUMPDEST PUSH2 0xE16 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0xE20 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0xE52 JUMPI DUP1 PUSH2 0xE46 PUSH2 0xE4F SWAP3 PUSH1 0x0 DUP7 ADD PUSH2 0xB24 JUMP JUMPDEST SWAP4 PUSH1 0x20 ADD PUSH2 0x323 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0xE86 JUMPI PUSH2 0xE70 PUSH2 0xE6A CALLDATASIZE PUSH1 0x4 PUSH2 0xE29 JUMP JUMPDEST SWAP1 PUSH2 0x2911 JUMP JUMPDEST PUSH2 0xE78 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0xE82 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH2 0xEA2 SWAP1 PUSH2 0xE9D PUSH1 0xD SWAP2 PUSH1 0x0 SWAP3 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x98D JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0xED5 JUMPI PUSH2 0xED1 PUSH2 0xEC0 PUSH2 0xEBB CALLDATASIZE PUSH1 0x4 PUSH2 0x8E6 JUMP JUMPDEST PUSH2 0xE8B JUMP JUMPDEST PUSH2 0xEC8 PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x394 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST CALLVALUE PUSH2 0xF09 JUMPI PUSH2 0xEF3 PUSH2 0xEED CALLDATASIZE PUSH1 0x4 PUSH2 0xE29 JUMP JUMPDEST SWAP1 PUSH2 0x29C7 JUMP JUMPDEST PUSH2 0xEFB PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0xF05 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP1 PUSH2 0xF18 SWAP1 PUSH2 0xBAD JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xF39 SWAP1 PUSH1 0x8 PUSH2 0xF3E SWAP4 MUL PUSH2 0x96E JUMP JUMPDEST PUSH2 0xF26 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0xF4C SWAP2 SLOAD PUSH2 0xF29 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xF66 SWAP1 PUSH2 0xF61 PUSH1 0xC SWAP2 PUSH1 0x0 SWAP3 PUSH2 0xF0E JUMP JUMPDEST PUSH2 0xF41 JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0xF99 JUMPI PUSH2 0xF95 PUSH2 0xF84 PUSH2 0xF7F CALLDATASIZE PUSH1 0x4 PUSH2 0x8E6 JUMP JUMPDEST PUSH2 0xF4F JUMP JUMPDEST PUSH2 0xF8C PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xB5F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH2 0xFB5 SWAP1 PUSH2 0xFB0 PUSH1 0xE SWAP2 PUSH1 0x0 SWAP3 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x98D JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0xFE8 JUMPI PUSH2 0xFE4 PUSH2 0xFD3 PUSH2 0xFCE CALLDATASIZE PUSH1 0x4 PUSH2 0x8E6 JUMP JUMPDEST PUSH2 0xF9E JUMP JUMPDEST PUSH2 0xFDB PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x394 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP1 SWAP2 DUP3 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x1027 JUMPI DUP2 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x1022 JUMPI PUSH1 0x20 ADD SWAP3 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH2 0x101D JUMPI JUMP JUMPDEST PUSH2 0x9FB JUMP JUMPDEST PUSH2 0xCC6 JUMP JUMPDEST PUSH2 0x784 JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x40 DUP3 DUP5 SUB SLT PUSH2 0x1087 JUMPI PUSH1 0x0 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1082 JUMPI DUP4 PUSH2 0x1058 SWAP2 DUP5 ADD PUSH2 0xFED JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x107D JUMPI PUSH2 0x1079 SWAP3 ADD PUSH2 0xCCB JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH2 0x10A8 SWAP1 PUSH2 0x332 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP1 PUSH2 0x10B9 DUP2 PUSH1 0x20 SWAP4 PUSH2 0x109F JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x10E0 PUSH2 0x10DA PUSH2 0x10D3 DUP5 PUSH2 0x108C JUMP JUMPDEST DUP1 SWAP4 PUSH2 0x1090 JUMP JUMPDEST SWAP3 PUSH2 0x1099 JUMP JUMPDEST SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x10F1 JUMPI POP POP POP SWAP1 JUMP JUMPDEST SWAP1 SWAP2 SWAP3 PUSH2 0x110A PUSH2 0x1104 PUSH1 0x1 SWAP3 DUP7 MLOAD PUSH2 0x10AC JUMP JUMPDEST SWAP5 PUSH2 0x10BD JUMP JUMPDEST SWAP2 ADD SWAP2 SWAP1 SWAP2 PUSH2 0x10E4 JUMP JUMPDEST PUSH2 0x112A SWAP2 PUSH1 0x20 DUP3 ADD SWAP2 PUSH1 0x0 DUP2 DUP5 SUB SWAP2 ADD MSTORE PUSH2 0x10C3 JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x1161 JUMPI PUSH2 0x115D PUSH2 0x114C PUSH2 0x1143 CALLDATASIZE PUSH1 0x4 PUSH2 0x102C JUMP JUMPDEST SWAP3 SWAP2 SWAP1 SWAP2 PUSH2 0x29FB JUMP JUMPDEST PUSH2 0x1154 PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x1114 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x60 DUP3 DUP5 SUB SLT PUSH2 0x119C JUMPI PUSH2 0x1199 PUSH2 0x1182 DUP5 PUSH1 0x0 DUP6 ADD PUSH2 0xB24 JUMP JUMPDEST SWAP4 PUSH2 0x1190 DUP2 PUSH1 0x20 DUP7 ADD PUSH2 0x34A JUMP JUMPDEST SWAP4 PUSH1 0x40 ADD PUSH2 0x34A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x11D0 JUMPI PUSH2 0x11BA PUSH2 0x11B4 CALLDATASIZE PUSH1 0x4 PUSH2 0x1166 JUMP JUMPDEST SWAP2 PUSH2 0x2B51 JUMP JUMPDEST PUSH2 0x11C2 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x11CC DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH32 0x0 SWAP1 JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x120D SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0xC5E JUMP JUMPDEST JUMP JUMPDEST CALLVALUE PUSH2 0x123F JUMPI PUSH2 0x121F CALLDATASIZE PUSH1 0x4 PUSH2 0x529 JUMP JUMPDEST PUSH2 0x123B PUSH2 0x122A PUSH2 0x11D5 JUMP JUMPDEST PUSH2 0x1232 PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x11F9 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST CALLVALUE PUSH2 0x1275 JUMPI PUSH2 0x1271 PUSH2 0x1260 PUSH2 0x125A CALLDATASIZE PUSH1 0x4 PUSH2 0x359 JUMP JUMPDEST SWAP1 PUSH2 0x2B5E JUMP JUMPDEST PUSH2 0x1268 PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x394 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x60 DUP3 DUP5 SUB SLT PUSH2 0x12B0 JUMPI PUSH2 0x12AD PUSH2 0x1296 DUP5 PUSH1 0x0 DUP6 ADD PUSH2 0x34A JUMP JUMPDEST SWAP4 PUSH2 0x12A4 DUP2 PUSH1 0x20 DUP7 ADD PUSH2 0x323 JUMP JUMPDEST SWAP4 PUSH1 0x40 ADD PUSH2 0x4B2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x12E4 JUMPI PUSH2 0x12CE PUSH2 0x12C8 CALLDATASIZE PUSH1 0x4 PUSH2 0x127A JUMP JUMPDEST SWAP2 PUSH2 0x2BA2 JUMP JUMPDEST PUSH2 0x12D6 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x12E0 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH2 0x12F6 PUSH1 0x9 PUSH1 0x0 SWAP1 PUSH2 0x6AA JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x1329 JUMPI PUSH2 0x1309 CALLDATASIZE PUSH1 0x4 PUSH2 0x529 JUMP JUMPDEST PUSH2 0x1325 PUSH2 0x1314 PUSH2 0x12E9 JUMP JUMPDEST PUSH2 0x131C PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x736 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x134C JUMPI PUSH2 0x1348 PUSH1 0x20 SWAP2 PUSH2 0x63F JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x649 JUMP JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x1366 PUSH2 0x1361 DUP3 PUSH2 0x132E JUMP JUMPDEST PUSH2 0x78E JUMP JUMPDEST SWAP4 DUP2 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP1 DUP3 DUP5 ADD GT PUSH2 0x1382 JUMPI PUSH2 0x1380 SWAP3 PUSH2 0x7C6 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x789 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x13A5 JUMPI DUP2 PUSH1 0x20 PUSH2 0x13A2 SWAP4 CALLDATALOAD SWAP2 ADD PUSH2 0x1351 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x784 JUMP JUMPDEST SWAP1 PUSH1 0x80 DUP3 DUP3 SUB SLT PUSH2 0x1405 JUMPI PUSH2 0x13C2 DUP2 PUSH1 0x0 DUP5 ADD PUSH2 0x323 JUMP JUMPDEST SWAP3 PUSH2 0x13D0 DUP3 PUSH1 0x20 DUP6 ADD PUSH2 0x34A JUMP JUMPDEST SWAP3 PUSH2 0x13DE DUP4 PUSH1 0x40 DUP4 ADD PUSH2 0x34A JUMP JUMPDEST SWAP3 PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1400 JUMPI PUSH2 0x13FD SWAP3 ADD PUSH2 0x1387 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x143C JUMPI PUSH2 0x1426 PUSH2 0x141D CALLDATASIZE PUSH1 0x4 PUSH2 0x13AA JUMP JUMPDEST SWAP3 SWAP2 SWAP1 SWAP2 PUSH2 0x2C01 JUMP JUMPDEST PUSH2 0x142E PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x1438 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST CALLVALUE PUSH2 0x146F JUMPI PUSH2 0x1459 PUSH2 0x1454 CALLDATASIZE PUSH1 0x4 PUSH2 0x82B JUMP JUMPDEST PUSH2 0x2C37 JUMP JUMPDEST PUSH2 0x1461 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x146B DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x100 DUP4 DUP3 SUB SLT PUSH2 0x1539 JUMPI PUSH2 0x148E DUP2 PUSH1 0x0 DUP6 ADD PUSH2 0x323 JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1534 JUMPI DUP3 PUSH2 0x14AF SWAP2 DUP4 ADD PUSH2 0x808 JUMP JUMPDEST SWAP3 PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x152F JUMPI DUP4 PUSH2 0x14D0 SWAP2 DUP5 ADD PUSH2 0x808 JUMP JUMPDEST SWAP3 PUSH1 0x60 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x152A JUMPI DUP2 PUSH2 0x14F1 SWAP2 DUP6 ADD PUSH2 0x808 JUMP JUMPDEST SWAP3 PUSH2 0x14FF DUP3 PUSH1 0x80 DUP4 ADD PUSH2 0x323 JUMP JUMPDEST SWAP3 PUSH2 0x1527 PUSH2 0x1510 DUP5 PUSH1 0xA0 DUP6 ADD PUSH2 0x4B2 JUMP JUMPDEST SWAP4 PUSH2 0x151E DUP2 PUSH1 0xC0 DUP7 ADD PUSH2 0x323 JUMP JUMPDEST SWAP4 PUSH1 0xE0 ADD PUSH2 0xB24 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x1576 JUMPI PUSH2 0x1560 PUSH2 0x1551 CALLDATASIZE PUSH1 0x4 PUSH2 0x1474 JUMP JUMPDEST SWAP7 SWAP6 SWAP1 SWAP6 SWAP5 SWAP2 SWAP5 SWAP4 SWAP3 SWAP4 PUSH2 0x2C42 JUMP JUMPDEST PUSH2 0x1568 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x1572 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0x15A4 JUMPI DUP1 PUSH2 0x1598 PUSH2 0x15A1 SWAP3 PUSH1 0x0 DUP7 ADD PUSH2 0xB24 JUMP JUMPDEST SWAP4 PUSH1 0x20 ADD PUSH2 0x34A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x15DA JUMPI PUSH2 0x15D6 PUSH2 0x15C5 PUSH2 0x15BF CALLDATASIZE PUSH1 0x4 PUSH2 0x157B JUMP JUMPDEST SWAP1 PUSH2 0x2C89 JUMP JUMPDEST PUSH2 0x15CD PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x11F9 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST CALLVALUE PUSH2 0x1610 JUMPI PUSH2 0x160C PUSH2 0x15FB PUSH2 0x15F5 CALLDATASIZE PUSH1 0x4 PUSH2 0xE29 JUMP JUMPDEST SWAP1 PUSH2 0x2CF0 JUMP JUMPDEST PUSH2 0x1603 PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x441 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST CALLVALUE PUSH2 0x1643 JUMPI PUSH2 0x162D PUSH2 0x1628 CALLDATASIZE PUSH1 0x4 PUSH2 0x82B JUMP JUMPDEST PUSH2 0x2D43 JUMP JUMPDEST PUSH2 0x1635 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x163F DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0xC0 SWAP2 SUB SLT PUSH2 0x165B JUMPI SWAP1 JUMP JUMPDEST PUSH2 0x1648 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0xE0 SWAP2 SUB SLT PUSH2 0x166E JUMPI SWAP1 JUMP JUMPDEST PUSH2 0x1648 JUMP JUMPDEST SWAP2 PUSH1 0x60 DUP4 DUP4 SUB SLT PUSH2 0x16D8 JUMPI PUSH2 0x168B DUP3 PUSH1 0x0 DUP6 ADD PUSH2 0x323 JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x16D3 JUMPI DUP4 PUSH2 0x16AC SWAP2 DUP4 ADD PUSH2 0x164D JUMP JUMPDEST SWAP3 PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x16CE JUMPI PUSH2 0x16CB SWAP3 ADD PUSH2 0x1660 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x170E JUMPI PUSH2 0x170A PUSH2 0x16F9 PUSH2 0x16F3 CALLDATASIZE PUSH1 0x4 PUSH2 0x1673 JUMP JUMPDEST SWAP2 PUSH2 0x30A6 JUMP JUMPDEST PUSH2 0x1701 PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xB5F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SHL SWAP1 JUMP JUMPDEST PUSH2 0x1730 PUSH2 0x172B PUSH2 0x1735 SWAP3 PUSH2 0x1713 JUMP JUMPDEST PUSH2 0x1716 JUMP JUMPDEST PUSH2 0xB0C JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1742 PUSH1 0x0 PUSH2 0x171C JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x174D PUSH2 0x1738 JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x1780 JUMPI PUSH2 0x1760 CALLDATASIZE PUSH1 0x4 PUSH2 0x529 JUMP JUMPDEST PUSH2 0x177C PUSH2 0x176B PUSH2 0x1745 JUMP JUMPDEST PUSH2 0x1773 PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xB5F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH2 0x178E DUP2 PUSH2 0x42F JUMP JUMPDEST SUB PUSH2 0x1795 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x17A7 DUP3 PUSH2 0x1785 JUMP JUMPDEST JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0x17D2 JUMPI DUP1 PUSH2 0x17C6 PUSH2 0x17CF SWAP3 PUSH1 0x0 DUP7 ADD PUSH2 0x323 JUMP JUMPDEST SWAP4 PUSH1 0x20 ADD PUSH2 0x179A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x1806 JUMPI PUSH2 0x17F0 PUSH2 0x17EA CALLDATASIZE PUSH1 0x4 PUSH2 0x17A9 JUMP JUMPDEST SWAP1 PUSH2 0x3147 JUMP JUMPDEST PUSH2 0x17F8 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x1802 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST CALLVALUE PUSH2 0x183A JUMPI PUSH2 0x1824 PUSH2 0x181E CALLDATASIZE PUSH1 0x4 PUSH2 0xC30 JUMP JUMPDEST SWAP1 PUSH2 0x3197 JUMP JUMPDEST PUSH2 0x182C PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x1836 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP1 PUSH1 0x80 DUP3 DUP3 SUB SLT PUSH2 0x18CA JUMPI PUSH2 0x1857 DUP2 PUSH1 0x0 DUP5 ADD PUSH2 0x323 JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x18C5 JUMPI DUP3 PUSH2 0x1878 SWAP2 DUP6 ADD PUSH2 0xA57 JUMP JUMPDEST SWAP3 PUSH1 0x40 DUP2 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x18C0 JUMPI DUP4 PUSH2 0x1899 SWAP2 DUP4 ADD PUSH2 0xA57 JUMP JUMPDEST SWAP3 PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x18BB JUMPI PUSH2 0x18B8 SWAP3 ADD PUSH2 0x1387 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x1901 JUMPI PUSH2 0x18EB PUSH2 0x18E2 CALLDATASIZE PUSH1 0x4 PUSH2 0x183F JUMP JUMPDEST SWAP3 SWAP2 SWAP1 SWAP2 PUSH2 0x31D4 JUMP JUMPDEST PUSH2 0x18F3 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x18FD DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST CALLVALUE PUSH2 0x1936 JUMPI PUSH2 0x1932 PUSH2 0x1921 PUSH2 0x191C CALLDATASIZE PUSH1 0x4 PUSH2 0xB33 JUMP JUMPDEST PUSH2 0x31E2 JUMP JUMPDEST PUSH2 0x1929 PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x394 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST CALLVALUE PUSH2 0x196A JUMPI PUSH2 0x1954 PUSH2 0x194E CALLDATASIZE PUSH1 0x4 PUSH2 0xE29 JUMP JUMPDEST SWAP1 PUSH2 0x3232 JUMP JUMPDEST PUSH2 0x195C PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x1966 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x80 SWAP2 SUB SLT PUSH2 0x197D JUMPI SWAP1 JUMP JUMPDEST PUSH2 0x1648 JUMP JUMPDEST SWAP1 SWAP2 DUP3 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x19BC JUMPI DUP2 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x19B7 JUMPI PUSH1 0x20 ADD SWAP3 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH2 0x19B2 JUMPI JUMP JUMPDEST PUSH2 0x9FB JUMP JUMPDEST PUSH2 0xCC6 JUMP JUMPDEST PUSH2 0x784 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH1 0x80 DUP2 DUP5 SUB SLT PUSH2 0x1A38 JUMPI PUSH2 0x19DB DUP4 PUSH1 0x0 DUP4 ADD PUSH2 0x323 JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1A33 JUMPI DUP2 PUSH2 0x19FC SWAP2 DUP5 ADD PUSH2 0x196F JUMP JUMPDEST SWAP3 PUSH1 0x40 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1A2E JUMPI PUSH2 0x1A20 DUP4 PUSH2 0x1A2B SWAP3 DUP7 ADD PUSH2 0x1982 JUMP JUMPDEST SWAP4 SWAP1 SWAP5 PUSH1 0x60 ADD PUSH2 0x34A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x1A6F JUMPI PUSH2 0x1A59 PUSH2 0x1A50 CALLDATASIZE PUSH1 0x4 PUSH2 0x19C1 JUMP JUMPDEST SWAP4 SWAP3 SWAP1 SWAP3 PUSH2 0x3997 JUMP JUMPDEST PUSH2 0x1A61 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x1A6B DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH2 0x1A81 PUSH1 0xA PUSH1 0x0 SWAP1 PUSH2 0x6AA JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x1AB4 JUMPI PUSH2 0x1A94 CALLDATASIZE PUSH1 0x4 PUSH2 0x529 JUMP JUMPDEST PUSH2 0x1AB0 PUSH2 0x1A9F PUSH2 0x1A74 JUMP JUMPDEST PUSH2 0x1AA7 PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x736 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0x1AE2 JUMPI DUP1 PUSH2 0x1AD6 PUSH2 0x1ADF SWAP3 PUSH1 0x0 DUP7 ADD PUSH2 0x323 JUMP JUMPDEST SWAP4 PUSH1 0x20 ADD PUSH2 0x323 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x1B18 JUMPI PUSH2 0x1B14 PUSH2 0x1B03 PUSH2 0x1AFD CALLDATASIZE PUSH1 0x4 PUSH2 0x1AB9 JUMP JUMPDEST SWAP1 PUSH2 0x3E0E JUMP JUMPDEST PUSH2 0x1B0B PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x441 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST CALLVALUE PUSH2 0x1B4B JUMPI PUSH2 0x1B35 PUSH2 0x1B30 CALLDATASIZE PUSH1 0x4 PUSH2 0xB33 JUMP JUMPDEST PUSH2 0x3E5A JUMP JUMPDEST PUSH2 0x1B3D PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x1B47 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH1 0xA0 DUP2 DUP5 SUB SLT PUSH2 0x1BBC JUMPI PUSH2 0x1B6A DUP4 PUSH1 0x0 DUP4 ADD PUSH2 0x323 JUMP JUMPDEST SWAP3 PUSH2 0x1B78 DUP2 PUSH1 0x20 DUP5 ADD PUSH2 0x323 JUMP JUMPDEST SWAP3 PUSH2 0x1B86 DUP3 PUSH1 0x40 DUP6 ADD PUSH2 0x34A JUMP JUMPDEST SWAP3 PUSH2 0x1B94 DUP4 PUSH1 0x60 DUP4 ADD PUSH2 0x34A JUMP JUMPDEST SWAP3 PUSH1 0x80 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1BB7 JUMPI PUSH2 0x1BB3 SWAP3 ADD PUSH2 0xD0A JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x1BF6 JUMPI PUSH2 0x1BE0 PUSH2 0x1BD4 CALLDATASIZE PUSH1 0x4 PUSH2 0x1B50 JUMP JUMPDEST SWAP5 SWAP4 SWAP1 SWAP4 SWAP3 SWAP2 SWAP3 PUSH2 0x3E65 JUMP JUMPDEST PUSH2 0x1BE8 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x1BF2 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST CALLVALUE PUSH2 0x1C29 JUMPI PUSH2 0x1C13 PUSH2 0x1C0E CALLDATASIZE PUSH1 0x4 PUSH2 0x8E6 JUMP JUMPDEST PUSH2 0x4059 JUMP JUMPDEST PUSH2 0x1C1B PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x1C25 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x1C40 PUSH2 0x1C33 JUMP JUMPDEST POP PUSH8 0x9A31110384E0B0C9 PUSH1 0x20 MSTORE PUSH1 0x14 MSTORE PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x1C69 PUSH2 0x1C5C JUMP JUMPDEST POP DUP1 PUSH2 0x1C84 PUSH2 0x1C7E PUSH4 0x37BC2195 PUSH1 0xE0 SHL PUSH2 0x3E0 JUMP JUMPDEST SWAP2 PUSH2 0x3E0 JUMP JUMPDEST EQ SWAP1 DUP2 ISZERO PUSH2 0x1C91 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x1C9B SWAP2 POP PUSH2 0x4138 JUMP JUMPDEST CODESIZE PUSH2 0x1C8D JUMP JUMPDEST PUSH32 0x6DB4061A20CA83A3BE756EE172BD37A029093AC5AFE4CE968C6D5435B43CB011 SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x1CDF SWAP2 PUSH2 0x1CDA PUSH2 0x1CD5 PUSH2 0x1CA1 JUMP JUMPDEST PUSH2 0x418E JUMP JUMPDEST PUSH2 0x1CE1 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x1CEB SWAP2 PUSH2 0x43A8 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x1CF7 SWAP2 PUSH2 0x1CC5 JUMP JUMPDEST JUMP JUMPDEST PUSH32 0xE02A0315B383857AC496E9D2B2546A699AFAEB4E5E83A1FDEF64376D0B74E5A5 SWAP1 JUMP JUMPDEST PUSH2 0x1D36 SWAP1 PUSH2 0x1D31 PUSH2 0x1D2C PUSH2 0x1CF9 JUMP JUMPDEST PUSH2 0x418E JUMP JUMPDEST PUSH2 0x1F21 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x1F PUSH1 0x20 SWAP2 ADD DIV SWAP1 JUMP JUMPDEST SHL SWAP1 JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x8 PUSH2 0x1D62 SWAP2 MUL SWAP2 PUSH2 0x1D5C PUSH1 0x0 NOT DUP5 PUSH2 0x1D42 JUMP JUMPDEST SWAP3 PUSH2 0x1D42 JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x1D85 PUSH2 0x1D80 PUSH2 0x1D8D SWAP4 PUSH2 0xBAD JUMP JUMPDEST PUSH2 0x1D6C JUMP JUMPDEST SWAP1 DUP4 SLOAD PUSH2 0x1D46 JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x1DA3 SWAP2 PUSH2 0x1D9D PUSH2 0x1C33 JUMP JUMPDEST SWAP2 PUSH2 0x1D6F JUMP JUMPDEST JUMP JUMPDEST JUMPDEST DUP2 DUP2 LT PUSH2 0x1DB1 JUMPI POP POP JUMP JUMPDEST DUP1 PUSH2 0x1DBF PUSH1 0x0 PUSH1 0x1 SWAP4 PUSH2 0x1D91 JUMP JUMPDEST ADD PUSH2 0x1DA6 JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x1F DUP2 GT PUSH2 0x1DD5 JUMPI JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x1DE1 PUSH2 0x1E06 SWAP4 PUSH2 0x598 JUMP JUMPDEST SWAP1 PUSH1 0x20 PUSH2 0x1DED DUP5 PUSH2 0x1D38 JUMP JUMPDEST DUP4 ADD SWAP4 LT PUSH2 0x1E0E JUMPI JUMPDEST PUSH2 0x1DFF SWAP1 PUSH2 0x1D38 JUMP JUMPDEST ADD SWAP1 PUSH2 0x1DA5 JUMP JUMPDEST CODESIZE DUP1 DUP1 PUSH2 0x1DD0 JUMP JUMPDEST SWAP2 POP PUSH2 0x1DFF DUP2 SWAP3 SWAP1 POP PUSH2 0x1DF6 JUMP JUMPDEST SWAP1 PUSH2 0x1E2D SWAP1 PUSH1 0x0 NOT SWAP1 PUSH1 0x8 MUL PUSH2 0x96E JUMP JUMPDEST NOT AND SWAP1 JUMP JUMPDEST DUP2 PUSH2 0x1E3C SWAP2 PUSH2 0x1E1C JUMP JUMPDEST SWAP1 PUSH1 0x2 MUL OR SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x1E4E DUP2 PUSH2 0x6D3 JUMP JUMPDEST SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x1F10 JUMPI PUSH2 0x1E72 DUP3 PUSH2 0x1E6C DUP6 SLOAD PUSH2 0x565 JUMP JUMPDEST DUP6 PUSH2 0x1DC5 JUMP JUMPDEST PUSH1 0x20 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x1EA7 JUMPI SWAP2 DUP1 SWAP2 PUSH2 0x1E96 SWAP4 PUSH1 0x0 SWAP3 PUSH2 0x1E9B JUMPI JUMPDEST POP POP PUSH2 0x1E32 JUMP JUMPDEST SWAP1 SSTORE JUMPDEST JUMP JUMPDEST SWAP1 SWAP2 POP ADD MLOAD CODESIZE DUP1 PUSH2 0x1E8F JUMP JUMPDEST PUSH1 0x1F NOT DUP4 AND SWAP2 PUSH2 0x1EB6 DUP6 PUSH2 0x598 JUMP JUMPDEST SWAP3 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x1EF8 JUMPI POP SWAP2 PUSH1 0x2 SWAP4 SWAP2 DUP6 PUSH1 0x1 SWAP7 SWAP5 LT PUSH2 0x1EDE JUMPI JUMPDEST POP POP POP MUL ADD SWAP1 SSTORE PUSH2 0x1E99 JUMP JUMPDEST PUSH2 0x1EEE SWAP2 ADD MLOAD PUSH1 0x1F DUP5 AND SWAP1 PUSH2 0x1E1C JUMP JUMPDEST SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x1ED2 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD MLOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x1EBA JUMP JUMPDEST PUSH2 0x649 JUMP JUMPDEST SWAP1 PUSH2 0x1F1F SWAP2 PUSH2 0x1E44 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x1F2C SWAP1 PUSH1 0x8 PUSH2 0x1F15 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x1F37 SWAP1 PUSH2 0x1D1D JUMP JUMPDEST JUMP JUMPDEST PUSH32 0x70649EC320B507FEBAD3E8EF750E5F580B9AE32F9F50D4C7B121332C81971530 SWAP1 JUMP JUMPDEST PUSH2 0x1F76 SWAP1 PUSH2 0x1F71 PUSH2 0x1F6C PUSH2 0x1F39 JUMP JUMPDEST PUSH2 0x418E JUMP JUMPDEST PUSH2 0x1FF6 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x1F8C PUSH2 0x1F87 PUSH2 0x1F91 SWAP3 PUSH2 0x2F7 JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x2F7 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1F9D SWAP1 PUSH2 0x1F78 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1FA9 SWAP1 PUSH2 0x1F94 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x1FBD PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB SWAP2 PUSH2 0x1716 JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST PUSH2 0x1FD0 SWAP1 PUSH2 0x1F94 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x1FEB PUSH2 0x1FE6 PUSH2 0x1FF2 SWAP3 PUSH2 0x1FC7 JUMP JUMPDEST PUSH2 0x1FD3 JUMP JUMPDEST DUP3 SLOAD PUSH2 0x1FAC JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x2002 PUSH2 0x2009 SWAP2 PUSH2 0x1FA0 JUMP JUMPDEST PUSH1 0x6 PUSH2 0x1FD6 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x2014 SWAP1 PUSH2 0x1F5D JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x60 SWAP1 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x0 SWAP3 SWAP2 DUP1 SLOAD SWAP1 PUSH2 0x203B PUSH2 0x2034 DUP4 PUSH2 0x565 JUMP JUMPDEST DUP1 SWAP5 PUSH2 0x201B JUMP JUMPDEST SWAP2 PUSH1 0x1 DUP2 AND SWAP1 DUP2 PUSH1 0x0 EQ PUSH2 0x208F JUMPI POP PUSH1 0x1 EQ PUSH2 0x2057 JUMPI JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x2064 SWAP2 SWAP3 SWAP4 SWAP5 POP PUSH2 0x598 JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMPDEST DUP4 DUP3 LT PUSH2 0x207B JUMPI POP POP ADD SWAP1 CODESIZE DUP1 DUP1 PUSH2 0x2052 JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x20 SWAP3 SLOAD DUP5 DUP7 ADD MSTORE ADD SWAP2 ADD SWAP1 PUSH2 0x2068 JUMP JUMPDEST SWAP3 SWAP5 SWAP6 POP POP POP PUSH1 0xFF NOT AND DUP3 MSTORE DUP1 ISZERO ISZERO MUL ADD SWAP1 CODESIZE DUP1 DUP1 PUSH2 0x2052 JUMP JUMPDEST PUSH2 0x20CE PUSH2 0x20C5 SWAP3 PUSH1 0x20 SWAP3 PUSH2 0x20BC DUP2 PUSH2 0x6D3 JUMP JUMPDEST SWAP5 DUP6 DUP1 SWAP4 PUSH2 0x201B JUMP JUMPDEST SWAP4 DUP5 SWAP2 ADD PUSH2 0x6E0 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x2E6A736F6E000000000000000000000000000000000000000000000000000000 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x2106 PUSH1 0x5 DUP1 SWAP3 PUSH2 0x201B JUMP JUMPDEST PUSH2 0x210F DUP2 PUSH2 0x20D2 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST SWAP2 PUSH2 0x2124 PUSH2 0x212F SWAP4 PUSH2 0x212A SWAP4 PUSH2 0x2020 JUMP JUMPDEST SWAP1 PUSH2 0x20A9 JUMP JUMPDEST PUSH2 0x20FA JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x217C SWAP1 PUSH2 0x2141 PUSH2 0x2016 JUMP JUMPDEST POP PUSH2 0x2177 PUSH2 0x2150 PUSH1 0x9 SWAP3 PUSH2 0x4422 JUMP JUMPDEST SWAP2 PUSH2 0x2168 PUSH2 0x215C PUSH2 0x2E2 JUMP JUMPDEST SWAP4 DUP5 SWAP3 PUSH1 0x20 DUP5 ADD PUSH2 0x2113 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE SUB DUP3 PUSH2 0x65F JUMP JUMPDEST PUSH2 0x2132 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2188 SWAP1 PUSH2 0x1F78 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2194 SWAP1 PUSH2 0x217F JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x21A1 SWAP1 PUSH2 0x218B JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x0 SHR SWAP1 JUMP JUMPDEST PUSH2 0x21C1 PUSH2 0x21C6 SWAP2 PUSH2 0x21AF JUMP JUMPDEST PUSH2 0x972 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x21D3 SWAP1 SLOAD PUSH2 0x21B5 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x21EA PUSH2 0x21E5 PUSH2 0x21EF SWAP3 PUSH2 0x1713 JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x332 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x21FE PUSH2 0x2203 SWAP2 PUSH2 0x21AF JUMP JUMPDEST PUSH2 0xBAD JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x221D PUSH2 0x2218 PUSH2 0x2222 SWAP3 PUSH2 0x2206 JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x332 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2237 PUSH2 0x2232 DUP4 PUSH2 0x7A3 JUMP JUMPDEST PUSH2 0x78E JUMP JUMPDEST SWAP2 DUP3 MSTORE JUMP JUMPDEST PUSH2 0x2246 PUSH1 0x0 PUSH2 0x2225 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2251 PUSH2 0x223C JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2273 PUSH2 0x226E PUSH2 0x2267 PUSH1 0xF DUP6 SWAP1 PUSH2 0x2197 JUMP JUMPDEST DUP4 SWAP1 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x21C9 JUMP JUMPDEST DUP1 PUSH2 0x2287 PUSH2 0x2281 PUSH1 0x0 PUSH2 0x21D6 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST EQ PUSH2 0x2332 JUMPI PUSH2 0x2296 DUP2 BLOCKHASH PUSH2 0x21F2 JUMP JUMPDEST PUSH2 0x22A9 PUSH2 0x22A3 PUSH1 0x0 PUSH2 0x21D6 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST EQ ISZERO SWAP1 DUP2 ISZERO PUSH2 0x2315 JUMPI JUMPDEST POP PUSH2 0x22F8 JUMPI PUSH2 0x22F6 SWAP2 PUSH2 0x22DC PUSH1 0x0 PUSH2 0x22D7 PUSH2 0x22D0 PUSH1 0xF DUP6 SWAP1 PUSH2 0x2197 JUMP JUMPDEST DUP6 SWAP1 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x1D91 JUMP JUMPDEST SWAP1 PUSH2 0x22E7 PUSH1 0x1 PUSH2 0x2209 JUMP JUMPDEST SWAP1 PUSH2 0x22F0 PUSH2 0x2249 JUMP JUMPDEST SWAP3 PUSH2 0x4477 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 PUSH4 0x156F9043 PUSH1 0xE2 SHL DUP2 MSTORE DUP1 PUSH2 0x2311 PUSH1 0x4 DUP3 ADD PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP1 POP PUSH2 0x232A PUSH2 0x2324 NUMBER SWAP3 PUSH2 0x332 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST GT ISZERO CODESIZE PUSH2 0x22B3 JUMP JUMPDEST PUSH1 0x0 PUSH4 0x7DE832B5 PUSH1 0xE1 SHL DUP2 MSTORE DUP1 PUSH2 0x234B PUSH1 0x4 DUP3 ADD PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x235C SWAP2 CALLER SWAP2 SWAP1 SWAP2 PUSH2 0x44F2 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x236C SWAP1 PUSH2 0xB0C JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2379 SWAP1 PUSH2 0x2363 JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH2 0x2393 PUSH2 0x2398 SWAP2 PUSH2 0x21AF JUMP JUMPDEST PUSH2 0xF26 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x23A5 SWAP1 SLOAD PUSH2 0x2387 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH2 0x23C1 PUSH2 0x23C7 SWAP3 PUSH2 0x23B9 PUSH2 0x235E JUMP JUMPDEST POP PUSH1 0x4 PUSH2 0x236F JUMP JUMPDEST ADD PUSH2 0x239B JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x23D9 SWAP1 PUSH2 0xBAD JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x23FE PUSH2 0x2403 SWAP2 PUSH2 0x21AF JUMP JUMPDEST PUSH2 0x23E7 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2410 SWAP1 SLOAD PUSH2 0x23F2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x241D SWAP1 PUSH2 0x302 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST PUSH1 0xA0 SHR SWAP1 JUMP JUMPDEST PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0x2444 PUSH2 0x2449 SWAP2 PUSH2 0x2421 JUMP JUMPDEST PUSH2 0x2427 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2456 SWAP1 SLOAD PUSH2 0x2438 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2463 SWAP1 PUSH2 0x48C JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST PUSH2 0x2471 PUSH1 0x40 PUSH2 0x78E JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x24AB PUSH2 0x24A2 PUSH1 0x0 PUSH2 0x2485 PUSH2 0x2467 JUMP JUMPDEST SWAP5 PUSH2 0x249C PUSH2 0x2494 DUP4 DUP4 ADD PUSH2 0x2406 JUMP JUMPDEST DUP4 DUP9 ADD PUSH2 0x2413 JUMP JUMPDEST ADD PUSH2 0x244C JUMP JUMPDEST PUSH1 0x20 DUP5 ADD PUSH2 0x2459 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x24B6 SWAP1 PUSH2 0x2474 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x24C3 SWAP1 MLOAD PUSH2 0x302 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x24DA PUSH2 0x24D5 PUSH2 0x24DF SWAP3 PUSH2 0x1713 JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x2F7 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x24EB SWAP1 PUSH2 0x24C6 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x24F8 SWAP1 MLOAD PUSH2 0x48C JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x250F PUSH2 0x250A PUSH2 0x2514 SWAP3 PUSH2 0x48C JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x332 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x253C PUSH2 0x2542 SWAP2 SWAP4 SWAP3 SWAP4 PUSH2 0x332 JUMP JUMPDEST SWAP3 PUSH2 0x332 JUMP JUMPDEST SWAP2 PUSH2 0x254E DUP4 DUP3 MUL PUSH2 0x332 JUMP JUMPDEST SWAP3 DUP2 DUP5 DIV EQ SWAP1 ISZERO OR ISZERO PUSH2 0x255D JUMPI JUMP JUMPDEST PUSH2 0x2517 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x2584 PUSH2 0x258A SWAP2 PUSH2 0x332 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST SWAP1 DUP2 ISZERO PUSH2 0x2595 JUMPI DIV SWAP1 JUMP JUMPDEST PUSH2 0x2562 JUMP JUMPDEST PUSH2 0x25BD PUSH2 0x25C2 SWAP2 SWAP4 SWAP3 SWAP4 PUSH2 0x25AC PUSH2 0x23CA JUMP JUMPDEST POP PUSH2 0x25B5 PUSH2 0x1C33 JUMP JUMPDEST POP PUSH1 0x3 PUSH2 0x23CF JUMP JUMPDEST PUSH2 0x24AD JUMP JUMPDEST SWAP2 PUSH2 0x25CF PUSH1 0x0 DUP5 ADD PUSH2 0x24B9 JUMP JUMPDEST PUSH2 0x25EA PUSH2 0x25E4 PUSH2 0x25DF PUSH1 0x0 PUSH2 0x24E2 JUMP JUMPDEST PUSH2 0x302 JUMP JUMPDEST SWAP2 PUSH2 0x302 JUMP JUMPDEST EQ PUSH2 0x2637 JUMPI JUMPDEST PUSH1 0x0 PUSH2 0x262C PUSH2 0x2616 PUSH2 0x2633 SWAP4 PUSH2 0x2610 PUSH2 0x260B PUSH1 0x20 DUP10 ADD PUSH2 0x24EE JUMP JUMPDEST PUSH2 0x24FB JUMP JUMPDEST SWAP1 PUSH2 0x252D JUMP JUMPDEST PUSH2 0x2626 PUSH2 0x2621 PUSH2 0x45EA JUMP JUMPDEST PUSH2 0x24FB JUMP JUMPDEST SWAP1 PUSH2 0x2578 JUMP JUMPDEST SWAP4 ADD PUSH2 0x24B9 JUMP JUMPDEST SWAP2 SWAP1 JUMP JUMPDEST SWAP2 POP PUSH2 0x2633 PUSH1 0x0 PUSH2 0x262C PUSH2 0x2616 PUSH2 0x264E PUSH1 0x2 PUSH2 0x24AD JUMP JUMPDEST SWAP6 SWAP4 POP POP POP POP PUSH2 0x25F0 JUMP JUMPDEST PUSH2 0x2664 SWAP2 CALLDATASIZE SWAP2 PUSH2 0xA00 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2672 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x1351 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP7 SWAP4 SWAP7 SWAP6 SWAP1 SWAP5 SWAP2 SWAP3 SWAP6 PUSH2 0x2686 PUSH2 0x4601 JUMP JUMPDEST PUSH2 0x28BF JUMPI JUMPDEST DUP3 DUP8 SUB PUSH2 0x28B1 JUMPI PUSH1 0x60 SHL PUSH8 0x9A31110384E0B0C9 OR SWAP5 PUSH1 0x60 SHL PUSH8 0x9A31110384E0B0C9 OR SWAP2 DUP6 PUSH1 0x20 MSTORE DUP6 PUSH1 0x60 SHR SWAP6 DUP4 PUSH1 0x60 SHR SWAP4 DUP5 ISZERO PUSH2 0x28A3 JUMPI DUP8 CALLER SUB PUSH2 0x2887 JUMPI JUMPDEST DUP9 PUSH1 0x5 SHL DUP1 JUMPDEST PUSH2 0x2827 JUMPI POP POP POP DUP3 DUP7 PUSH1 0x20 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH1 0x40 MLOAD PUSH1 0x40 DUP2 MSTORE DUP12 DUP14 DUP2 PUSH1 0x5 SHL SWAP5 DUP3 DUP7 SWAP4 PUSH1 0x40 DUP7 ADD MSTORE DUP4 DUP14 PUSH1 0x60 DUP8 ADD CALLDATACOPY DUP4 PUSH1 0x60 ADD DUP3 DUP7 ADD MSTORE PUSH1 0x60 DUP5 DUP7 ADD ADD SWAP1 DUP2 MSTORE ADD CALLDATACOPY PUSH1 0x80 CALLER SWAP4 DUP1 ADD ADD SWAP1 LOG4 PUSH2 0x273D PUSH2 0x460F JUMP JUMPDEST PUSH2 0x280A JUMPI JUMPDEST POP DUP2 EXTCODESIZE PUSH2 0x2753 JUMPI JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP1 SWAP8 DUP7 SWAP5 PUSH1 0x0 MSTORE DUP1 PUSH1 0xC0 PUSH1 0x40 MLOAD SWAP12 DUP13 SWAP11 PUSH4 0xBC197C81 DUP13 MSTORE CALLER DUP7 DUP14 ADD MSTORE PUSH1 0x40 DUP13 ADD MSTORE PUSH1 0xA0 PUSH1 0x60 DUP13 ADD MSTORE DUP11 DUP4 PUSH1 0x5 SHL SWAP10 DUP11 SWAP6 DUP7 SWAP5 DUP6 SWAP4 ADD MSTORE PUSH1 0xE0 DUP14 ADD CALLDATACOPY DUP2 PUSH1 0xC0 ADD PUSH1 0x80 DUP13 ADD MSTORE PUSH1 0xE0 DUP3 DUP13 ADD ADD SWAP3 DUP4 MSTORE DUP5 DUP4 ADD CALLDATACOPY DUP2 DUP1 PUSH1 0xE0 ADD ADD PUSH1 0xA0 DUP11 ADD MSTORE ADD ADD DUP4 DUP2 MSTORE ADD CALLDATACOPY DUP1 ADD ADD PUSH2 0x104 ADD PUSH1 0x1C PUSH1 0x40 MLOAD ADD PUSH1 0x0 DUP1 MLOAD GAS CALL ISZERO PUSH2 0x27FB JUMPI JUMPDEST PUSH4 0xBC197C81 PUSH1 0xE0 SHL SWAP1 MLOAD SUB PUSH2 0x27ED JUMPI CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x274A JUMP JUMPDEST PUSH4 0x9C05499B PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x27D2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH2 0x2821 SWAP1 DUP7 SWAP1 DUP5 SWAP1 DUP7 SWAP1 DUP11 DUP13 SWAP2 SWAP3 DUP8 SWAP5 DUP12 SWAP7 PUSH2 0x461D JUMP JUMPDEST CODESIZE PUSH2 0x2742 JUMP JUMPDEST PUSH1 0x20 SWAP1 SUB DUP1 DUP12 ADD CALLDATALOAD DUP4 PUSH1 0x20 MSTORE DUP2 DUP9 ADD CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP1 SLOAD DUP1 DUP4 GT PUSH2 0x2879 JUMPI DUP3 SWAP1 SUB SWAP1 SSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD SWAP1 DUP2 ADD SWAP1 DUP2 LT PUSH2 0x286B JUMPI DUP3 SWAP2 SSTORE PUSH2 0x26D0 JUMP JUMPDEST PUSH4 0x1336CEA PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0xF4D678B8 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST CALLER PUSH1 0x0 MSTORE PUSH1 0x34 PUSH1 0xC KECCAK256 SLOAD PUSH2 0x26CA JUMPI PUSH4 0x4B6E7F18 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0xEA553B34 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0x3B800A46 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH2 0x28E2 DUP5 DUP9 PUSH2 0x28DC DUP12 DUP8 SWAP1 PUSH2 0x28D6 DUP9 SWAP5 DUP13 SWAP7 PUSH2 0x2659 JUMP JUMPDEST POP PUSH2 0x2659 JUMP JUMPDEST POP PUSH2 0x2667 JUMP JUMPDEST POP PUSH2 0x268B JUMP JUMPDEST SWAP1 PUSH2 0x2903 SWAP2 PUSH2 0x28FE PUSH2 0x28F9 DUP3 PUSH2 0x23A8 JUMP JUMPDEST PUSH2 0x418E JUMP JUMPDEST PUSH2 0x2905 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x290F SWAP2 PUSH2 0x4667 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x291B SWAP2 PUSH2 0x28E8 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x20 PUSH32 0x20726F6C657320666F722073656C660000000000000000000000000000000000 SWAP2 PUSH32 0x416363657373436F6E74726F6C3A2063616E206F6E6C792072656E6F756E6365 PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x2978 PUSH1 0x2F PUSH1 0x40 SWAP3 PUSH2 0x6D7 JUMP JUMPDEST PUSH2 0x2981 DUP2 PUSH2 0x291D JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x299B SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x296B JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x29A5 JUMPI JUMP JUMPDEST PUSH2 0x29AD PUSH2 0x2E2 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x29C3 PUSH1 0x4 DUP3 ADD PUSH2 0x2985 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP1 PUSH2 0x29F4 SWAP2 PUSH2 0x29EF DUP3 PUSH2 0x29E9 PUSH2 0x29E3 PUSH2 0x29DE PUSH2 0x4691 JUMP JUMPDEST PUSH2 0x302 JUMP JUMPDEST SWAP2 PUSH2 0x302 JUMP JUMPDEST EQ PUSH2 0x299E JUMP JUMPDEST PUSH2 0x469E JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x60 SWAP1 JUMP JUMPDEST SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2A07 PUSH2 0x29F6 JUMP JUMPDEST POP DUP3 SUB PUSH2 0x2A5E JUMPI PUSH1 0x40 MLOAD SWAP4 DUP3 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP3 PUSH1 0x5 SHL DUP1 DUP5 DUP2 ADD PUSH1 0x40 MSTORE JUMPDEST PUSH2 0x2A2F JUMPI POP POP POP POP JUMP JUMPDEST PUSH1 0x20 SWAP1 SUB DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x60 SHL PUSH8 0x9A31110384E0B0C9 OR PUSH1 0x20 MSTORE DUP1 DUP4 ADD CALLDATALOAD PUSH1 0x0 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP2 DUP7 ADD MSTORE PUSH2 0x2A25 JUMP JUMPDEST PUSH4 0x3B800A46 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH32 0xBAA5EE745DE68A3095827D2EE7DD2043AFC932834D02CC1B8BE3DA78577F6C1A SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2AAB SWAP3 SWAP2 PUSH2 0x2AA6 PUSH2 0x2AA1 PUSH2 0x2A6C JUMP JUMPDEST PUSH2 0x418E JUMP JUMPDEST PUSH2 0x2B10 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x2ABA PUSH1 0x0 NOT SWAP2 PUSH2 0x1716 JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST PUSH2 0x2ACD SWAP1 PUSH2 0x21AF JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2AE5 PUSH2 0x2AE0 PUSH2 0x2AEC SWAP3 PUSH2 0x2363 JUMP JUMPDEST PUSH2 0x2AC4 JUMP JUMPDEST DUP3 SLOAD PUSH2 0x2AAD JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST SWAP1 PUSH2 0x2B05 PUSH2 0x2B00 PUSH2 0x2B0C SWAP3 PUSH2 0xBAD JUMP JUMPDEST PUSH2 0x1D6C JUMP JUMPDEST DUP3 SLOAD PUSH2 0x2AAD JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x2B4F SWAP3 SWAP2 PUSH2 0x2B2D PUSH2 0x2B4A SWAP3 PUSH2 0x2B28 PUSH1 0xC DUP7 SWAP1 PUSH2 0xF0E JUMP JUMPDEST PUSH2 0x2AD0 JUMP JUMPDEST PUSH2 0x2B42 DUP2 PUSH2 0x2B3D PUSH1 0xD DUP7 SWAP1 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x2AF0 JUMP JUMPDEST SWAP2 PUSH1 0xE PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x2AF0 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x2B5C SWAP3 SWAP2 PUSH2 0x2A90 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x2B71 SWAP2 PUSH2 0x2B6B PUSH2 0x1C33 JUMP JUMPDEST POP PUSH2 0x470E JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2B91 SWAP3 SWAP2 PUSH2 0x2B8C PUSH2 0x2B87 PUSH2 0x1CA1 JUMP JUMPDEST PUSH2 0x418E JUMP JUMPDEST PUSH2 0x2B93 JUMP JUMPDEST JUMP JUMPDEST SWAP2 PUSH2 0x2BA0 SWAP3 SWAP2 SWAP1 SWAP2 PUSH2 0x48F4 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x2BAD SWAP3 SWAP2 PUSH2 0x2B76 JUMP JUMPDEST JUMP JUMPDEST PUSH32 0x9F2DF0FED2C77648DE5860A4CC508CD0818C85B8B8A1AB4CEEEF8D981C8956A6 SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2BEF SWAP4 SWAP3 SWAP2 PUSH2 0x2BEA PUSH2 0x2BE5 PUSH2 0x2BAF JUMP JUMPDEST PUSH2 0x418E JUMP JUMPDEST PUSH2 0x2BF1 JUMP JUMPDEST JUMP JUMPDEST SWAP2 PUSH2 0x2BFF SWAP4 SWAP2 SWAP1 SWAP2 SWAP3 PUSH2 0x4477 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x2C0D SWAP4 SWAP3 SWAP2 PUSH2 0x2BD3 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x2C28 SWAP1 PUSH2 0x2C23 PUSH2 0x2C1E PUSH2 0x1CF9 JUMP JUMPDEST PUSH2 0x418E JUMP JUMPDEST PUSH2 0x2C2A JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x2C35 SWAP1 PUSH1 0x9 PUSH2 0x1F15 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x2C40 SWAP1 PUSH2 0x2C0F JUMP JUMPDEST JUMP JUMPDEST SWAP2 PUSH2 0x2C6C SWAP8 SWAP6 SWAP4 SWAP2 SWAP7 SWAP5 SWAP3 PUSH2 0x2C5F PUSH2 0x2C58 PUSH2 0x2A6C JUMP JUMPDEST DUP3 SWAP1 PUSH2 0x4667 JUMP JUMPDEST SWAP7 SWAP1 SWAP2 SWAP3 SWAP4 SWAP5 SWAP6 SWAP7 PUSH2 0x4977 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x2C78 SWAP1 PUSH2 0x2363 JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2CA9 PUSH2 0x2CA4 PUSH2 0x2CAE SWAP4 PUSH2 0x2C9C PUSH2 0x23CA JUMP JUMPDEST POP PUSH1 0x5 PUSH2 0x2C6E JUMP JUMPDEST PUSH2 0x2C86 JUMP JUMPDEST PUSH2 0x49C6 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2CBB SWAP1 PUSH2 0x218B JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH2 0x2CDB PUSH2 0x2CE0 SWAP2 PUSH2 0x21AF JUMP JUMPDEST PUSH2 0x2CC9 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2CED SWAP1 SLOAD PUSH2 0x2CCF JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2D18 SWAP2 PUSH1 0x0 PUSH2 0x2D0D PUSH2 0x2D13 SWAP4 PUSH2 0x2D05 PUSH2 0x1C5C JUMP JUMPDEST POP PUSH1 0x4 PUSH2 0x236F JUMP JUMPDEST ADD PUSH2 0x2CB1 JUMP JUMPDEST PUSH2 0x2CE3 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2D34 SWAP1 PUSH2 0x2D2F PUSH2 0x2D2A PUSH2 0x1CF9 JUMP JUMPDEST PUSH2 0x418E JUMP JUMPDEST PUSH2 0x2D36 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x2D41 SWAP1 PUSH1 0xA PUSH2 0x1F15 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x2D4C SWAP1 PUSH2 0x2D1B JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x2D65 PUSH2 0x2D6A SWAP2 PUSH2 0x21AF JUMP JUMPDEST PUSH2 0x2D4E JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2D77 SWAP1 SLOAD PUSH2 0x2D59 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2D83 SWAP1 PUSH2 0x217F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0xE0 SHL SWAP1 JUMP JUMPDEST SWAP1 POP MLOAD SWAP1 PUSH2 0x2D9E DUP3 PUSH2 0xB0F JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x2DBA JUMPI PUSH2 0x2DB7 SWAP2 PUSH1 0x0 ADD PUSH2 0x2D91 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST POP PUSH2 0x2DCE SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x323 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2DDA SWAP1 PUSH2 0x302 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST POP PUSH2 0x2DED SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x401 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2DF9 SWAP1 PUSH2 0x3E0 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST POP PUSH2 0x2E0C SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0xB24 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2E18 SWAP1 PUSH2 0xB0C JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SUB DUP3 CALLDATASIZE SUB SUB DUP2 SLT ISZERO PUSH2 0x2E6C JUMPI ADD PUSH1 0x20 DUP2 CALLDATALOAD SWAP2 ADD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2E67 JUMPI PUSH1 0x1 DUP3 MUL CALLDATASIZE SUB DUP4 SGT PUSH2 0x2E62 JUMPI JUMP JUMPDEST PUSH2 0x2E21 JUMP JUMPDEST PUSH2 0x2E1C JUMP JUMPDEST PUSH2 0x2E26 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x2E94 DUP2 PUSH2 0x2E8D DUP2 PUSH2 0x2E99 SWAP6 PUSH2 0x2E71 JUMP JUMPDEST DUP1 SWAP6 PUSH2 0x7C6 JUMP JUMPDEST PUSH2 0x63F JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST SWAP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x40 SUB DUP3 CALLDATASIZE SUB SUB DUP2 SLT ISZERO PUSH2 0x2EB3 JUMPI ADD SWAP1 JUMP JUMPDEST PUSH2 0x2E26 JUMP JUMPDEST SWAP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SUB DUP3 CALLDATASIZE SUB SUB DUP2 SLT ISZERO PUSH2 0x2EF9 JUMPI ADD PUSH1 0x20 DUP2 CALLDATALOAD SWAP2 ADD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2EF4 JUMPI PUSH1 0x1 DUP3 MUL CALLDATASIZE SUB DUP4 SGT PUSH2 0x2EEF JUMPI JUMP JUMPDEST PUSH2 0x2E21 JUMP JUMPDEST PUSH2 0x2E1C JUMP JUMPDEST PUSH2 0x2E26 JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x2F18 DUP2 PUSH2 0x2F11 DUP2 PUSH2 0x2F1D SWAP6 PUSH2 0x58F JUMP JUMPDEST DUP1 SWAP6 PUSH2 0x7C6 JUMP JUMPDEST PUSH2 0x63F JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0x2F37 DUP2 PUSH2 0x2F21 JUMP JUMPDEST SUB PUSH2 0x2F3E JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x2F50 DUP3 PUSH2 0x2F2E JUMP JUMPDEST JUMP JUMPDEST POP PUSH2 0x2F61 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x2F43 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2F6D SWAP1 PUSH2 0x2F21 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP1 PUSH2 0x2FAF SWAP1 PUSH1 0x20 PUSH2 0x2FA7 PUSH2 0x2F9D PUSH1 0x40 DUP5 ADD PUSH2 0x2F8F PUSH1 0x0 DUP9 ADD DUP9 PUSH2 0x2EB8 JUMP JUMPDEST SWAP1 DUP7 DUP4 SUB PUSH1 0x0 DUP9 ADD MSTORE PUSH2 0x2EFE JUMP JUMPDEST SWAP5 DUP3 DUP2 ADD SWAP1 PUSH2 0x2F52 JUMP JUMPDEST SWAP2 ADD SWAP1 PUSH2 0x2F64 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x305C SWAP2 PUSH2 0x304E PUSH2 0x3043 PUSH1 0xC0 DUP4 ADD PUSH2 0x2FDA PUSH2 0x2FD0 PUSH1 0x0 DUP8 ADD DUP8 PUSH2 0x2DBF JUMP JUMPDEST PUSH1 0x0 DUP7 ADD SWAP1 PUSH2 0x2DD1 JUMP JUMPDEST PUSH2 0x2FF4 PUSH2 0x2FEA PUSH1 0x20 DUP8 ADD DUP8 PUSH2 0x2DDE JUMP JUMPDEST PUSH1 0x20 DUP7 ADD SWAP1 PUSH2 0x2DF0 JUMP JUMPDEST PUSH2 0x300E PUSH2 0x3004 PUSH1 0x40 DUP8 ADD DUP8 PUSH2 0x2DFD JUMP JUMPDEST PUSH1 0x40 DUP7 ADD SWAP1 PUSH2 0x2E0F JUMP JUMPDEST PUSH2 0x3028 PUSH2 0x301E PUSH1 0x60 DUP8 ADD DUP8 PUSH2 0x2DFD JUMP JUMPDEST PUSH1 0x60 DUP7 ADD SWAP1 PUSH2 0x2E0F JUMP JUMPDEST PUSH2 0x3035 PUSH1 0x80 DUP7 ADD DUP7 PUSH2 0x2E2B JUMP JUMPDEST SWAP1 DUP6 DUP4 SUB PUSH1 0x80 DUP8 ADD MSTORE PUSH2 0x2E7A JUMP JUMPDEST SWAP3 PUSH1 0xA0 DUP2 ADD SWAP1 PUSH2 0x2E9D JUMP JUMPDEST SWAP1 PUSH1 0xA0 DUP2 DUP5 SUB SWAP2 ADD MSTORE PUSH2 0x2F71 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP4 SWAP3 SWAP1 PUSH2 0x308B PUSH1 0x40 SWAP2 PUSH2 0x3093 SWAP5 PUSH2 0x307E PUSH1 0x60 DUP10 ADD SWAP3 PUSH1 0x0 DUP11 ADD SWAP1 PUSH2 0xC5E JUMP JUMPDEST DUP8 DUP3 SUB PUSH1 0x20 DUP10 ADD MSTORE PUSH2 0x2FB2 JUMP JUMPDEST SWAP5 ADD SWAP1 PUSH2 0xB52 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x309D PUSH2 0x2E2 JUMP JUMPDEST RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST SWAP2 POP PUSH1 0x20 SWAP1 PUSH2 0x30B3 PUSH2 0x235E JUMP JUMPDEST POP PUSH2 0x30C6 PUSH2 0x30C1 PUSH1 0x6 PUSH2 0x2D6D JUMP JUMPDEST PUSH2 0x2D7A JUMP JUMPDEST PUSH2 0x30F2 PUSH4 0x3808A90B SWAP5 SWAP3 SWAP5 PUSH2 0x30FD PUSH2 0x30DE PUSH1 0x7 PUSH2 0x239B JUMP JUMPDEST PUSH2 0x30E6 PUSH2 0x2E2 JUMP JUMPDEST SWAP8 DUP9 SWAP7 DUP8 SWAP6 DUP7 SWAP6 PUSH2 0x2D8B JUMP JUMPDEST DUP6 MSTORE PUSH1 0x4 DUP6 ADD PUSH2 0x305F JUMP JUMPDEST SUB SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x3142 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3114 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x3135 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x313B JUMPI JUMPDEST PUSH2 0x312D DUP2 DUP4 PUSH2 0x65F JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x2DA0 JUMP JUMPDEST CODESIZE PUSH2 0x3110 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x3123 JUMP JUMPDEST PUSH2 0x3095 JUMP JUMPDEST SWAP1 ISZERO ISZERO PUSH8 0x9A31110384E0B0C9 PUSH1 0x20 MSTORE CALLER PUSH1 0x14 MSTORE DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x34 PUSH1 0xC KECCAK256 SSTORE PUSH1 0x0 MSTORE PUSH1 0x60 SHL PUSH1 0x60 SHR CALLER PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 PUSH1 0x20 PUSH1 0x0 LOG3 JUMP JUMPDEST PUSH2 0x31A4 SWAP2 CALLER SWAP2 SWAP1 SWAP2 PUSH2 0x49FF JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x31C2 SWAP4 SWAP3 SWAP2 PUSH2 0x31BD PUSH2 0x31B8 PUSH2 0x2BAF JUMP JUMPDEST PUSH2 0x418E JUMP JUMPDEST PUSH2 0x31C4 JUMP JUMPDEST JUMP JUMPDEST SWAP2 PUSH2 0x31D2 SWAP4 SWAP2 SWAP1 SWAP2 SWAP3 PUSH2 0x4A51 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x31E0 SWAP4 SWAP3 SWAP2 PUSH2 0x31A6 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x3201 PUSH2 0x31FC PUSH2 0x3206 SWAP3 PUSH2 0x31F4 PUSH2 0x1C33 JUMP JUMPDEST POP PUSH1 0x5 PUSH2 0x2C6E JUMP JUMPDEST PUSH2 0x2C86 JUMP JUMPDEST PUSH2 0x4B25 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x3224 SWAP2 PUSH2 0x321F PUSH2 0x321A DUP3 PUSH2 0x23A8 JUMP JUMPDEST PUSH2 0x418E JUMP JUMPDEST PUSH2 0x3226 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x3230 SWAP2 PUSH2 0x469E JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x323C SWAP2 PUSH2 0x3209 JUMP JUMPDEST JUMP JUMPDEST SWAP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SUB DUP3 CALLDATASIZE SUB SUB DUP2 SLT ISZERO PUSH2 0x327F JUMPI ADD PUSH1 0x20 DUP2 CALLDATALOAD SWAP2 ADD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x327A JUMPI PUSH1 0x20 DUP3 MUL CALLDATASIZE SUB DUP4 SGT PUSH2 0x3275 JUMPI JUMP JUMPDEST PUSH2 0x2E21 JUMP JUMPDEST PUSH2 0x2E1C JUMP JUMPDEST PUSH2 0x2E26 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x329D DUP2 PUSH1 0x20 SWAP4 PUSH2 0x2DD1 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP2 PUSH2 0x32B5 DUP3 PUSH2 0x32BB SWAP3 PUSH2 0x3284 JUMP JUMPDEST SWAP3 PUSH2 0x328D JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x0 SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x32CF JUMPI POP POP POP POP SWAP1 JUMP JUMPDEST SWAP1 SWAP2 SWAP3 SWAP4 PUSH2 0x32F1 PUSH2 0x32EB PUSH1 0x1 SWAP3 PUSH2 0x32E6 DUP9 DUP7 PUSH2 0x2DBF JUMP JUMPDEST PUSH2 0x3290 JUMP JUMPDEST SWAP6 PUSH2 0x32A1 JUMP JUMPDEST SWAP3 ADD SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x32C1 JUMP JUMPDEST SWAP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SUB DUP3 CALLDATASIZE SUB SUB DUP2 SLT ISZERO PUSH2 0x333D JUMPI ADD PUSH1 0x20 DUP2 CALLDATALOAD SWAP2 ADD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x3338 JUMPI PUSH1 0x20 DUP3 MUL CALLDATASIZE SUB DUP4 SGT PUSH2 0x3333 JUMPI JUMP JUMPDEST PUSH2 0x2E21 JUMP JUMPDEST PUSH2 0x2E1C JUMP JUMPDEST PUSH2 0x2E26 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3357 SWAP1 PUSH2 0x42F JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP1 PUSH2 0x3368 DUP2 PUSH1 0x20 SWAP4 PUSH2 0x334E JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST POP PUSH2 0x337B SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x179A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP2 PUSH2 0x3392 DUP3 PUSH2 0x3398 SWAP3 PUSH2 0x3342 JUMP JUMPDEST SWAP3 PUSH2 0x334B JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x0 SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x33AC JUMPI POP POP POP POP SWAP1 JUMP JUMPDEST SWAP1 SWAP2 SWAP3 SWAP4 PUSH2 0x33CE PUSH2 0x33C8 PUSH1 0x1 SWAP3 PUSH2 0x33C3 DUP9 DUP7 PUSH2 0x336C JUMP JUMPDEST PUSH2 0x335B JUMP JUMPDEST SWAP6 PUSH2 0x337E JUMP JUMPDEST SWAP3 ADD SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x339E JUMP JUMPDEST SWAP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SUB DUP3 CALLDATASIZE SUB SUB DUP2 SLT ISZERO PUSH2 0x341A JUMPI ADD PUSH1 0x20 DUP2 CALLDATALOAD SWAP2 ADD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x3415 JUMPI PUSH1 0x20 DUP3 MUL CALLDATASIZE SUB DUP4 SGT PUSH2 0x3410 JUMPI JUMP JUMPDEST PUSH2 0x2E21 JUMP JUMPDEST PUSH2 0x2E1C JUMP JUMPDEST PUSH2 0x2E26 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 CALLDATACOPY JUMP JUMPDEST SWAP1 SWAP2 DUP3 PUSH2 0x3449 SWAP2 PUSH2 0x342B JUMP JUMPDEST SWAP2 PUSH1 0x1 DUP1 PUSH1 0xFB SHL SUB DUP2 GT PUSH2 0x346C JUMPI DUP3 SWAP2 PUSH1 0x20 PUSH2 0x3468 SWAP3 MUL SWAP4 DUP5 SWAP2 PUSH2 0x3439 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x3434 JUMP JUMPDEST SWAP1 PUSH2 0x347C SWAP3 SWAP2 PUSH2 0x343D JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SUB DUP3 CALLDATASIZE SUB SUB DUP2 SLT ISZERO PUSH2 0x34C0 JUMPI ADD PUSH1 0x20 DUP2 CALLDATALOAD SWAP2 ADD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x34BB JUMPI PUSH1 0x20 DUP3 MUL CALLDATASIZE SUB DUP4 SGT PUSH2 0x34B6 JUMPI JUMP JUMPDEST PUSH2 0x2E21 JUMP JUMPDEST PUSH2 0x2E1C JUMP JUMPDEST PUSH2 0x2E26 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH2 0x34D6 SWAP2 PUSH2 0x341F JUMP JUMPDEST SWAP1 DUP2 PUSH2 0x34E7 PUSH1 0x20 DUP4 MUL DUP5 ADD SWAP5 PUSH2 0x3428 JUMP JUMPDEST SWAP3 DUP4 PUSH1 0x0 SWAP3 JUMPDEST DUP5 DUP5 LT PUSH2 0x34FD JUMPI POP POP POP POP POP POP SWAP1 JUMP JUMPDEST SWAP1 SWAP2 SWAP3 SWAP4 SWAP5 SWAP6 PUSH1 0x20 PUSH2 0x3529 PUSH2 0x3523 DUP4 DUP6 PUSH1 0x1 SWAP6 SUB DUP9 MSTORE PUSH2 0x351D DUP12 DUP9 PUSH2 0x347F JUMP JUMPDEST SWAP1 PUSH2 0x3471 JUMP JUMPDEST SWAP9 PUSH2 0x34C5 JUMP JUMPDEST SWAP5 ADD SWAP5 ADD SWAP3 SWAP5 SWAP4 SWAP2 SWAP1 PUSH2 0x34ED JUMP JUMPDEST PUSH2 0x35B5 SWAP2 PUSH2 0x35A7 PUSH2 0x359C PUSH2 0x3581 PUSH2 0x3566 PUSH1 0x80 DUP6 ADD PUSH2 0x3558 PUSH1 0x0 DUP9 ADD DUP9 PUSH2 0x323E JUMP JUMPDEST SWAP1 DUP8 DUP4 SUB PUSH1 0x0 DUP10 ADD MSTORE PUSH2 0x32A7 JUMP JUMPDEST PUSH2 0x3573 PUSH1 0x20 DUP8 ADD DUP8 PUSH2 0x32FC JUMP JUMPDEST SWAP1 DUP7 DUP4 SUB PUSH1 0x20 DUP9 ADD MSTORE PUSH2 0x3384 JUMP JUMPDEST PUSH2 0x358E PUSH1 0x40 DUP7 ADD DUP7 PUSH2 0x33D9 JUMP JUMPDEST SWAP1 DUP6 DUP4 SUB PUSH1 0x40 DUP8 ADD MSTORE PUSH2 0x34CB JUMP JUMPDEST SWAP3 PUSH1 0x60 DUP2 ADD SWAP1 PUSH2 0x33D9 JUMP JUMPDEST SWAP2 PUSH1 0x60 DUP2 DUP6 SUB SWAP2 ADD MSTORE PUSH2 0x34CB JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP2 PUSH2 0x35DC SWAP3 PUSH2 0x35CF PUSH1 0x40 DUP3 ADD SWAP4 PUSH1 0x0 DUP4 ADD SWAP1 PUSH2 0x387 JUMP JUMPDEST PUSH1 0x20 DUP2 DUP5 SUB SWAP2 ADD MSTORE PUSH2 0x3537 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3601 JUMPI PUSH1 0x20 DUP1 SWAP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH2 0x649 JUMP JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x361B PUSH2 0x3616 DUP3 PUSH2 0x35E9 JUMP JUMPDEST PUSH2 0x78E JUMP JUMPDEST SWAP4 DUP2 DUP6 MSTORE PUSH1 0x20 DUP1 DUP7 ADD SWAP3 MUL DUP4 ADD SWAP3 DUP2 DUP5 GT PUSH2 0x3658 JUMPI SWAP2 JUMPDEST DUP4 DUP4 LT PUSH2 0x363F JUMPI POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 SWAP2 PUSH2 0x364D DUP5 DUP7 PUSH2 0xB24 JUMP JUMPDEST DUP2 MSTORE ADD SWAP3 ADD SWAP2 PUSH2 0x3632 JUMP JUMPDEST PUSH2 0x9FB JUMP JUMPDEST PUSH2 0x3668 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3606 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3674 SWAP1 PUSH2 0x332 JUMP JUMPDEST PUSH1 0x0 DUP2 EQ PUSH2 0x3683 JUMPI PUSH1 0x1 SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH2 0x2517 JUMP JUMPDEST SWAP1 PUSH2 0x3692 SWAP1 PUSH2 0xBAD JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 CALLDATALOAD SWAP1 PUSH1 0x1 PUSH1 0x20 SUB DUP2 CALLDATASIZE SUB SUB DUP3 SLT ISZERO PUSH2 0x36F1 JUMPI ADD DUP1 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x36EC JUMPI PUSH1 0x20 ADD SWAP2 PUSH1 0x20 DUP3 MUL CALLDATASIZE SUB DUP4 SGT PUSH2 0x36E7 JUMPI JUMP JUMPDEST PUSH2 0x36AA JUMP JUMPDEST PUSH2 0x36A5 JUMP JUMPDEST PUSH2 0x36A0 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x3720 JUMPI PUSH1 0x20 MUL ADD SWAP1 JUMP JUMPDEST PUSH2 0x36FA JUMP JUMPDEST CALLDATALOAD PUSH2 0x372F DUP2 PUSH2 0x30E JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 CALLDATALOAD SWAP1 PUSH1 0x1 PUSH1 0x20 SUB DUP2 CALLDATASIZE SUB SUB DUP3 SLT ISZERO PUSH2 0x3774 JUMPI ADD DUP1 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x376F JUMPI PUSH1 0x20 ADD SWAP2 PUSH1 0x20 DUP3 MUL CALLDATASIZE SUB DUP4 SGT PUSH2 0x376A JUMPI JUMP JUMPDEST PUSH2 0x36AA JUMP JUMPDEST PUSH2 0x36A5 JUMP JUMPDEST PUSH2 0x36A0 JUMP JUMPDEST SWAP1 CALLDATALOAD SWAP1 PUSH1 0x1 PUSH1 0x20 SUB DUP2 CALLDATASIZE SUB SUB DUP3 SLT ISZERO PUSH2 0x37BB JUMPI ADD DUP1 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x37B6 JUMPI PUSH1 0x20 ADD SWAP2 PUSH1 0x20 DUP3 MUL CALLDATASIZE SUB DUP4 SGT PUSH2 0x37B1 JUMPI JUMP JUMPDEST PUSH2 0x36AA JUMP JUMPDEST PUSH2 0x36A5 JUMP JUMPDEST PUSH2 0x36A0 JUMP JUMPDEST SWAP1 DUP3 LT ISZERO PUSH2 0x37DB JUMPI PUSH1 0x20 PUSH2 0x37D7 SWAP3 MUL DUP2 ADD SWAP1 PUSH2 0x3779 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH2 0x36FA JUMP JUMPDEST SWAP1 CALLDATALOAD SWAP1 PUSH1 0x1 PUSH1 0x20 SUB DUP2 CALLDATASIZE SUB SUB DUP3 SLT ISZERO PUSH2 0x3822 JUMPI ADD DUP1 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x381D JUMPI PUSH1 0x20 ADD SWAP2 PUSH1 0x20 DUP3 MUL CALLDATASIZE SUB DUP4 SGT PUSH2 0x3818 JUMPI JUMP JUMPDEST PUSH2 0x36AA JUMP JUMPDEST PUSH2 0x36A5 JUMP JUMPDEST PUSH2 0x36A0 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x3837 JUMPI PUSH1 0x20 MUL ADD SWAP1 JUMP JUMPDEST PUSH2 0x36FA JUMP JUMPDEST CALLDATALOAD PUSH2 0x3846 DUP2 PUSH2 0x1785 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3852 SWAP1 PUSH2 0x1F78 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x385E SWAP1 PUSH2 0x3849 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x386A SWAP1 PUSH2 0x217F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP2 SUB SLT PUSH2 0x3878 JUMPI JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST SWAP1 SWAP2 DUP3 PUSH2 0x3889 SWAP2 PUSH2 0x1090 JUMP JUMPDEST SWAP2 PUSH1 0x1 DUP1 PUSH1 0xFB SHL SUB DUP2 GT PUSH2 0x38AC JUMPI DUP3 SWAP2 PUSH1 0x20 PUSH2 0x38A8 SWAP3 MUL SWAP4 DUP5 SWAP2 PUSH2 0x3439 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x3434 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH2 0x38D9 PUSH2 0x38E2 PUSH1 0x20 SWAP4 PUSH2 0x38E7 SWAP4 PUSH2 0x38D0 DUP2 PUSH2 0x35E5 JUMP JUMPDEST SWAP4 DUP5 DUP1 SWAP4 PUSH2 0x38B1 JUMP JUMPDEST SWAP6 DUP7 SWAP2 ADD PUSH2 0x6E0 JUMP JUMPDEST PUSH2 0x63F JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST SWAP4 PUSH2 0x3918 PUSH2 0x3934 SWAP7 SWAP5 SWAP3 PUSH2 0x3926 SWAP5 PUSH2 0x390B PUSH1 0x80 DUP10 ADD SWAP3 PUSH1 0x0 DUP11 ADD SWAP1 PUSH2 0xC5E JUMP JUMPDEST DUP8 DUP3 SUB PUSH1 0x20 DUP10 ADD MSTORE PUSH2 0x10C3 JUMP JUMPDEST SWAP2 DUP6 DUP4 SUB PUSH1 0x40 DUP8 ADD MSTORE PUSH2 0x387D JUMP JUMPDEST SWAP2 PUSH1 0x60 DUP2 DUP5 SUB SWAP2 ADD MSTORE PUSH2 0x38BA JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3940 SWAP1 PUSH2 0x1F78 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x394C SWAP1 PUSH2 0x3937 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3958 SWAP1 PUSH2 0x217F JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x3965 DUP3 PUSH2 0x108C JUMP JUMPDEST DUP2 LT ISZERO PUSH2 0x3976 JUMPI PUSH1 0x20 DUP1 SWAP2 MUL ADD ADD SWAP1 JUMP JUMPDEST PUSH2 0x36FA JUMP JUMPDEST PUSH2 0x3985 SWAP1 MLOAD PUSH2 0x332 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH2 0x3994 SWAP2 ADD PUSH2 0x332 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP3 PUSH2 0x3A13 PUSH2 0x3A19 SWAP2 PUSH2 0x3A0E SWAP4 SWAP8 SWAP5 PUSH2 0x39B0 DUP8 DUP10 SWAP1 PUSH2 0x470E JUMP JUMPDEST SWAP6 SWAP1 SWAP6 PUSH2 0x39DE DUP12 SWAP2 PUSH2 0x39CF PUSH2 0x39C3 PUSH2 0x2E2 JUMP JUMPDEST SWAP4 DUP5 SWAP3 PUSH1 0x20 DUP5 ADD PUSH2 0x35B8 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE SUB DUP3 PUSH2 0x65F JUMP JUMPDEST PUSH2 0x39F0 PUSH2 0x39EA DUP3 PUSH2 0x35E5 JUMP JUMPDEST SWAP2 PUSH2 0x35DF JUMP JUMPDEST KECCAK256 SWAP2 SWAP3 PUSH2 0x3A07 PUSH2 0x3A02 PUSH1 0xC DUP13 SWAP1 PUSH2 0xF0E JUMP JUMPDEST PUSH2 0x239B JUMP JUMPDEST SWAP3 SWAP4 PUSH2 0x365D JUMP JUMPDEST PUSH2 0x4B45 JUMP JUMPDEST ISZERO PUSH2 0x42F JUMP JUMPDEST PUSH2 0x3DF1 JUMPI PUSH2 0x3AA3 SWAP1 PUSH2 0x3A45 PUSH1 0x0 PUSH2 0x3A40 PUSH2 0x3A39 PUSH1 0xF SWAP10 SWAP7 SWAP9 SWAP10 DUP9 SWAP1 PUSH2 0x2197 JUMP JUMPDEST DUP10 SWAP1 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x1D91 JUMP JUMPDEST PUSH2 0x3A6B PUSH2 0x3A54 PUSH1 0xE DUP9 SWAP1 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x3A65 PUSH2 0x3A60 DUP3 PUSH2 0x21C9 JUMP JUMPDEST PUSH2 0x366B JUMP JUMPDEST SWAP1 PUSH2 0x2AF0 JUMP JUMPDEST PUSH2 0x3A9E PUSH2 0x3A8C PUSH2 0x3A85 PUSH2 0x3A80 PUSH1 0xE DUP11 SWAP1 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x21C9 JUMP JUMPDEST DUP9 SWAP1 PUSH2 0x4B96 JUMP JUMPDEST SWAP2 PUSH2 0x3A99 PUSH1 0x10 DUP10 SWAP1 PUSH2 0x3688 JUMP JUMPDEST PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x2AF0 JUMP JUMPDEST PUSH2 0x3AAB PUSH2 0x1C33 JUMP JUMPDEST SWAP3 JUMPDEST DUP4 PUSH2 0x3AD6 PUSH2 0x3AD0 PUSH2 0x3ACB PUSH2 0x3AC5 DUP7 PUSH1 0x0 DUP2 ADD SWAP1 PUSH2 0x36AF JUMP JUMPDEST SWAP1 PUSH2 0x36F6 JUMP JUMPDEST PUSH2 0x332 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST LT ISZERO PUSH2 0x3DB1 JUMPI PUSH2 0x3AFC PUSH2 0x3AF7 PUSH2 0x3AF0 DUP5 PUSH1 0x0 DUP2 ADD SWAP1 PUSH2 0x36AF JUMP JUMPDEST DUP8 SWAP2 PUSH2 0x3710 JUMP JUMPDEST PUSH2 0x3725 JUMP JUMPDEST SWAP2 PUSH2 0x3B1E PUSH2 0x3B18 PUSH2 0x3B11 DUP4 PUSH1 0x40 DUP2 ADD SWAP1 PUSH2 0x3732 JUMP JUMPDEST DUP9 SWAP2 PUSH2 0x37C0 JUMP JUMPDEST SWAP1 PUSH2 0x2659 JUMP JUMPDEST SWAP6 PUSH2 0x3B3F PUSH2 0x3B3A PUSH2 0x3B33 DUP5 PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x37E0 JUMP JUMPDEST DUP10 SWAP2 PUSH2 0x3827 JUMP JUMPDEST PUSH2 0x383C JUMP JUMPDEST PUSH1 0x0 EQ PUSH2 0x3C3B JUMPI PUSH2 0x3B4E PUSH2 0x1C33 JUMP JUMPDEST JUMPDEST DUP1 PUSH2 0x3B6A PUSH2 0x3B64 PUSH2 0x3B5F DUP12 PUSH2 0x108C JUMP JUMPDEST PUSH2 0x332 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST LT ISZERO PUSH2 0x3C22 JUMPI PUSH2 0x3B81 PUSH2 0x3B7C DUP7 PUSH2 0x3943 JUMP JUMPDEST PUSH2 0x394F JUMP JUMPDEST SWAP1 PUSH4 0x40C10F19 DUP8 PUSH2 0x3B9B PUSH2 0x3B96 DUP13 DUP6 SWAP1 PUSH2 0x395B JUMP JUMPDEST PUSH2 0x397B JUMP JUMPDEST SWAP4 DUP1 EXTCODESIZE ISZERO PUSH2 0x3C1D JUMPI PUSH2 0x3BC1 PUSH1 0x0 DUP1 SWAP5 PUSH2 0x3BCC PUSH2 0x3BB5 PUSH2 0x2E2 JUMP JUMPDEST SWAP9 DUP10 SWAP7 DUP8 SWAP6 DUP7 SWAP5 PUSH2 0x2D8B JUMP JUMPDEST DUP5 MSTORE PUSH1 0x4 DUP5 ADD PUSH2 0xC6B JUMP JUMPDEST SUB SWAP3 GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x3C18 JUMPI PUSH2 0x3BE6 SWAP3 PUSH2 0x3BEB JUMPI JUMPDEST POP PUSH2 0x3988 JUMP JUMPDEST PUSH2 0x3B4F JUMP JUMPDEST PUSH2 0x3C0B SWAP1 PUSH1 0x0 RETURNDATASIZE DUP2 GT PUSH2 0x3C11 JUMPI JUMPDEST PUSH2 0x3C03 DUP2 DUP4 PUSH2 0x65F JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x386D JUMP JUMPDEST CODESIZE PUSH2 0x3BE0 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x3BF9 JUMP JUMPDEST PUSH2 0x3095 JUMP JUMPDEST PUSH2 0x2D86 JUMP JUMPDEST POP SWAP5 SWAP1 SWAP6 POP PUSH2 0x3C33 SWAP2 SWAP3 POP JUMPDEST PUSH2 0x3988 JUMP JUMPDEST SWAP3 SWAP4 SWAP1 PUSH2 0x3AAD JUMP JUMPDEST SWAP5 SWAP1 SWAP6 SWAP2 SWAP3 DUP5 SWAP3 PUSH32 0x0 PUSH2 0x3C7E PUSH2 0x3C78 PUSH2 0x3C73 PUSH1 0x0 PUSH2 0x24E2 JUMP JUMPDEST PUSH2 0x302 JUMP JUMPDEST SWAP2 PUSH2 0x302 JUMP JUMPDEST EQ ISZERO DUP1 PUSH2 0x3D96 JUMPI JUMPDEST PUSH2 0x3D6D JUMPI JUMPDEST PUSH2 0x3CC6 PUSH2 0x3CC1 PUSH2 0x3CAC PUSH2 0x3CBB DUP10 PUSH2 0x3CA0 PUSH2 0x2E2 JUMP JUMPDEST SWAP3 DUP4 SWAP2 PUSH1 0x20 DUP4 ADD PUSH2 0x11F9 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE SUB DUP3 PUSH2 0x65F JUMP JUMPDEST SWAP4 PUSH2 0x3855 JUMP JUMPDEST PUSH2 0x3861 JUMP JUMPDEST PUSH4 0xB48AB8B6 SWAP5 SWAP2 SWAP5 PUSH2 0x3CE6 PUSH2 0x3CDF DUP12 PUSH1 0x60 DUP2 ADD SWAP1 PUSH2 0x3732 JUMP JUMPDEST DUP8 SWAP2 PUSH2 0x37C0 JUMP JUMPDEST SWAP1 SWAP5 SWAP2 DUP4 EXTCODESIZE ISZERO PUSH2 0x3D68 JUMPI PUSH2 0x3D1C PUSH2 0x3D11 SWAP4 PUSH1 0x0 SWAP8 SWAP4 DUP9 SWAP5 PUSH2 0x3D05 PUSH2 0x2E2 JUMP JUMPDEST SWAP12 DUP13 SWAP10 DUP11 SWAP9 DUP10 SWAP8 PUSH2 0x2D8B JUMP JUMPDEST DUP8 MSTORE PUSH1 0x4 DUP8 ADD PUSH2 0x38EB JUMP JUMPDEST SUB SWAP3 GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x3D63 JUMPI PUSH2 0x3C33 SWAP3 PUSH2 0x3D36 JUMPI JUMPDEST POP PUSH2 0x3C2E JUMP JUMPDEST PUSH2 0x3D56 SWAP1 PUSH1 0x0 RETURNDATASIZE DUP2 GT PUSH2 0x3D5C JUMPI JUMPDEST PUSH2 0x3D4E DUP2 DUP4 PUSH2 0x65F JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x386D JUMP JUMPDEST CODESIZE PUSH2 0x3D30 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x3D44 JUMP JUMPDEST PUSH2 0x3095 JUMP JUMPDEST PUSH2 0x2D86 JUMP JUMPDEST SWAP3 POP PUSH32 0x0 SWAP3 PUSH2 0x3C8B JUMP JUMPDEST POP CALLER PUSH2 0x3DAA PUSH2 0x3DA4 DUP9 PUSH2 0x302 JUMP JUMPDEST SWAP2 PUSH2 0x302 JUMP JUMPDEST EQ ISZERO PUSH2 0x3C86 JUMP JUMPDEST SWAP4 SWAP3 POP POP SWAP1 PUSH32 0xF254AACE0EF98D6AC1A0D84C95648F8E3F7A1881DBB43393709ECD004B00F103 SWAP2 PUSH2 0x3DEC PUSH2 0x3DE3 PUSH2 0x2E2 JUMP JUMPDEST SWAP3 DUP4 SWAP3 DUP4 PUSH2 0xC6B JUMP JUMPDEST SUB SWAP1 LOG1 JUMP JUMPDEST PUSH1 0x0 PUSH4 0x9BDE339 PUSH1 0xE0 SHL DUP2 MSTORE DUP1 PUSH2 0x3E0A PUSH1 0x4 DUP3 ADD PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x3E16 PUSH2 0x1C5C JUMP JUMPDEST POP PUSH8 0x9A31110384E0B0C9 PUSH1 0x20 MSTORE PUSH1 0x14 MSTORE PUSH1 0x0 MSTORE PUSH1 0x34 PUSH1 0xC KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH2 0x3E4B SWAP1 PUSH2 0x3E46 PUSH2 0x3E41 PUSH2 0x1F39 JUMP JUMPDEST PUSH2 0x418E JUMP JUMPDEST PUSH2 0x3E4D JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x3E58 SWAP1 PUSH1 0x7 PUSH2 0x2AD0 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x3E63 SWAP1 PUSH2 0x3E32 JUMP JUMPDEST JUMP JUMPDEST SWAP5 SWAP1 SWAP2 SWAP5 PUSH2 0x3E71 PUSH2 0x4601 JUMP JUMPDEST PUSH2 0x400F JUMPI JUMPDEST PUSH1 0x60 SHL PUSH8 0x9A31110384E0B0C9 OR SWAP2 PUSH1 0x60 SHL PUSH8 0x9A31110384E0B0C9 OR SWAP2 DUP1 PUSH1 0x20 MSTORE PUSH1 0x60 SHR SWAP3 DUP3 PUSH1 0x60 SHR SWAP3 DUP4 ISZERO PUSH2 0x4001 JUMPI DUP5 CALLER SUB PUSH2 0x3FE5 JUMPI JUMPDEST DUP7 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP1 SLOAD DUP1 DUP5 GT PUSH2 0x3FD7 JUMPI DUP4 SWAP1 SUB SWAP1 SSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP1 SLOAD SWAP1 DUP3 DUP3 ADD SWAP2 DUP3 LT PUSH2 0x3FC9 JUMPI SSTORE DUP1 PUSH1 0x20 MSTORE DUP3 DUP5 CALLER PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 PUSH1 0x0 LOG4 PUSH2 0x3F0F PUSH2 0x460F JUMP JUMPDEST PUSH2 0x3FA4 JUMPI JUMPDEST DUP3 EXTCODESIZE PUSH2 0x3F23 JUMPI JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 SWAP5 DUP3 SWAP2 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP7 PUSH4 0xF23A6E61 DUP9 MSTORE CALLER DUP10 DUP10 ADD MSTORE PUSH1 0x40 DUP9 ADD MSTORE PUSH1 0x60 DUP8 ADD MSTORE PUSH1 0x80 DUP7 ADD MSTORE PUSH1 0xA0 DUP1 DUP7 ADD MSTORE DUP2 PUSH1 0xC0 DUP7 ADD MSTORE PUSH1 0xE0 DUP6 ADD CALLDATACOPY PUSH1 0xC4 ADD SWAP1 PUSH1 0x0 PUSH1 0x1C DUP5 ADD SWAP2 GAS CALL ISZERO PUSH2 0x3F95 JUMPI JUMPDEST PUSH4 0xF23A6E61 PUSH1 0xE0 SHL SWAP1 MLOAD SUB PUSH2 0x3F87 JUMPI CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x3F1B JUMP JUMPDEST PUSH4 0x9C05499B PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x3F6D JUMPI RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH2 0x3FAD DUP7 PUSH2 0x4BE5 JUMP JUMPDEST POP PUSH2 0x3FB7 DUP2 PUSH2 0x4BE5 JUMP JUMPDEST POP PUSH2 0x3FC3 DUP6 DUP4 SWAP1 PUSH2 0x2667 JUMP JUMPDEST POP PUSH2 0x3F14 JUMP JUMPDEST PUSH4 0x1336CEA PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0xF4D678B8 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST CALLER PUSH1 0x0 MSTORE PUSH1 0x34 PUSH1 0xC KECCAK256 SLOAD PUSH2 0x3EAD JUMPI PUSH4 0x4B6E7F18 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0xEA553B34 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH2 0x4018 DUP7 PUSH2 0x4BE5 JUMP JUMPDEST POP PUSH2 0x4022 DUP5 PUSH2 0x4BE5 JUMP JUMPDEST POP PUSH2 0x402E DUP6 DUP4 SWAP1 PUSH2 0x2667 JUMP JUMPDEST POP PUSH2 0x3E76 JUMP JUMPDEST PUSH2 0x4043 PUSH2 0x4049 SWAP2 SWAP4 SWAP3 SWAP4 PUSH2 0x332 JUMP JUMPDEST SWAP3 PUSH2 0x332 JUMP JUMPDEST DUP3 ADD DUP1 SWAP3 GT PUSH2 0x4054 JUMPI JUMP JUMPDEST PUSH2 0x2517 JUMP JUMPDEST PUSH2 0x4077 PUSH2 0x4072 PUSH2 0x406B PUSH1 0xF CALLER SWAP1 PUSH2 0x2197 JUMP JUMPDEST DUP4 SWAP1 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x21C9 JUMP JUMPDEST PUSH2 0x408A PUSH2 0x4084 PUSH1 0x0 PUSH2 0x21D6 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST SUB PUSH2 0x411B JUMPI PUSH2 0x40A4 CALLER DUP3 PUSH2 0x409E PUSH1 0x1 PUSH2 0x2209 JUMP JUMPDEST SWAP2 PUSH2 0x49FF JUMP JUMPDEST PUSH2 0x40D6 PUSH2 0x40BB NUMBER PUSH2 0x40B5 PUSH1 0x1 PUSH2 0x2209 JUMP JUMPDEST SWAP1 PUSH2 0x4034 JUMP JUMPDEST PUSH2 0x40D1 PUSH2 0x40CA PUSH1 0xF CALLER SWAP1 PUSH2 0x2197 JUMP JUMPDEST DUP5 SWAP1 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x2AF0 JUMP JUMPDEST CALLER PUSH2 0x4116 PUSH2 0x4104 PUSH32 0x5E1DD8C4451717D5CA4FFBEFDADA35E22E0871220B9ED9DD03A351F0938C5ED7 SWAP3 PUSH2 0x218B JUMP JUMPDEST SWAP3 PUSH2 0x410D PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x394 JUMP JUMPDEST SUB SWAP1 LOG2 JUMP JUMPDEST PUSH1 0x0 PUSH4 0x156F9043 PUSH1 0xE2 SHL DUP2 MSTORE DUP1 PUSH2 0x4134 PUSH1 0x4 DUP3 ADD PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x4140 PUSH2 0x1C5C JUMP JUMPDEST POP PUSH4 0xC79B8B5F PUSH1 0xE0 SHL PUSH2 0x415B PUSH2 0x4155 DUP4 PUSH2 0x3E0 JUMP JUMPDEST SWAP2 PUSH2 0x3E0 JUMP JUMPDEST EQ DUP1 ISZERO PUSH2 0x417F JUMPI JUMPDEST SWAP1 DUP2 ISZERO PUSH2 0x416F JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x4179 SWAP2 POP PUSH2 0x4C05 JUMP JUMPDEST CODESIZE PUSH2 0x416B JUMP JUMPDEST POP PUSH2 0x4189 DUP2 PUSH2 0x4C05 JUMP JUMPDEST PUSH2 0x4163 JUMP JUMPDEST PUSH2 0x41A0 SWAP1 PUSH2 0x419A PUSH2 0x4691 JUMP JUMPDEST SWAP1 PUSH2 0x4D12 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x20 PUSH32 0x2073616C65507269636500000000000000000000000000000000000000000000 SWAP2 PUSH32 0x455243323938313A20726F79616C7479206665652077696C6C20657863656564 PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x41FD PUSH1 0x2A PUSH1 0x40 SWAP3 PUSH2 0x6D7 JUMP JUMPDEST PUSH2 0x4206 DUP2 PUSH2 0x41A2 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x4220 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x41F0 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x422A JUMPI JUMP JUMPDEST PUSH2 0x4232 PUSH2 0x2E2 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x4248 PUSH1 0x4 DUP3 ADD PUSH2 0x420A JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH32 0x455243323938313A20696E76616C696420726563656976657200000000000000 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x4281 PUSH1 0x19 PUSH1 0x20 SWAP3 PUSH2 0x6D7 JUMP JUMPDEST PUSH2 0x428A DUP2 PUSH2 0x424C JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x42A4 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x4274 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x42AE JUMPI JUMP JUMPDEST PUSH2 0x42B6 PUSH2 0x2E2 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x42CC PUSH1 0x4 DUP3 ADD PUSH2 0x428E JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x42DA PUSH1 0x40 PUSH2 0x78E JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x42F5 PUSH2 0x42F0 PUSH2 0x42FC SWAP3 PUSH2 0x218B JUMP JUMPDEST PUSH2 0x42DD JUMP JUMPDEST DUP3 SLOAD PUSH2 0x1FAC JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH1 0xA0 SHL SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x4320 PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xA0 SHL SWAP2 PUSH2 0x4300 JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST PUSH2 0x433E PUSH2 0x4339 PUSH2 0x4343 SWAP3 PUSH2 0x48C JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x48C JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x435E PUSH2 0x4359 PUSH2 0x4365 SWAP3 PUSH2 0x432A JUMP JUMPDEST PUSH2 0x4346 JUMP JUMPDEST DUP3 SLOAD PUSH2 0x4306 JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST SWAP1 PUSH2 0x4394 PUSH1 0x20 PUSH1 0x0 PUSH2 0x439A SWAP5 PUSH2 0x438C DUP3 DUP3 ADD PUSH2 0x4386 DUP5 DUP9 ADD PUSH2 0x24B9 JUMP JUMPDEST SWAP1 PUSH2 0x42E0 JUMP JUMPDEST ADD SWAP3 ADD PUSH2 0x24EE JUMP JUMPDEST SWAP1 PUSH2 0x4349 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x43A6 SWAP2 PUSH2 0x4369 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x4419 PUSH2 0x4420 SWAP3 PUSH2 0x43D4 DUP4 PUSH2 0x43CD PUSH2 0x43C7 PUSH2 0x43C2 PUSH2 0x45EA JUMP JUMPDEST PUSH2 0x48C JUMP JUMPDEST SWAP2 PUSH2 0x48C JUMP JUMPDEST GT ISZERO PUSH2 0x4223 JUMP JUMPDEST PUSH2 0x43FA DUP2 PUSH2 0x43F3 PUSH2 0x43ED PUSH2 0x43E8 PUSH1 0x0 PUSH2 0x24E2 JUMP JUMPDEST PUSH2 0x302 JUMP JUMPDEST SWAP2 PUSH2 0x302 JUMP JUMPDEST EQ ISZERO PUSH2 0x42A7 JUMP JUMPDEST SWAP2 PUSH2 0x4410 PUSH2 0x4406 PUSH2 0x42D0 JUMP JUMPDEST SWAP4 PUSH1 0x0 DUP6 ADD PUSH2 0x2413 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD PUSH2 0x2459 JUMP JUMPDEST PUSH1 0x2 PUSH2 0x439C JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x442B PUSH2 0x2016 JUMP JUMPDEST POP PUSH1 0x80 PUSH1 0x40 MLOAD ADD SWAP2 PUSH1 0x20 DUP4 ADD PUSH1 0x40 MSTORE PUSH1 0x0 DUP4 MSTORE DUP3 SWAP1 PUSH1 0xA PUSH1 0x0 NOT DUP1 SWAP3 SWAP6 JUMPDEST ADD SWAP5 DUP2 DUP2 MOD PUSH1 0x30 ADD DUP7 MSTORE8 DIV SWAP4 DUP5 ISZERO PUSH2 0x4468 JUMPI SWAP1 PUSH1 0xA SWAP2 SWAP1 DUP1 SWAP3 SWAP2 PUSH2 0x4449 JUMP JUMPDEST SWAP4 POP POP DUP3 PUSH1 0x20 SWAP2 SUB SWAP3 SUB SWAP2 DUP3 MSTORE JUMP JUMPDEST PUSH2 0x44C5 SWAP2 SWAP3 PUSH2 0x4491 PUSH2 0x44CB SWAP6 PUSH2 0x44B6 SWAP4 SWAP1 DUP7 DUP5 SWAP2 SWAP3 PUSH2 0x4DAB JUMP JUMPDEST PUSH2 0x44AE PUSH2 0x44A7 DUP3 PUSH2 0x44A2 PUSH1 0x0 PUSH2 0x21C9 JUMP JUMPDEST PUSH2 0x4034 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2AF0 JUMP JUMPDEST SWAP3 PUSH1 0x1 PUSH2 0xBC9 JUMP JUMPDEST SWAP2 PUSH2 0x44C0 DUP4 PUSH2 0x21C9 JUMP JUMPDEST PUSH2 0x4034 JUMP JUMPDEST SWAP1 PUSH2 0x2AF0 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x44DC PUSH2 0x44E2 SWAP2 SWAP4 SWAP3 SWAP4 PUSH2 0x332 JUMP JUMPDEST SWAP3 PUSH2 0x332 JUMP JUMPDEST DUP3 SUB SWAP2 DUP3 GT PUSH2 0x44ED JUMPI JUMP JUMPDEST PUSH2 0x2517 JUMP JUMPDEST PUSH2 0x4501 SWAP1 SWAP4 SWAP3 SWAP4 DUP3 DUP6 SWAP2 PUSH2 0x4EAC JUMP JUMPDEST PUSH2 0x450A DUP2 PUSH2 0x108C JUMP JUMPDEST SWAP3 PUSH2 0x4515 PUSH1 0x0 PUSH2 0x21D6 JUMP JUMPDEST SWAP3 PUSH2 0x451E PUSH2 0x1C33 JUMP JUMPDEST SWAP4 JUMPDEST DUP5 PUSH2 0x4533 PUSH2 0x452D DUP9 PUSH2 0x332 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST LT ISZERO PUSH2 0x45A0 JUMPI PUSH2 0x4594 PUSH2 0x459A SWAP2 PUSH2 0x4553 PUSH2 0x454E DUP7 DUP10 SWAP1 PUSH2 0x395B JUMP JUMPDEST PUSH2 0x397B JUMP JUMPDEST PUSH2 0x458E DUP9 PUSH2 0x4588 PUSH2 0x4579 DUP11 PUSH2 0x4573 PUSH2 0x456E DUP8 SWAP6 PUSH1 0x1 SWAP4 PUSH2 0x395B JUMP JUMPDEST PUSH2 0x397B JUMP JUMPDEST SWAP1 PUSH2 0xBC9 JUMP JUMPDEST SWAP2 PUSH2 0x4583 DUP4 PUSH2 0x21C9 JUMP JUMPDEST PUSH2 0x44CD JUMP JUMPDEST SWAP1 PUSH2 0x2AF0 JUMP JUMPDEST SWAP1 PUSH2 0x4034 JUMP JUMPDEST SWAP5 PUSH2 0x3988 JUMP JUMPDEST SWAP4 PUSH2 0x4520 JUMP JUMPDEST SWAP2 POP SWAP4 POP PUSH2 0x45C4 SWAP3 POP PUSH2 0x45BD SWAP2 POP PUSH2 0x45B8 PUSH1 0x0 PUSH2 0x21C9 JUMP JUMPDEST PUSH2 0x44CD JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2AF0 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x45E2 PUSH2 0x45DD PUSH2 0x45E7 SWAP3 PUSH2 0x45CB JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x48C JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x45F2 PUSH2 0x45C6 JUMP JUMPDEST POP PUSH2 0x45FE PUSH2 0x2710 PUSH2 0x45CE JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x4609 PUSH2 0x1C5C JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x4617 PUSH2 0x1C5C JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST POP POP SWAP5 SWAP3 SWAP4 SWAP1 SWAP4 PUSH2 0x462C PUSH2 0x460F JUMP JUMPDEST PUSH2 0x4639 JUMPI JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x464F PUSH2 0x4655 SWAP4 PUSH2 0x465B SWAP8 SWAP7 SWAP1 SWAP3 SWAP4 SWAP6 SWAP7 PUSH2 0x2659 JUMP JUMPDEST POP PUSH2 0x2659 JUMP JUMPDEST POP PUSH2 0x2667 JUMP JUMPDEST POP CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x4631 JUMP JUMPDEST SWAP1 PUSH2 0x4689 PUSH2 0x4684 PUSH2 0x468E SWAP4 PUSH2 0x467D DUP2 DUP6 SWAP1 PUSH2 0x4F0C JUMP JUMPDEST PUSH1 0x5 PUSH2 0x2C6E JUMP JUMPDEST PUSH2 0x2C86 JUMP JUMPDEST PUSH2 0x4FF3 JUMP JUMPDEST POP JUMP JUMPDEST PUSH2 0x4699 PUSH2 0x23CA JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x46C0 PUSH2 0x46BB PUSH2 0x46C5 SWAP4 PUSH2 0x46B4 DUP2 DUP6 SWAP1 PUSH2 0x502E JUMP JUMPDEST PUSH1 0x5 PUSH2 0x2C6E JUMP JUMPDEST PUSH2 0x2C86 JUMP JUMPDEST PUSH2 0x50C8 JUMP JUMPDEST POP JUMP JUMPDEST SWAP2 PUSH1 0x20 PUSH2 0x46EA SWAP3 SWAP5 SWAP4 PUSH2 0x46E3 PUSH1 0x40 DUP3 ADD SWAP7 PUSH1 0x0 DUP4 ADD SWAP1 PUSH2 0xB52 JUMP JUMPDEST ADD SWAP1 PUSH2 0xC5E JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x46F8 PUSH2 0x46FE SWAP2 PUSH2 0x332 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST SWAP1 DUP2 ISZERO PUSH2 0x4709 JUMPI MOD SWAP1 JUMP JUMPDEST PUSH2 0x2562 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH2 0x4719 PUSH2 0x1C33 JUMP JUMPDEST POP PUSH2 0x4722 PUSH2 0x1C33 JUMP JUMPDEST POP PUSH2 0x4737 PUSH2 0x4732 PUSH1 0xE DUP6 SWAP1 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x21C9 JUMP JUMPDEST PUSH2 0x474A PUSH2 0x4744 PUSH1 0x0 PUSH2 0x21D6 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST EQ PUSH2 0x4853 JUMPI PUSH2 0x476D PUSH2 0x4768 PUSH2 0x4761 PUSH1 0xF DUP5 SWAP1 PUSH2 0x2197 JUMP JUMPDEST DUP6 SWAP1 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x21C9 JUMP JUMPDEST DUP1 PUSH2 0x4781 PUSH2 0x477B PUSH1 0x0 PUSH2 0x21D6 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST EQ PUSH2 0x4836 JUMPI BLOCKHASH SWAP1 PUSH2 0x4791 DUP3 PUSH2 0x21F2 JUMP JUMPDEST PUSH2 0x47A4 PUSH2 0x479E PUSH1 0x0 PUSH2 0x21D6 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST EQ PUSH2 0x4819 JUMPI PUSH2 0x47F5 PUSH2 0x480F SWAP2 PUSH2 0x47DD PUSH2 0x4816 SWAP5 PUSH2 0x47CE PUSH2 0x47C2 PUSH2 0x2E2 JUMP JUMPDEST SWAP4 DUP5 SWAP3 PUSH1 0x20 DUP5 ADD PUSH2 0x46C8 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE SUB DUP3 PUSH2 0x65F JUMP JUMPDEST PUSH2 0x47EF PUSH2 0x47E9 DUP3 PUSH2 0x35E5 JUMP JUMPDEST SWAP2 PUSH2 0x35DF JUMP JUMPDEST KECCAK256 PUSH2 0x21F2 JUMP JUMPDEST PUSH2 0x4809 PUSH2 0x4804 PUSH1 0xE DUP8 SWAP1 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x21C9 JUMP JUMPDEST SWAP1 PUSH2 0x46EC JUMP JUMPDEST SWAP3 DUP4 PUSH2 0x4B96 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH4 0xB7B33787 PUSH1 0xE0 SHL DUP2 MSTORE DUP1 PUSH2 0x4832 PUSH1 0x4 DUP3 ADD PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH4 0x7DE832B5 PUSH1 0xE1 SHL DUP2 MSTORE DUP1 PUSH2 0x484F PUSH1 0x4 DUP3 ADD PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH4 0xB56C82B PUSH1 0xE3 SHL DUP2 MSTORE DUP1 PUSH2 0x486C PUSH1 0x4 DUP3 ADD PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH32 0x455243323938313A20496E76616C696420706172616D65746572730000000000 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x48A5 PUSH1 0x1B PUSH1 0x20 SWAP3 PUSH2 0x6D7 JUMP JUMPDEST PUSH2 0x48AE DUP2 PUSH2 0x4870 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x48C8 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x4898 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x48D2 JUMPI JUMP JUMPDEST PUSH2 0x48DA PUSH2 0x2E2 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x48F0 PUSH1 0x4 DUP3 ADD PUSH2 0x48B2 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x4970 SWAP1 PUSH2 0x4969 PUSH2 0x4975 SWAP5 SWAP4 PUSH2 0x4924 DUP6 PUSH2 0x491D PUSH2 0x4917 PUSH2 0x4912 PUSH2 0x45EA JUMP JUMPDEST PUSH2 0x48C JUMP JUMPDEST SWAP2 PUSH2 0x48C JUMP JUMPDEST GT ISZERO PUSH2 0x4223 JUMP JUMPDEST PUSH2 0x494A DUP2 PUSH2 0x4943 PUSH2 0x493D PUSH2 0x4938 PUSH1 0x0 PUSH2 0x24E2 JUMP JUMPDEST PUSH2 0x302 JUMP JUMPDEST SWAP2 PUSH2 0x302 JUMP JUMPDEST EQ ISZERO PUSH2 0x48CB JUMP JUMPDEST SWAP4 PUSH2 0x4960 PUSH2 0x4956 PUSH2 0x42D0 JUMP JUMPDEST SWAP6 PUSH1 0x0 DUP8 ADD PUSH2 0x2413 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD PUSH2 0x2459 JUMP JUMPDEST PUSH1 0x3 PUSH2 0x23CF JUMP JUMPDEST PUSH2 0x439C JUMP JUMPDEST JUMP JUMPDEST SWAP6 SWAP7 PUSH2 0x49A5 SWAP8 PUSH2 0x4998 SWAP7 SWAP6 SWAP5 PUSH2 0x4993 SWAP5 DUP10 SWAP5 SWAP1 SWAP2 SWAP3 SWAP4 SWAP5 PUSH2 0x5103 JUMP JUMPDEST PUSH2 0x43A8 JUMP JUMPDEST PUSH2 0x49A0 PUSH2 0x2BAF JUMP JUMPDEST PUSH2 0x4667 JUMP JUMPDEST JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x49BE PUSH2 0x49B9 PUSH2 0x49C3 SWAP3 PUSH2 0x332 JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x2F7 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x49F2 PUSH2 0x49ED PUSH2 0x49FC SWAP4 PUSH2 0x49E8 PUSH1 0x0 PUSH2 0x49F7 SWAP6 PUSH2 0x49E1 PUSH2 0x23CA JUMP JUMPDEST POP ADD PUSH2 0x49A7 JUMP JUMPDEST PUSH2 0x51D9 JUMP JUMPDEST PUSH2 0x21F2 JUMP JUMPDEST PUSH2 0x49AA JUMP JUMPDEST PUSH2 0x217F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x4A3A PUSH2 0x4A4F SWAP4 PUSH2 0x4A15 PUSH2 0x4A49 SWAP4 DUP6 DUP4 SWAP2 PUSH2 0x51FB JUMP JUMPDEST PUSH2 0x4A32 PUSH2 0x4A2B DUP3 PUSH2 0x4A26 PUSH1 0x0 PUSH2 0x21C9 JUMP JUMPDEST PUSH2 0x44CD JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2AF0 JUMP JUMPDEST SWAP3 PUSH1 0x1 PUSH2 0xBC9 JUMP JUMPDEST SWAP2 PUSH2 0x4A44 DUP4 PUSH2 0x21C9 JUMP JUMPDEST PUSH2 0x44CD JUMP JUMPDEST SWAP1 PUSH2 0x2AF0 JUMP JUMPDEST JUMP JUMPDEST SWAP3 PUSH2 0x4A63 SWAP2 SWAP5 SWAP3 SWAP4 SWAP1 DUP6 DUP6 SWAP2 SWAP3 PUSH2 0x5216 JUMP JUMPDEST PUSH2 0x4A6C DUP4 PUSH2 0x108C JUMP JUMPDEST SWAP2 PUSH2 0x4A77 PUSH1 0x0 PUSH2 0x21D6 JUMP JUMPDEST SWAP2 PUSH2 0x4A80 PUSH2 0x1C33 JUMP JUMPDEST JUMPDEST DUP1 PUSH2 0x4A94 PUSH2 0x4A8E DUP8 PUSH2 0x332 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST LT ISZERO PUSH2 0x4B00 JUMPI PUSH2 0x4AFB SWAP1 PUSH2 0x4AF6 PUSH2 0x4ABF PUSH2 0x4AB7 PUSH2 0x4AB2 DUP8 DUP6 SWAP1 PUSH2 0x395B JUMP JUMPDEST PUSH2 0x397B JUMP JUMPDEST SWAP7 DUP8 SWAP1 PUSH2 0x4034 JUMP JUMPDEST SWAP6 PUSH2 0x4AF0 PUSH2 0x4AE1 PUSH1 0x1 PUSH2 0x4ADB PUSH2 0x4AD6 DUP14 DUP9 SWAP1 PUSH2 0x395B JUMP JUMPDEST PUSH2 0x397B JUMP JUMPDEST SWAP1 PUSH2 0xBC9 JUMP JUMPDEST SWAP2 PUSH2 0x4AEB DUP4 PUSH2 0x21C9 JUMP JUMPDEST PUSH2 0x4034 JUMP JUMPDEST SWAP1 PUSH2 0x2AF0 JUMP JUMPDEST PUSH2 0x3988 JUMP JUMPDEST PUSH2 0x4A81 JUMP JUMPDEST POP SWAP4 POP POP PUSH2 0x4B23 SWAP2 POP PUSH2 0x4B1C SWAP1 PUSH2 0x4B17 PUSH1 0x0 PUSH2 0x21C9 JUMP JUMPDEST PUSH2 0x4034 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2AF0 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x4B3D PUSH1 0x0 PUSH2 0x4B42 SWAP3 PUSH2 0x4B36 PUSH2 0x1C33 JUMP JUMPDEST POP ADD PUSH2 0x49A7 JUMP JUMPDEST PUSH2 0x5359 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH2 0x4B50 PUSH2 0x1C5C JUMP JUMPDEST POP DUP1 MLOAD PUSH2 0x4B5D JUMPI JUMPDEST POP EQ SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 ADD SWAP2 MLOAD PUSH1 0x5 SHL DUP3 ADD SWAP1 JUMPDEST DUP3 MLOAD DUP2 GT PUSH1 0x5 SHL SWAP1 DUP2 MSTORE PUSH1 0x20 DUP4 MLOAD SWAP2 XOR MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP3 ADD SWAP2 DUP2 DUP4 LT PUSH2 0x4B6B JUMPI SWAP2 POP POP CODESIZE PUSH2 0x4B58 JUMP JUMPDEST SWAP1 PUSH2 0x4BB8 PUSH2 0x4BB1 PUSH2 0x4BBD SWAP3 PUSH2 0x4BA9 PUSH2 0x1C33 JUMP JUMPDEST POP PUSH1 0x10 PUSH2 0x3688 JUMP JUMPDEST DUP4 SWAP1 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x21C9 JUMP JUMPDEST DUP1 PUSH2 0x4BD1 PUSH2 0x4BCB PUSH1 0x0 PUSH2 0x21D6 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0x4BDE JUMPI POP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 POP PUSH2 0x4BDB JUMP JUMPDEST SWAP1 PUSH2 0x4BEE PUSH2 0x29F6 JUMP JUMPDEST POP PUSH1 0x40 MLOAD SWAP2 PUSH1 0x40 DUP4 ADD PUSH1 0x40 MSTORE PUSH1 0x1 DUP4 MSTORE PUSH1 0x20 DUP4 ADD MSTORE JUMP JUMPDEST PUSH2 0x4C0D PUSH2 0x1C5C JUMP JUMPDEST POP PUSH2 0x4C17 DUP2 PUSH2 0x5371 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x4C3A JUMPI JUMPDEST SWAP1 DUP2 ISZERO PUSH2 0x4C2A JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x4C34 SWAP2 POP PUSH2 0x5417 JUMP JUMPDEST CODESIZE PUSH2 0x4C26 JUMP JUMPDEST POP PUSH2 0x4C44 DUP2 PUSH2 0x53B1 JUMP JUMPDEST PUSH2 0x4C1E JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x4C60 PUSH2 0x4C5B PUSH2 0x4C65 SWAP3 PUSH2 0x4C49 JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x332 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x416363657373436F6E74726F6C3A206163636F756E7420000000000000000000 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x4C9C PUSH1 0x17 DUP1 SWAP3 PUSH2 0x201B JUMP JUMPDEST PUSH2 0x4CA5 DUP2 PUSH2 0x4C68 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x206973206D697373696E6720726F6C6520000000000000000000000000000000 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x4CDD PUSH1 0x11 DUP1 SWAP3 PUSH2 0x201B JUMP JUMPDEST PUSH2 0x4CE6 DUP2 PUSH2 0x4CA9 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x4D04 PUSH2 0x4D0F SWAP4 SWAP3 PUSH2 0x4CFE PUSH2 0x4D09 SWAP4 PUSH2 0x4C90 JUMP JUMPDEST SWAP1 PUSH2 0x20A9 JUMP JUMPDEST PUSH2 0x4CD1 JUMP JUMPDEST SWAP1 PUSH2 0x20A9 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x4D27 PUSH2 0x4D21 DUP4 DUP4 SWAP1 PUSH2 0x2CF0 JUMP JUMPDEST ISZERO PUSH2 0x42F JUMP JUMPDEST PUSH2 0x4D2F JUMPI POP POP JUMP JUMPDEST PUSH2 0x4DA7 SWAP2 PUSH2 0x4D85 PUSH2 0x4D5E PUSH2 0x4D4E PUSH2 0x4D48 PUSH2 0x4D8A SWAP6 PUSH2 0x5493 JUMP JUMPDEST SWAP4 PUSH2 0x21F2 JUMP JUMPDEST PUSH2 0x4D58 PUSH1 0x20 PUSH2 0x4C4C JUMP JUMPDEST SWAP1 PUSH2 0x566C JUMP JUMPDEST SWAP2 PUSH2 0x4D76 PUSH2 0x4D6A PUSH2 0x2E2 JUMP JUMPDEST SWAP4 DUP5 SWAP3 PUSH1 0x20 DUP5 ADD PUSH2 0x4CEA JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE SUB DUP3 PUSH2 0x65F JUMP JUMPDEST PUSH2 0x2132 JUMP JUMPDEST PUSH2 0x4D92 PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 PUSH3 0x461BCD PUSH1 0xE5 SHL DUP4 MSTORE PUSH1 0x4 DUP4 ADD PUSH2 0x736 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP2 SWAP3 SWAP1 SWAP3 PUSH2 0x4DB7 PUSH2 0x4601 JUMP JUMPDEST PUSH2 0x4E93 JUMPI JUMPDEST DUP3 PUSH1 0x60 SHL DUP1 ISZERO PUSH2 0x4E85 JUMPI PUSH8 0x9A31110384E0B0C9 PUSH1 0x20 MSTORE DUP4 PUSH1 0x14 MSTORE DUP5 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP1 SLOAD SWAP1 DUP4 DUP3 ADD SWAP2 DUP3 LT PUSH2 0x4E77 JUMPI SSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x60 SHR PUSH1 0x0 CALLER PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP4 LOG4 PUSH2 0x4E24 PUSH2 0x460F JUMP JUMPDEST PUSH2 0x4E5E JUMPI JUMPDEST PUSH2 0x4E32 DUP4 PUSH2 0x57B8 JUMP JUMPDEST PUSH2 0x4E3D JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x4E55 SWAP4 PUSH2 0x4E4B PUSH1 0x0 PUSH2 0x24E2 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 SWAP3 SWAP4 PUSH2 0x57C5 JUMP JUMPDEST CODESIZE DUP1 DUP1 DUP1 PUSH2 0x4E37 JUMP JUMPDEST PUSH2 0x4E67 DUP5 PUSH2 0x4BE5 JUMP JUMPDEST POP PUSH2 0x4E71 DUP2 PUSH2 0x4BE5 JUMP JUMPDEST POP PUSH2 0x4E29 JUMP JUMPDEST PUSH4 0x1336CEA PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0xEA553B34 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH2 0x4E9C DUP5 PUSH2 0x4BE5 JUMP JUMPDEST POP PUSH2 0x4EA6 DUP2 PUSH2 0x4BE5 JUMP JUMPDEST POP PUSH2 0x4DBC JUMP JUMPDEST SWAP1 SWAP2 PUSH2 0x4EC5 SWAP3 PUSH2 0x4EBC PUSH1 0x0 PUSH2 0x24E2 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 SWAP3 PUSH2 0x585E JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x4ED3 PUSH1 0xFF SWAP2 PUSH2 0x1716 JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST PUSH2 0x4EE6 SWAP1 PUSH2 0x42F JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x4F01 PUSH2 0x4EFC PUSH2 0x4F08 SWAP3 PUSH2 0x4EDD JUMP JUMPDEST PUSH2 0x4EE9 JUMP JUMPDEST DUP3 SLOAD PUSH2 0x4EC7 JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x4F20 PUSH2 0x4F1A DUP3 DUP5 SWAP1 PUSH2 0x2CF0 JUMP JUMPDEST ISZERO PUSH2 0x42F JUMP JUMPDEST PUSH2 0x4F29 JUMPI JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x4F4C PUSH1 0x1 PUSH2 0x4F47 PUSH1 0x0 PUSH2 0x4F3F PUSH1 0x4 DUP7 SWAP1 PUSH2 0x236F JUMP JUMPDEST ADD DUP6 SWAP1 PUSH2 0x2CB1 JUMP JUMPDEST PUSH2 0x4EEC JUMP JUMPDEST SWAP1 PUSH2 0x4F55 PUSH2 0x4691 JUMP JUMPDEST SWAP1 PUSH2 0x4F92 PUSH2 0x4F8C PUSH2 0x4F86 PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP6 PUSH2 0x2363 JUMP JUMPDEST SWAP3 PUSH2 0x218B JUMP JUMPDEST SWAP3 PUSH2 0x218B JUMP JUMPDEST SWAP3 PUSH2 0x4F9B PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x4FA5 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 LOG4 CODESIZE DUP1 PUSH2 0x4F25 JUMP JUMPDEST PUSH2 0x4FB8 SWAP1 PUSH2 0x1F78 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x4FCF PUSH2 0x4FCA PUSH2 0x4FD4 SWAP3 PUSH2 0x2F7 JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x332 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x4FEB PUSH2 0x4FE6 PUSH2 0x4FF0 SWAP3 PUSH2 0x332 JUMP JUMPDEST PUSH2 0x1716 JUMP JUMPDEST PUSH2 0xB0C JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x5026 PUSH2 0x5020 PUSH2 0x501B PUSH2 0x5016 PUSH1 0x0 PUSH2 0x502B SWAP7 PUSH2 0x500E PUSH2 0x1C5C JUMP JUMPDEST POP ADD SWAP5 PUSH2 0x4FAF JUMP JUMPDEST PUSH2 0x4FBB JUMP JUMPDEST PUSH2 0x4FD7 JUMP JUMPDEST SWAP2 PUSH2 0x49A7 JUMP JUMPDEST PUSH2 0x5A4E JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x5039 DUP2 DUP4 SWAP1 PUSH2 0x2CF0 JUMP JUMPDEST PUSH2 0x5042 JUMPI JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x5065 PUSH1 0x0 PUSH2 0x5060 PUSH1 0x0 PUSH2 0x5058 PUSH1 0x4 DUP7 SWAP1 PUSH2 0x236F JUMP JUMPDEST ADD DUP6 SWAP1 PUSH2 0x2CB1 JUMP JUMPDEST PUSH2 0x4EEC JUMP JUMPDEST SWAP1 PUSH2 0x506E PUSH2 0x4691 JUMP JUMPDEST SWAP1 PUSH2 0x50AB PUSH2 0x50A5 PUSH2 0x509F PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP6 PUSH2 0x2363 JUMP JUMPDEST SWAP3 PUSH2 0x218B JUMP JUMPDEST SWAP3 PUSH2 0x218B JUMP JUMPDEST SWAP3 PUSH2 0x50B4 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x50BE DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 LOG4 CODESIZE DUP1 PUSH2 0x503E JUMP JUMPDEST SWAP1 PUSH2 0x50FB PUSH2 0x50F5 PUSH2 0x50F0 PUSH2 0x50EB PUSH1 0x0 PUSH2 0x5100 SWAP7 PUSH2 0x50E3 PUSH2 0x1C5C JUMP JUMPDEST POP ADD SWAP5 PUSH2 0x4FAF JUMP JUMPDEST PUSH2 0x4FBB JUMP JUMPDEST PUSH2 0x4FD7 JUMP JUMPDEST SWAP2 PUSH2 0x49A7 JUMP JUMPDEST PUSH2 0x5B0E JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP2 SWAP1 SWAP5 SWAP3 PUSH2 0x5111 PUSH1 0xB PUSH2 0x2CE3 JUMP JUMPDEST PUSH2 0x5184 JUMPI PUSH2 0x5131 PUSH2 0x5138 SWAP3 PUSH2 0x512A PUSH2 0x5176 SWAP9 PUSH1 0x8 PUSH2 0x1F15 JUMP JUMPDEST PUSH1 0x9 PUSH2 0x1F15 JUMP JUMPDEST PUSH1 0xA PUSH2 0x1F15 JUMP JUMPDEST PUSH2 0x514A PUSH2 0x5143 PUSH2 0x1738 JUMP JUMPDEST DUP3 SWAP1 PUSH2 0x4667 JUMP JUMPDEST PUSH2 0x515C PUSH2 0x5155 PUSH2 0x1CA1 JUMP JUMPDEST DUP3 SWAP1 PUSH2 0x4667 JUMP JUMPDEST PUSH2 0x516E PUSH2 0x5167 PUSH2 0x1CF9 JUMP JUMPDEST DUP3 SWAP1 PUSH2 0x4667 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH2 0x5C18 JUMP JUMPDEST PUSH2 0x5182 PUSH1 0x1 PUSH1 0xB PUSH2 0x4EEC JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 PUSH4 0xF92EE8A9 PUSH1 0xE0 SHL DUP2 MSTORE DUP1 PUSH2 0x519D PUSH1 0x4 DUP3 ADD PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH2 0x51B9 DUP2 PUSH2 0x51A1 JUMP JUMPDEST DUP3 LT ISZERO PUSH2 0x51D4 JUMPI PUSH2 0x51CB PUSH1 0x1 SWAP2 PUSH2 0x51A5 JUMP JUMPDEST SWAP2 MUL ADD SWAP1 PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x36FA JUMP JUMPDEST PUSH2 0x51F8 SWAP2 PUSH1 0x0 PUSH2 0x51F2 SWAP3 PUSH2 0x51EB PUSH2 0x235E JUMP JUMPDEST POP ADD PUSH2 0x51B0 JUMP JUMPDEST SWAP1 PUSH2 0xF41 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 SWAP2 PUSH2 0x5214 SWAP3 PUSH2 0x520B PUSH1 0x0 PUSH2 0x24E2 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 SWAP3 PUSH2 0x5C35 JUMP JUMPDEST JUMP JUMPDEST SWAP2 SWAP3 SWAP1 SWAP3 PUSH2 0x5222 PUSH2 0x4601 JUMP JUMPDEST PUSH2 0x5354 JUMPI JUMPDEST DUP1 MLOAD DUP5 MLOAD SUB PUSH2 0x5346 JUMPI DUP3 PUSH1 0x60 SHL DUP1 ISZERO PUSH2 0x5338 JUMPI DUP1 PUSH8 0x9A31110384E0B0C9 OR PUSH1 0x20 MSTORE DUP5 MLOAD PUSH1 0x5 SHL DUP1 JUMPDEST PUSH2 0x5301 JUMPI POP PUSH1 0x0 PUSH1 0x40 MLOAD PUSH1 0x40 DUP2 MSTORE PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB DUP2 DUP9 MLOAD PUSH1 0x5 SHL PUSH1 0x20 ADD PUSH1 0x40 DUP3 ADD SWAP1 DUP2 DUP2 DUP13 PUSH1 0x4 GAS STATICCALL POP RETURNDATASIZE PUSH1 0x40 ADD PUSH1 0x20 DUP4 ADD MSTORE RETURNDATASIZE ADD DUP7 MLOAD PUSH1 0x5 SHL PUSH1 0x20 ADD DUP2 DUP2 DUP10 PUSH1 0x4 GAS STATICCALL POP RETURNDATASIZE ADD SUB SWAP4 PUSH1 0x60 SHR SWAP4 CALLER SWAP3 LOG4 PUSH2 0x52C2 PUSH2 0x460F JUMP JUMPDEST PUSH2 0x52FC JUMPI JUMPDEST PUSH2 0x52D0 DUP4 PUSH2 0x57B8 JUMP JUMPDEST PUSH2 0x52DB JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x52F3 SWAP4 PUSH2 0x52E9 PUSH1 0x0 PUSH2 0x24E2 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 SWAP3 SWAP4 PUSH2 0x5D39 JUMP JUMPDEST CODESIZE DUP1 DUP1 DUP1 PUSH2 0x52D5 JUMP JUMPDEST PUSH2 0x52C7 JUMP JUMPDEST DUP1 DUP4 ADD MLOAD SWAP1 DUP1 DUP8 ADD MLOAD PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 DUP3 SLOAD SWAP1 DUP2 ADD SWAP1 DUP2 LT PUSH2 0x532A JUMPI PUSH1 0x20 SWAP3 SSTORE SUB DUP1 PUSH2 0x524F JUMP JUMPDEST PUSH4 0x1336CEA PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0xEA553B34 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0x3B800A46 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH2 0x5227 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x536E SWAP2 PUSH2 0x5367 PUSH2 0x1C33 JUMP JUMPDEST POP ADD PUSH2 0x51A1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x5379 PUSH2 0x1C5C JUMP JUMPDEST POP PUSH4 0x3E85E62F PUSH1 0xE0 SHL PUSH2 0x5394 PUSH2 0x538E DUP4 PUSH2 0x3E0 JUMP JUMPDEST SWAP2 PUSH2 0x3E0 JUMP JUMPDEST EQ SWAP1 DUP2 ISZERO PUSH2 0x53A1 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x53AB SWAP2 POP PUSH2 0x5DF0 JUMP JUMPDEST CODESIZE PUSH2 0x539D JUMP JUMPDEST PUSH2 0x53B9 PUSH2 0x1C5C JUMP JUMPDEST POP PUSH2 0x53C3 DUP2 PUSH2 0x5E17 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x5408 JUMPI JUMPDEST DUP1 ISZERO PUSH2 0x53ED JUMPI JUMPDEST SWAP1 DUP2 ISZERO PUSH2 0x53DD JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x53E7 SWAP2 POP PUSH2 0x5E57 JUMP JUMPDEST CODESIZE PUSH2 0x53D9 JUMP JUMPDEST POP PUSH1 0x0 PUSH2 0x5402 PUSH2 0x53FC DUP4 PUSH2 0x3E0 JUMP JUMPDEST SWAP2 PUSH2 0x3E0 JUMP JUMPDEST EQ PUSH2 0x53D1 JUMP JUMPDEST POP PUSH2 0x5412 DUP2 PUSH2 0x5E57 JUMP JUMPDEST PUSH2 0x53CA JUMP JUMPDEST PUSH2 0x541F PUSH2 0x1C5C JUMP JUMPDEST POP PUSH2 0x5429 DUP2 PUSH2 0x5E57 JUMP JUMPDEST SWAP1 DUP2 ISZERO PUSH2 0x5435 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x543F SWAP2 POP PUSH2 0x5E97 JUMP JUMPDEST CODESIZE PUSH2 0x5431 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH2 0x5462 PUSH2 0x545D PUSH2 0x5467 SWAP3 PUSH2 0x5445 JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x5448 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x5474 PUSH1 0x14 PUSH2 0x544E JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x548B PUSH2 0x5486 PUSH2 0x5490 SWAP3 PUSH2 0x5448 JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x332 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x54B0 PUSH2 0x54AB PUSH2 0x54C6 SWAP3 PUSH2 0x54A5 PUSH2 0x2016 JUMP JUMPDEST POP PUSH2 0x4FAF JUMP JUMPDEST PUSH2 0x4FBB JUMP JUMPDEST PUSH2 0x54C0 PUSH2 0x54BB PUSH2 0x546A JUMP JUMPDEST PUSH2 0x5477 JUMP JUMPDEST SWAP1 PUSH2 0x566C JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x54E0 PUSH2 0x54DB PUSH2 0x54E5 SWAP3 PUSH2 0x54C9 JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x332 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x54FA PUSH2 0x54F5 DUP4 PUSH2 0x132E JUMP JUMPDEST PUSH2 0x78E JUMP JUMPDEST SWAP2 DUP3 MSTORE JUMP JUMPDEST CALLDATASIZE SWAP1 CALLDATACOPY JUMP JUMPDEST SWAP1 PUSH2 0x5529 PUSH2 0x5511 DUP4 PUSH2 0x54E8 JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP1 PUSH2 0x551F DUP7 SWAP4 PUSH2 0x132E JUMP JUMPDEST SWAP3 ADD SWAP2 SUB SWAP1 PUSH2 0x54FF JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x3 PUSH1 0xFC SHL SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x553D DUP3 PUSH2 0x35E5 JUMP JUMPDEST DUP2 LT ISZERO PUSH2 0x554F JUMPI PUSH1 0x1 PUSH1 0x20 SWAP2 MUL ADD ADD SWAP1 JUMP JUMPDEST PUSH2 0x36FA JUMP JUMPDEST PUSH1 0xF PUSH1 0xFB SHL SWAP1 JUMP JUMPDEST PUSH16 0x181899199A1A9B1B9C1CB0B131B232B3 PUSH1 0x81 SHL SWAP1 JUMP JUMPDEST PUSH2 0x557B PUSH2 0x555C JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x5595 PUSH2 0x5590 PUSH2 0x559A SWAP3 PUSH2 0x557E JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x332 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xF8 SHL SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x55BA PUSH2 0x55B5 PUSH2 0x55BF SWAP3 PUSH2 0x55A3 JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x5448 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x55E1 SWAP1 PUSH2 0x55DB PUSH2 0x55D5 PUSH2 0x55E6 SWAP5 PUSH2 0x5448 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST SWAP1 PUSH2 0x96E JUMP JUMPDEST PUSH2 0x332 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x537472696E67733A20686578206C656E67746820696E73756666696369656E74 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x561D PUSH1 0x20 DUP1 SWAP3 PUSH2 0x6D7 JUMP JUMPDEST PUSH2 0x5626 DUP2 PUSH2 0x55E9 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x5640 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x5611 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x564A JUMPI JUMP JUMPDEST PUSH2 0x5652 PUSH2 0x2E2 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x5668 PUSH1 0x4 DUP3 ADD PUSH2 0x562A JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP2 SWAP1 PUSH2 0x5676 PUSH2 0x2016 JUMP JUMPDEST POP PUSH2 0x5710 PUSH2 0x5700 PUSH2 0x56AC PUSH2 0x56A7 PUSH2 0x5697 PUSH1 0x2 PUSH2 0x5692 DUP8 SWAP2 PUSH2 0x54CC JUMP JUMPDEST PUSH2 0x252D JUMP JUMPDEST PUSH2 0x56A1 PUSH1 0x2 PUSH2 0x54CC JUMP JUMPDEST SWAP1 PUSH2 0x4034 JUMP JUMPDEST PUSH2 0x5504 JUMP JUMPDEST SWAP3 PUSH2 0x56B5 PUSH2 0x552B JUMP JUMPDEST PUSH2 0x56CE DUP6 PUSH2 0x56C8 PUSH1 0x0 SWAP4 PUSH1 0x0 BYTE SWAP4 PUSH2 0x21D6 JUMP JUMPDEST SWAP1 PUSH2 0x5533 JUMP JUMPDEST MSTORE8 PUSH2 0x56D7 PUSH2 0x5554 JUMP JUMPDEST PUSH2 0x56F0 DUP6 PUSH2 0x56EA PUSH1 0x1 SWAP4 PUSH1 0x0 BYTE SWAP4 PUSH2 0x2209 JUMP JUMPDEST SWAP1 PUSH2 0x5533 JUMP JUMPDEST MSTORE8 PUSH2 0x56FB PUSH1 0x2 PUSH2 0x54CC JUMP JUMPDEST PUSH2 0x252D JUMP JUMPDEST PUSH2 0x570A PUSH1 0x1 PUSH2 0x2209 JUMP JUMPDEST SWAP1 PUSH2 0x4034 JUMP JUMPDEST SWAP3 JUMPDEST DUP4 PUSH2 0x5726 PUSH2 0x5720 PUSH1 0x1 PUSH2 0x2209 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST GT ISZERO PUSH2 0x578D JUMPI PUSH2 0x5734 PUSH2 0x5573 JUMP JUMPDEST DUP2 PUSH2 0x573F PUSH1 0xF PUSH2 0x5581 JUMP JUMPDEST AND SWAP2 PUSH1 0x10 DUP4 LT ISZERO PUSH2 0x5788 JUMPI PUSH2 0x575B PUSH2 0x577C SWAP3 PUSH2 0x5782 SWAP5 BYTE PUSH2 0x559D JUMP JUMPDEST PUSH2 0x576B DUP6 SWAP2 DUP9 SWAP1 PUSH1 0x0 BYTE SWAP3 PUSH2 0x5533 JUMP JUMPDEST MSTORE8 PUSH2 0x5776 PUSH1 0x4 PUSH2 0x55A6 JUMP JUMPDEST SWAP1 PUSH2 0x55C2 JUMP JUMPDEST SWAP4 PUSH2 0x366B JUMP JUMPDEST SWAP3 PUSH2 0x5712 JUMP JUMPDEST PUSH2 0x36FA JUMP JUMPDEST PUSH2 0x57B5 SWAP3 SWAP4 POP PUSH2 0x57B0 SWAP1 PUSH2 0x57AA PUSH2 0x57A4 PUSH1 0x0 PUSH2 0x21D6 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST EQ PUSH2 0x5643 JUMP JUMPDEST PUSH2 0x2132 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x57C0 PUSH2 0x1C5C JUMP JUMPDEST POP EXTCODESIZE SWAP1 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 SWAP4 PUSH1 0x40 MLOAD SWAP6 DUP7 SWAP5 PUSH4 0xF23A6E61 DUP7 MSTORE CALLER DUP8 DUP8 ADD MSTORE PUSH1 0x60 SHL PUSH1 0x60 SHR PUSH1 0x40 DUP7 ADD MSTORE PUSH1 0x60 DUP6 ADD MSTORE PUSH1 0x80 DUP5 ADD MSTORE PUSH1 0xA0 DUP1 DUP5 ADD MSTORE DUP1 MLOAD DUP1 SWAP2 DUP2 DUP1 PUSH1 0xC0 DUP8 ADD MSTORE PUSH2 0x584A JUMPI JUMPDEST POP POP PUSH1 0xC4 ADD SWAP1 PUSH1 0x0 PUSH1 0x1C DUP5 ADD SWAP2 GAS CALL ISZERO PUSH2 0x583B JUMPI JUMPDEST PUSH4 0xF23A6E61 PUSH1 0xE0 SHL SWAP1 MLOAD SUB PUSH2 0x582D JUMPI JUMP JUMPDEST PUSH4 0x9C05499B PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x581C JUMPI RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST DUP2 DUP7 PUSH1 0xE0 DUP8 ADD SWAP3 ADD PUSH1 0x4 GAS STATICCALL POP DUP1 CODESIZE PUSH2 0x5807 JUMP JUMPDEST SWAP2 SWAP4 SWAP3 SWAP1 PUSH2 0x586A PUSH2 0x4601 JUMP JUMPDEST PUSH2 0x5996 JUMPI JUMPDEST DUP2 MLOAD DUP6 MLOAD SUB PUSH2 0x5988 JUMPI PUSH1 0x60 SHL SWAP2 DUP3 PUSH8 0x9A31110384E0B0C9 OR PUSH1 0x20 MSTORE DUP1 PUSH1 0x60 SHL DUP4 DUP2 EQ SWAP1 ISZERO OR ISZERO PUSH2 0x5966 JUMPI JUMPDEST POP DUP4 MLOAD PUSH1 0x5 SHL DUP1 JUMPDEST PUSH2 0x5930 JUMPI POP PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH1 0x0 SWAP4 SWAP5 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP2 PUSH1 0x40 DUP4 MSTORE DUP1 MLOAD PUSH1 0x5 SHL PUSH1 0x20 ADD DUP1 SWAP2 PUSH1 0x40 DUP6 ADD SWAP3 DUP4 SWAP2 PUSH1 0x4 GAS STATICCALL POP RETURNDATASIZE PUSH1 0x40 ADD PUSH1 0x20 DUP5 ADD MSTORE RETURNDATASIZE ADD SWAP1 DUP2 DUP2 MLOAD PUSH1 0x5 SHL PUSH1 0x20 ADD DUP1 SWAP3 PUSH1 0x4 GAS STATICCALL POP RETURNDATASIZE ADD SUB SWAP3 PUSH1 0x60 SHR SWAP3 CALLER SWAP3 LOG4 PUSH2 0x591B PUSH2 0x460F JUMP JUMPDEST PUSH2 0x5922 JUMPI JUMPDEST JUMP JUMPDEST PUSH2 0x592A PUSH2 0x2249 JUMP JUMPDEST POP PUSH2 0x5920 JUMP JUMPDEST DUP1 DUP3 ADD MLOAD SWAP1 DUP1 DUP7 ADD MLOAD PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP1 SLOAD SWAP3 DUP4 DUP2 GT PUSH2 0x5958 JUMPI PUSH1 0x20 SWAP4 SUB SWAP1 SSTORE SUB DUP1 PUSH2 0x58A2 JUMP JUMPDEST PUSH4 0xF4D678B8 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x34 PUSH1 0xC KECCAK256 SLOAD ISZERO PUSH2 0x597A JUMPI CODESIZE PUSH2 0x589A JUMP JUMPDEST PUSH4 0x4B6E7F18 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0x3B800A46 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH2 0x599E PUSH2 0x2249 JUMP JUMPDEST POP PUSH2 0x586F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD SWAP1 JUMP JUMPDEST PUSH2 0x59BF DUP2 PUSH2 0x59B2 JUMP JUMPDEST DUP3 LT ISZERO PUSH2 0x59DA JUMPI PUSH2 0x59D1 PUSH1 0x1 SWAP2 PUSH2 0x59A7 JUMP JUMPDEST SWAP2 MUL ADD SWAP1 PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x36FA JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x59F5 PUSH2 0x59F0 PUSH2 0x59FD SWAP4 PUSH2 0x2363 JUMP JUMPDEST PUSH2 0x2AC4 JUMP JUMPDEST SWAP1 DUP4 SLOAD PUSH2 0x1D46 JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST SWAP1 DUP2 SLOAD SWAP2 PUSH9 0x10000000000000000 DUP4 LT ISZERO PUSH2 0x5A31 JUMPI DUP3 PUSH2 0x5A29 SWAP2 PUSH1 0x1 PUSH2 0x5A2F SWAP6 ADD DUP2 SSTORE PUSH2 0x59B6 JUMP JUMPDEST SWAP1 PUSH2 0x59DF JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x649 JUMP JUMPDEST SWAP1 PUSH2 0x5A40 SWAP1 PUSH2 0x2363 JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH2 0x5A56 PUSH2 0x1C5C JUMP JUMPDEST POP PUSH2 0x5A6B PUSH2 0x5A65 DUP3 DUP5 SWAP1 PUSH2 0x5ED7 JUMP JUMPDEST ISZERO PUSH2 0x42F JUMP JUMPDEST PUSH1 0x0 EQ PUSH2 0x5AAE JUMPI PUSH2 0x5AA4 PUSH2 0x5AA9 SWAP3 PUSH2 0x5A8F PUSH2 0x5A88 PUSH1 0x0 DUP6 ADD PUSH2 0x59A4 JUMP JUMPDEST DUP3 SWAP1 PUSH2 0x5A01 JUMP JUMPDEST PUSH1 0x1 PUSH2 0x5A9D PUSH1 0x0 DUP6 ADD PUSH2 0x51A1 JUMP JUMPDEST SWAP4 ADD PUSH2 0x5A36 JUMP JUMPDEST PUSH2 0x2AF0 JUMP JUMPDEST PUSH1 0x1 SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x31 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x5ADD SWAP2 PUSH2 0x5AD7 PUSH2 0x235E JUMP JUMPDEST SWAP2 PUSH2 0x59DF JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x5AE8 DUP2 PUSH2 0x59B2 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x5B09 JUMPI PUSH1 0x1 SWAP1 SUB SWAP1 PUSH2 0x5B06 PUSH2 0x5B00 DUP4 DUP4 PUSH2 0x59B6 JUMP JUMPDEST SWAP1 PUSH2 0x5ACB JUMP JUMPDEST SSTORE JUMP JUMPDEST PUSH2 0x5AB5 JUMP JUMPDEST PUSH2 0x5B16 PUSH2 0x1C5C JUMP JUMPDEST POP PUSH2 0x5B2D PUSH2 0x5B28 PUSH1 0x1 DUP4 ADD DUP5 SWAP1 PUSH2 0x5A36 JUMP JUMPDEST PUSH2 0x21C9 JUMP JUMPDEST SWAP1 DUP2 PUSH2 0x5B42 PUSH2 0x5B3C PUSH1 0x0 PUSH2 0x21D6 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST EQ ISZERO PUSH1 0x0 EQ PUSH2 0x5C10 JUMPI PUSH2 0x5BC2 SWAP3 PUSH1 0x1 PUSH2 0x5BBD SWAP3 DUP5 PUSH2 0x5B6B PUSH1 0x0 SWAP7 PUSH2 0x5B65 DUP6 PUSH2 0x2209 JUMP JUMPDEST SWAP1 PUSH2 0x44CD JUMP JUMPDEST PUSH2 0x5B88 PUSH2 0x5B79 DUP9 DUP6 ADD PUSH2 0x51A1 JUMP JUMPDEST PUSH2 0x5B82 DUP7 PUSH2 0x2209 JUMP JUMPDEST SWAP1 PUSH2 0x44CD JUMP JUMPDEST DUP1 PUSH2 0x5B9B PUSH2 0x5B95 DUP5 PUSH2 0x332 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST SUB PUSH2 0x5BC7 JUMPI JUMPDEST POP POP POP PUSH2 0x5BB7 PUSH2 0x5BB2 DUP7 DUP4 ADD PUSH2 0x59A4 JUMP JUMPDEST PUSH2 0x5ADF JUMP JUMPDEST ADD PUSH2 0x5A36 JUMP JUMPDEST PUSH2 0x1D91 JUMP JUMPDEST PUSH1 0x1 SWAP1 JUMP JUMPDEST PUSH2 0x5C08 SWAP3 PUSH2 0x5BFA PUSH2 0x5BE6 PUSH2 0x5BE0 PUSH2 0x5C03 SWAP5 DUP13 DUP10 ADD PUSH2 0x51B0 JUMP JUMPDEST SWAP1 PUSH2 0xF41 JUMP JUMPDEST SWAP4 PUSH2 0x5BF4 DUP6 SWAP2 DUP13 DUP10 ADD PUSH2 0x51B0 JUMP JUMPDEST SWAP1 PUSH2 0x59DF JUMP JUMPDEST SWAP2 DUP6 DUP6 ADD PUSH2 0x5A36 JUMP JUMPDEST PUSH2 0x2AF0 JUMP JUMPDEST CODESIZE DUP1 DUP1 PUSH2 0x5BA1 JUMP JUMPDEST POP POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x5C2E PUSH2 0x5C33 SWAP4 SWAP3 PUSH2 0x5C29 PUSH2 0x1F39 JUMP JUMPDEST PUSH2 0x4667 JUMP JUMPDEST PUSH2 0x5F0D JUMP JUMPDEST JUMP JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x5C41 PUSH2 0x4601 JUMP JUMPDEST PUSH2 0x5D17 JUMPI JUMPDEST PUSH1 0x60 SHL SWAP1 DUP2 PUSH8 0x9A31110384E0B0C9 OR PUSH1 0x20 MSTORE DUP2 DUP2 PUSH1 0x60 SHL EQ DUP2 PUSH1 0x60 SHL ISZERO OR ISZERO PUSH2 0x5CF5 JUMPI JUMPDEST POP DUP3 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD SWAP2 DUP3 DUP5 GT PUSH2 0x5CE7 JUMPI DUP4 PUSH1 0x0 SWAP4 SUB SWAP1 SSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x60 SHR CALLER PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP5 LOG4 PUSH2 0x5CBB PUSH2 0x460F JUMP JUMPDEST PUSH2 0x5CC4 JUMPI JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x5CD0 PUSH2 0x5CD6 SWAP3 PUSH2 0x4BE5 JUMP JUMPDEST POP PUSH2 0x4BE5 JUMP JUMPDEST POP PUSH2 0x5CDF PUSH2 0x2249 JUMP JUMPDEST POP CODESIZE DUP1 PUSH2 0x5CC0 JUMP JUMPDEST PUSH4 0xF4D678B8 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x34 PUSH1 0xC KECCAK256 SLOAD ISZERO PUSH2 0x5D09 JUMPI CODESIZE PUSH2 0x5C6A JUMP JUMPDEST PUSH4 0x4B6E7F18 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH2 0x5D20 DUP5 PUSH2 0x4BE5 JUMP JUMPDEST POP PUSH2 0x5D2A DUP4 PUSH2 0x4BE5 JUMP JUMPDEST POP PUSH2 0x5D33 PUSH2 0x2249 JUMP JUMPDEST POP PUSH2 0x5C46 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 SWAP4 PUSH1 0x40 MLOAD SWAP6 DUP7 SWAP5 PUSH4 0xBC197C81 DUP7 MSTORE CALLER DUP8 DUP8 ADD MSTORE PUSH1 0x60 SHL PUSH1 0x60 SHR PUSH1 0x40 DUP7 ADD MSTORE PUSH1 0xA0 PUSH1 0x60 DUP7 ADD MSTORE DUP1 MLOAD PUSH1 0x5 SHL DUP7 ADD DUP1 SWAP2 PUSH1 0xC0 DUP8 ADD SWAP3 DUP4 SWAP2 PUSH1 0x4 GAS STATICCALL POP RETURNDATASIZE PUSH1 0xA0 ADD SWAP1 DUP2 PUSH1 0x80 DUP8 ADD MSTORE RETURNDATASIZE ADD SWAP2 DUP3 DUP2 MLOAD PUSH1 0x5 SHL DUP9 ADD DUP1 SWAP3 PUSH1 0x4 GAS STATICCALL POP RETURNDATASIZE ADD PUSH1 0xA0 DUP6 ADD MSTORE RETURNDATASIZE ADD SWAP1 DUP2 DUP2 MLOAD DUP7 ADD DUP1 SWAP3 PUSH1 0x4 GAS STATICCALL POP PUSH1 0x1C DUP4 ADD SWAP1 RETURNDATASIZE ADD SUB SWAP1 PUSH1 0x0 PUSH1 0x1C DUP5 ADD SWAP2 GAS CALL ISZERO PUSH2 0x5DE1 JUMPI JUMPDEST PUSH4 0xBC197C81 PUSH1 0xE0 SHL SWAP1 MLOAD SUB PUSH2 0x5DD3 JUMPI JUMP JUMPDEST PUSH4 0x9C05499B PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x5DC2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH2 0x5DF8 PUSH2 0x1C5C JUMP JUMPDEST POP PUSH1 0xE0 SHR PUSH4 0xE89341C DUP2 EQ SWAP1 PUSH4 0x1FFC9A7 PUSH4 0xD9B67A26 DUP3 EQ SWAP2 EQ OR OR SWAP1 JUMP JUMPDEST PUSH2 0x5E1F PUSH2 0x1C5C JUMP JUMPDEST POP DUP1 PUSH2 0x5E3A PUSH2 0x5E34 PUSH4 0x152A902D PUSH1 0xE1 SHL PUSH2 0x3E0 JUMP JUMPDEST SWAP2 PUSH2 0x3E0 JUMP JUMPDEST EQ SWAP1 DUP2 ISZERO PUSH2 0x5E47 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x5E51 SWAP2 POP PUSH2 0x5F2D JUMP JUMPDEST CODESIZE PUSH2 0x5E43 JUMP JUMPDEST PUSH2 0x5E5F PUSH2 0x1C5C JUMP JUMPDEST POP DUP1 PUSH2 0x5E7A PUSH2 0x5E74 PUSH4 0x5A05180F PUSH1 0xE0 SHL PUSH2 0x3E0 JUMP JUMPDEST SWAP2 PUSH2 0x3E0 JUMP JUMPDEST EQ SWAP1 DUP2 ISZERO PUSH2 0x5E87 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x5E91 SWAP2 POP PUSH2 0x5F53 JUMP JUMPDEST CODESIZE PUSH2 0x5E83 JUMP JUMPDEST PUSH2 0x5E9F PUSH2 0x1C5C JUMP JUMPDEST POP DUP1 PUSH2 0x5EBA PUSH2 0x5EB4 PUSH4 0x4E821D33 PUSH1 0xE1 SHL PUSH2 0x3E0 JUMP JUMPDEST SWAP2 PUSH2 0x3E0 JUMP JUMPDEST EQ SWAP1 DUP2 ISZERO PUSH2 0x5EC7 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x5ED1 SWAP2 POP PUSH2 0x53B1 JUMP JUMPDEST CODESIZE PUSH2 0x5EC3 JUMP JUMPDEST PUSH2 0x5EF5 SWAP2 PUSH1 0x1 PUSH2 0x5EF0 SWAP3 PUSH2 0x5EE9 PUSH2 0x1C5C JUMP JUMPDEST POP ADD PUSH2 0x5A36 JUMP JUMPDEST PUSH2 0x21C9 JUMP JUMPDEST PUSH2 0x5F08 PUSH2 0x5F02 PUSH1 0x0 PUSH2 0x21D6 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST EQ ISZERO SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x5F24 PUSH2 0x5F1D PUSH2 0x5F2B SWAP4 PUSH2 0x1FA0 JUMP JUMPDEST PUSH1 0x6 PUSH2 0x1FD6 JUMP JUMPDEST PUSH1 0x7 PUSH2 0x2AD0 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x5F35 PUSH2 0x1C5C JUMP JUMPDEST POP PUSH2 0x5F4F PUSH2 0x5F49 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL PUSH2 0x3E0 JUMP JUMPDEST SWAP2 PUSH2 0x3E0 JUMP JUMPDEST EQ SWAP1 JUMP JUMPDEST PUSH2 0x5F5B PUSH2 0x1C5C JUMP JUMPDEST POP DUP1 PUSH2 0x5F76 PUSH2 0x5F70 PUSH4 0x7965DB0B PUSH1 0xE0 SHL PUSH2 0x3E0 JUMP JUMPDEST SWAP2 PUSH2 0x3E0 JUMP JUMPDEST EQ SWAP1 DUP2 ISZERO PUSH2 0x5F83 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x5F8D SWAP2 POP PUSH2 0x5E17 JUMP JUMPDEST CODESIZE PUSH2 0x5F7F JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x23 0xAF SWAP10 0xD0 SLT 0xF9 0xC0 CODECOPY PUSH22 0x49FA6D414EA97A8C70379F7B83DD92C49E8264E57F39 0xAD PUSH5 0x736F6C6343 STOP ADDMOD SHL STOP CALLER ", + "sourceMap": "399:5363:43:-:0;;;;;;;;;-1:-1:-1;399:5363:43;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;:::o;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;:::o;:::-;;:::o;:::-;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;:::o;:::-;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;:::o;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;:::i;:::-;:::o;:::-;;;-1:-1:-1;399:5363:43;;;;;:::i;:::-;;:::o;:::-;;:::i;686:18:38:-;;;;;;:::i;:::-;;:::o;399:5363:43:-;;;:::o;:::-;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;:::o;:::-;;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;:::o;:::-;;:::o;:::-;;;;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::o;347:26:39:-;;;;;:::i;:::-;;:::o;399:5363:43:-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;;;;;;;;:::o;379:46:39:-;;;;;;;;;:::i;:::-;;:::i;:::-;;:::o;399:5363:43:-;;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;:::o;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;632:41::-;;;;;;;;;:::i;:::-;;:::i;:::-;;:::o;399:5363::-;;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;:::o;:::-;;;;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::o;581:45::-;;;;;;;;;:::i;:::-;;:::i;:::-;;:::o;399:5363::-;;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;679:50::-;;;;;;;;;:::i;:::-;;:::i;:::-;;:::o;399:5363::-;;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;:::o;:::-;;;;;;;:::o;:::-;;;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;:::o;:::-;;;;:::o;:::-;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;536:38::-;;;:::o;399:5363::-;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;710:21:38:-;;;;;;:::i;:::-;;:::o;399:5363:43:-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;2153:49:0:-;2198:4;;;:::i;:::-;2153:49;:::o;:::-;;;:::i;:::-;;:::o;399:5363:43:-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;737:25:38:-;;;;;;:::i;:::-;;:::o;399:5363:43:-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;:::o;6070:334:29:-;6145:14;;:::i;:::-;6214:184;;;;;;;;;;;;6070:334;:::o;399:5363:43:-;;;:::o;5553:206::-;5644:4;;:::i;:::-;5667:11;;:45;;5682:30;;;5667:45;:::i;:::-;;;:::i;:::-;;:85;;;;;5553:206;5660:92;;:::o;5667:85::-;5716:36;5740:11;;5716:36;:::i;:::-;5667:85;;;496:78:48;543:31;496:78;:::o;2589:76:0:-;;2657:1;2589:76;2642:4;961:18:48;;:::i;:::-;2642:4:0;:::i;:::-;2657:1;:::i;:::-;2589:76::o;877:163:48:-;;1020:12;877:163;1020:12;:::i;:::-;877:163::o;:::-;;;;;:::i;:::-;:::o;599:80:38:-;647:32;599:80;:::o;2589:76:0:-;2657:1;2589:76;2642:4;2638:19:38;;:::i;:::-;2642:4:0;:::i;:::-;2657:1;:::i;:::-;2589:76::o;399:5363:43:-;;;;;;;:::o;:::-;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;:::o;:::-;;:::o;:::-;;;;;;;;:::i;:::-;;:::i;:::-;;;;;:::i;:::-;;;:::o;:::-;;;;;:::i;:::-;;;:::i;:::-;:::o;:::-;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::o;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;:::o;2556:136:38:-;2669:16;2556:136;2669:16;;:::i;:::-;2556:136::o;:::-;;;;:::i;:::-;:::o;514:91:50:-;568:37;514:91;:::o;2589:76:0:-;2657:1;2589:76;2642:4;1115:25:50;;:::i;:::-;2642:4:0;:::i;:::-;2657:1;:::i;:::-;2589:76::o;399:5363:43:-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;1030:179:50:-;1165:37;1152:50;1030:179;1165:37;:::i;:::-;1152:50;;:::i;:::-;1030:179::o;:::-;;;;:::i;:::-;:::o;399:5363:43:-;;;:::o;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;:::o;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;:::i;:::-;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;:::o;2000:184:38:-;2110:67;2000:184;2078:13;;:::i;:::-;2134:7;2117:59;2143:23;2134:7;2162:3;2143:23;:::i;:::-;2117:59;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;2110:67;:::i;:::-;2103:74;:::o;399:5363:43:-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;:::i;:::-;;:::o;4046:401::-;;4136:26;;:18;:12;4149:4;4136:18;;:::i;:::-;4155:6;4136:26;;:::i;:::-;;:::i;:::-;4176:10;:15;;4190:1;4176:15;:::i;:::-;;;:::i;:::-;;4172:63;;4248:30;4266:10;4256:21;4248:30;:::i;:::-;:35;;4282:1;4248:35;:::i;:::-;;;:::i;:::-;;;:65;;;;;4046:401;4244:118;;;4414:26;4378:12;4371:33;;4378:26;:18;:12;4391:4;4378:18;;:::i;:::-;4397:6;4378:26;;:::i;:::-;4371:33;:::i;:::-;4426:6;4414:26;4434:1;4414:26;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;4046:401::o;4244:118::-;4336:15;;;;;;;;;;;;:::i;:::-;;;;4248:65;4287:12;;:26;;:12;4303:10;4287:26;:::i;:::-;;;:::i;:::-;;;4248:65;;;4172:63;4214:10;;;;;;;;;;;;:::i;:::-;;;;3571:151:38;3707:7;3571:151;3685:10;3697:8;3707:7;;;:::i;:::-;3571:151::o;399:5363:43:-;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;4504:129:0:-;4604:22;:12;:22;4504:129;4578:7;;:::i;:::-;4604:6;;:12;:::i;:::-;:22;;:::i;:::-;4597:29;:::o;399:5363:43:-;;;:::o;:::-;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;;:::o;:::-;;;;:::o;:::-;;;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;:::o;:::-;;:::i;1671:428:12:-;1823:26;1794:55;1671:428;;;;1766:7;;:::i;:::-;1775;;;:::i;:::-;1823:17;;:26;:::i;:::-;1794:55;:::i;:::-;1864:7;:16;;:7;:16;;:::i;:::-;:30;;1884:10;1892:1;1884:10;:::i;:::-;1864:30;:::i;:::-;;;:::i;:::-;;1860:90;;1671:428;2060:16;1984:57;1985:35;2060:16;1985:9;:35;1997:23;;:7;:23;;:::i;:::-;1985:35;:::i;:::-;;;:::i;:::-;1984:57;2024:17;;:::i;:::-;1984:57;:::i;:::-;;;:::i;:::-;2060:7;:16;;:::i;:::-;2052:40;;:::o;1860:90::-;1920:19;;2060:16;;1984:57;1985:35;1910:29;1920:19;1910:29;:::i;:::-;1860:90;;;;;;;;399:5363:43;;;;;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::o;12785:5890:29:-;;;;;;;;;;12990:25;;:::i;:::-;12986:106;;12785:5890;13144:3349;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12785:5890;13144:3349;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16506:24;;:::i;:::-;16502:112;;13144:3349;16666:2003;;;;;13144:3349;12785:5890;;;;;;;:::o;16666:2003::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16502:112;16598:4;16574;;16580:2;;16584:3;;;;16589:7;;16598:4;;;;;;:::i;:::-;16502:112;;;13144:3349;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12986:106;13031:50;13062:3;;13031:50;13067:7;;13076:4;13031:50;13076:4;;;13031:50;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;12986:106;;2589:76:0;;2657:1;2589:76;2642:4;5012:18;5025:4;5012:18;:::i;:::-;2642:4;:::i;:::-;2657:1;:::i;:::-;2589:76::o;4929:145::-;;5059:7;4929:145;5059:7;:::i;:::-;4929:145::o;:::-;;;;;:::i;:::-;:::o;399:5363:43:-;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;6038:214:0;;6237:7;6038:214;6125:83;6133:7;:23;;6144:12;;:::i;:::-;6133:23;:::i;:::-;;;:::i;:::-;;6125:83;:::i;:::-;6237:7;:::i;:::-;6038:214::o;399:5363:43:-;;;:::o;18822:1021:29:-;;;;;18958:25;;:::i;:::-;19042:795;;;;;;;;;;;;;;;;;;;;;;;;;;18822:1021;;;;:::o;19042:795::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;457:72:43;501:28;457:72;:::o;2589:76:0:-;;2657:1;2589:76;;2642:4;1810:15:43;;:::i;:::-;2642:4:0;:::i;:::-;2657:1;:::i;:::-;2589:76::o;399:5363:43:-;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;;;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;1713:240::-;1913:33;1713:240;;1837:32;1913:23;1713:240;1837:18;:10;1848:6;1837:18;;:::i;:::-;:32;:::i;:::-;1879:24;1896:7;1879:14;:6;1886;1879:14;;:::i;:::-;:24;:::i;:::-;1913:15;;:23;:::i;:::-;:33;:::i;:::-;1713:240::o;:::-;;;;;;:::i;:::-;:::o;4486:178::-;;4604:27;4486:178;4559:17;;:::i;:::-;4618:4;4604:27;:::i;:::-;4588:43;;4641:16;:::o;2589:76:0:-;;2657:1;2589:76;;2642:4;1593:18:48;;:::i;:::-;2642:4:0;:::i;:::-;2657:1;:::i;:::-;2589:76::o;1464:215:48:-;;1659:12;1464:215;1649:8;1659:12;;;:::i;:::-;1464:215::o;:::-;;;;;;:::i;:::-;:::o;369:64:41:-;409:24;369:64;:::o;2589:76:0:-;;2657:1;2589:76;;;2642:4;2003:11:41;;:::i;:::-;2642:4:0;:::i;:::-;2657:1;:::i;:::-;2589:76::o;1907:158:41:-;;2053:4;1907:158;;2045:6;2053:4;;;:::i;:::-;1907:158::o;:::-;;;;;;;:::i;:::-;:::o;2589:76:0:-;2657:1;2589:76;2642:4;2392:19:38;;:::i;:::-;2642:4:0;:::i;:::-;2657:1;:::i;:::-;2589:76::o;2304:148:38:-;2423:22;2304:148;2423:22;;:::i;:::-;2304:148::o;:::-;;;;:::i;:::-;:::o;1028:646:43:-;;1636:21;1028:646;;;;;;;1395:5;1378:15;;:::i;:::-;1395:5;;;:::i;:::-;1460:9;1483:12;1509:16;1539:15;1568:19;1601:21;1636;;;:::i;:::-;1028:646::o;399:5363::-;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;:::o;1431:151:1:-;;1547:21;:18;:28;1431:151;1521:7;;:::i;:::-;1547:12;;:18;:::i;:::-;:21;:::i;:::-;:28;:::i;:::-;1540:35;:::o;399:5363:43:-;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;3021:145:0:-;3130:29;3021:145;3130:20;:12;:29;3021:145;3107:4;;:::i;:::-;3130:6;;:12;:::i;:::-;:20;:29;:::i;:::-;;:::i;:::-;3123:36;:::o;2589:76::-;2657:1;2589:76;2642:4;2989:19:38;;:::i;:::-;2642:4:0;:::i;:::-;2657:1;:::i;:::-;2589:76::o;2901:156:38:-;3020:30;2901:156;3020:30;;:::i;:::-;2901:156::o;:::-;;;;:::i;:::-;:::o;399:5363:43:-;;;;;;;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;:::o;:::-;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;:::i;:::-;;;:::o;:::-;;;;:::o;:::-;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;:::i;:::-;:::o;:::-;;;:::i;:::-;;;;;;;;1171:295:27;;;1398:63;1171:295;1319:7;;:::i;:::-;1398:10;:30;:10;;;:::i;:::-;:30;:::i;:::-;:63;:30;1429:6;1437:11;1450:10;1398:63;1450:10;;;:::i;:::-;1398:63;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;1171:295;1391:70;;:::o;1398:63::-;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;:::i;7020:720:29:-;;7150:584;;;;;;;;;;;;;;;;;;;;;;;;;;;7020:720::o;3253:113:38:-;3352:6;3253:113;3331:10;3343:7;3352:6;;;:::i;:::-;3253:113::o;2589:76:0:-;;2657:1;2589:76;;;2642:4;2458:11:41;;:::i;:::-;2642:4:0;:::i;:::-;2657:1;:::i;:::-;2589:76::o;2299:228:41:-;;2515:4;2299:228;;2506:7;2515:4;;;:::i;:::-;2299:228::o;:::-;;;;;;;:::i;:::-;:::o;1750:140:1:-;1856:25;:18;:27;1750:140;1830:7;;:::i;:::-;1856:12;;:18;:::i;:::-;:25;:::i;:::-;:27;:::i;:::-;1849:34;:::o;2589:76:0:-;;2657:1;2589:76;2642:4;5438:18;5451:4;5438:18;:::i;:::-;2642:4;:::i;:::-;2657:1;:::i;:::-;2589:76::o;5354:147::-;;5486:7;5354:147;5486:7;:::i;:::-;5354:147::o;:::-;;;;;:::i;:::-;:::o;399:5363:43:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;:::o;:::-;;:::o;:::-;;;;;;;:::i;:::-;;;:::o;:::-;;;;:::o;:::-;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;:::o;:::-;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;:::o;:::-;;:::o;:::-;;;;;;;:::o;:::-;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;:::-;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;:::o;:::-;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::o;:::-;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;:::-;;;;;;;:::o;:::-;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::o;2333:1674::-;;2652:54;2651:55;2333:1674;2652:54;2333:1674;;;2539:27;2553:4;2559:6;2539:27;;:::i;:::-;2496:70;;;2602:34;2624:11;2602:34;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;2592:45;;;;:::i;:::-;;;:::i;:::-;;2674:5;;2681:18;;:10;2692:6;2681:18;;:::i;:::-;;:::i;:::-;2701:4;2652:54;;:::i;:::-;;:::i;:::-;2651:55;;:::i;:::-;2647:107;;2897:92;2771:12;2764:33;;2771:26;:18;:12;;;;;2784:4;2771:18;;:::i;:::-;2790:6;2771:26;;:::i;:::-;2764:33;:::i;:::-;2807:25;:23;:15;2823:6;2807:23;;:::i;:::-;:25;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;2897:38;2938:51;2957:23;;:15;2973:6;2957:23;;:::i;:::-;;:::i;:::-;2982:6;2938:51;;:::i;:::-;2897:17;:25;:17;2915:6;2897:25;;:::i;:::-;:38;:::i;:::-;:92;:::i;:::-;3005:9;;:::i;:::-;3000:965;3005:9;3016:1;:37;;3020:33;:26;:11;:26;;;;;:::i;:::-;:33;;:::i;:::-;3016:37;:::i;:::-;;;:::i;:::-;;;;;3090:29;;:26;:11;:26;;;;;:::i;:::-;3117:1;3090:29;;:::i;:::-;;:::i;:::-;3161:11;3133:51;3161:23;:20;:11;:20;;;;;:::i;:::-;3182:1;3161:23;;:::i;:::-;3133:51;;:::i;:::-;3202:11;:23;;:20;:11;:20;;;;;:::i;:::-;3223:1;3202:23;;:::i;:::-;;:::i;:::-;3198:698;;;;3250:9;;:::i;:::-;;3261:1;:19;;3265:15;:8;:15;:::i;:::-;3261:19;:::i;:::-;;;:::i;:::-;;;;;3305:37;:32;3327:9;3305:32;:::i;:::-;:37;:::i;:::-;;;3343:4;3349:11;;:8;3358:1;3349:11;;:::i;:::-;;:::i;:::-;3305:56;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;3419:3;3305:56;;;3250:9;3419:3;;:::i;:::-;3250:9;;3305:56;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;:::i;3261:19::-;;;;;;3937:3;3261:19;;;3198:698;3937:3;:::i;:::-;3005:9;;;;;3198:698;3575:4;;;;;;3601:13;;:27;;3618:10;3626:1;3618:10;:::i;:::-;3601:27;:::i;:::-;;;:::i;:::-;;;:49;;;3198:698;3597:114;;3198:698;3788:43;:33;3754:16;;3765:4;3754:16;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;3811:9;3788:33;:::i;:::-;:43;:::i;:::-;;3832:2;3836:8;3846:11;:22;:19;:11;:19;;;;;:::i;:::-;3866:1;3846:22;;:::i;:::-;3870:10;;3788:93;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;3937:3;3788:93;;;3198:698;;;;3788:93;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;:::i;3597:114::-;3679:13;;;3597:114;;;3601:49;3632:10;;:18;;3646:4;3632:18;:::i;:::-;;;:::i;:::-;;;3601:49;;3016:37;;;;;3993:6;3980:20;;;;;:::i;:::-;;;;;;:::i;:::-;;;;2333:1674::o;2647:107::-;2729:14;;;;;;;;;;;;:::i;:::-;;;;6495:386:29;6615:11;;:::i;:::-;6685:190;;;;;;;;;;;;6495:386;:::o;2589:76:0:-;2657:1;2589:76;2642:4;1486:25:50;;:::i;:::-;2642:4:0;:::i;:::-;2657:1;:::i;:::-;2589:76::o;1401:151:50:-;1523:22;1401:151;1523:22;;:::i;:::-;1401:151::o;:::-;;;;:::i;:::-;:::o;8225:4012:29:-;;;;;8401:25;;:::i;:::-;8397:122;;8225:4012;8571:2095;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8225:4012;8571:2095;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10679:24;;:::i;:::-;10675:120;;8225:4012;10847:1384;;;;8225:4012;;;;;;;:::o;10847:1384::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10675:120;10749:11;10757:2;10749:11;:::i;:::-;;10762:15;10770:6;10762:15;:::i;:::-;;10719:65;10779:4;;10719:65;;:::i;:::-;;10675:120;;8571:2095;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8397:122;8473:11;8481:2;8473:11;:::i;:::-;;8486:15;8494:6;8486:15;:::i;:::-;;8442:66;8503:4;;8442:66;;:::i;:::-;;8397:122;;399:5363:43;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;:::o;:::-;;:::i;1992:302::-;2061:32;;:24;:12;2074:10;2061:24;;:::i;:::-;2086:6;2061:32;;:::i;:::-;;:::i;:::-;:37;;2097:1;2061:37;:::i;:::-;;;:::i;:::-;;2057:90;;2156:28;2162:10;2174:6;2156:28;2182:1;2156:28;:::i;:::-;;;:::i;:::-;2194:51;2229:16;:12;:16;2244:1;2229:16;:::i;:::-;;;:::i;:::-;2194:32;:24;:12;2207:10;2194:24;;:::i;:::-;2219:6;2194:32;;:::i;:::-;:51;:::i;:::-;2268:10;2261:26;;;;;:::i;:::-;;;;:::i;:::-;;;;;;:::i;:::-;;;;1992:302::o;2057:90::-;2121:15;4336;;;2121;;;;;;;;:::i;:::-;;;;2681:305:41;2798:4;;:::i;:::-;2821:40;;;;:55;;2865:11;2821:55;:::i;:::-;;;:::i;:::-;;:118;;;;2681:305;2821:158;;;;;2681:305;2814:165;;:::o;2821:158::-;2943:36;2967:11;;2943:36;:::i;:::-;2821:158;;;:118;2927:11;2892:47;2927:11;2892:47;:::i;:::-;2821:118;;3460:103:0;3543:12;3460:103;3543:12;;:::i;:::-;;;:::i;:::-;3460:103::o;399:5363:43:-;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;:::o;:::-;;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;:::i;:::-;:::o;:::-;;;;;:::i;:::-;:::o;2730:327:12:-;;3015:35;2993:57;2730:327;2824:88;2832:12;:33;;2848:17;;:::i;:::-;2832:33;:::i;:::-;;;:::i;:::-;;;2824:88;:::i;:::-;2922:60;2930:8;:22;;2942:10;2950:1;2942:10;:::i;:::-;2930:22;:::i;:::-;;;:::i;:::-;;;2922:60;:::i;:::-;3037:12;3015:35;;;:::i;:::-;;;;;;:::i;:::-;;;;;:::i;:::-;2993:57;;:::i;:::-;2730:327::o;6111:1560:31:-;;6167:20;;:::i;:::-;6242:1423;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6111:1560::o;678:228:39:-;872:27;678:228;;823:5;872:27;678:228;872:16;678:228;809:3;;814:7;823:5;;;:::i;:::-;840:22;;855:7;840:22;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;872:11;;:16;:::i;:::-;:27;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;678:228::o;399:5363:43:-;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;:::o;:::-;;:::i;2455:557:39:-;2606:8;2455:557;;;;2600:4;2606:8;;;:::i;:::-;2642:11;:4;:11;:::i;:::-;2685:1;2663:23;2685:1;2663:23;:::i;:::-;2701:9;;;:::i;:::-;2696:274;2701:9;2712:1;:9;;2716:5;2712:9;:::i;:::-;;;:::i;:::-;;;;;2824:21;2942:3;2755:8;:11;;:8;2764:1;2755:11;;:::i;:::-;;:::i;:::-;2780:30;2804:6;2780:30;:20;2804:6;2792:7;;2804:6;2780:11;;2792:4;:7;:::i;:::-;;:::i;:::-;2780:20;;:::i;:::-;:30;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;2824:21;;:::i;:::-;2942:3;;:::i;:::-;2701:9;;;2712;;;;;2979:26;2712:9;;2979:26;2712:9;;2979:26;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;2455:557::o;399:5363:43:-;;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;2374:95:12:-;2432:6;;:::i;:::-;2457:5;2450:12;2457:5;2450:12;:::i;:::-;;:::o;41921:101:29:-;41987:4;;:::i;:::-;42010:5;;42003:12;:::o;42664:100::-;42729:4;;:::i;:::-;42752:5;;42745:12;:::o;43666:310::-;;;;;;;;43870:24;;:::i;:::-;43866:104;;43666:310;;;;;;;:::o;43866:104::-;43910:49;;43940:3;43910:49;43940:3;;43945:7;;43954:4;;43910:49;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;43866:104;;;;;;;;1978:166:1;;2106:22;:18;:31;1978:166;2088:7;2082:4;2088:7;;;:::i;:::-;2106:12;:18;:::i;:::-;:22;:::i;:::-;:31;:::i;:::-;;1978:166::o;640:96:14:-;693:7;;:::i;:::-;719:10;;712:17;:::o;2233:171:1:-;;2363:25;:18;:34;2233:171;2345:7;2339:4;2345:7;;;:::i;:::-;2363:12;:18;:::i;:::-;:25;:::i;:::-;:34;:::i;:::-;;2233:171::o;399:5363:43:-;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;:::o;:::-;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;:::o;:::-;;:::i;4670:672::-;;;;4746:17;;:::i;:::-;4765;;;:::i;:::-;4798:15;:23;;:15;4814:6;4798:23;;:::i;:::-;;:::i;:::-;:28;;4825:1;4798:28;:::i;:::-;;;:::i;:::-;;4794:82;;4907:26;;:18;:12;4920:4;4907:18;;:::i;:::-;4926:6;4907:26;;:::i;:::-;;:::i;:::-;4947:10;:15;;4961:1;4947:15;:::i;:::-;;;:::i;:::-;;4943:63;;5035:21;5078:9;5070:18;5078:9;5070:18;:::i;:::-;:23;;5092:1;5070:23;:::i;:::-;;;:::i;:::-;;5066:76;;5164:47;:73;5193:9;5182:27;5259:37;5193:9;5182:27;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;5172:38;;;;:::i;:::-;;;:::i;:::-;;5164:47;:::i;:::-;5214:23;;:15;5230:6;5214:23;;:::i;:::-;;:::i;:::-;5164:73;;:::i;:::-;5278:9;;5259:37;:::i;:::-;5306:29;:::o;5066:76::-;5116:15;;;;;;;;;;;;:::i;:::-;;;;4943:63;4985:10;4214;;;4985;;;;;;;;:::i;:::-;;;;4794:82;4849:16;;;;;;;;;;;;:::i;:::-;;;;399:5363;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;3491:351:12;3771:26;3491:351;3800:35;3771:64;3491:351;;3600:88;3608:12;:33;;3624:17;;:::i;:::-;3608:33;:::i;:::-;;;:::i;:::-;;;3600:88;:::i;:::-;3698:62;3706:8;:22;;3718:10;3726:1;3718:10;:::i;:::-;3706:22;:::i;:::-;;;:::i;:::-;;;3698:62;:::i;:::-;3822:12;3800:35;;;:::i;:::-;;;;;;:::i;:::-;;;;;:::i;:::-;3771:17;:26;:::i;:::-;:64;:::i;:::-;3491:351::o;1057:590:41:-;;;1634:5;1057:590;1579:19;1057:590;;;1502:21;1057:590;1429:5;1436:9;1447:12;1461:16;1479:21;1502;;;:::i;:::-;1579:19;:::i;:::-;1621:11;;:::i;:::-;1634:5;:::i;:::-;1057:590::o;399:5363:43:-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;9563:156:22:-;9679:31;9687:22;9663:49;9563:156;9687:22;9691:10;9671:40;9563:156;9637:7;;:::i;:::-;9691:3;:10;9687:22;:::i;:::-;;:::i;:::-;9679:31;:::i;:::-;9671:40;:::i;:::-;9663:49;:::i;:::-;9656:56;:::o;2000:205:39:-;2171:16;:27;2000:205;2120:7;2171:27;2000:205;2115:3;2120:7;;;:::i;:::-;2139:22;;2154:7;2139:22;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;2171:11;;:16;:::i;:::-;:27;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;2000:205::o;1177:618::-;;1392:5;1177:618;;;;1376:4;;1382:8;1392:5;;;:::i;:::-;1425:11;:4;:11;:::i;:::-;1468:1;1446:23;1468:1;1446:23;:::i;:::-;1484:9;;;:::i;:::-;;1495:1;:9;;1499:5;1495:9;:::i;:::-;;;:::i;:::-;;;;;1725:3;1538:8;1598:30;1563:21;1538:11;;:8;1547:1;1538:11;;:::i;:::-;;:::i;:::-;1578:6;;1563:21;;:::i;:::-;1622:6;1598:30;:20;:11;1610:7;;:4;1615:1;1610:7;;:::i;:::-;;:::i;:::-;1598:20;;:::i;:::-;:30;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;1725:3;:::i;:::-;1484:9;;1495;;;;;1762:26;1495:9;;1762:26;1495:9;1762:26;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;1177:618::o;9106:115:22:-;9195:19;9203:10;9195:19;9106:115;9169:7;;:::i;:::-;9203:3;:10;9195:19;:::i;:::-;;:::i;:::-;9188:26;:::o;917:1384:32:-;;;;1032:12;;:::i;:::-;1103:1192;;;;;917:1384;1103:1192;;917:1384;:::o;1103:1192::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5348:199:43;;5465:32;:25;:32;5348:199;5430:7;;:::i;:::-;5465:17;;:25;:::i;:::-;5491:5;5465:32;;:::i;:::-;;:::i;:::-;5514:5;:10;;5523:1;5514:10;:::i;:::-;;;:::i;:::-;;:26;;;;5527:5;5514:26;5507:33;:::o;5514:26::-;5535:5;;5514:26;;48030:303:29;;48080:23;;:::i;:::-;48158:169;;;;;;;;;;;;;;;;48030:303::o;3876:366:38:-;4040:4;;:::i;:::-;4095:11;4063:44;4095:11;4063:44;:::i;:::-;:96;;;;3876:366;4063:172;;;;;3876:366;4056:179;;:::o;4063:172::-;4175:60;4223:11;;4175:60;:::i;:::-;4063:172;;;:96;4147:11;4111:48;4147:11;4111:48;:::i;:::-;4063:96;;399:5363:43;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;:::o;3844:479:0:-;;3931:23;3932:22;3940:4;3946:7;3932:22;;:::i;:::-;3931:23;;:::i;:::-;3927:390;;3844:479;;:::o;3927:390::-;3970:336;4135:7;4022:252;4214:38;4234:13;4115:28;3994:298;4135:7;4115:28;:::i;:::-;4242:4;4234:13;:::i;:::-;4214:38;4249:2;4214:38;:::i;:::-;;;:::i;:::-;4022:252;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;3994:298;:::i;:::-;3970:336;;:::i;:::-;399:5363:43;;;;;;3970:336:0;;;;;;:::i;:::-;;;;21034:1574:29;;;;;21139:25;;:::i;:::-;21135:128;;21034:1574;21315:1067;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22395:24;;:::i;:::-;22391:126;;21034:1574;22530:12;22539:2;22530:12;:::i;:::-;22526:75;;21034:1574;;;;;:::o;22526:75::-;22596:4;22576:1;22568:10;22576:1;22568:10;:::i;:::-;22580:2;22584;22588:6;22596:4;;;:::i;:::-;22526:75;;;;;;22391:126;22471:11;22479:2;22471:11;:::i;:::-;;22484:15;22492:6;22484:15;:::i;:::-;;22391:126;;21315:1067;;;;;;;;;;;;;;21135:128;21217:11;21225:2;21217:11;:::i;:::-;;21230:15;21238:6;21230:15;:::i;:::-;;21135:128;;28229:178;;;28392:7;28229:178;28369:10;28377:1;28369:10;:::i;:::-;28381:4;28387:3;28392:7;;;:::i;:::-;28229:178::o;399:5363:43:-;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;7587:233:0:-;7669:23;7670:22;7678:4;7684:7;7670:22;;:::i;:::-;7669:23;;:::i;:::-;7665:149;;7587:233;;;:::o;7665:149::-;7708:36;7740:4;7708:29;:20;:12;:6;7715:4;7708:12;;:::i;:::-;:20;7729:7;7708:29;;:::i;:::-;:36;:::i;:::-;7781:7;7790:12;;:::i;:::-;7763:40;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;:::i;:::-;;;;;:::i;:::-;;;;7665:149;;;;399:5363:43;;;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;8305:150:22:-;;8398:50;8415:32;8423:23;8431:14;8403:10;8398:50;8305:150;8375:4;;:::i;:::-;8403:3;:10;8439:5;8431:14;:::i;:::-;8423:23;:::i;:::-;8415:32;:::i;:::-;8398:50;;:::i;:::-;;:::i;:::-;8391:57;:::o;7991:234:0:-;8074:22;8082:4;8088:7;8074:22;;:::i;:::-;8070:149;;7991:234;;;:::o;8070:149::-;8112:37;8144:5;8112:29;:20;:12;:6;8119:4;8112:12;;:::i;:::-;:20;8133:7;8112:29;;:::i;:::-;:37;:::i;:::-;8186:7;8195:12;;:::i;:::-;8168:40;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;:::i;:::-;;;;;:::i;:::-;;;;8070:149;;;;8623:156:22;;8719:53;8739:32;8747:23;8755:14;8727:10;8719:53;8623:156;8696:4;;:::i;:::-;8727:3;:10;8763:5;8755:14;:::i;:::-;8747:23;:::i;:::-;8739:32;:::i;:::-;8719:53;;:::i;:::-;;:::i;:::-;8712:60;:::o;1241:694:38:-;;;;;1501:12;;;:::i;:::-;1497:73;;1606:22;1638:30;1587:9;1580:16;1876:21;1587:9;1580:16;;:::i;:::-;1606:22;;:::i;:::-;1638:30;;:::i;:::-;1710:5;1690:18;;:::i;:::-;1710:5;;;:::i;:::-;1757;1737:18;;:::i;:::-;1757:5;;;:::i;:::-;1805;1784:19;;:::i;:::-;1805:5;;;:::i;:::-;1853:21;1876;;;:::i;:::-;1909:19;1924:4;1909:19;;:::i;:::-;1241:694::o;1497:73::-;1536:23;;;;;;;;;;;;:::i;:::-;;;;399:5363:43;;;:::o;:::-;;;;;;;:::o;:::-;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;:::o;:::-;;:::i;4912:118:22:-;5005:18;4912:118;5005:11;:18;4912:118;4979:7;;:::i;:::-;5005:3;:11;:18;:::i;:::-;;;:::i;:::-;4998:25;:::o;26059:126:29:-;;;26171:6;26059:126;26149:10;26157:1;26149:10;:::i;:::-;26161:4;26167:2;26171:6;;;:::i;:::-;26059:126::o;22985:2719::-;;;;;23153:25;;:::i;:::-;23149:112;;22985:2719;23313:2174;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25500:24;;:::i;:::-;25496:110;;23313:2174;25619:12;25628:2;25619:12;:::i;:::-;25615:82;;23313:2174;22985:2719;;;;:::o;25615:82::-;25692:4;25670:1;25662:10;25670:1;25662:10;:::i;:::-;25674:2;25678:3;25683:7;25692:4;;;:::i;:::-;25615:82;;;;;;25496:110;;;23313:2174;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23149:112;;;4463:107:22;4545:11;:18;4463:107;4519:7;;:::i;:::-;4545:3;:11;:18;:::i;:::-;4538:25;:::o;3166:234:39:-;3274:4;;:::i;:::-;3297:41;;;;:56;;3342:11;3297:56;:::i;:::-;;;:::i;:::-;;:96;;;;;3166:234;3290:103;;:::o;3297:96::-;3357:36;3381:11;;3357:36;:::i;:::-;3297:96;;;1833:366:48;1966:4;;:::i;:::-;2015:11;1989:38;2015:11;1989:38;:::i;:::-;:96;;;;1833:366;1989:163;;;;1833:366;1989:203;;;;;1833:366;1982:210;;:::o;1989:203::-;2156:36;2180:11;;2156:36;:::i;:::-;1989:203;;;:163;2101:36;;:51;;2141:11;2101:51;:::i;:::-;;;:::i;:::-;;1989:163;;:96;2073:11;2031:54;2073:11;2031:54;:::i;:::-;1989:96;;1586:295:50;1731:4;;:::i;:::-;1808:11;1766:54;1808:11;1766:54;:::i;:::-;:108;;;;;1586:295;1747:127;;:::o;1766:108::-;1824:50;1862:11;;1824:50;:::i;:::-;1766:108;;;399:5363:43;;:::o;:::-;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;302:43:17:-;343:2;;;:::i;:::-;302:43;:::o;343:2::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;2407:149::-;2509:22;2517:13;2497:52;2407:149;2465:13;;:::i;:::-;2525:4;2517:13;:::i;:::-;2509:22;:::i;:::-;2497:52;2533:15;;:::i;:::-;2497:52;:::i;:::-;;;:::i;:::-;2490:59;:::o;399:5363:43:-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;;;:::o;:::-;;;;:::o;:::-;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;:::o;:::-;;;;;:::o;:::-;;;;;:::i;:::-;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;:::o;:::-;;;;;:::o;242:54:17:-;278:18;;:::i;:::-;242:54;:::o;278:18::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;399:5363:43;;;278:18:17;;;;;;;;:::i;:::-;;;;1818:437;;;1893:13;;:::i;:::-;1950:1;2042:14;:10;1940:25;1950:14;:10;:1;:10;1954:6;1950:10;;:::i;:::-;;:::i;:::-;:14;1963:1;1950:14;:::i;:::-;;;:::i;:::-;1940:25;:::i;:::-;1975:15;;;:::i;:::-;;:6;:15;1982:1;1975:15;;;;;:::i;:::-;;;:::i;:::-;;2000;;:::i;:::-;;:6;:15;2007:1;2000:15;;;;;:::i;:::-;;;:::i;:::-;;2042:10;:1;:10;:::i;:::-;;:::i;:::-;:14;2055:1;2042:14;:::i;:::-;;;:::i;:::-;2025:128;2065:3;2058:1;:5;;2062:1;2058:5;:::i;:::-;;;:::i;:::-;;;;;2096:8;;:::i;:::-;2105:5;:11;2113:3;2105:11;:::i;:::-;;2096:21;;;;;;;;2131:11;2096:21;2065:3;2096:21;;;:::i;:::-;2084:33;:6;2091:1;;2084:33;;;;;:::i;:::-;;2131:11;2141:1;2131:11;:::i;:::-;;;:::i;:::-;2065:3;;:::i;:::-;2030:26;;;2096:21;;:::i;2058:5::-;2234:14;2058:5;;;2162:55;2058:5;2170:10;;2179:1;2170:10;:::i;:::-;;;:::i;:::-;;2162:55;:::i;:::-;2234:14;:::i;:::-;2227:21;:::o;44043:212:29:-;44094:11;;:::i;:::-;44160:89;;44043:212;:::o;44416:1433::-;;;44629:1214;44416:1433;44629:1214;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44416:1433;44629:1214;;;;;;;;;;;;;;;44416:1433;44629:1214;;;;;;;;44416:1433::o;44629:1214::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28780:2807;;;;;28925:25;;:::i;:::-;28921:112;;28780:2807;29085:2377;;;;;;;;;;;;;;;;;;;;;;;;;;;28780:2807;29085:2377;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31475:24;;:::i;:::-;31471:110;;29085:2377;28780:2807::o;31471:110::-;31515:55;;:::i;:::-;;31471:110;;29085:2377;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28921:112;28966:56;;:::i;:::-;;28921:112;;399:5363:43;;:::o;:::-;;;;;;;:::o;:::-;;;:::o;:::-;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;:::i;:::-;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;:::o;:::-;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;:::o;2214:404:22:-;2277:4;;:::i;:::-;2308:3;2297:22;2298:21;2308:3;2313:5;2298:21;;:::i;:::-;2297:22;;:::i;:::-;2293:319;;;;2493:19;:40;2335:3;:23;:16;:11;:3;:11;:16;:::i;:::-;2352:5;2335:23;;:::i;:::-;2493:12;2515:18;:11;:3;:11;:18;:::i;:::-;2493:3;:12;:19;:::i;:::-;:40;:::i;:::-;2554:4;2547:11;:::o;2293:319::-;2596:5;;;2589:12;:::o;399:5363:43:-;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;:::o;:::-;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;:::o;:::-;;:::i;2786:1388:22:-;2852:4;;:::i;:::-;2989:3;:19;;:12;:3;:12;3002:5;2989:19;;:::i;:::-;;:::i;:::-;3023:10;;:15;;3037:1;3023:15;:::i;:::-;;;:::i;:::-;;;3019:1149;;;;4062:26;3416:10;4069:12;:19;3416:10;;:14;4062:26;3416:10;:14;3429:1;3416:14;:::i;:::-;;;:::i;:::-;3464:22;:18;:3;;:11;:18;:::i;:::-;:22;3485:1;3464:22;:::i;:::-;;;:::i;:::-;3505:9;:26;;3518:13;3505:26;:::i;:::-;;;:::i;:::-;;3501:398;;3019:1149;3977:3;;;:15;;:3;;:11;:15;:::i;:::-;;:::i;:::-;4069:12;:19;:::i;:::-;4062:26;:::i;:::-;4110:4;4103:11;:::o;3501:398::-;3805:36;3571:3;3693:38;3571:22;;3805:23;3571:3;;;:11;:22;:::i;:::-;;;:::i;:::-;3722:9;3693:26;3722:9;3693:3;;;:11;:26;:::i;:::-;:38;;:::i;:::-;3805:3;;;:12;:23;:::i;:::-;:36;:::i;:::-;3501:398;;;;;3019:1149;4152:5;;;;4145:12;:::o;612:218:50:-;;755:5;813:9;612:218;;728:25;;:::i;:::-;755:5;:::i;:::-;813:9;:::i;:::-;612:218::o;26498:1652:29:-;;;;;26598:25;;:::i;:::-;26594:128;;26498:1652;26774:1235;;;;;;;;;;;;;;;;;;;;;26498:1652;26774:1235;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28022:24;;:::i;:::-;28018:126;;26498:1652;;;:::o;28018:126::-;28100:11;28113:15;28108:2;28100:11;:::i;:::-;;28113:15;:::i;:::-;;28062:71;;:::i;:::-;;28018:126;;;;26774:1235;;;;;;;;;;;;;;;;;;;;;;;;;;;26594:128;26678:11;26686:2;26678:11;:::i;:::-;;26691:15;26699:6;26691:15;:::i;:::-;;26639:72;;:::i;:::-;;26594:128;;46015:1949;;;46253:1705;46015:1949;46253:1705;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46015:1949;46253:1705;;;;;;;;46015:1949::o;46253:1705::-;;;;;;;;;;;;;;;;;;;20052:385;20128:11;;:::i;:::-;20194:237;;;;;;;;;;;;;;;20052:385;:::o;1408:213:12:-;1510:4;;:::i;:::-;1533:11;;:41;;1548:26;;;1533:41;:::i;:::-;;;:::i;:::-;;:81;;;;;1408:213;1526:88;;:::o;1533:81::-;1578:36;1602:11;;1578:36;:::i;:::-;1533:81;;;634:212:1;719:4;;:::i;:::-;742:11;;:57;;757:42;;;742:57;:::i;:::-;;;:::i;:::-;;:97;;;;;634:212;735:104;;:::o;742:97::-;803:36;827:11;;803:36;:::i;:::-;742:97;;;1899:210:27;1992:4;;:::i;:::-;2011:11;;:53;;2026:38;;;2011:53;:::i;:::-;;;:::i;:::-;;:93;;;;;1899:210;2004:100;;:::o;2011:93::-;2068:36;2092:11;;2068:36;:::i;:::-;2011:93;;;4255:127:22;4351:19;4255:127;4351:12;:19;4255:127;4328:4;;:::i;:::-;4351:3;:12;:19;:::i;:::-;;:::i;:::-;:24;;4374:1;4351:24;:::i;:::-;;;:::i;:::-;;;4344:31;:::o;952:176:27:-;;1045:50;1058:37;1101:22;952:176;1058:37;:::i;:::-;1045:50;;:::i;:::-;1101:22;;:::i;:::-;952:176::o;829:155:18:-;914:4;;:::i;:::-;937:11;:40;;20194:237:29;952:25:18;;937:40;:::i;:::-;;;:::i;:::-;;930:47;:::o;2732:202:0:-;2817:4;;:::i;:::-;2840:11;;:47;;2855:32;;;2840:47;:::i;:::-;;;:::i;:::-;;:87;;;;;2732:202;2833:94;;:::o;2840:87::-;2891:36;2915:11;;2891:36;:::i;:::-;2840:87;;" + }, + "methodIdentifiers": { + "DEFAULT_ADMIN_ROLE()": "a217fddf", + "acceptImplicitRequest(address,(address,bytes4,bytes32,bytes32,bytes,(string,uint64)),(address,uint256,bytes,uint256,bool,bool,uint256))": "9d043a66", + "balanceOf(address,uint256)": "00fdd58e", + "balanceOfBatch(address[],uint256[])": "4e1273f4", + "baseURI()": "6c0360eb", + "batchBurn(uint256[],uint256[])": "20ec271b", + "batchMint(address,uint256[],uint256[],bytes)": "b48ab8b6", + "burn(uint256,uint256)": "b390c0ab", + "commit(uint256)": "f4f98ad5", + "contractURI()": "e8a3d485", + "erc1155Holder()": "51304683", + "getRevealIdx(address,uint256)": "5377ab8f", + "getRoleAdmin(bytes32)": "248a9ca3", + "getRoleMember(bytes32,uint256)": "9010d07c", + "getRoleMemberCount(bytes32)": "ca15c873", + "grantRole(bytes32,address)": "2f2ff15d", + "hasRole(bytes32,address)": "91d14854", + "initialize(address,string,string,string,address,uint96,address,bytes32)": "8ff83ac1", + "isApprovedForAll(address,address)": "e985e9c5", + "merkleRoot(uint256)": "3c70b357", + "mint(address,uint256,uint256,bytes)": "731133e9", + "name()": "06fdde03", + "refundPack(address,uint256)": "167a59f7", + "remainingSupply(uint256)": "47fda41a", + "renounceRole(bytes32,address)": "36568abe", + "reveal(address,(address[],bool[],uint256[][],uint256[][]),bytes32[],uint256)": "d67b333b", + "revokeRole(bytes32,address)": "d547741f", + "royaltyInfo(uint256,uint256)": "2a55205a", + "safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)": "2eb2c2d6", + "safeTransferFrom(address,address,uint256,uint256,bytes)": "f242432a", + "setApprovalForAll(address,bool)": "a22cb465", + "setBaseMetadataURI(string)": "7e518ec8", + "setContractName(string)": "0b5ee006", + "setContractURI(string)": "938e3d7b", + "setDefaultRoyalty(address,uint96)": "04634d8d", + "setImplicitModeProjectId(bytes32)": "ed4c2ac7", + "setImplicitModeValidator(address)": "0bb310de", + "setPacksContent(bytes32,uint256,uint256)": "50336a03", + "setTokenRoyalty(uint256,address,uint96)": "5944c753", + "supply(uint256)": "35403023", + "supportsInterface(bytes4)": "01ffc9a7", + "tokenSupply(uint256)": "2693ebf2", + "totalSupply()": "18160ddd", + "uri(uint256)": "0e89341c" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_erc1155Holder\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccountBalanceOverflow\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AllPacksOpened\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ArrayLengthsMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidArrayLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidCommit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoCommit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotOwnerNorApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PendingReveal\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToNonERC1155ReceiverImplementer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isApproved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"packId\",\"type\":\"uint256\"}],\"name\":\"Commit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"packId\",\"type\":\"uint256\"}],\"name\":\"Reveal\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"TransferBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TransferSingle\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"value\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"URI\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wallet\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"approvedSigner\",\"type\":\"address\"},{\"internalType\":\"bytes4\",\"name\":\"identityType\",\"type\":\"bytes4\"},{\"internalType\":\"bytes32\",\"name\":\"issuerHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"audienceHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"applicationData\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"redirectUrl\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"issuedAt\",\"type\":\"uint64\"}],\"internalType\":\"struct AuthData\",\"name\":\"authData\",\"type\":\"tuple\"}],\"internalType\":\"struct Attestation\",\"name\":\"attestation\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"delegateCall\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"onlyFallback\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"behaviorOnError\",\"type\":\"uint256\"}],\"internalType\":\"struct Payload.Call\",\"name\":\"call\",\"type\":\"tuple\"}],\"name\":\"acceptImplicitRequest\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"result\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"owners\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"}],\"name\":\"balanceOfBatch\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"balances\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"baseURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"batchBurn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"batchMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"packId\",\"type\":\"uint256\"}],\"name\":\"commit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"contractURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"erc1155Holder\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"packId\",\"type\":\"uint256\"}],\"name\":\"getRevealIdx\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"revealIdx\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"getRoleMember\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleMemberCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenBaseURI\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenContractURI\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"royaltyReceiver\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"royaltyFeeNumerator\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"implicitModeValidator\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"implicitModeProjectId\",\"type\":\"bytes32\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"merkleRoot\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"packId\",\"type\":\"uint256\"}],\"name\":\"refundPack\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"remainingSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address[]\",\"name\":\"tokenAddresses\",\"type\":\"address[]\"},{\"internalType\":\"bool[]\",\"name\":\"isERC721\",\"type\":\"bool[]\"},{\"internalType\":\"uint256[][]\",\"name\":\"tokenIds\",\"type\":\"uint256[][]\"},{\"internalType\":\"uint256[][]\",\"name\":\"amounts\",\"type\":\"uint256[][]\"}],\"internalType\":\"struct IERC1155Pack.PackContent\",\"name\":\"packContent\",\"type\":\"tuple\"},{\"internalType\":\"bytes32[]\",\"name\":\"proof\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"packId\",\"type\":\"uint256\"}],\"name\":\"reveal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"salePrice\",\"type\":\"uint256\"}],\"name\":\"royaltyInfo\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeBatchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isApproved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenBaseURI\",\"type\":\"string\"}],\"name\":\"setBaseMetadataURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"}],\"name\":\"setContractName\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenContractURI\",\"type\":\"string\"}],\"name\":\"setContractURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"feeNumerator\",\"type\":\"uint96\"}],\"name\":\"setDefaultRoyalty\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"projectId\",\"type\":\"bytes32\"}],\"name\":\"setImplicitModeProjectId\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"setImplicitModeValidator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_merkleRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_supply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"packId\",\"type\":\"uint256\"}],\"name\":\"setPacksContent\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"feeNumerator\",\"type\":\"uint96\"}],\"name\":\"setTokenRoyalty\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"supply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"tokenSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"}],\"name\":\"uri\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AccountBalanceOverflow()\":[{\"details\":\"The recipient's balance has overflowed.\"}],\"ArrayLengthsMismatch()\":[{\"details\":\"The lengths of the input arrays are not the same.\"}],\"InsufficientBalance()\":[{\"details\":\"Insufficient balance.\"}],\"NotOwnerNorApproved()\":[{\"details\":\"Only the token owner or an approved account can manage the tokens.\"}],\"TransferToNonERC1155ReceiverImplementer()\":[{\"details\":\"Cannot safely transfer to a contract that does not implement the ERC1155Receiver interface.\"}],\"TransferToZeroAddress()\":[{\"details\":\"Cannot mint or transfer to the zero address.\"}]},\"events\":{\"ApprovalForAll(address,address,bool)\":{\"details\":\"Emitted when `owner` enables or disables `operator` to manage all of their tokens.\"},\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this. _Available since v3.1._\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)\"},\"TransferBatch(address,address,address,uint256[],uint256[])\":{\"details\":\"Emitted when `amounts` of token `ids` are transferred from `from` to `to` by `operator`.\"},\"TransferSingle(address,address,address,uint256,uint256)\":{\"details\":\"Emitted when `amount` of token `id` is transferred from `from` to `to` by `operator`.\"},\"URI(string,uint256)\":{\"details\":\"Emitted when the Uniform Resource Identifier (URI) for token `id` is updated to `value`. This event is not used in the base contract. You may need to emit this event depending on your URI logic. See: https://eips.ethereum.org/EIPS/eip-1155#metadata\"}},\"kind\":\"dev\",\"methods\":{\"acceptImplicitRequest(address,(address,bytes4,bytes32,bytes32,bytes,(string,uint64)),(address,uint256,bytes,uint256,bool,bool,uint256))\":{\"params\":{\"attestation\":\"The attestation data\",\"call\":\"The call to validate\",\"wallet\":\"The wallet's address\"},\"returns\":{\"_0\":\"The hash of the implicit request if valid\"}},\"balanceOf(address,uint256)\":{\"details\":\"Returns the amount of `id` owned by `owner`.\"},\"balanceOfBatch(address[],uint256[])\":{\"details\":\"Returns the amounts of `ids` for `owners. Requirements: - `owners` and `ids` must have the same length.\"},\"batchBurn(uint256[],uint256[])\":{\"params\":{\"amounts\":\"Array of the amount to be burned\",\"tokenIds\":\"Array of token ids to burn\"}},\"batchMint(address,uint256[],uint256[],bytes)\":{\"params\":{\"amounts\":\"Amounts of tokens to mint.\",\"data\":\"Data to pass if receiver is contract.\",\"to\":\"Address to mint tokens to.\",\"tokenIds\":\"Token IDs to mint.\"}},\"burn(uint256,uint256)\":{\"params\":{\"amount\":\"Amount of tokens to burn\",\"tokenId\":\"Id of token to burn\"}},\"commit(uint256)\":{\"params\":{\"packId\":\"tokenId of pack.\"}},\"getRevealIdx(address,uint256)\":{\"params\":{\"packId\":\"tokenId of pack.\",\"user\":\"address of reward recipient.\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"getRoleMember(bytes32,uint256)\":{\"details\":\"Returns one of the accounts that have `role`. `index` must be a value between 0 and {getRoleMemberCount}, non-inclusive. Role bearers are not sorted in any particular way, and their ordering may change at any point. WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure you perform all queries on the same block. See the following https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] for more information.\"},\"getRoleMemberCount(bytes32)\":{\"details\":\"Returns the number of accounts that have `role`. Can be used together with {getRoleMember} to enumerate all bearers of a role.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"initialize(address,string,string,string,address,uint96,address,bytes32)\":{\"details\":\"This should be called immediately after deployment.\",\"params\":{\"implicitModeProjectId\":\"The implicit mode project id\",\"implicitModeValidator\":\"The implicit mode validator address\",\"owner\":\"Owner address\",\"royaltyFeeNumerator\":\"The royalty fee numerator in basis points (e.g. 15% would be 1500)\",\"royaltyReceiver\":\"Address of who should be sent the royalty payment\",\"tokenBaseURI\":\"Base URI for token metadata\",\"tokenContractURI\":\"Contract URI for token metadata\",\"tokenName\":\"Token name\"}},\"isApprovedForAll(address,address)\":{\"details\":\"Returns whether `operator` is approved to manage the tokens of `owner`.\"},\"mint(address,uint256,uint256,bytes)\":{\"params\":{\"amount\":\"Amount of tokens to mint.\",\"data\":\"Data to pass if receiver is contract.\",\"to\":\"Address to mint tokens to.\",\"tokenId\":\"Token ID to mint.\"}},\"refundPack(address,uint256)\":{\"params\":{\"packId\":\"tokenId of pack.\",\"user\":\"address of pack owner.\"}},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event.\"},\"reveal(address,(address[],bool[],uint256[][],uint256[][]),bytes32[],uint256)\":{\"params\":{\"packContent\":\"reward selected with random index.\",\"packId\":\"tokenId of pack.\",\"proof\":\"Pack contents merkle proof.\",\"user\":\"address of reward recipient.\"}},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"royaltyInfo(uint256,uint256)\":{\"details\":\"Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of exchange. The royalty amount is denominated and should be paid in that same unit of exchange.\"},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"details\":\"Transfers `amounts` of `ids` from `from` to `to`. Requirements: - `to` cannot be the zero address. - `from` must have at least `amount` of `id`. - `ids` and `amounts` must have the same length. - If the caller is not `from`, it must be approved to manage the tokens of `from`. - If `to` refers to a smart contract, it must implement {ERC1155-onERC1155BatchReceived}, which is called upon a batch transfer. Emits a {TransferBatch} event.\"},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"details\":\"Transfers `amount` of `id` from `from` to `to`. Requirements: - `to` cannot be the zero address. - `from` must have at least `amount` of `id`. - If the caller is not `from`, it must be approved to manage the tokens of `from`. - If `to` refers to a smart contract, it must implement {ERC1155-onERC1155Received}, which is called upon a batch transfer. Emits a {TransferSingle} event.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"Sets whether `operator` is approved to manage the tokens of the caller. Emits a {ApprovalForAll} event.\"},\"setBaseMetadataURI(string)\":{\"params\":{\"tokenBaseURI\":\"New base URI of token's URI\"}},\"setContractName(string)\":{\"params\":{\"tokenName\":\"New contract name\"}},\"setContractURI(string)\":{\"params\":{\"tokenContractURI\":\"New contract URI of token's URI\"}},\"setDefaultRoyalty(address,uint96)\":{\"params\":{\"feeNumerator\":\"The royalty fee numerator in basis points (e.g. 15% would be 1500)\",\"receiver\":\"Address of who should be sent the royalty payment\"}},\"setImplicitModeProjectId(bytes32)\":{\"params\":{\"projectId\":\"The project id.\"}},\"setImplicitModeValidator(address)\":{\"params\":{\"validator\":\"The validator address.\"}},\"setPacksContent(bytes32,uint256,uint256)\":{\"details\":\"Updating these values before all the packs have been opened may lead to undesirable behavior.\",\"params\":{\"_merkleRoot\":\"merkle root built from all possible pack contents.\",\"_supply\":\"total amount of packs.\",\"packId\":\"tokenId of pack.\"}},\"setTokenRoyalty(uint256,address,uint96)\":{\"params\":{\"feeNumerator\":\"The royalty fee numerator in basis points (e.g. 15% would be 1500)\",\"receiver\":\"Address of who should be sent the royalty payment\",\"tokenId\":\"The token id to set the royalty information for\"}},\"supportsInterface(bytes4)\":{\"params\":{\"interfaceId\":\"Interface id\"},\"returns\":{\"_0\":\"True if supported\"}},\"uri(uint256)\":{\"details\":\"Returns the URI for token `id`. You can either return the same templated URI for all token IDs, (e.g. \\\"https://example.com/api/{id}.json\\\"), or return a unique URI for each `id`. See: https://eips.ethereum.org/EIPS/eip-1155#metadata\"}},\"version\":1},\"userdoc\":{\"errors\":{\"AllPacksOpened()\":[{\"notice\":\"All packs opened.\"}],\"InvalidArrayLength()\":[{\"notice\":\"Invalid array input length.\"}],\"InvalidCommit()\":[{\"notice\":\"Commit expired or never made.\"}],\"InvalidInitialization()\":[{\"notice\":\"Invalid initialization error.\"}],\"InvalidProof()\":[{\"notice\":\"Invalid proof.\"}],\"NoCommit()\":[{\"notice\":\"Commit never made.\"}],\"PendingReveal()\":[{\"notice\":\"Reveal is pending.\"}]},\"events\":{\"Commit(address,uint256)\":{\"notice\":\"Emitted when a user make a commitment\"},\"Reveal(address,uint256)\":{\"notice\":\"Emitted when a reveal is successful\"}},\"kind\":\"user\",\"methods\":{\"acceptImplicitRequest(address,(address,bytes4,bytes32,bytes32,bytes,(string,uint64)),(address,uint256,bytes,uint256,bool,bool,uint256))\":{\"notice\":\"Determines if an implicit request is valid\"},\"batchBurn(uint256[],uint256[])\":{\"notice\":\"Burn tokens of given token id for each (tokenIds[i], amounts[i]) pair.\"},\"batchMint(address,uint256[],uint256[],bytes)\":{\"notice\":\"Mint tokens.\"},\"burn(uint256,uint256)\":{\"notice\":\"Allows the owner of the token to burn their tokens.\"},\"commit(uint256)\":{\"notice\":\"Commit to reveal pack content.this function burns user's pack.\"},\"getRevealIdx(address,uint256)\":{\"notice\":\"Get random reveal index.\"},\"initialize(address,string,string,string,address,uint96,address,bytes32)\":{\"notice\":\"Initialize the contract.\"},\"mint(address,uint256,uint256,bytes)\":{\"notice\":\"Mint tokens.\"},\"refundPack(address,uint256)\":{\"notice\":\"Ask for pack refund after commit expiration.this function mints a pack for the user when his commit is expired.\"},\"reveal(address,(address[],bool[],uint256[][],uint256[][]),bytes32[],uint256)\":{\"notice\":\"Reveal pack content.\"},\"setBaseMetadataURI(string)\":{\"notice\":\"Update the base URI of token's URI.\"},\"setContractName(string)\":{\"notice\":\"Update the name of the contract.\"},\"setContractURI(string)\":{\"notice\":\"Update the contract URI of token's URI.Refer to https://docs.opensea.io/docs/contract-level-metadata\"},\"setDefaultRoyalty(address,uint96)\":{\"notice\":\"Sets the royalty information that all ids in this contract will default to.\"},\"setImplicitModeProjectId(bytes32)\":{\"notice\":\"Updates the settings for implicit mode validation.Only callable by an address with the project admin role.\"},\"setImplicitModeValidator(address)\":{\"notice\":\"Updates the validator for implicit mode validation.Only callable by an address with the project admin role.\"},\"setPacksContent(bytes32,uint256,uint256)\":{\"notice\":\"Set all possible pack contents.\"},\"setTokenRoyalty(uint256,address,uint96)\":{\"notice\":\"Sets the royalty information that a given token id in this contract will use.This overrides the default royalty information for this token id\"},\"supportsInterface(bytes4)\":{\"notice\":\"Check interface support.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/tokens/ERC1155/presets/pack/ERC1155Pack.sol\":\"ERC1155Pack\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Strings.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```solidity\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```solidity\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}\\n * to enforce additional security measures for this role.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n * Overriding this function changes the behavior of the {onlyRole} modifier.\\n *\\n * Format of the revert message is described in {_checkRole}.\\n *\\n * _Available since v4.6._\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n Strings.toHexString(account),\\n \\\" is missing role \\\",\\n Strings.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * May emit a {RoleGranted} event.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n}\\n\",\"keccak256\":\"0x0dd6e52cb394d7f5abe5dca2d4908a6be40417914720932de757de34a99ab87f\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/access/AccessControlEnumerable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControlEnumerable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControlEnumerable.sol\\\";\\nimport \\\"./AccessControl.sol\\\";\\nimport \\\"../utils/structs/EnumerableSet.sol\\\";\\n\\n/**\\n * @dev Extension of {AccessControl} that allows enumerating the members of each role.\\n */\\nabstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl {\\n using EnumerableSet for EnumerableSet.AddressSet;\\n\\n mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers;\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns one of the accounts that have `role`. `index` must be a\\n * value between 0 and {getRoleMemberCount}, non-inclusive.\\n *\\n * Role bearers are not sorted in any particular way, and their ordering may\\n * change at any point.\\n *\\n * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure\\n * you perform all queries on the same block. See the following\\n * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]\\n * for more information.\\n */\\n function getRoleMember(bytes32 role, uint256 index) public view virtual override returns (address) {\\n return _roleMembers[role].at(index);\\n }\\n\\n /**\\n * @dev Returns the number of accounts that have `role`. Can be used\\n * together with {getRoleMember} to enumerate all bearers of a role.\\n */\\n function getRoleMemberCount(bytes32 role) public view virtual override returns (uint256) {\\n return _roleMembers[role].length();\\n }\\n\\n /**\\n * @dev Overload {_grantRole} to track enumerable memberships\\n */\\n function _grantRole(bytes32 role, address account) internal virtual override {\\n super._grantRole(role, account);\\n _roleMembers[role].add(account);\\n }\\n\\n /**\\n * @dev Overload {_revokeRole} to track enumerable memberships\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual override {\\n super._revokeRole(role, account);\\n _roleMembers[role].remove(account);\\n }\\n}\\n\",\"keccak256\":\"0x13f5e15f2a0650c0b6aaee2ef19e89eaf4870d6e79662d572a393334c1397247\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/access/IAccessControlEnumerable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControlEnumerable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\n\\n/**\\n * @dev External interface of AccessControlEnumerable declared to support ERC165 detection.\\n */\\ninterface IAccessControlEnumerable is IAccessControl {\\n /**\\n * @dev Returns one of the accounts that have `role`. `index` must be a\\n * value between 0 and {getRoleMemberCount}, non-inclusive.\\n *\\n * Role bearers are not sorted in any particular way, and their ordering may\\n * change at any point.\\n *\\n * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure\\n * you perform all queries on the same block. See the following\\n * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]\\n * for more information.\\n */\\n function getRoleMember(bytes32 role, uint256 index) external view returns (address);\\n\\n /**\\n * @dev Returns the number of accounts that have `role`. Can be used\\n * together with {getRoleMember} to enumerate all bearers of a role.\\n */\\n function getRoleMemberCount(bytes32 role) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0xba4459ab871dfa300f5212c6c30178b63898c03533a1ede28436f11546626676\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/interfaces/IERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC2981.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Interface for the NFT Royalty Standard.\\n *\\n * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal\\n * support for royalty payments across all NFT marketplaces and ecosystem participants.\\n *\\n * _Available since v4.5._\\n */\\ninterface IERC2981 is IERC165 {\\n /**\\n * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of\\n * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.\\n */\\n function royaltyInfo(\\n uint256 tokenId,\\n uint256 salePrice\\n ) external view returns (address receiver, uint256 royaltyAmount);\\n}\\n\",\"keccak256\":\"0x3976825a61df20457730b79ad0ac9c8908e3c7978ed9bf090c67137c91256b5c\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/token/common/ERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/common/ERC2981.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/IERC2981.sol\\\";\\nimport \\\"../../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.\\n *\\n * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for\\n * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.\\n *\\n * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the\\n * fee is specified in basis points by default.\\n *\\n * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See\\n * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to\\n * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.\\n *\\n * _Available since v4.5._\\n */\\nabstract contract ERC2981 is IERC2981, ERC165 {\\n struct RoyaltyInfo {\\n address receiver;\\n uint96 royaltyFraction;\\n }\\n\\n RoyaltyInfo private _defaultRoyaltyInfo;\\n mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\\n return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @inheritdoc IERC2981\\n */\\n function royaltyInfo(uint256 tokenId, uint256 salePrice) public view virtual override returns (address, uint256) {\\n RoyaltyInfo memory royalty = _tokenRoyaltyInfo[tokenId];\\n\\n if (royalty.receiver == address(0)) {\\n royalty = _defaultRoyaltyInfo;\\n }\\n\\n uint256 royaltyAmount = (salePrice * royalty.royaltyFraction) / _feeDenominator();\\n\\n return (royalty.receiver, royaltyAmount);\\n }\\n\\n /**\\n * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a\\n * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an\\n * override.\\n */\\n function _feeDenominator() internal pure virtual returns (uint96) {\\n return 10000;\\n }\\n\\n /**\\n * @dev Sets the royalty information that all ids in this contract will default to.\\n *\\n * Requirements:\\n *\\n * - `receiver` cannot be the zero address.\\n * - `feeNumerator` cannot be greater than the fee denominator.\\n */\\n function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {\\n require(feeNumerator <= _feeDenominator(), \\\"ERC2981: royalty fee will exceed salePrice\\\");\\n require(receiver != address(0), \\\"ERC2981: invalid receiver\\\");\\n\\n _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);\\n }\\n\\n /**\\n * @dev Removes default royalty information.\\n */\\n function _deleteDefaultRoyalty() internal virtual {\\n delete _defaultRoyaltyInfo;\\n }\\n\\n /**\\n * @dev Sets the royalty information for a specific token id, overriding the global default.\\n *\\n * Requirements:\\n *\\n * - `receiver` cannot be the zero address.\\n * - `feeNumerator` cannot be greater than the fee denominator.\\n */\\n function _setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal virtual {\\n require(feeNumerator <= _feeDenominator(), \\\"ERC2981: royalty fee will exceed salePrice\\\");\\n require(receiver != address(0), \\\"ERC2981: Invalid parameters\\\");\\n\\n _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);\\n }\\n\\n /**\\n * @dev Resets royalty information for the token id back to the global default.\\n */\\n function _resetTokenRoyalty(uint256 tokenId) internal virtual {\\n delete _tokenRoyaltyInfo[tokenId];\\n }\\n}\\n\",\"keccak256\":\"0x990a4133f88b07f92724903f42bb25cdaeca0cf255fb48df26568c40e7c919c6\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\nimport \\\"./math/SignedMath.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\\n */\\n function toString(int256 value) internal pure returns (string memory) {\\n return string(abi.encodePacked(value < 0 ? \\\"-\\\" : \\\"\\\", toString(SignedMath.abs(value))));\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n\\n /**\\n * @dev Returns true if the two strings are equal.\\n */\\n function equal(string memory a, string memory b) internal pure returns (bool) {\\n return keccak256(bytes(a)) == keccak256(bytes(b));\\n }\\n}\\n\",\"keccak256\":\"0x3088eb2868e8d13d89d16670b5f8612c4ab9ff8956272837d8e90106c59c14a0\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\\n // The surrounding unchecked block does not change this fact.\\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1, \\\"Math: mulDiv overflow\\\");\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10 ** 64) {\\n value /= 10 ** 64;\\n result += 64;\\n }\\n if (value >= 10 ** 32) {\\n value /= 10 ** 32;\\n result += 32;\\n }\\n if (value >= 10 ** 16) {\\n value /= 10 ** 16;\\n result += 16;\\n }\\n if (value >= 10 ** 8) {\\n value /= 10 ** 8;\\n result += 8;\\n }\\n if (value >= 10 ** 4) {\\n value /= 10 ** 4;\\n result += 4;\\n }\\n if (value >= 10 ** 2) {\\n value /= 10 ** 2;\\n result += 2;\\n }\\n if (value >= 10 ** 1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard signed math utilities missing in the Solidity language.\\n */\\nlibrary SignedMath {\\n /**\\n * @dev Returns the largest of two signed numbers.\\n */\\n function max(int256 a, int256 b) internal pure returns (int256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two signed numbers.\\n */\\n function min(int256 a, int256 b) internal pure returns (int256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two signed numbers without overflow.\\n * The result is rounded towards zero.\\n */\\n function average(int256 a, int256 b) internal pure returns (int256) {\\n // Formula from the book \\\"Hacker's Delight\\\"\\n int256 x = (a & b) + ((a ^ b) >> 1);\\n return x + (int256(uint256(x) >> 255) & (a ^ b));\\n }\\n\\n /**\\n * @dev Returns the absolute unsigned value of a signed value.\\n */\\n function abs(int256 n) internal pure returns (uint256) {\\n unchecked {\\n // must be unchecked in order to support `n = type(int256).min`\\n return uint256(n >= 0 ? n : -n);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/EnumerableSet.sol)\\n// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for managing\\n * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive\\n * types.\\n *\\n * Sets have the following properties:\\n *\\n * - Elements are added, removed, and checked for existence in constant time\\n * (O(1)).\\n * - Elements are enumerated in O(n). No guarantees are made on the ordering.\\n *\\n * ```solidity\\n * contract Example {\\n * // Add the library methods\\n * using EnumerableSet for EnumerableSet.AddressSet;\\n *\\n * // Declare a set state variable\\n * EnumerableSet.AddressSet private mySet;\\n * }\\n * ```\\n *\\n * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)\\n * and `uint256` (`UintSet`) are supported.\\n *\\n * [WARNING]\\n * ====\\n * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure\\n * unusable.\\n * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.\\n *\\n * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an\\n * array of EnumerableSet.\\n * ====\\n */\\nlibrary EnumerableSet {\\n // To implement this library for multiple types with as little code\\n // repetition as possible, we write it in terms of a generic Set type with\\n // bytes32 values.\\n // The Set implementation uses private functions, and user-facing\\n // implementations (such as AddressSet) are just wrappers around the\\n // underlying Set.\\n // This means that we can only create new EnumerableSets for types that fit\\n // in bytes32.\\n\\n struct Set {\\n // Storage of set values\\n bytes32[] _values;\\n // Position of the value in the `values` array, plus 1 because index 0\\n // means a value is not in the set.\\n mapping(bytes32 => uint256) _indexes;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function _add(Set storage set, bytes32 value) private returns (bool) {\\n if (!_contains(set, value)) {\\n set._values.push(value);\\n // The value is stored at length-1, but we add 1 to all indexes\\n // and use 0 as a sentinel value\\n set._indexes[value] = set._values.length;\\n return true;\\n } else {\\n return false;\\n }\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function _remove(Set storage set, bytes32 value) private returns (bool) {\\n // We read and store the value's index to prevent multiple reads from the same storage slot\\n uint256 valueIndex = set._indexes[value];\\n\\n if (valueIndex != 0) {\\n // Equivalent to contains(set, value)\\n // To delete an element from the _values array in O(1), we swap the element to delete with the last one in\\n // the array, and then remove the last element (sometimes called as 'swap and pop').\\n // This modifies the order of the array, as noted in {at}.\\n\\n uint256 toDeleteIndex = valueIndex - 1;\\n uint256 lastIndex = set._values.length - 1;\\n\\n if (lastIndex != toDeleteIndex) {\\n bytes32 lastValue = set._values[lastIndex];\\n\\n // Move the last value to the index where the value to delete is\\n set._values[toDeleteIndex] = lastValue;\\n // Update the index for the moved value\\n set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex\\n }\\n\\n // Delete the slot where the moved value was stored\\n set._values.pop();\\n\\n // Delete the index for the deleted slot\\n delete set._indexes[value];\\n\\n return true;\\n } else {\\n return false;\\n }\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function _contains(Set storage set, bytes32 value) private view returns (bool) {\\n return set._indexes[value] != 0;\\n }\\n\\n /**\\n * @dev Returns the number of values on the set. O(1).\\n */\\n function _length(Set storage set) private view returns (uint256) {\\n return set._values.length;\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function _at(Set storage set, uint256 index) private view returns (bytes32) {\\n return set._values[index];\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function _values(Set storage set) private view returns (bytes32[] memory) {\\n return set._values;\\n }\\n\\n // Bytes32Set\\n\\n struct Bytes32Set {\\n Set _inner;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {\\n return _add(set._inner, value);\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {\\n return _remove(set._inner, value);\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {\\n return _contains(set._inner, value);\\n }\\n\\n /**\\n * @dev Returns the number of values in the set. O(1).\\n */\\n function length(Bytes32Set storage set) internal view returns (uint256) {\\n return _length(set._inner);\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {\\n return _at(set._inner, index);\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {\\n bytes32[] memory store = _values(set._inner);\\n bytes32[] memory result;\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := store\\n }\\n\\n return result;\\n }\\n\\n // AddressSet\\n\\n struct AddressSet {\\n Set _inner;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function add(AddressSet storage set, address value) internal returns (bool) {\\n return _add(set._inner, bytes32(uint256(uint160(value))));\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function remove(AddressSet storage set, address value) internal returns (bool) {\\n return _remove(set._inner, bytes32(uint256(uint160(value))));\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function contains(AddressSet storage set, address value) internal view returns (bool) {\\n return _contains(set._inner, bytes32(uint256(uint160(value))));\\n }\\n\\n /**\\n * @dev Returns the number of values in the set. O(1).\\n */\\n function length(AddressSet storage set) internal view returns (uint256) {\\n return _length(set._inner);\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function at(AddressSet storage set, uint256 index) internal view returns (address) {\\n return address(uint160(uint256(_at(set._inner, index))));\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function values(AddressSet storage set) internal view returns (address[] memory) {\\n bytes32[] memory store = _values(set._inner);\\n address[] memory result;\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := store\\n }\\n\\n return result;\\n }\\n\\n // UintSet\\n\\n struct UintSet {\\n Set _inner;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function add(UintSet storage set, uint256 value) internal returns (bool) {\\n return _add(set._inner, bytes32(value));\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function remove(UintSet storage set, uint256 value) internal returns (bool) {\\n return _remove(set._inner, bytes32(value));\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function contains(UintSet storage set, uint256 value) internal view returns (bool) {\\n return _contains(set._inner, bytes32(value));\\n }\\n\\n /**\\n * @dev Returns the number of values in the set. O(1).\\n */\\n function length(UintSet storage set) internal view returns (uint256) {\\n return _length(set._inner);\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function at(UintSet storage set, uint256 index) internal view returns (uint256) {\\n return uint256(_at(set._inner, index));\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function values(UintSet storage set) internal view returns (uint256[] memory) {\\n bytes32[] memory store = _values(set._inner);\\n uint256[] memory result;\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := store\\n }\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0x9f4357008a8f7d8c8bf5d48902e789637538d8c016be5766610901b4bba81514\",\"license\":\"MIT\"},\"lib/signals-implicit-mode/lib/sequence-v3/src/extensions/sessions/implicit/Attestation.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.27;\\n\\nimport { LibBytes } from \\\"../../../utils/LibBytes.sol\\\";\\nimport { ACCEPT_IMPLICIT_REQUEST_MAGIC_PREFIX } from \\\"./ISignalsImplicitMode.sol\\\";\\n\\nusing LibBytes for bytes;\\n\\n/// @notice Attestation for a specific session\\n/// @param approvedSigner Address of the approved signer\\n/// @param identityType Identity type\\n/// @param issuerHash Hash of the issuer\\n/// @param audienceHash Hash of the audience\\n/// @param applicationData Unspecified application data\\n/// @param authData Auth data\\nstruct Attestation {\\n address approvedSigner;\\n bytes4 identityType;\\n bytes32 issuerHash;\\n bytes32 audienceHash;\\n bytes applicationData;\\n AuthData authData;\\n}\\n\\n/// @notice Auth data for an attestation\\n/// @param redirectUrl Authorization redirect URL\\n/// @param issuedAt Timestamp of the attestation issuance\\nstruct AuthData {\\n string redirectUrl;\\n uint64 issuedAt;\\n}\\n\\n/// @title LibAttestation\\n/// @author Michael Standen\\n/// @notice Library for attestation management\\nlibrary LibAttestation {\\n\\n /// @notice Hashes an attestation\\n function toHash(\\n Attestation memory attestation\\n ) internal pure returns (bytes32) {\\n return keccak256(toPacked(attestation));\\n }\\n\\n /// @notice Decodes an attestation from a packed bytes array\\n /// @param encoded The packed bytes array\\n /// @param pointer The pointer to the start of the attestation\\n /// @return attestation The decoded attestation\\n /// @return newPointer The new pointer to the end of the attestation\\n function fromPacked(\\n bytes calldata encoded,\\n uint256 pointer\\n ) internal pure returns (Attestation memory attestation, uint256 newPointer) {\\n newPointer = pointer;\\n (attestation.approvedSigner, newPointer) = encoded.readAddress(newPointer);\\n (attestation.identityType, newPointer) = encoded.readBytes4(newPointer);\\n (attestation.issuerHash, newPointer) = encoded.readBytes32(newPointer);\\n (attestation.audienceHash, newPointer) = encoded.readBytes32(newPointer);\\n // Application data (arbitrary bytes)\\n uint256 dataSize;\\n (dataSize, newPointer) = encoded.readUint24(newPointer);\\n attestation.applicationData = encoded[newPointer:newPointer + dataSize];\\n newPointer += dataSize;\\n // Auth data\\n (attestation.authData, newPointer) = fromPackedAuthData(encoded, newPointer);\\n return (attestation, newPointer);\\n }\\n\\n /// @notice Decodes the auth data from a packed bytes\\n /// @param encoded The packed bytes containing the auth data\\n /// @param pointer The pointer to the start of the auth data within the encoded data\\n /// @return authData The decoded auth data\\n /// @return newPointer The pointer to the end of the auth data within the encoded data\\n function fromPackedAuthData(\\n bytes calldata encoded,\\n uint256 pointer\\n ) internal pure returns (AuthData memory authData, uint256 newPointer) {\\n uint24 redirectUrlLength;\\n (redirectUrlLength, pointer) = encoded.readUint24(pointer);\\n authData.redirectUrl = string(encoded[pointer:pointer + redirectUrlLength]);\\n pointer += redirectUrlLength;\\n (authData.issuedAt, pointer) = encoded.readUint64(pointer);\\n return (authData, pointer);\\n }\\n\\n /// @notice Encodes an attestation into a packed bytes array\\n /// @param attestation The attestation to encode\\n /// @return encoded The packed bytes array\\n function toPacked(\\n Attestation memory attestation\\n ) internal pure returns (bytes memory encoded) {\\n return abi.encodePacked(\\n attestation.approvedSigner,\\n attestation.identityType,\\n attestation.issuerHash,\\n attestation.audienceHash,\\n uint24(attestation.applicationData.length),\\n attestation.applicationData,\\n toPackAuthData(attestation.authData)\\n );\\n }\\n\\n /// @notice Encodes the auth data into a packed bytes array\\n /// @param authData The auth data to encode\\n /// @return encoded The packed bytes array\\n function toPackAuthData(\\n AuthData memory authData\\n ) internal pure returns (bytes memory encoded) {\\n return abi.encodePacked(uint24(bytes(authData.redirectUrl).length), bytes(authData.redirectUrl), authData.issuedAt);\\n }\\n\\n /// @notice Generates the implicit request magic return value\\n /// @param attestation The attestation\\n /// @param wallet The wallet\\n /// @return magic The expected implicit request magic\\n function generateImplicitRequestMagic(Attestation memory attestation, address wallet) internal pure returns (bytes32) {\\n return keccak256(\\n abi.encodePacked(ACCEPT_IMPLICIT_REQUEST_MAGIC_PREFIX, wallet, attestation.audienceHash, attestation.issuerHash)\\n );\\n }\\n\\n}\\n\",\"keccak256\":\"0xcaa44022b5eb4bc7ab487b3b1a0125da67e2e891cee983ef6cdb6814f045efc8\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/lib/sequence-v3/src/extensions/sessions/implicit/ISignalsImplicitMode.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.27;\\n\\nimport { Payload } from \\\"../../../modules/Payload.sol\\\";\\nimport { Attestation } from \\\"./Attestation.sol\\\";\\n\\n/// @dev Magic prefix for the implicit request\\nbytes32 constant ACCEPT_IMPLICIT_REQUEST_MAGIC_PREFIX = keccak256(abi.encodePacked(\\\"acceptImplicitRequest\\\"));\\n\\n/// @title ISignalsImplicitMode\\n/// @author Agustin Aguilar, Michael Standen\\n/// @notice Interface for the contracts that support implicit mode validation\\ninterface ISignalsImplicitMode {\\n\\n /// @notice Determines if an implicit request is valid\\n /// @param wallet The wallet's address\\n /// @param attestation The attestation data\\n /// @param call The call to validate\\n /// @return magic The hash of the implicit request if valid\\n function acceptImplicitRequest(\\n address wallet,\\n Attestation calldata attestation,\\n Payload.Call calldata call\\n ) external view returns (bytes32 magic);\\n\\n}\\n\",\"keccak256\":\"0x6cb48f50c49bcb3c7071306fe9fac6c102bc9eabf73d9909e19ab3b9a835d0a8\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/lib/sequence-v3/src/modules/Payload.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.27;\\n\\nimport { LibBytes } from \\\"../utils/LibBytes.sol\\\";\\n\\nusing LibBytes for bytes;\\n\\n/// @title Payload\\n/// @author Agustin Aguilar, Michael Standen, William Hua\\n/// @notice Library for encoding and decoding payloads\\nlibrary Payload {\\n\\n /// @notice Error thrown when the kind is invalid\\n error InvalidKind(uint8 kind);\\n\\n /// @dev keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\")\\n bytes32 private constant EIP712_DOMAIN_TYPEHASH = 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f;\\n\\n /// @dev keccak256(\\\"Sequence Wallet\\\")\\n bytes32 private constant EIP712_DOMAIN_NAME_SEQUENCE =\\n 0x4aa45ca7ad825ceb1bf35643f0a58c295239df563b1b565c2485f96477c56318;\\n\\n /// @dev keccak256(\\\"3\\\")\\n bytes32 private constant EIP712_DOMAIN_VERSION_SEQUENCE =\\n 0x2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de;\\n\\n function domainSeparator(bool _noChainId, address _wallet) internal view returns (bytes32 _domainSeparator) {\\n return keccak256(\\n abi.encode(\\n EIP712_DOMAIN_TYPEHASH,\\n EIP712_DOMAIN_NAME_SEQUENCE,\\n EIP712_DOMAIN_VERSION_SEQUENCE,\\n _noChainId ? uint256(0) : uint256(block.chainid),\\n _wallet\\n )\\n );\\n }\\n\\n /// @dev keccak256(\\\"Call(address to,uint256 value,bytes data,uint256 gasLimit,bool delegateCall,bool onlyFallback,uint256 behaviorOnError)\\\")\\n bytes32 private constant CALL_TYPEHASH = 0x0603985259a953da1f65a522f589c17bd1d0117ec1d3abb7c0788aef251ef437;\\n\\n /// @dev keccak256(\\\"Calls(Call[] calls,uint256 space,uint256 nonce,address[] wallets)Call(address to,uint256 value,bytes data,uint256 gasLimit,bool delegateCall,bool onlyFallback,uint256 behaviorOnError)\\\")\\n bytes32 private constant CALLS_TYPEHASH = 0x11e1e4079a79a66e4ade50033cfe2678cdd5341d2dfe5ef9513edb1a0be147a2;\\n\\n /// @dev keccak256(\\\"Message(bytes message,address[] wallets)\\\")\\n bytes32 private constant MESSAGE_TYPEHASH = 0xe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d466;\\n\\n /// @dev keccak256(\\\"ConfigUpdate(bytes32 imageHash,address[] wallets)\\\")\\n bytes32 private constant CONFIG_UPDATE_TYPEHASH = 0x11fdeb7e8373a1aa96bfac8d0ea91526b2c5d15e5cee20e0543e780258f3e8e4;\\n\\n /// @notice Kind of transaction\\n uint8 public constant KIND_TRANSACTIONS = 0x00;\\n /// @notice Kind of digest\\n uint8 public constant KIND_MESSAGE = 0x01;\\n /// @notice Kind of config update\\n uint8 public constant KIND_CONFIG_UPDATE = 0x02;\\n /// @notice Kind of message\\n uint8 public constant KIND_DIGEST = 0x03;\\n\\n /// @notice Behavior on error: ignore error\\n uint8 public constant BEHAVIOR_IGNORE_ERROR = 0x00;\\n /// @notice Behavior on error: revert on error\\n uint8 public constant BEHAVIOR_REVERT_ON_ERROR = 0x01;\\n /// @notice Behavior on error: abort on error\\n uint8 public constant BEHAVIOR_ABORT_ON_ERROR = 0x02;\\n\\n /// @notice Payload call information\\n /// @param to Address of the target contract\\n /// @param value Value to send with the call\\n /// @param data Data to send with the call\\n /// @param gasLimit Gas limit for the call\\n /// @param delegateCall If the call is a delegate call\\n /// @param onlyFallback If the call should only be executed in an error scenario\\n /// @param behaviorOnError Behavior on error\\n struct Call {\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 gasLimit;\\n bool delegateCall;\\n bool onlyFallback;\\n uint256 behaviorOnError;\\n }\\n\\n /// @notice Decoded payload\\n /// @param kind Kind of payload\\n /// @param noChainId If the chain ID should be omitted\\n /// @param calls Array of calls (transaction kind)\\n /// @param space Nonce space for the calls (transaction kind)\\n /// @param nonce Nonce value for the calls (transaction kind)\\n /// @param message Message to validate (message kind)\\n /// @param imageHash Image hash to update to (config update kind)\\n /// @param digest Digest to validate (digest kind)\\n /// @param parentWallets Parent wallets\\n struct Decoded {\\n uint8 kind;\\n bool noChainId;\\n // Transaction kind\\n Call[] calls;\\n uint256 space;\\n uint256 nonce;\\n // Message kind\\n // TODO: Maybe native 721 ?\\n bytes message;\\n // Config update kind\\n bytes32 imageHash;\\n // Digest kind for 1271\\n bytes32 digest;\\n // Parent wallets\\n address[] parentWallets;\\n }\\n\\n function fromMessage(\\n bytes memory message\\n ) internal pure returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_MESSAGE;\\n _decoded.message = message;\\n }\\n\\n function fromConfigUpdate(\\n bytes32 imageHash\\n ) internal pure returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_CONFIG_UPDATE;\\n _decoded.imageHash = imageHash;\\n }\\n\\n function fromDigest(\\n bytes32 digest\\n ) internal pure returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_DIGEST;\\n _decoded.digest = digest;\\n }\\n\\n function fromPackedCalls(\\n bytes calldata packed\\n ) internal view returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_TRANSACTIONS;\\n\\n // Read the global flag\\n (uint256 globalFlag, uint256 pointer) = packed.readFirstUint8();\\n\\n // First bit determines if space is zero or not\\n if (globalFlag & 0x01 == 0x01) {\\n _decoded.space = 0;\\n } else {\\n (_decoded.space, pointer) = packed.readUint160(pointer);\\n }\\n\\n // Next 3 bits determine the size of the nonce\\n uint256 nonceSize = (globalFlag >> 1) & 0x07;\\n\\n if (nonceSize > 0) {\\n // Read the nonce\\n (_decoded.nonce, pointer) = packed.readUintX(pointer, nonceSize);\\n }\\n\\n uint256 numCalls;\\n\\n // Bit 5 determines if the batch contains a single call\\n if (globalFlag & 0x10 == 0x10) {\\n numCalls = 1;\\n } else {\\n // Bit 6 determines if the number of calls uses 1 byte or 2 bytes\\n if (globalFlag & 0x20 == 0x20) {\\n (numCalls, pointer) = packed.readUint16(pointer);\\n } else {\\n (numCalls, pointer) = packed.readUint8(pointer);\\n }\\n }\\n\\n // Read the calls\\n _decoded.calls = new Call[](numCalls);\\n\\n for (uint256 i = 0; i < numCalls; i++) {\\n uint8 flags;\\n (flags, pointer) = packed.readUint8(pointer);\\n\\n // First bit determines if this is a call to self\\n // or a call to another address\\n if (flags & 0x01 == 0x01) {\\n // Call to self\\n _decoded.calls[i].to = address(this);\\n } else {\\n // Call to another address\\n (_decoded.calls[i].to, pointer) = packed.readAddress(pointer);\\n }\\n\\n // Second bit determines if the call has value or not\\n if (flags & 0x02 == 0x02) {\\n (_decoded.calls[i].value, pointer) = packed.readUint256(pointer);\\n }\\n\\n // Third bit determines if the call has data or not\\n if (flags & 0x04 == 0x04) {\\n // 3 bytes determine the size of the calldata\\n uint256 calldataSize;\\n (calldataSize, pointer) = packed.readUint24(pointer);\\n _decoded.calls[i].data = packed[pointer:pointer + calldataSize];\\n pointer += calldataSize;\\n }\\n\\n // Fourth bit determines if the call has a gas limit or not\\n if (flags & 0x08 == 0x08) {\\n (_decoded.calls[i].gasLimit, pointer) = packed.readUint256(pointer);\\n }\\n\\n // Fifth bit determines if the call is a delegate call or not\\n _decoded.calls[i].delegateCall = (flags & 0x10 == 0x10);\\n\\n // Sixth bit determines if the call is fallback only\\n _decoded.calls[i].onlyFallback = (flags & 0x20 == 0x20);\\n\\n // Last 2 bits are directly mapped to the behavior on error\\n _decoded.calls[i].behaviorOnError = (flags & 0xC0) >> 6;\\n }\\n }\\n\\n function hashCall(\\n Call memory c\\n ) internal pure returns (bytes32) {\\n return keccak256(\\n abi.encode(\\n CALL_TYPEHASH, c.to, c.value, keccak256(c.data), c.gasLimit, c.delegateCall, c.onlyFallback, c.behaviorOnError\\n )\\n );\\n }\\n\\n function hashCalls(\\n Call[] memory calls\\n ) internal pure returns (bytes32) {\\n // In EIP712, an array is often hashed as the keccak256 of the concatenated\\n // hashes of each item. So we hash each Call, pack them, and hash again.\\n bytes32[] memory callHashes = new bytes32[](calls.length);\\n for (uint256 i = 0; i < calls.length; i++) {\\n callHashes[i] = hashCall(calls[i]);\\n }\\n return keccak256(abi.encodePacked(callHashes));\\n }\\n\\n function toEIP712(\\n Decoded memory _decoded\\n ) internal pure returns (bytes32) {\\n bytes32 walletsHash = keccak256(abi.encodePacked(_decoded.parentWallets));\\n\\n if (_decoded.kind == KIND_TRANSACTIONS) {\\n bytes32 callsHash = hashCalls(_decoded.calls);\\n // The top-level struct for Calls might be something like:\\n // Calls(bytes32 callsHash,uint256 space,uint256 nonce,bytes32 walletsHash)\\n return keccak256(abi.encode(CALLS_TYPEHASH, callsHash, _decoded.space, _decoded.nonce, walletsHash));\\n } else if (_decoded.kind == KIND_MESSAGE) {\\n // If you define your top-level as: Message(bytes32 messageHash,bytes32 walletsHash)\\n return keccak256(abi.encode(MESSAGE_TYPEHASH, keccak256(_decoded.message), walletsHash));\\n } else if (_decoded.kind == KIND_CONFIG_UPDATE) {\\n // Top-level: ConfigUpdate(bytes32 imageHash,bytes32 walletsHash)\\n return keccak256(abi.encode(CONFIG_UPDATE_TYPEHASH, _decoded.imageHash, walletsHash));\\n } else if (_decoded.kind == KIND_DIGEST) {\\n // Top-level: Use MESSAGE_TYPEHASH but assume the digest is already the hashed message\\n return keccak256(abi.encode(MESSAGE_TYPEHASH, _decoded.digest, walletsHash));\\n } else {\\n // Unknown kind\\n revert InvalidKind(_decoded.kind);\\n }\\n }\\n\\n function hash(\\n Decoded memory _decoded\\n ) internal view returns (bytes32) {\\n bytes32 domain = domainSeparator(_decoded.noChainId, address(this));\\n bytes32 structHash = toEIP712(_decoded);\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domain, structHash));\\n }\\n\\n function hashFor(Decoded memory _decoded, address _wallet) internal view returns (bytes32) {\\n bytes32 domain = domainSeparator(_decoded.noChainId, _wallet);\\n bytes32 structHash = toEIP712(_decoded);\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domain, structHash));\\n }\\n\\n}\\n\",\"keccak256\":\"0x25066fa78d12d0d73d463b97b37528291f3d4d60ca642247441538b83d6597d6\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/lib/sequence-v3/src/utils/LibBytes.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.18;\\n\\n/// @title Library for reading data from bytes arrays\\n/// @author Agustin Aguilar (aa@horizon.io), Michael Standen (mstan@horizon.io)\\n/// @notice This library contains functions for reading data from bytes arrays.\\n/// @dev These functions do not check if the input index is within the bounds of the data array.\\n/// @dev Reading out of bounds may return dirty values.\\nlibrary LibBytes {\\n\\n function readFirstUint8(\\n bytes calldata _data\\n ) internal pure returns (uint8 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(_data.offset)\\n a := shr(248, word)\\n newPointer := 1\\n }\\n }\\n\\n function readUint8(bytes calldata _data, uint256 _index) internal pure returns (uint8 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(248, word)\\n newPointer := add(_index, 1)\\n }\\n }\\n\\n function readUint16(bytes calldata _data, uint256 _index) internal pure returns (uint16 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(240, word)\\n newPointer := add(_index, 2)\\n }\\n }\\n\\n function readUint24(bytes calldata _data, uint256 _index) internal pure returns (uint24 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(232, word)\\n newPointer := add(_index, 3)\\n }\\n }\\n\\n function readUint64(bytes calldata _data, uint256 _index) internal pure returns (uint64 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(192, word)\\n newPointer := add(_index, 8)\\n }\\n }\\n\\n function readUint160(bytes calldata _data, uint256 _index) internal pure returns (uint160 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(96, word)\\n newPointer := add(_index, 20)\\n }\\n }\\n\\n function readUint256(bytes calldata _data, uint256 _index) internal pure returns (uint256 a, uint256 newPointer) {\\n assembly {\\n a := calldataload(add(_index, _data.offset))\\n newPointer := add(_index, 32)\\n }\\n }\\n\\n function readUintX(\\n bytes calldata _data,\\n uint256 _index,\\n uint256 _length\\n ) internal pure returns (uint256 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n let shift := sub(256, mul(_length, 8))\\n a := and(shr(shift, word), sub(shl(mul(8, _length), 1), 1))\\n newPointer := add(_index, _length)\\n }\\n }\\n\\n function readBytes4(bytes calldata _data, uint256 _pointer) internal pure returns (bytes4 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_pointer, _data.offset))\\n a := and(word, 0xffffffff00000000000000000000000000000000000000000000000000000000)\\n newPointer := add(_pointer, 4)\\n }\\n }\\n\\n function readBytes32(bytes calldata _data, uint256 _pointer) internal pure returns (bytes32 a, uint256 newPointer) {\\n assembly {\\n a := calldataload(add(_pointer, _data.offset))\\n newPointer := add(_pointer, 32)\\n }\\n }\\n\\n function readAddress(bytes calldata _data, uint256 _index) internal pure returns (address a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := and(shr(96, word), 0xffffffffffffffffffffffffffffffffffffffff)\\n newPointer := add(_index, 20)\\n }\\n }\\n\\n /// @dev ERC-2098 Compact Signature\\n function readRSVCompact(\\n bytes calldata _data,\\n uint256 _index\\n ) internal pure returns (bytes32 r, bytes32 s, uint8 v, uint256 newPointer) {\\n uint256 yParityAndS;\\n assembly {\\n r := calldataload(add(_index, _data.offset))\\n yParityAndS := calldataload(add(_index, add(_data.offset, 32)))\\n newPointer := add(_index, 64)\\n }\\n uint256 yParity = uint256(yParityAndS >> 255);\\n s = bytes32(uint256(yParityAndS) & ((1 << 255) - 1));\\n v = uint8(yParity) + 27;\\n }\\n\\n}\\n\",\"keccak256\":\"0x4fe0b4786b2157e12384b90ae9daa1009b74b2547a8a24b800a8b998278c874b\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/src/helper/SignalsImplicitMode.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.13;\\n\\nimport { IImplicitProjectValidation } from \\\"../registry/IImplicitProjectValidation.sol\\\";\\n\\nimport { ERC165, IERC165 } from \\\"openzeppelin-contracts/contracts/utils/introspection/ERC165.sol\\\";\\nimport { Attestation } from \\\"sequence-v3/src/extensions/sessions/implicit/Attestation.sol\\\";\\nimport { ISignalsImplicitMode } from \\\"sequence-v3/src/extensions/sessions/implicit/ISignalsImplicitMode.sol\\\";\\nimport { Payload } from \\\"sequence-v3/src/modules/Payload.sol\\\";\\n\\n/// @title SignalsImplicitMode\\n/// @author Michael Standen\\n/// @notice Base contract for implicit mode validation by project\\nabstract contract SignalsImplicitMode is ISignalsImplicitMode, ERC165 {\\n\\n IImplicitProjectValidation internal _validator;\\n bytes32 internal _projectId;\\n\\n /// @notice Initialize implicit mode validation\\n /// @param validator The IImplicitProjectValidation address\\n /// @param projectId The project id\\n function _initializeSignalsImplicitMode(address validator, bytes32 projectId) internal {\\n _validator = IImplicitProjectValidation(validator);\\n _projectId = projectId;\\n }\\n\\n /// @inheritdoc ISignalsImplicitMode\\n function acceptImplicitRequest(\\n address wallet,\\n Attestation calldata attestation,\\n Payload.Call calldata call\\n ) external view returns (bytes32) {\\n _validateImplicitRequest(wallet, attestation, call);\\n return _validator.validateAttestation(wallet, attestation, _projectId);\\n }\\n\\n /// @notice Validates an implicit request\\n /// @dev Optional hook for additional validation of the implicit requests\\n /// @param wallet The wallet's address\\n /// @param attestation The attestation data\\n /// @param call The call to validate\\n function _validateImplicitRequest(\\n address wallet,\\n Attestation calldata attestation,\\n Payload.Call calldata call\\n ) internal view virtual { }\\n\\n /// @inheritdoc IERC165\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view virtual override returns (bool) {\\n return interfaceId == type(ISignalsImplicitMode).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n}\\n\",\"keccak256\":\"0xd9107be2460f7f7ec4bdfefc3d10c79aa92b9285e1b12a75cb2a8d17b150a2ec\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/src/registry/IImplicitProjectValidation.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.13;\\n\\nimport { Attestation } from \\\"sequence-v3/src/extensions/sessions/implicit/Attestation.sol\\\";\\n\\n/// @title IImplicitProjectValidation\\n/// @author Michael Standen\\n/// @notice Interface for contracts supporting validation of implicit sessions for projects\\ninterface IImplicitProjectValidation {\\n\\n /// @notice Invalid redirect url error\\n error InvalidRedirectUrl();\\n\\n /// @notice Check if a project has a code\\n /// @param wallet The wallet address\\n /// @param attestation The attestation\\n /// @param projectId The project id\\n /// @return magic The attestation magic bytes for the wallet address\\n function validateAttestation(\\n address wallet,\\n Attestation calldata attestation,\\n bytes32 projectId\\n ) external view returns (bytes32);\\n\\n}\\n\",\"keccak256\":\"0x1e8c305e011aa13d774e0ff3cfd9286af3d8174c4e33ba5ef8f724ea2dd6e5b2\",\"license\":\"Apache-2.0\"},\"lib/solady/src/tokens/ERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\n/// @notice Simple ERC1155 implementation.\\n/// @author Solady (https://github.com/vectorized/solady/blob/main/src/tokens/ERC1155.sol)\\n/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC1155.sol)\\n/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC1155/ERC1155.sol)\\n///\\n/// @dev Note:\\n/// - The ERC1155 standard allows for self-approvals.\\n/// For performance, this implementation WILL NOT revert for such actions.\\n/// Please add any checks with overrides if desired.\\n/// - The transfer functions use the identity precompile (0x4)\\n/// to copy memory internally.\\n///\\n/// If you are overriding:\\n/// - Make sure all variables written to storage are properly cleaned\\n// (e.g. the bool value for `isApprovedForAll` MUST be either 1 or 0 under the hood).\\n/// - Check that the overridden function is actually used in the function you want to\\n/// change the behavior of. Much of the code has been manually inlined for performance.\\nabstract contract ERC1155 {\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* CUSTOM ERRORS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev The lengths of the input arrays are not the same.\\n error ArrayLengthsMismatch();\\n\\n /// @dev Cannot mint or transfer to the zero address.\\n error TransferToZeroAddress();\\n\\n /// @dev The recipient's balance has overflowed.\\n error AccountBalanceOverflow();\\n\\n /// @dev Insufficient balance.\\n error InsufficientBalance();\\n\\n /// @dev Only the token owner or an approved account can manage the tokens.\\n error NotOwnerNorApproved();\\n\\n /// @dev Cannot safely transfer to a contract that does not implement\\n /// the ERC1155Receiver interface.\\n error TransferToNonERC1155ReceiverImplementer();\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* EVENTS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Emitted when `amount` of token `id` is transferred\\n /// from `from` to `to` by `operator`.\\n event TransferSingle(\\n address indexed operator,\\n address indexed from,\\n address indexed to,\\n uint256 id,\\n uint256 amount\\n );\\n\\n /// @dev Emitted when `amounts` of token `ids` are transferred\\n /// from `from` to `to` by `operator`.\\n event TransferBatch(\\n address indexed operator,\\n address indexed from,\\n address indexed to,\\n uint256[] ids,\\n uint256[] amounts\\n );\\n\\n /// @dev Emitted when `owner` enables or disables `operator` to manage all of their tokens.\\n event ApprovalForAll(address indexed owner, address indexed operator, bool isApproved);\\n\\n /// @dev Emitted when the Uniform Resource Identifier (URI) for token `id`\\n /// is updated to `value`. This event is not used in the base contract.\\n /// You may need to emit this event depending on your URI logic.\\n ///\\n /// See: https://eips.ethereum.org/EIPS/eip-1155#metadata\\n event URI(string value, uint256 indexed id);\\n\\n /// @dev `keccak256(bytes(\\\"TransferSingle(address,address,address,uint256,uint256)\\\"))`.\\n uint256 private constant _TRANSFER_SINGLE_EVENT_SIGNATURE =\\n 0xc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62;\\n\\n /// @dev `keccak256(bytes(\\\"TransferBatch(address,address,address,uint256[],uint256[])\\\"))`.\\n uint256 private constant _TRANSFER_BATCH_EVENT_SIGNATURE =\\n 0x4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb;\\n\\n /// @dev `keccak256(bytes(\\\"ApprovalForAll(address,address,bool)\\\"))`.\\n uint256 private constant _APPROVAL_FOR_ALL_EVENT_SIGNATURE =\\n 0x17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31;\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* STORAGE */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev The `ownerSlotSeed` of a given owner is given by.\\n /// ```\\n /// let ownerSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, owner))\\n /// ```\\n ///\\n /// The balance slot of `owner` is given by.\\n /// ```\\n /// mstore(0x20, ownerSlotSeed)\\n /// mstore(0x00, id)\\n /// let balanceSlot := keccak256(0x00, 0x40)\\n /// ```\\n ///\\n /// The operator approval slot of `owner` is given by.\\n /// ```\\n /// mstore(0x20, ownerSlotSeed)\\n /// mstore(0x00, operator)\\n /// let operatorApprovalSlot := keccak256(0x0c, 0x34)\\n /// ```\\n uint256 private constant _ERC1155_MASTER_SLOT_SEED = 0x9a31110384e0b0c9;\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* ERC1155 METADATA */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns the URI for token `id`.\\n ///\\n /// You can either return the same templated URI for all token IDs,\\n /// (e.g. \\\"https://example.com/api/{id}.json\\\"),\\n /// or return a unique URI for each `id`.\\n ///\\n /// See: https://eips.ethereum.org/EIPS/eip-1155#metadata\\n function uri(uint256 id) public view virtual returns (string memory);\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* ERC1155 */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns the amount of `id` owned by `owner`.\\n function balanceOf(address owner, uint256 id) public view virtual returns (uint256 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x20, _ERC1155_MASTER_SLOT_SEED)\\n mstore(0x14, owner)\\n mstore(0x00, id)\\n result := sload(keccak256(0x00, 0x40))\\n }\\n }\\n\\n /// @dev Returns whether `operator` is approved to manage the tokens of `owner`.\\n function isApprovedForAll(address owner, address operator)\\n public\\n view\\n virtual\\n returns (bool result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x20, _ERC1155_MASTER_SLOT_SEED)\\n mstore(0x14, owner)\\n mstore(0x00, operator)\\n result := sload(keccak256(0x0c, 0x34))\\n }\\n }\\n\\n /// @dev Sets whether `operator` is approved to manage the tokens of the caller.\\n ///\\n /// Emits a {ApprovalForAll} event.\\n function setApprovalForAll(address operator, bool isApproved) public virtual {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Convert to 0 or 1.\\n isApproved := iszero(iszero(isApproved))\\n // Update the `isApproved` for (`msg.sender`, `operator`).\\n mstore(0x20, _ERC1155_MASTER_SLOT_SEED)\\n mstore(0x14, caller())\\n mstore(0x00, operator)\\n sstore(keccak256(0x0c, 0x34), isApproved)\\n // Emit the {ApprovalForAll} event.\\n mstore(0x00, isApproved)\\n // forgefmt: disable-next-line\\n log3(0x00, 0x20, _APPROVAL_FOR_ALL_EVENT_SIGNATURE, caller(), shr(96, shl(96, operator)))\\n }\\n }\\n\\n /// @dev Transfers `amount` of `id` from `from` to `to`.\\n ///\\n /// Requirements:\\n /// - `to` cannot be the zero address.\\n /// - `from` must have at least `amount` of `id`.\\n /// - If the caller is not `from`,\\n /// it must be approved to manage the tokens of `from`.\\n /// - If `to` refers to a smart contract, it must implement\\n /// {ERC1155-onERC1155Received}, which is called upon a batch transfer.\\n ///\\n /// Emits a {TransferSingle} event.\\n function safeTransferFrom(\\n address from,\\n address to,\\n uint256 id,\\n uint256 amount,\\n bytes calldata data\\n ) public virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(from, to, _single(id), _single(amount), data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n let fromSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, from))\\n let toSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, to))\\n mstore(0x20, fromSlotSeed)\\n // Clear the upper 96 bits.\\n from := shr(96, fromSlotSeed)\\n to := shr(96, toSlotSeed)\\n // Revert if `to` is the zero address.\\n if iszero(to) {\\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\\n revert(0x1c, 0x04)\\n }\\n // If the caller is not `from`, do the authorization check.\\n if iszero(eq(caller(), from)) {\\n mstore(0x00, caller())\\n if iszero(sload(keccak256(0x0c, 0x34))) {\\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n // Subtract and store the updated balance of `from`.\\n {\\n mstore(0x00, id)\\n let fromBalanceSlot := keccak256(0x00, 0x40)\\n let fromBalance := sload(fromBalanceSlot)\\n if gt(amount, fromBalance) {\\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(fromBalanceSlot, sub(fromBalance, amount))\\n }\\n // Increase and store the updated balance of `to`.\\n {\\n mstore(0x20, toSlotSeed)\\n let toBalanceSlot := keccak256(0x00, 0x40)\\n let toBalanceBefore := sload(toBalanceSlot)\\n let toBalanceAfter := add(toBalanceBefore, amount)\\n if lt(toBalanceAfter, toBalanceBefore) {\\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(toBalanceSlot, toBalanceAfter)\\n }\\n // Emit a {TransferSingle} event.\\n mstore(0x20, amount)\\n log4(0x00, 0x40, _TRANSFER_SINGLE_EVENT_SIGNATURE, caller(), from, to)\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(from, to, _single(id), _single(amount), data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Do the {onERC1155Received} check if `to` is a smart contract.\\n if extcodesize(to) {\\n // Prepare the calldata.\\n let m := mload(0x40)\\n // `onERC1155Received(address,address,uint256,uint256,bytes)`.\\n mstore(m, 0xf23a6e61)\\n mstore(add(m, 0x20), caller())\\n mstore(add(m, 0x40), from)\\n mstore(add(m, 0x60), id)\\n mstore(add(m, 0x80), amount)\\n mstore(add(m, 0xa0), 0xa0)\\n mstore(add(m, 0xc0), data.length)\\n calldatacopy(add(m, 0xe0), data.offset, data.length)\\n // Revert if the call reverts.\\n if iszero(call(gas(), to, 0, add(m, 0x1c), add(0xc4, data.length), m, 0x20)) {\\n if returndatasize() {\\n // Bubble up the revert if the call reverts.\\n returndatacopy(m, 0x00, returndatasize())\\n revert(m, returndatasize())\\n }\\n }\\n // Load the returndata and compare it with the function selector.\\n if iszero(eq(mload(m), shl(224, 0xf23a6e61))) {\\n mstore(0x00, 0x9c05499b) // `TransferToNonERC1155ReceiverImplementer()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n }\\n }\\n\\n /// @dev Transfers `amounts` of `ids` from `from` to `to`.\\n ///\\n /// Requirements:\\n /// - `to` cannot be the zero address.\\n /// - `from` must have at least `amount` of `id`.\\n /// - `ids` and `amounts` must have the same length.\\n /// - If the caller is not `from`,\\n /// it must be approved to manage the tokens of `from`.\\n /// - If `to` refers to a smart contract, it must implement\\n /// {ERC1155-onERC1155BatchReceived}, which is called upon a batch transfer.\\n ///\\n /// Emits a {TransferBatch} event.\\n function safeBatchTransferFrom(\\n address from,\\n address to,\\n uint256[] calldata ids,\\n uint256[] calldata amounts,\\n bytes calldata data\\n ) public virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(from, to, ids, amounts, data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n if iszero(eq(ids.length, amounts.length)) {\\n mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.\\n revert(0x1c, 0x04)\\n }\\n let fromSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, from))\\n let toSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, to))\\n mstore(0x20, fromSlotSeed)\\n // Clear the upper 96 bits.\\n from := shr(96, fromSlotSeed)\\n to := shr(96, toSlotSeed)\\n // Revert if `to` is the zero address.\\n if iszero(to) {\\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\\n revert(0x1c, 0x04)\\n }\\n // If the caller is not `from`, do the authorization check.\\n if iszero(eq(caller(), from)) {\\n mstore(0x00, caller())\\n if iszero(sload(keccak256(0x0c, 0x34))) {\\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n // Loop through all the `ids` and update the balances.\\n {\\n for { let i := shl(5, ids.length) } i {} {\\n i := sub(i, 0x20)\\n let amount := calldataload(add(amounts.offset, i))\\n // Subtract and store the updated balance of `from`.\\n {\\n mstore(0x20, fromSlotSeed)\\n mstore(0x00, calldataload(add(ids.offset, i)))\\n let fromBalanceSlot := keccak256(0x00, 0x40)\\n let fromBalance := sload(fromBalanceSlot)\\n if gt(amount, fromBalance) {\\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(fromBalanceSlot, sub(fromBalance, amount))\\n }\\n // Increase and store the updated balance of `to`.\\n {\\n mstore(0x20, toSlotSeed)\\n let toBalanceSlot := keccak256(0x00, 0x40)\\n let toBalanceBefore := sload(toBalanceSlot)\\n let toBalanceAfter := add(toBalanceBefore, amount)\\n if lt(toBalanceAfter, toBalanceBefore) {\\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(toBalanceSlot, toBalanceAfter)\\n }\\n }\\n }\\n // Emit a {TransferBatch} event.\\n {\\n let m := mload(0x40)\\n // Copy the `ids`.\\n mstore(m, 0x40)\\n let n := shl(5, ids.length)\\n mstore(add(m, 0x40), ids.length)\\n calldatacopy(add(m, 0x60), ids.offset, n)\\n // Copy the `amounts`.\\n mstore(add(m, 0x20), add(0x60, n))\\n let o := add(add(m, n), 0x60)\\n mstore(o, ids.length)\\n calldatacopy(add(o, 0x20), amounts.offset, n)\\n // Do the emit.\\n log4(m, add(add(n, n), 0x80), _TRANSFER_BATCH_EVENT_SIGNATURE, caller(), from, to)\\n }\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransferCalldata(from, to, ids, amounts, data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Do the {onERC1155BatchReceived} check if `to` is a smart contract.\\n if extcodesize(to) {\\n mstore(0x00, to) // Cache `to` to prevent stack too deep.\\n let m := mload(0x40)\\n // Prepare the calldata.\\n // `onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)`.\\n mstore(m, 0xbc197c81)\\n mstore(add(m, 0x20), caller())\\n mstore(add(m, 0x40), from)\\n // Copy the `ids`.\\n mstore(add(m, 0x60), 0xa0)\\n let n := shl(5, ids.length)\\n mstore(add(m, 0xc0), ids.length)\\n calldatacopy(add(m, 0xe0), ids.offset, n)\\n // Copy the `amounts`.\\n mstore(add(m, 0x80), add(0xc0, n))\\n let o := add(add(m, n), 0xe0)\\n mstore(o, ids.length)\\n calldatacopy(add(o, 0x20), amounts.offset, n)\\n // Copy the `data`.\\n mstore(add(m, 0xa0), add(add(0xe0, n), n))\\n o := add(add(o, n), 0x20)\\n mstore(o, data.length)\\n calldatacopy(add(o, 0x20), data.offset, data.length)\\n let nAll := add(0x104, add(data.length, add(n, n)))\\n // Revert if the call reverts.\\n if iszero(call(gas(), mload(0x00), 0, add(mload(0x40), 0x1c), nAll, m, 0x20)) {\\n if returndatasize() {\\n // Bubble up the revert if the call reverts.\\n returndatacopy(m, 0x00, returndatasize())\\n revert(m, returndatasize())\\n }\\n }\\n // Load the returndata and compare it with the function selector.\\n if iszero(eq(mload(m), shl(224, 0xbc197c81))) {\\n mstore(0x00, 0x9c05499b) // `TransferToNonERC1155ReceiverImplementer()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n }\\n }\\n\\n /// @dev Returns the amounts of `ids` for `owners.\\n ///\\n /// Requirements:\\n /// - `owners` and `ids` must have the same length.\\n function balanceOfBatch(address[] calldata owners, uint256[] calldata ids)\\n public\\n view\\n virtual\\n returns (uint256[] memory balances)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n if iszero(eq(ids.length, owners.length)) {\\n mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.\\n revert(0x1c, 0x04)\\n }\\n balances := mload(0x40)\\n mstore(balances, ids.length)\\n let o := add(balances, 0x20)\\n let i := shl(5, ids.length)\\n mstore(0x40, add(i, o))\\n // Loop through all the `ids` and load the balances.\\n for {} i {} {\\n i := sub(i, 0x20)\\n let owner := calldataload(add(owners.offset, i))\\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, shl(96, owner)))\\n mstore(0x00, calldataload(add(ids.offset, i)))\\n mstore(add(o, i), sload(keccak256(0x00, 0x40)))\\n }\\n }\\n }\\n\\n /// @dev Returns true if this contract implements the interface defined by `interfaceId`.\\n /// See: https://eips.ethereum.org/EIPS/eip-165\\n /// This function call must use less than 30000 gas.\\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let s := shr(224, interfaceId)\\n // ERC165: 0x01ffc9a7, ERC1155: 0xd9b67a26, ERC1155MetadataURI: 0x0e89341c.\\n result := or(or(eq(s, 0x01ffc9a7), eq(s, 0xd9b67a26)), eq(s, 0x0e89341c))\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* INTERNAL MINT FUNCTIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Mints `amount` of `id` to `to`.\\n ///\\n /// Requirements:\\n /// - `to` cannot be the zero address.\\n /// - If `to` refers to a smart contract, it must implement\\n /// {ERC1155-onERC1155Received}, which is called upon a batch transfer.\\n ///\\n /// Emits a {TransferSingle} event.\\n function _mint(address to, uint256 id, uint256 amount, bytes memory data) internal virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(address(0), to, _single(id), _single(amount), data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n let to_ := shl(96, to)\\n // Revert if `to` is the zero address.\\n if iszero(to_) {\\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\\n revert(0x1c, 0x04)\\n }\\n // Increase and store the updated balance of `to`.\\n {\\n mstore(0x20, _ERC1155_MASTER_SLOT_SEED)\\n mstore(0x14, to)\\n mstore(0x00, id)\\n let toBalanceSlot := keccak256(0x00, 0x40)\\n let toBalanceBefore := sload(toBalanceSlot)\\n let toBalanceAfter := add(toBalanceBefore, amount)\\n if lt(toBalanceAfter, toBalanceBefore) {\\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(toBalanceSlot, toBalanceAfter)\\n }\\n // Emit a {TransferSingle} event.\\n mstore(0x20, amount)\\n log4(0x00, 0x40, _TRANSFER_SINGLE_EVENT_SIGNATURE, caller(), 0, shr(96, to_))\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(address(0), to, _single(id), _single(amount), data);\\n }\\n if (_hasCode(to)) _checkOnERC1155Received(address(0), to, id, amount, data);\\n }\\n\\n /// @dev Mints `amounts` of `ids` to `to`.\\n ///\\n /// Requirements:\\n /// - `to` cannot be the zero address.\\n /// - `ids` and `amounts` must have the same length.\\n /// - If `to` refers to a smart contract, it must implement\\n /// {ERC1155-onERC1155BatchReceived}, which is called upon a batch transfer.\\n ///\\n /// Emits a {TransferBatch} event.\\n function _batchMint(\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) internal virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(address(0), to, ids, amounts, data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n if iszero(eq(mload(ids), mload(amounts))) {\\n mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.\\n revert(0x1c, 0x04)\\n }\\n let to_ := shl(96, to)\\n // Revert if `to` is the zero address.\\n if iszero(to_) {\\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\\n revert(0x1c, 0x04)\\n }\\n // Loop through all the `ids` and update the balances.\\n {\\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, to_))\\n for { let i := shl(5, mload(ids)) } i { i := sub(i, 0x20) } {\\n let amount := mload(add(amounts, i))\\n // Increase and store the updated balance of `to`.\\n {\\n mstore(0x00, mload(add(ids, i)))\\n let toBalanceSlot := keccak256(0x00, 0x40)\\n let toBalanceBefore := sload(toBalanceSlot)\\n let toBalanceAfter := add(toBalanceBefore, amount)\\n if lt(toBalanceAfter, toBalanceBefore) {\\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(toBalanceSlot, toBalanceAfter)\\n }\\n }\\n }\\n // Emit a {TransferBatch} event.\\n {\\n let m := mload(0x40)\\n // Copy the `ids`.\\n mstore(m, 0x40)\\n let n := add(0x20, shl(5, mload(ids)))\\n let o := add(m, 0x40)\\n pop(staticcall(gas(), 4, ids, n, o, n))\\n // Copy the `amounts`.\\n mstore(add(m, 0x20), add(0x40, returndatasize()))\\n o := add(o, returndatasize())\\n n := add(0x20, shl(5, mload(amounts)))\\n pop(staticcall(gas(), 4, amounts, n, o, n))\\n n := sub(add(o, returndatasize()), m)\\n // Do the emit.\\n log4(m, n, _TRANSFER_BATCH_EVENT_SIGNATURE, caller(), 0, shr(96, to_))\\n }\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(address(0), to, ids, amounts, data);\\n }\\n if (_hasCode(to)) _checkOnERC1155BatchReceived(address(0), to, ids, amounts, data);\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* INTERNAL BURN FUNCTIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Equivalent to `_burn(address(0), from, id, amount)`.\\n function _burn(address from, uint256 id, uint256 amount) internal virtual {\\n _burn(address(0), from, id, amount);\\n }\\n\\n /// @dev Destroys `amount` of `id` from `from`.\\n ///\\n /// Requirements:\\n /// - `from` must have at least `amount` of `id`.\\n /// - If `by` is not the zero address, it must be either `from`,\\n /// or approved to manage the tokens of `from`.\\n ///\\n /// Emits a {TransferSingle} event.\\n function _burn(address by, address from, uint256 id, uint256 amount) internal virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(from, address(0), _single(id), _single(amount), \\\"\\\");\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n let from_ := shl(96, from)\\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, from_))\\n // If `by` is not the zero address, and not equal to `from`,\\n // check if it is approved to manage all the tokens of `from`.\\n if iszero(or(iszero(shl(96, by)), eq(shl(96, by), from_))) {\\n mstore(0x00, by)\\n if iszero(sload(keccak256(0x0c, 0x34))) {\\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n // Decrease and store the updated balance of `from`.\\n {\\n mstore(0x00, id)\\n let fromBalanceSlot := keccak256(0x00, 0x40)\\n let fromBalance := sload(fromBalanceSlot)\\n if gt(amount, fromBalance) {\\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(fromBalanceSlot, sub(fromBalance, amount))\\n }\\n // Emit a {TransferSingle} event.\\n mstore(0x20, amount)\\n log4(0x00, 0x40, _TRANSFER_SINGLE_EVENT_SIGNATURE, caller(), shr(96, from_), 0)\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(from, address(0), _single(id), _single(amount), \\\"\\\");\\n }\\n }\\n\\n /// @dev Equivalent to `_batchBurn(address(0), from, ids, amounts)`.\\n function _batchBurn(address from, uint256[] memory ids, uint256[] memory amounts)\\n internal\\n virtual\\n {\\n _batchBurn(address(0), from, ids, amounts);\\n }\\n\\n /// @dev Destroys `amounts` of `ids` from `from`.\\n ///\\n /// Requirements:\\n /// - `ids` and `amounts` must have the same length.\\n /// - `from` must have at least `amounts` of `ids`.\\n /// - If `by` is not the zero address, it must be either `from`,\\n /// or approved to manage the tokens of `from`.\\n ///\\n /// Emits a {TransferBatch} event.\\n function _batchBurn(address by, address from, uint256[] memory ids, uint256[] memory amounts)\\n internal\\n virtual\\n {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(from, address(0), ids, amounts, \\\"\\\");\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n if iszero(eq(mload(ids), mload(amounts))) {\\n mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.\\n revert(0x1c, 0x04)\\n }\\n let from_ := shl(96, from)\\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, from_))\\n // If `by` is not the zero address, and not equal to `from`,\\n // check if it is approved to manage all the tokens of `from`.\\n let by_ := shl(96, by)\\n if iszero(or(iszero(by_), eq(by_, from_))) {\\n mstore(0x00, by)\\n if iszero(sload(keccak256(0x0c, 0x34))) {\\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n // Loop through all the `ids` and update the balances.\\n {\\n for { let i := shl(5, mload(ids)) } i { i := sub(i, 0x20) } {\\n let amount := mload(add(amounts, i))\\n // Decrease and store the updated balance of `from`.\\n {\\n mstore(0x00, mload(add(ids, i)))\\n let fromBalanceSlot := keccak256(0x00, 0x40)\\n let fromBalance := sload(fromBalanceSlot)\\n if gt(amount, fromBalance) {\\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(fromBalanceSlot, sub(fromBalance, amount))\\n }\\n }\\n }\\n // Emit a {TransferBatch} event.\\n {\\n let m := mload(0x40)\\n // Copy the `ids`.\\n mstore(m, 0x40)\\n let n := add(0x20, shl(5, mload(ids)))\\n let o := add(m, 0x40)\\n pop(staticcall(gas(), 4, ids, n, o, n))\\n // Copy the `amounts`.\\n mstore(add(m, 0x20), add(0x40, returndatasize()))\\n o := add(o, returndatasize())\\n n := add(0x20, shl(5, mload(amounts)))\\n pop(staticcall(gas(), 4, amounts, n, o, n))\\n n := sub(add(o, returndatasize()), m)\\n // Do the emit.\\n log4(m, n, _TRANSFER_BATCH_EVENT_SIGNATURE, caller(), shr(96, from_), 0)\\n }\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(from, address(0), ids, amounts, \\\"\\\");\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* INTERNAL APPROVAL FUNCTIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Approve or remove the `operator` as an operator for `by`,\\n /// without authorization checks.\\n ///\\n /// Emits a {ApprovalForAll} event.\\n function _setApprovalForAll(address by, address operator, bool isApproved) internal virtual {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Convert to 0 or 1.\\n isApproved := iszero(iszero(isApproved))\\n // Update the `isApproved` for (`by`, `operator`).\\n mstore(0x20, _ERC1155_MASTER_SLOT_SEED)\\n mstore(0x14, by)\\n mstore(0x00, operator)\\n sstore(keccak256(0x0c, 0x34), isApproved)\\n // Emit the {ApprovalForAll} event.\\n mstore(0x00, isApproved)\\n let m := shr(96, not(0))\\n log3(0x00, 0x20, _APPROVAL_FOR_ALL_EVENT_SIGNATURE, and(m, by), and(m, operator))\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* INTERNAL TRANSFER FUNCTIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Equivalent to `_safeTransfer(address(0), from, to, id, amount, data)`.\\n function _safeTransfer(address from, address to, uint256 id, uint256 amount, bytes memory data)\\n internal\\n virtual\\n {\\n _safeTransfer(address(0), from, to, id, amount, data);\\n }\\n\\n /// @dev Transfers `amount` of `id` from `from` to `to`.\\n ///\\n /// Requirements:\\n /// - `to` cannot be the zero address.\\n /// - `from` must have at least `amount` of `id`.\\n /// - If `by` is not the zero address, it must be either `from`,\\n /// or approved to manage the tokens of `from`.\\n /// - If `to` refers to a smart contract, it must implement\\n /// {ERC1155-onERC1155Received}, which is called upon a batch transfer.\\n ///\\n /// Emits a {TransferSingle} event.\\n function _safeTransfer(\\n address by,\\n address from,\\n address to,\\n uint256 id,\\n uint256 amount,\\n bytes memory data\\n ) internal virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(from, to, _single(id), _single(amount), data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n let from_ := shl(96, from)\\n let to_ := shl(96, to)\\n // Revert if `to` is the zero address.\\n if iszero(to_) {\\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\\n revert(0x1c, 0x04)\\n }\\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, from_))\\n // If `by` is not the zero address, and not equal to `from`,\\n // check if it is approved to manage all the tokens of `from`.\\n let by_ := shl(96, by)\\n if iszero(or(iszero(by_), eq(by_, from_))) {\\n mstore(0x00, by)\\n if iszero(sload(keccak256(0x0c, 0x34))) {\\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n // Subtract and store the updated balance of `from`.\\n {\\n mstore(0x00, id)\\n let fromBalanceSlot := keccak256(0x00, 0x40)\\n let fromBalance := sload(fromBalanceSlot)\\n if gt(amount, fromBalance) {\\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(fromBalanceSlot, sub(fromBalance, amount))\\n }\\n // Increase and store the updated balance of `to`.\\n {\\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, to_))\\n let toBalanceSlot := keccak256(0x00, 0x40)\\n let toBalanceBefore := sload(toBalanceSlot)\\n let toBalanceAfter := add(toBalanceBefore, amount)\\n if lt(toBalanceAfter, toBalanceBefore) {\\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(toBalanceSlot, toBalanceAfter)\\n }\\n // Emit a {TransferSingle} event.\\n mstore(0x20, amount)\\n // forgefmt: disable-next-line\\n log4(0x00, 0x40, _TRANSFER_SINGLE_EVENT_SIGNATURE, caller(), shr(96, from_), shr(96, to_))\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(from, to, _single(id), _single(amount), data);\\n }\\n if (_hasCode(to)) _checkOnERC1155Received(from, to, id, amount, data);\\n }\\n\\n /// @dev Equivalent to `_safeBatchTransfer(address(0), from, to, ids, amounts, data)`.\\n function _safeBatchTransfer(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) internal virtual {\\n _safeBatchTransfer(address(0), from, to, ids, amounts, data);\\n }\\n\\n /// @dev Transfers `amounts` of `ids` from `from` to `to`.\\n ///\\n /// Requirements:\\n /// - `to` cannot be the zero address.\\n /// - `ids` and `amounts` must have the same length.\\n /// - `from` must have at least `amounts` of `ids`.\\n /// - If `by` is not the zero address, it must be either `from`,\\n /// or approved to manage the tokens of `from`.\\n /// - If `to` refers to a smart contract, it must implement\\n /// {ERC1155-onERC1155BatchReceived}, which is called upon a batch transfer.\\n ///\\n /// Emits a {TransferBatch} event.\\n function _safeBatchTransfer(\\n address by,\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) internal virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(from, to, ids, amounts, data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n if iszero(eq(mload(ids), mload(amounts))) {\\n mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.\\n revert(0x1c, 0x04)\\n }\\n let from_ := shl(96, from)\\n let to_ := shl(96, to)\\n // Revert if `to` is the zero address.\\n if iszero(to_) {\\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\\n revert(0x1c, 0x04)\\n }\\n let fromSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, from_)\\n let toSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, to_)\\n mstore(0x20, fromSlotSeed)\\n // If `by` is not the zero address, and not equal to `from`,\\n // check if it is approved to manage all the tokens of `from`.\\n let by_ := shl(96, by)\\n if iszero(or(iszero(by_), eq(by_, from_))) {\\n mstore(0x00, by)\\n if iszero(sload(keccak256(0x0c, 0x34))) {\\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n // Loop through all the `ids` and update the balances.\\n {\\n for { let i := shl(5, mload(ids)) } i { i := sub(i, 0x20) } {\\n let amount := mload(add(amounts, i))\\n // Subtract and store the updated balance of `from`.\\n {\\n mstore(0x20, fromSlotSeed)\\n mstore(0x00, mload(add(ids, i)))\\n let fromBalanceSlot := keccak256(0x00, 0x40)\\n let fromBalance := sload(fromBalanceSlot)\\n if gt(amount, fromBalance) {\\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(fromBalanceSlot, sub(fromBalance, amount))\\n }\\n // Increase and store the updated balance of `to`.\\n {\\n mstore(0x20, toSlotSeed)\\n let toBalanceSlot := keccak256(0x00, 0x40)\\n let toBalanceBefore := sload(toBalanceSlot)\\n let toBalanceAfter := add(toBalanceBefore, amount)\\n if lt(toBalanceAfter, toBalanceBefore) {\\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(toBalanceSlot, toBalanceAfter)\\n }\\n }\\n }\\n // Emit a {TransferBatch} event.\\n {\\n let m := mload(0x40)\\n // Copy the `ids`.\\n mstore(m, 0x40)\\n let n := add(0x20, shl(5, mload(ids)))\\n let o := add(m, 0x40)\\n pop(staticcall(gas(), 4, ids, n, o, n))\\n // Copy the `amounts`.\\n mstore(add(m, 0x20), add(0x40, returndatasize()))\\n o := add(o, returndatasize())\\n n := add(0x20, shl(5, mload(amounts)))\\n pop(staticcall(gas(), 4, amounts, n, o, n))\\n n := sub(add(o, returndatasize()), m)\\n // Do the emit.\\n log4(m, n, _TRANSFER_BATCH_EVENT_SIGNATURE, caller(), shr(96, from_), shr(96, to_))\\n }\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(from, to, ids, amounts, data);\\n }\\n if (_hasCode(to)) _checkOnERC1155BatchReceived(from, to, ids, amounts, data);\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* HOOKS FOR OVERRIDING */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Override this function to return true if `_beforeTokenTransfer` is used.\\n /// This is to help the compiler avoid producing dead bytecode.\\n function _useBeforeTokenTransfer() internal view virtual returns (bool) {\\n return false;\\n }\\n\\n /// @dev Hook that is called before any token transfer.\\n /// This includes minting and burning, as well as batched variants.\\n ///\\n /// The same hook is called on both single and batched variants.\\n /// For single transfers, the length of the `id` and `amount` arrays are 1.\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) internal virtual {}\\n\\n /// @dev Override this function to return true if `_afterTokenTransfer` is used.\\n /// This is to help the compiler avoid producing dead bytecode.\\n function _useAfterTokenTransfer() internal view virtual returns (bool) {\\n return false;\\n }\\n\\n /// @dev Hook that is called after any token transfer.\\n /// This includes minting and burning, as well as batched variants.\\n ///\\n /// The same hook is called on both single and batched variants.\\n /// For single transfers, the length of the `id` and `amount` arrays are 1.\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) internal virtual {}\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* PRIVATE HELPERS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Helper for calling the `_afterTokenTransfer` hook.\\n /// This is to help the compiler avoid producing dead bytecode.\\n function _afterTokenTransferCalldata(\\n address from,\\n address to,\\n uint256[] calldata ids,\\n uint256[] calldata amounts,\\n bytes calldata data\\n ) private {\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(from, to, ids, amounts, data);\\n }\\n }\\n\\n /// @dev Returns if `a` has bytecode of non-zero length.\\n function _hasCode(address a) private view returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := extcodesize(a) // Can handle dirty upper bits.\\n }\\n }\\n\\n /// @dev Perform a call to invoke {IERC1155Receiver-onERC1155Received} on `to`.\\n /// Reverts if the target does not support the function correctly.\\n function _checkOnERC1155Received(\\n address from,\\n address to,\\n uint256 id,\\n uint256 amount,\\n bytes memory data\\n ) private {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Prepare the calldata.\\n let m := mload(0x40)\\n // `onERC1155Received(address,address,uint256,uint256,bytes)`.\\n mstore(m, 0xf23a6e61)\\n mstore(add(m, 0x20), caller())\\n mstore(add(m, 0x40), shr(96, shl(96, from)))\\n mstore(add(m, 0x60), id)\\n mstore(add(m, 0x80), amount)\\n mstore(add(m, 0xa0), 0xa0)\\n let n := mload(data)\\n mstore(add(m, 0xc0), n)\\n if n { pop(staticcall(gas(), 4, add(data, 0x20), n, add(m, 0xe0), n)) }\\n // Revert if the call reverts.\\n if iszero(call(gas(), to, 0, add(m, 0x1c), add(0xc4, n), m, 0x20)) {\\n if returndatasize() {\\n // Bubble up the revert if the call reverts.\\n returndatacopy(m, 0x00, returndatasize())\\n revert(m, returndatasize())\\n }\\n }\\n // Load the returndata and compare it with the function selector.\\n if iszero(eq(mload(m), shl(224, 0xf23a6e61))) {\\n mstore(0x00, 0x9c05499b) // `TransferToNonERC1155ReceiverImplementer()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n }\\n\\n /// @dev Perform a call to invoke {IERC1155Receiver-onERC1155BatchReceived} on `to`.\\n /// Reverts if the target does not support the function correctly.\\n function _checkOnERC1155BatchReceived(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) private {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Prepare the calldata.\\n let m := mload(0x40)\\n // `onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)`.\\n mstore(m, 0xbc197c81)\\n mstore(add(m, 0x20), caller())\\n mstore(add(m, 0x40), shr(96, shl(96, from)))\\n // Copy the `ids`.\\n mstore(add(m, 0x60), 0xa0)\\n let n := add(0x20, shl(5, mload(ids)))\\n let o := add(m, 0xc0)\\n pop(staticcall(gas(), 4, ids, n, o, n))\\n // Copy the `amounts`.\\n let s := add(0xa0, returndatasize())\\n mstore(add(m, 0x80), s)\\n o := add(o, returndatasize())\\n n := add(0x20, shl(5, mload(amounts)))\\n pop(staticcall(gas(), 4, amounts, n, o, n))\\n // Copy the `data`.\\n mstore(add(m, 0xa0), add(s, returndatasize()))\\n o := add(o, returndatasize())\\n n := add(0x20, mload(data))\\n pop(staticcall(gas(), 4, data, n, o, n))\\n n := sub(add(o, returndatasize()), add(m, 0x1c))\\n // Revert if the call reverts.\\n if iszero(call(gas(), to, 0, add(m, 0x1c), n, m, 0x20)) {\\n if returndatasize() {\\n // Bubble up the revert if the call reverts.\\n returndatacopy(m, 0x00, returndatasize())\\n revert(m, returndatasize())\\n }\\n }\\n // Load the returndata and compare it with the function selector.\\n if iszero(eq(mload(m), shl(224, 0xbc197c81))) {\\n mstore(0x00, 0x9c05499b) // `TransferToNonERC1155ReceiverImplementer()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n }\\n\\n /// @dev Returns `x` in an array with a single element.\\n function _single(uint256 x) private pure returns (uint256[] memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n mstore(0x40, add(result, 0x40))\\n mstore(result, 1)\\n mstore(add(result, 0x20), x)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x306249cc3611727ffa9e15ec816282a60fd9629e5ea03ab1c780d638d1537c68\",\"license\":\"MIT\"},\"lib/solady/src/utils/LibBytes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\n/// @notice Library for byte related operations.\\n/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibBytes.sol)\\nlibrary LibBytes {\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* STRUCTS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Goated bytes storage struct that totally MOGs, no cap, fr.\\n /// Uses less gas and bytecode than Solidity's native bytes storage. It's meta af.\\n /// Packs length with the first 31 bytes if <255 bytes, so it\\u2019s mad tight.\\n struct BytesStorage {\\n bytes32 _spacer;\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* CONSTANTS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev The constant returned when the `search` is not found in the bytes.\\n uint256 internal constant NOT_FOUND = type(uint256).max;\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* BYTE STORAGE OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Sets the value of the bytes storage `$` to `s`.\\n function set(BytesStorage storage $, bytes memory s) internal {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := mload(s)\\n let packed := or(0xff, shl(8, n))\\n for { let i := 0 } 1 {} {\\n if iszero(gt(n, 0xfe)) {\\n i := 0x1f\\n packed := or(n, shl(8, mload(add(s, i))))\\n if iszero(gt(n, i)) { break }\\n }\\n let o := add(s, 0x20)\\n mstore(0x00, $.slot)\\n for { let p := keccak256(0x00, 0x20) } 1 {} {\\n sstore(add(p, shr(5, i)), mload(add(o, i)))\\n i := add(i, 0x20)\\n if iszero(lt(i, n)) { break }\\n }\\n break\\n }\\n sstore($.slot, packed)\\n }\\n }\\n\\n /// @dev Sets the value of the bytes storage `$` to `s`.\\n function setCalldata(BytesStorage storage $, bytes calldata s) internal {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let packed := or(0xff, shl(8, s.length))\\n for { let i := 0 } 1 {} {\\n if iszero(gt(s.length, 0xfe)) {\\n i := 0x1f\\n packed := or(s.length, shl(8, shr(8, calldataload(s.offset))))\\n if iszero(gt(s.length, i)) { break }\\n }\\n mstore(0x00, $.slot)\\n for { let p := keccak256(0x00, 0x20) } 1 {} {\\n sstore(add(p, shr(5, i)), calldataload(add(s.offset, i)))\\n i := add(i, 0x20)\\n if iszero(lt(i, s.length)) { break }\\n }\\n break\\n }\\n sstore($.slot, packed)\\n }\\n }\\n\\n /// @dev Sets the value of the bytes storage `$` to the empty bytes.\\n function clear(BytesStorage storage $) internal {\\n delete $._spacer;\\n }\\n\\n /// @dev Returns whether the value stored is `$` is the empty bytes \\\"\\\".\\n function isEmpty(BytesStorage storage $) internal view returns (bool) {\\n return uint256($._spacer) & 0xff == uint256(0);\\n }\\n\\n /// @dev Returns the length of the value stored in `$`.\\n function length(BytesStorage storage $) internal view returns (uint256 result) {\\n result = uint256($._spacer);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := and(0xff, result)\\n result := or(mul(shr(8, result), eq(0xff, n)), mul(n, iszero(eq(0xff, n))))\\n }\\n }\\n\\n /// @dev Returns the value stored in `$`.\\n function get(BytesStorage storage $) internal view returns (bytes memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n let o := add(result, 0x20)\\n let packed := sload($.slot)\\n let n := shr(8, packed)\\n for { let i := 0 } 1 {} {\\n if iszero(eq(or(packed, 0xff), packed)) {\\n mstore(o, packed)\\n n := and(0xff, packed)\\n i := 0x1f\\n if iszero(gt(n, i)) { break }\\n }\\n mstore(0x00, $.slot)\\n for { let p := keccak256(0x00, 0x20) } 1 {} {\\n mstore(add(o, i), sload(add(p, shr(5, i))))\\n i := add(i, 0x20)\\n if iszero(lt(i, n)) { break }\\n }\\n break\\n }\\n mstore(result, n) // Store the length of the memory.\\n mstore(add(o, n), 0) // Zeroize the slot after the bytes.\\n mstore(0x40, add(add(o, n), 0x20)) // Allocate memory.\\n }\\n }\\n\\n /// @dev Returns the uint8 at index `i`. If out-of-bounds, returns 0.\\n function uint8At(BytesStorage storage $, uint256 i) internal view returns (uint8 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n for { let packed := sload($.slot) } 1 {} {\\n if iszero(eq(or(packed, 0xff), packed)) {\\n if iszero(gt(i, 0x1e)) {\\n result := byte(i, packed)\\n break\\n }\\n if iszero(gt(i, and(0xff, packed))) {\\n mstore(0x00, $.slot)\\n let j := sub(i, 0x1f)\\n result := byte(and(j, 0x1f), sload(add(keccak256(0x00, 0x20), shr(5, j))))\\n }\\n break\\n }\\n if iszero(gt(i, shr(8, packed))) {\\n mstore(0x00, $.slot)\\n result := byte(and(i, 0x1f), sload(add(keccak256(0x00, 0x20), shr(5, i))))\\n }\\n break\\n }\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* BYTES OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns `subject` all occurrences of `needle` replaced with `replacement`.\\n function replace(bytes memory subject, bytes memory needle, bytes memory replacement)\\n internal\\n pure\\n returns (bytes memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n let needleLen := mload(needle)\\n let replacementLen := mload(replacement)\\n let d := sub(result, subject) // Memory difference.\\n let i := add(subject, 0x20) // Subject bytes pointer.\\n mstore(0x00, add(i, mload(subject))) // End of subject.\\n if iszero(gt(needleLen, mload(subject))) {\\n let subjectSearchEnd := add(sub(mload(0x00), needleLen), 1)\\n let h := 0 // The hash of `needle`.\\n if iszero(lt(needleLen, 0x20)) { h := keccak256(add(needle, 0x20), needleLen) }\\n let s := mload(add(needle, 0x20))\\n for { let m := shl(3, sub(0x20, and(needleLen, 0x1f))) } 1 {} {\\n let t := mload(i)\\n // Whether the first `needleLen % 32` bytes of `subject` and `needle` matches.\\n if iszero(shr(m, xor(t, s))) {\\n if h {\\n if iszero(eq(keccak256(i, needleLen), h)) {\\n mstore(add(i, d), t)\\n i := add(i, 1)\\n if iszero(lt(i, subjectSearchEnd)) { break }\\n continue\\n }\\n }\\n // Copy the `replacement` one word at a time.\\n for { let j := 0 } 1 {} {\\n mstore(add(add(i, d), j), mload(add(add(replacement, 0x20), j)))\\n j := add(j, 0x20)\\n if iszero(lt(j, replacementLen)) { break }\\n }\\n d := sub(add(d, replacementLen), needleLen)\\n if needleLen {\\n i := add(i, needleLen)\\n if iszero(lt(i, subjectSearchEnd)) { break }\\n continue\\n }\\n }\\n mstore(add(i, d), t)\\n i := add(i, 1)\\n if iszero(lt(i, subjectSearchEnd)) { break }\\n }\\n }\\n let end := mload(0x00)\\n let n := add(sub(d, add(result, 0x20)), end)\\n // Copy the rest of the bytes one word at a time.\\n for {} lt(i, end) { i := add(i, 0x20) } { mstore(add(i, d), mload(i)) }\\n let o := add(i, d)\\n mstore(o, 0) // Zeroize the slot after the bytes.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from left to right, starting from `from`.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function indexOf(bytes memory subject, bytes memory needle, uint256 from)\\n internal\\n pure\\n returns (uint256 result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := not(0) // Initialize to `NOT_FOUND`.\\n for { let subjectLen := mload(subject) } 1 {} {\\n if iszero(mload(needle)) {\\n result := from\\n if iszero(gt(from, subjectLen)) { break }\\n result := subjectLen\\n break\\n }\\n let needleLen := mload(needle)\\n let subjectStart := add(subject, 0x20)\\n\\n subject := add(subjectStart, from)\\n let end := add(sub(add(subjectStart, subjectLen), needleLen), 1)\\n let m := shl(3, sub(0x20, and(needleLen, 0x1f)))\\n let s := mload(add(needle, 0x20))\\n\\n if iszero(and(lt(subject, end), lt(from, subjectLen))) { break }\\n\\n if iszero(lt(needleLen, 0x20)) {\\n for { let h := keccak256(add(needle, 0x20), needleLen) } 1 {} {\\n if iszero(shr(m, xor(mload(subject), s))) {\\n if eq(keccak256(subject, needleLen), h) {\\n result := sub(subject, subjectStart)\\n break\\n }\\n }\\n subject := add(subject, 1)\\n if iszero(lt(subject, end)) { break }\\n }\\n break\\n }\\n for {} 1 {} {\\n if iszero(shr(m, xor(mload(subject), s))) {\\n result := sub(subject, subjectStart)\\n break\\n }\\n subject := add(subject, 1)\\n if iszero(lt(subject, end)) { break }\\n }\\n break\\n }\\n }\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from left to right.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function indexOf(bytes memory subject, bytes memory needle) internal pure returns (uint256) {\\n return indexOf(subject, needle, 0);\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from right to left, starting from `from`.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function lastIndexOf(bytes memory subject, bytes memory needle, uint256 from)\\n internal\\n pure\\n returns (uint256 result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n for {} 1 {} {\\n result := not(0) // Initialize to `NOT_FOUND`.\\n let needleLen := mload(needle)\\n if gt(needleLen, mload(subject)) { break }\\n let w := result\\n\\n let fromMax := sub(mload(subject), needleLen)\\n if iszero(gt(fromMax, from)) { from := fromMax }\\n\\n let end := add(add(subject, 0x20), w)\\n subject := add(add(subject, 0x20), from)\\n if iszero(gt(subject, end)) { break }\\n // As this function is not too often used,\\n // we shall simply use keccak256 for smaller bytecode size.\\n for { let h := keccak256(add(needle, 0x20), needleLen) } 1 {} {\\n if eq(keccak256(subject, needleLen), h) {\\n result := sub(subject, add(end, 1))\\n break\\n }\\n subject := add(subject, w) // `sub(subject, 1)`.\\n if iszero(gt(subject, end)) { break }\\n }\\n break\\n }\\n }\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from right to left.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function lastIndexOf(bytes memory subject, bytes memory needle)\\n internal\\n pure\\n returns (uint256)\\n {\\n return lastIndexOf(subject, needle, type(uint256).max);\\n }\\n\\n /// @dev Returns true if `needle` is found in `subject`, false otherwise.\\n function contains(bytes memory subject, bytes memory needle) internal pure returns (bool) {\\n return indexOf(subject, needle) != NOT_FOUND;\\n }\\n\\n /// @dev Returns whether `subject` starts with `needle`.\\n function startsWith(bytes memory subject, bytes memory needle)\\n internal\\n pure\\n returns (bool result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := mload(needle)\\n // Just using keccak256 directly is actually cheaper.\\n let t := eq(keccak256(add(subject, 0x20), n), keccak256(add(needle, 0x20), n))\\n result := lt(gt(n, mload(subject)), t)\\n }\\n }\\n\\n /// @dev Returns whether `subject` ends with `needle`.\\n function endsWith(bytes memory subject, bytes memory needle)\\n internal\\n pure\\n returns (bool result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := mload(needle)\\n let notInRange := gt(n, mload(subject))\\n // `subject + 0x20 + max(subject.length - needle.length, 0)`.\\n let t := add(add(subject, 0x20), mul(iszero(notInRange), sub(mload(subject), n)))\\n // Just using keccak256 directly is actually cheaper.\\n result := gt(eq(keccak256(t, n), keccak256(add(needle, 0x20), n)), notInRange)\\n }\\n }\\n\\n /// @dev Returns `subject` repeated `times`.\\n function repeat(bytes memory subject, uint256 times)\\n internal\\n pure\\n returns (bytes memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let l := mload(subject) // Subject length.\\n if iszero(or(iszero(times), iszero(l))) {\\n result := mload(0x40)\\n subject := add(subject, 0x20)\\n let o := add(result, 0x20)\\n for {} 1 {} {\\n // Copy the `subject` one word at a time.\\n for { let j := 0 } 1 {} {\\n mstore(add(o, j), mload(add(subject, j)))\\n j := add(j, 0x20)\\n if iszero(lt(j, l)) { break }\\n }\\n o := add(o, l)\\n times := sub(times, 1)\\n if iszero(times) { break }\\n }\\n mstore(o, 0) // Zeroize the slot after the bytes.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n mstore(result, sub(o, add(result, 0x20))) // Store the length.\\n }\\n }\\n }\\n\\n /// @dev Returns a copy of `subject` sliced from `start` to `end` (exclusive).\\n /// `start` and `end` are byte offsets.\\n function slice(bytes memory subject, uint256 start, uint256 end)\\n internal\\n pure\\n returns (bytes memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let l := mload(subject) // Subject length.\\n if iszero(gt(l, end)) { end := l }\\n if iszero(gt(l, start)) { start := l }\\n if lt(start, end) {\\n result := mload(0x40)\\n let n := sub(end, start)\\n let i := add(subject, start)\\n let w := not(0x1f)\\n // Copy the `subject` one word at a time, backwards.\\n for { let j := and(add(n, 0x1f), w) } 1 {} {\\n mstore(add(result, j), mload(add(i, j)))\\n j := add(j, w) // `sub(j, 0x20)`.\\n if iszero(j) { break }\\n }\\n let o := add(add(result, 0x20), n)\\n mstore(o, 0) // Zeroize the slot after the bytes.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n mstore(result, n) // Store the length.\\n }\\n }\\n }\\n\\n /// @dev Returns a copy of `subject` sliced from `start` to the end of the bytes.\\n /// `start` is a byte offset.\\n function slice(bytes memory subject, uint256 start)\\n internal\\n pure\\n returns (bytes memory result)\\n {\\n result = slice(subject, start, type(uint256).max);\\n }\\n\\n /// @dev Returns a copy of `subject` sliced from `start` to `end` (exclusive).\\n /// `start` and `end` are byte offsets. Faster than Solidity's native slicing.\\n function sliceCalldata(bytes calldata subject, uint256 start, uint256 end)\\n internal\\n pure\\n returns (bytes calldata result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n end := xor(end, mul(xor(end, subject.length), lt(subject.length, end)))\\n start := xor(start, mul(xor(start, subject.length), lt(subject.length, start)))\\n result.offset := add(subject.offset, start)\\n result.length := mul(lt(start, end), sub(end, start))\\n }\\n }\\n\\n /// @dev Returns a copy of `subject` sliced from `start` to the end of the bytes.\\n /// `start` is a byte offset. Faster than Solidity's native slicing.\\n function sliceCalldata(bytes calldata subject, uint256 start)\\n internal\\n pure\\n returns (bytes calldata result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n start := xor(start, mul(xor(start, subject.length), lt(subject.length, start)))\\n result.offset := add(subject.offset, start)\\n result.length := mul(lt(start, subject.length), sub(subject.length, start))\\n }\\n }\\n\\n /// @dev Reduces the size of `subject` to `n`.\\n /// If `n` is greater than the size of `subject`, this will be a no-op.\\n function truncate(bytes memory subject, uint256 n)\\n internal\\n pure\\n returns (bytes memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := subject\\n mstore(mul(lt(n, mload(result)), result), n)\\n }\\n }\\n\\n /// @dev Returns a copy of `subject`, with the length reduced to `n`.\\n /// If `n` is greater than the size of `subject`, this will be a no-op.\\n function truncatedCalldata(bytes calldata subject, uint256 n)\\n internal\\n pure\\n returns (bytes calldata result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result.offset := subject.offset\\n result.length := xor(n, mul(xor(n, subject.length), lt(subject.length, n)))\\n }\\n }\\n\\n /// @dev Returns all the indices of `needle` in `subject`.\\n /// The indices are byte offsets.\\n function indicesOf(bytes memory subject, bytes memory needle)\\n internal\\n pure\\n returns (uint256[] memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let searchLen := mload(needle)\\n if iszero(gt(searchLen, mload(subject))) {\\n result := mload(0x40)\\n let i := add(subject, 0x20)\\n let o := add(result, 0x20)\\n let subjectSearchEnd := add(sub(add(i, mload(subject)), searchLen), 1)\\n let h := 0 // The hash of `needle`.\\n if iszero(lt(searchLen, 0x20)) { h := keccak256(add(needle, 0x20), searchLen) }\\n let s := mload(add(needle, 0x20))\\n for { let m := shl(3, sub(0x20, and(searchLen, 0x1f))) } 1 {} {\\n let t := mload(i)\\n // Whether the first `searchLen % 32` bytes of `subject` and `needle` matches.\\n if iszero(shr(m, xor(t, s))) {\\n if h {\\n if iszero(eq(keccak256(i, searchLen), h)) {\\n i := add(i, 1)\\n if iszero(lt(i, subjectSearchEnd)) { break }\\n continue\\n }\\n }\\n mstore(o, sub(i, add(subject, 0x20))) // Append to `result`.\\n o := add(o, 0x20)\\n i := add(i, searchLen) // Advance `i` by `searchLen`.\\n if searchLen {\\n if iszero(lt(i, subjectSearchEnd)) { break }\\n continue\\n }\\n }\\n i := add(i, 1)\\n if iszero(lt(i, subjectSearchEnd)) { break }\\n }\\n mstore(result, shr(5, sub(o, add(result, 0x20)))) // Store the length of `result`.\\n // Allocate memory for result.\\n // We allocate one more word, so this array can be recycled for {split}.\\n mstore(0x40, add(o, 0x20))\\n }\\n }\\n }\\n\\n /// @dev Returns an arrays of bytess based on the `delimiter` inside of the `subject` bytes.\\n function split(bytes memory subject, bytes memory delimiter)\\n internal\\n pure\\n returns (bytes[] memory result)\\n {\\n uint256[] memory indices = indicesOf(subject, delimiter);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let w := not(0x1f)\\n let indexPtr := add(indices, 0x20)\\n let indicesEnd := add(indexPtr, shl(5, add(mload(indices), 1)))\\n mstore(add(indicesEnd, w), mload(subject))\\n mstore(indices, add(mload(indices), 1))\\n for { let prevIndex := 0 } 1 {} {\\n let index := mload(indexPtr)\\n mstore(indexPtr, 0x60)\\n if iszero(eq(index, prevIndex)) {\\n let element := mload(0x40)\\n let l := sub(index, prevIndex)\\n mstore(element, l) // Store the length of the element.\\n // Copy the `subject` one word at a time, backwards.\\n for { let o := and(add(l, 0x1f), w) } 1 {} {\\n mstore(add(element, o), mload(add(add(subject, prevIndex), o)))\\n o := add(o, w) // `sub(o, 0x20)`.\\n if iszero(o) { break }\\n }\\n mstore(add(add(element, 0x20), l), 0) // Zeroize the slot after the bytes.\\n // Allocate memory for the length and the bytes, rounded up to a multiple of 32.\\n mstore(0x40, add(element, and(add(l, 0x3f), w)))\\n mstore(indexPtr, element) // Store the `element` into the array.\\n }\\n prevIndex := add(index, mload(delimiter))\\n indexPtr := add(indexPtr, 0x20)\\n if iszero(lt(indexPtr, indicesEnd)) { break }\\n }\\n result := indices\\n if iszero(mload(delimiter)) {\\n result := add(indices, 0x20)\\n mstore(result, sub(mload(indices), 2))\\n }\\n }\\n }\\n\\n /// @dev Returns a concatenated bytes of `a` and `b`.\\n /// Cheaper than `bytes.concat()` and does not de-align the free memory pointer.\\n function concat(bytes memory a, bytes memory b) internal pure returns (bytes memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n let w := not(0x1f)\\n let aLen := mload(a)\\n // Copy `a` one word at a time, backwards.\\n for { let o := and(add(aLen, 0x20), w) } 1 {} {\\n mstore(add(result, o), mload(add(a, o)))\\n o := add(o, w) // `sub(o, 0x20)`.\\n if iszero(o) { break }\\n }\\n let bLen := mload(b)\\n let output := add(result, aLen)\\n // Copy `b` one word at a time, backwards.\\n for { let o := and(add(bLen, 0x20), w) } 1 {} {\\n mstore(add(output, o), mload(add(b, o)))\\n o := add(o, w) // `sub(o, 0x20)`.\\n if iszero(o) { break }\\n }\\n let totalLen := add(aLen, bLen)\\n let last := add(add(result, 0x20), totalLen)\\n mstore(last, 0) // Zeroize the slot after the bytes.\\n mstore(result, totalLen) // Store the length.\\n mstore(0x40, add(last, 0x20)) // Allocate memory.\\n }\\n }\\n\\n /// @dev Returns whether `a` equals `b`.\\n function eq(bytes memory a, bytes memory b) internal pure returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := eq(keccak256(add(a, 0x20), mload(a)), keccak256(add(b, 0x20), mload(b)))\\n }\\n }\\n\\n /// @dev Returns whether `a` equals `b`, where `b` is a null-terminated small bytes.\\n function eqs(bytes memory a, bytes32 b) internal pure returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // These should be evaluated on compile time, as far as possible.\\n let m := not(shl(7, div(not(iszero(b)), 255))) // `0x7f7f ...`.\\n let x := not(or(m, or(b, add(m, and(b, m)))))\\n let r := shl(7, iszero(iszero(shr(128, x))))\\n r := or(r, shl(6, iszero(iszero(shr(64, shr(r, x))))))\\n r := or(r, shl(5, lt(0xffffffff, shr(r, x))))\\n r := or(r, shl(4, lt(0xffff, shr(r, x))))\\n r := or(r, shl(3, lt(0xff, shr(r, x))))\\n // forgefmt: disable-next-item\\n result := gt(eq(mload(a), add(iszero(x), xor(31, shr(3, r)))),\\n xor(shr(add(8, r), b), shr(add(8, r), mload(add(a, 0x20)))))\\n }\\n }\\n\\n /// @dev Returns 0 if `a == b`, -1 if `a < b`, +1 if `a > b`.\\n /// If `a` == b[:a.length]`, and `a.length < b.length`, returns -1.\\n function cmp(bytes memory a, bytes memory b) internal pure returns (int256 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let aLen := mload(a)\\n let bLen := mload(b)\\n let n := and(xor(aLen, mul(xor(aLen, bLen), lt(bLen, aLen))), not(0x1f))\\n if n {\\n for { let i := 0x20 } 1 {} {\\n let x := mload(add(a, i))\\n let y := mload(add(b, i))\\n if iszero(or(xor(x, y), eq(i, n))) {\\n i := add(i, 0x20)\\n continue\\n }\\n result := sub(gt(x, y), lt(x, y))\\n break\\n }\\n }\\n // forgefmt: disable-next-item\\n if iszero(result) {\\n let l := 0x201f1e1d1c1b1a191817161514131211100f0e0d0c0b0a090807060504030201\\n let x := and(mload(add(add(a, 0x20), n)), shl(shl(3, byte(sub(aLen, n), l)), not(0)))\\n let y := and(mload(add(add(b, 0x20), n)), shl(shl(3, byte(sub(bLen, n), l)), not(0)))\\n result := sub(gt(x, y), lt(x, y))\\n if iszero(result) { result := sub(gt(aLen, bLen), lt(aLen, bLen)) }\\n }\\n }\\n }\\n\\n /// @dev Directly returns `a` without copying.\\n function directReturn(bytes memory a) internal pure {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Assumes that the bytes does not start from the scratch space.\\n let retStart := sub(a, 0x20)\\n let retUnpaddedSize := add(mload(a), 0x40)\\n // Right pad with zeroes. Just in case the bytes is produced\\n // by a method that doesn't zero right pad.\\n mstore(add(retStart, retUnpaddedSize), 0)\\n mstore(retStart, 0x20) // Store the return offset.\\n // End the transaction, returning the bytes.\\n return(retStart, and(not(0x1f), add(0x1f, retUnpaddedSize)))\\n }\\n }\\n\\n /// @dev Directly returns `a` with minimal copying.\\n function directReturn(bytes[] memory a) internal pure {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := mload(a) // `a.length`.\\n let o := add(a, 0x20) // Start of elements in `a`.\\n let u := a // Highest memory slot.\\n let w := not(0x1f)\\n for { let i := 0 } iszero(eq(i, n)) { i := add(i, 1) } {\\n let c := add(o, shl(5, i)) // Location of pointer to `a[i]`.\\n let s := mload(c) // `a[i]`.\\n let l := mload(s) // `a[i].length`.\\n let r := and(l, 0x1f) // `a[i].length % 32`.\\n let z := add(0x20, and(l, w)) // Offset of last word in `a[i]` from `s`.\\n // If `s` comes before `o`, or `s` is not zero right padded.\\n if iszero(lt(lt(s, o), or(iszero(r), iszero(shl(shl(3, r), mload(add(s, z))))))) {\\n let m := mload(0x40)\\n mstore(m, l) // Copy `a[i].length`.\\n for {} 1 {} {\\n mstore(add(m, z), mload(add(s, z))) // Copy `a[i]`, backwards.\\n z := add(z, w) // `sub(z, 0x20)`.\\n if iszero(z) { break }\\n }\\n let e := add(add(m, 0x20), l)\\n mstore(e, 0) // Zeroize the slot after the copied bytes.\\n mstore(0x40, add(e, 0x20)) // Allocate memory.\\n s := m\\n }\\n mstore(c, sub(s, o)) // Convert to calldata offset.\\n let t := add(l, add(s, 0x20))\\n if iszero(lt(t, u)) { u := t }\\n }\\n let retStart := add(a, w) // Assumes `a` doesn't start from scratch space.\\n mstore(retStart, 0x20) // Store the return offset.\\n return(retStart, add(0x40, sub(u, retStart))) // End the transaction.\\n }\\n }\\n\\n /// @dev Returns the word at `offset`, without any bounds checks.\\n function load(bytes memory a, uint256 offset) internal pure returns (bytes32 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(add(add(a, 0x20), offset))\\n }\\n }\\n\\n /// @dev Returns the word at `offset`, without any bounds checks.\\n function loadCalldata(bytes calldata a, uint256 offset)\\n internal\\n pure\\n returns (bytes32 result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := calldataload(add(a.offset, offset))\\n }\\n }\\n\\n /// @dev Returns a slice representing a static struct in the calldata. Performs bounds checks.\\n function staticStructInCalldata(bytes calldata a, uint256 offset)\\n internal\\n pure\\n returns (bytes calldata result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let l := sub(a.length, 0x20)\\n result.offset := add(a.offset, offset)\\n result.length := sub(a.length, offset)\\n if or(shr(64, or(l, a.offset)), gt(offset, l)) { revert(l, 0x00) }\\n }\\n }\\n\\n /// @dev Returns a slice representing a dynamic struct in the calldata. Performs bounds checks.\\n function dynamicStructInCalldata(bytes calldata a, uint256 offset)\\n internal\\n pure\\n returns (bytes calldata result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let l := sub(a.length, 0x20)\\n let s := calldataload(add(a.offset, offset)) // Relative offset of `result` from `a.offset`.\\n result.offset := add(a.offset, s)\\n result.length := sub(a.length, s)\\n if or(shr(64, or(s, or(l, a.offset))), gt(offset, l)) { revert(l, 0x00) }\\n }\\n }\\n\\n /// @dev Returns bytes in calldata. Performs bounds checks.\\n function bytesInCalldata(bytes calldata a, uint256 offset)\\n internal\\n pure\\n returns (bytes calldata result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let l := sub(a.length, 0x20)\\n let s := calldataload(add(a.offset, offset)) // Relative offset of `result` from `a.offset`.\\n result.offset := add(add(a.offset, s), 0x20)\\n result.length := calldataload(add(a.offset, s))\\n // forgefmt: disable-next-item\\n if or(shr(64, or(result.length, or(s, or(l, a.offset)))),\\n or(gt(add(s, result.length), l), gt(offset, l))) { revert(l, 0x00) }\\n }\\n }\\n\\n /// @dev Returns empty calldata bytes. For silencing the compiler.\\n function emptyCalldata() internal pure returns (bytes calldata result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result.length := 0\\n }\\n }\\n}\\n\",\"keccak256\":\"0x320c3c933df51e8fd6f1fc96de721c8cc6f1be1d4c586c11f1c472a23b86eba5\",\"license\":\"MIT\"},\"lib/solady/src/utils/LibString.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport {LibBytes} from \\\"./LibBytes.sol\\\";\\n\\n/// @notice Library for converting numbers into strings and other string operations.\\n/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibString.sol)\\n/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/LibString.sol)\\n///\\n/// @dev Note:\\n/// For performance and bytecode compactness, most of the string operations are restricted to\\n/// byte strings (7-bit ASCII), except where otherwise specified.\\n/// Usage of byte string operations on charsets with runes spanning two or more bytes\\n/// can lead to undefined behavior.\\nlibrary LibString {\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* STRUCTS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Goated string storage struct that totally MOGs, no cap, fr.\\n /// Uses less gas and bytecode than Solidity's native string storage. It's meta af.\\n /// Packs length with the first 31 bytes if <255 bytes, so it\\u2019s mad tight.\\n struct StringStorage {\\n bytes32 _spacer;\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* CUSTOM ERRORS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev The length of the output is too small to contain all the hex digits.\\n error HexLengthInsufficient();\\n\\n /// @dev The length of the string is more than 32 bytes.\\n error TooBigForSmallString();\\n\\n /// @dev The input string must be a 7-bit ASCII.\\n error StringNot7BitASCII();\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* CONSTANTS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev The constant returned when the `search` is not found in the string.\\n uint256 internal constant NOT_FOUND = type(uint256).max;\\n\\n /// @dev Lookup for '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'.\\n uint128 internal constant ALPHANUMERIC_7_BIT_ASCII = 0x7fffffe07fffffe03ff000000000000;\\n\\n /// @dev Lookup for 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'.\\n uint128 internal constant LETTERS_7_BIT_ASCII = 0x7fffffe07fffffe0000000000000000;\\n\\n /// @dev Lookup for 'abcdefghijklmnopqrstuvwxyz'.\\n uint128 internal constant LOWERCASE_7_BIT_ASCII = 0x7fffffe000000000000000000000000;\\n\\n /// @dev Lookup for 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.\\n uint128 internal constant UPPERCASE_7_BIT_ASCII = 0x7fffffe0000000000000000;\\n\\n /// @dev Lookup for '0123456789'.\\n uint128 internal constant DIGITS_7_BIT_ASCII = 0x3ff000000000000;\\n\\n /// @dev Lookup for '0123456789abcdefABCDEF'.\\n uint128 internal constant HEXDIGITS_7_BIT_ASCII = 0x7e0000007e03ff000000000000;\\n\\n /// @dev Lookup for '01234567'.\\n uint128 internal constant OCTDIGITS_7_BIT_ASCII = 0xff000000000000;\\n\\n /// @dev Lookup for '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!\\\"#$%&\\\\'()*+,-./:;<=>?@[\\\\\\\\]^_`{|}~ \\\\t\\\\n\\\\r\\\\x0b\\\\x0c'.\\n uint128 internal constant PRINTABLE_7_BIT_ASCII = 0x7fffffffffffffffffffffff00003e00;\\n\\n /// @dev Lookup for '!\\\"#$%&\\\\'()*+,-./:;<=>?@[\\\\\\\\]^_`{|}~'.\\n uint128 internal constant PUNCTUATION_7_BIT_ASCII = 0x78000001f8000001fc00fffe00000000;\\n\\n /// @dev Lookup for ' \\\\t\\\\n\\\\r\\\\x0b\\\\x0c'.\\n uint128 internal constant WHITESPACE_7_BIT_ASCII = 0x100003e00;\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* STRING STORAGE OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Sets the value of the string storage `$` to `s`.\\n function set(StringStorage storage $, string memory s) internal {\\n LibBytes.set(bytesStorage($), bytes(s));\\n }\\n\\n /// @dev Sets the value of the string storage `$` to `s`.\\n function setCalldata(StringStorage storage $, string calldata s) internal {\\n LibBytes.setCalldata(bytesStorage($), bytes(s));\\n }\\n\\n /// @dev Sets the value of the string storage `$` to the empty string.\\n function clear(StringStorage storage $) internal {\\n delete $._spacer;\\n }\\n\\n /// @dev Returns whether the value stored is `$` is the empty string \\\"\\\".\\n function isEmpty(StringStorage storage $) internal view returns (bool) {\\n return uint256($._spacer) & 0xff == uint256(0);\\n }\\n\\n /// @dev Returns the length of the value stored in `$`.\\n function length(StringStorage storage $) internal view returns (uint256) {\\n return LibBytes.length(bytesStorage($));\\n }\\n\\n /// @dev Returns the value stored in `$`.\\n function get(StringStorage storage $) internal view returns (string memory) {\\n return string(LibBytes.get(bytesStorage($)));\\n }\\n\\n /// @dev Returns the uint8 at index `i`. If out-of-bounds, returns 0.\\n function uint8At(StringStorage storage $, uint256 i) internal view returns (uint8) {\\n return LibBytes.uint8At(bytesStorage($), i);\\n }\\n\\n /// @dev Helper to cast `$` to a `BytesStorage`.\\n function bytesStorage(StringStorage storage $)\\n internal\\n pure\\n returns (LibBytes.BytesStorage storage casted)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n casted.slot := $.slot\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* DECIMAL OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns the base 10 decimal representation of `value`.\\n function toString(uint256 value) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // The maximum value of a uint256 contains 78 digits (1 byte per digit), but\\n // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.\\n // We will need 1 word for the trailing zeros padding, 1 word for the length,\\n // and 3 words for a maximum of 78 digits.\\n result := add(mload(0x40), 0x80)\\n mstore(0x40, add(result, 0x20)) // Allocate memory.\\n mstore(result, 0) // Zeroize the slot after the string.\\n\\n let end := result // Cache the end of the memory to calculate the length later.\\n let w := not(0) // Tsk.\\n // We write the string from rightmost digit to leftmost digit.\\n // The following is essentially a do-while loop that also handles the zero case.\\n for { let temp := value } 1 {} {\\n result := add(result, w) // `sub(result, 1)`.\\n // Store the character to the pointer.\\n // The ASCII index of the '0' character is 48.\\n mstore8(result, add(48, mod(temp, 10)))\\n temp := div(temp, 10) // Keep dividing `temp` until zero.\\n if iszero(temp) { break }\\n }\\n let n := sub(end, result)\\n result := sub(result, 0x20) // Move the pointer 32 bytes back to make room for the length.\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the base 10 decimal representation of `value`.\\n function toString(int256 value) internal pure returns (string memory result) {\\n if (value >= 0) return toString(uint256(value));\\n unchecked {\\n result = toString(~uint256(value) + 1);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n // We still have some spare memory space on the left,\\n // as we have allocated 3 words (96 bytes) for up to 78 digits.\\n let n := mload(result) // Load the string length.\\n mstore(result, 0x2d) // Store the '-' character.\\n result := sub(result, 1) // Move back the string pointer by a byte.\\n mstore(result, add(n, 1)) // Update the string length.\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* HEXADECIMAL OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns the hexadecimal representation of `value`,\\n /// left-padded to an input length of `byteCount` bytes.\\n /// The output is prefixed with \\\"0x\\\" encoded using 2 hexadecimal digits per byte,\\n /// giving a total length of `byteCount * 2 + 2` bytes.\\n /// Reverts if `byteCount` is too small for the output to contain all the digits.\\n function toHexString(uint256 value, uint256 byteCount)\\n internal\\n pure\\n returns (string memory result)\\n {\\n result = toHexStringNoPrefix(value, byteCount);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := add(mload(result), 2) // Compute the length.\\n mstore(result, 0x3078) // Store the \\\"0x\\\" prefix.\\n result := sub(result, 2) // Move the pointer.\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`,\\n /// left-padded to an input length of `byteCount` bytes.\\n /// The output is not prefixed with \\\"0x\\\" and is encoded using 2 hexadecimal digits per byte,\\n /// giving a total length of `byteCount * 2` bytes.\\n /// Reverts if `byteCount` is too small for the output to contain all the digits.\\n function toHexStringNoPrefix(uint256 value, uint256 byteCount)\\n internal\\n pure\\n returns (string memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // We need 0x20 bytes for the trailing zeros padding, `byteCount * 2` bytes\\n // for the digits, 0x02 bytes for the prefix, and 0x20 bytes for the length.\\n // We add 0x20 to the total and round down to a multiple of 0x20.\\n // (0x20 + 0x20 + 0x02 + 0x20) = 0x62.\\n result := add(mload(0x40), and(add(shl(1, byteCount), 0x42), not(0x1f)))\\n mstore(0x40, add(result, 0x20)) // Allocate memory.\\n mstore(result, 0) // Zeroize the slot after the string.\\n\\n let end := result // Cache the end to calculate the length later.\\n // Store \\\"0123456789abcdef\\\" in scratch space.\\n mstore(0x0f, 0x30313233343536373839616263646566)\\n\\n let start := sub(result, add(byteCount, byteCount))\\n let w := not(1) // Tsk.\\n let temp := value\\n // We write the string from rightmost digit to leftmost digit.\\n // The following is essentially a do-while loop that also handles the zero case.\\n for {} 1 {} {\\n result := add(result, w) // `sub(result, 2)`.\\n mstore8(add(result, 1), mload(and(temp, 15)))\\n mstore8(result, mload(and(shr(4, temp), 15)))\\n temp := shr(8, temp)\\n if iszero(xor(result, start)) { break }\\n }\\n if temp {\\n mstore(0x00, 0x2194895a) // `HexLengthInsufficient()`.\\n revert(0x1c, 0x04)\\n }\\n let n := sub(end, result)\\n result := sub(result, 0x20)\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`.\\n /// The output is prefixed with \\\"0x\\\" and encoded using 2 hexadecimal digits per byte.\\n /// As address are 20 bytes long, the output will left-padded to have\\n /// a length of `20 * 2 + 2` bytes.\\n function toHexString(uint256 value) internal pure returns (string memory result) {\\n result = toHexStringNoPrefix(value);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := add(mload(result), 2) // Compute the length.\\n mstore(result, 0x3078) // Store the \\\"0x\\\" prefix.\\n result := sub(result, 2) // Move the pointer.\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`.\\n /// The output is prefixed with \\\"0x\\\".\\n /// The output excludes leading \\\"0\\\" from the `toHexString` output.\\n /// `0x00: \\\"0x0\\\", 0x01: \\\"0x1\\\", 0x12: \\\"0x12\\\", 0x123: \\\"0x123\\\"`.\\n function toMinimalHexString(uint256 value) internal pure returns (string memory result) {\\n result = toHexStringNoPrefix(value);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let o := eq(byte(0, mload(add(result, 0x20))), 0x30) // Whether leading zero is present.\\n let n := add(mload(result), 2) // Compute the length.\\n mstore(add(result, o), 0x3078) // Store the \\\"0x\\\" prefix, accounting for leading zero.\\n result := sub(add(result, o), 2) // Move the pointer, accounting for leading zero.\\n mstore(result, sub(n, o)) // Store the length, accounting for leading zero.\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`.\\n /// The output excludes leading \\\"0\\\" from the `toHexStringNoPrefix` output.\\n /// `0x00: \\\"0\\\", 0x01: \\\"1\\\", 0x12: \\\"12\\\", 0x123: \\\"123\\\"`.\\n function toMinimalHexStringNoPrefix(uint256 value)\\n internal\\n pure\\n returns (string memory result)\\n {\\n result = toHexStringNoPrefix(value);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let o := eq(byte(0, mload(add(result, 0x20))), 0x30) // Whether leading zero is present.\\n let n := mload(result) // Get the length.\\n result := add(result, o) // Move the pointer, accounting for leading zero.\\n mstore(result, sub(n, o)) // Store the length, accounting for leading zero.\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`.\\n /// The output is encoded using 2 hexadecimal digits per byte.\\n /// As address are 20 bytes long, the output will left-padded to have\\n /// a length of `20 * 2` bytes.\\n function toHexStringNoPrefix(uint256 value) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // We need 0x20 bytes for the trailing zeros padding, 0x20 bytes for the length,\\n // 0x02 bytes for the prefix, and 0x40 bytes for the digits.\\n // The next multiple of 0x20 above (0x20 + 0x20 + 0x02 + 0x40) is 0xa0.\\n result := add(mload(0x40), 0x80)\\n mstore(0x40, add(result, 0x20)) // Allocate memory.\\n mstore(result, 0) // Zeroize the slot after the string.\\n\\n let end := result // Cache the end to calculate the length later.\\n mstore(0x0f, 0x30313233343536373839616263646566) // Store the \\\"0123456789abcdef\\\" lookup.\\n\\n let w := not(1) // Tsk.\\n // We write the string from rightmost digit to leftmost digit.\\n // The following is essentially a do-while loop that also handles the zero case.\\n for { let temp := value } 1 {} {\\n result := add(result, w) // `sub(result, 2)`.\\n mstore8(add(result, 1), mload(and(temp, 15)))\\n mstore8(result, mload(and(shr(4, temp), 15)))\\n temp := shr(8, temp)\\n if iszero(temp) { break }\\n }\\n let n := sub(end, result)\\n result := sub(result, 0x20)\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`.\\n /// The output is prefixed with \\\"0x\\\", encoded using 2 hexadecimal digits per byte,\\n /// and the alphabets are capitalized conditionally according to\\n /// https://eips.ethereum.org/EIPS/eip-55\\n function toHexStringChecksummed(address value) internal pure returns (string memory result) {\\n result = toHexString(value);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let mask := shl(6, div(not(0), 255)) // `0b010000000100000000 ...`\\n let o := add(result, 0x22)\\n let hashed := and(keccak256(o, 40), mul(34, mask)) // `0b10001000 ... `\\n let t := shl(240, 136) // `0b10001000 << 240`\\n for { let i := 0 } 1 {} {\\n mstore(add(i, i), mul(t, byte(i, hashed)))\\n i := add(i, 1)\\n if eq(i, 20) { break }\\n }\\n mstore(o, xor(mload(o), shr(1, and(mload(0x00), and(mload(o), mask)))))\\n o := add(o, 0x20)\\n mstore(o, xor(mload(o), shr(1, and(mload(0x20), and(mload(o), mask)))))\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`.\\n /// The output is prefixed with \\\"0x\\\" and encoded using 2 hexadecimal digits per byte.\\n function toHexString(address value) internal pure returns (string memory result) {\\n result = toHexStringNoPrefix(value);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := add(mload(result), 2) // Compute the length.\\n mstore(result, 0x3078) // Store the \\\"0x\\\" prefix.\\n result := sub(result, 2) // Move the pointer.\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`.\\n /// The output is encoded using 2 hexadecimal digits per byte.\\n function toHexStringNoPrefix(address value) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n // Allocate memory.\\n // We need 0x20 bytes for the trailing zeros padding, 0x20 bytes for the length,\\n // 0x02 bytes for the prefix, and 0x28 bytes for the digits.\\n // The next multiple of 0x20 above (0x20 + 0x20 + 0x02 + 0x28) is 0x80.\\n mstore(0x40, add(result, 0x80))\\n mstore(0x0f, 0x30313233343536373839616263646566) // Store the \\\"0123456789abcdef\\\" lookup.\\n\\n result := add(result, 2)\\n mstore(result, 40) // Store the length.\\n let o := add(result, 0x20)\\n mstore(add(o, 40), 0) // Zeroize the slot after the string.\\n value := shl(96, value)\\n // We write the string from rightmost digit to leftmost digit.\\n // The following is essentially a do-while loop that also handles the zero case.\\n for { let i := 0 } 1 {} {\\n let p := add(o, add(i, i))\\n let temp := byte(i, value)\\n mstore8(add(p, 1), mload(and(temp, 15)))\\n mstore8(p, mload(shr(4, temp)))\\n i := add(i, 1)\\n if eq(i, 20) { break }\\n }\\n }\\n }\\n\\n /// @dev Returns the hex encoded string from the raw bytes.\\n /// The output is encoded using 2 hexadecimal digits per byte.\\n function toHexString(bytes memory raw) internal pure returns (string memory result) {\\n result = toHexStringNoPrefix(raw);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := add(mload(result), 2) // Compute the length.\\n mstore(result, 0x3078) // Store the \\\"0x\\\" prefix.\\n result := sub(result, 2) // Move the pointer.\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the hex encoded string from the raw bytes.\\n /// The output is encoded using 2 hexadecimal digits per byte.\\n function toHexStringNoPrefix(bytes memory raw) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := mload(raw)\\n result := add(mload(0x40), 2) // Skip 2 bytes for the optional prefix.\\n mstore(result, add(n, n)) // Store the length of the output.\\n\\n mstore(0x0f, 0x30313233343536373839616263646566) // Store the \\\"0123456789abcdef\\\" lookup.\\n let o := add(result, 0x20)\\n let end := add(raw, n)\\n for {} iszero(eq(raw, end)) {} {\\n raw := add(raw, 1)\\n mstore8(add(o, 1), mload(and(mload(raw), 15)))\\n mstore8(o, mload(and(shr(4, mload(raw)), 15)))\\n o := add(o, 2)\\n }\\n mstore(o, 0) // Zeroize the slot after the string.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* RUNE STRING OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns the number of UTF characters in the string.\\n function runeCount(string memory s) internal pure returns (uint256 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n if mload(s) {\\n mstore(0x00, div(not(0), 255))\\n mstore(0x20, 0x0202020202020202020202020202020202020202020202020303030304040506)\\n let o := add(s, 0x20)\\n let end := add(o, mload(s))\\n for { result := 1 } 1 { result := add(result, 1) } {\\n o := add(o, byte(0, mload(shr(250, mload(o)))))\\n if iszero(lt(o, end)) { break }\\n }\\n }\\n }\\n }\\n\\n /// @dev Returns if this string is a 7-bit ASCII string.\\n /// (i.e. all characters codes are in [0..127])\\n function is7BitASCII(string memory s) internal pure returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := 1\\n let mask := shl(7, div(not(0), 255))\\n let n := mload(s)\\n if n {\\n let o := add(s, 0x20)\\n let end := add(o, n)\\n let last := mload(end)\\n mstore(end, 0)\\n for {} 1 {} {\\n if and(mask, mload(o)) {\\n result := 0\\n break\\n }\\n o := add(o, 0x20)\\n if iszero(lt(o, end)) { break }\\n }\\n mstore(end, last)\\n }\\n }\\n }\\n\\n /// @dev Returns if this string is a 7-bit ASCII string,\\n /// AND all characters are in the `allowed` lookup.\\n /// Note: If `s` is empty, returns true regardless of `allowed`.\\n function is7BitASCII(string memory s, uint128 allowed) internal pure returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := 1\\n if mload(s) {\\n let allowed_ := shr(128, shl(128, allowed))\\n let o := add(s, 0x20)\\n for { let end := add(o, mload(s)) } 1 {} {\\n result := and(result, shr(byte(0, mload(o)), allowed_))\\n o := add(o, 1)\\n if iszero(and(result, lt(o, end))) { break }\\n }\\n }\\n }\\n }\\n\\n /// @dev Converts the bytes in the 7-bit ASCII string `s` to\\n /// an allowed lookup for use in `is7BitASCII(s, allowed)`.\\n /// To save runtime gas, you can cache the result in an immutable variable.\\n function to7BitASCIIAllowedLookup(string memory s) internal pure returns (uint128 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n if mload(s) {\\n let o := add(s, 0x20)\\n for { let end := add(o, mload(s)) } 1 {} {\\n result := or(result, shl(byte(0, mload(o)), 1))\\n o := add(o, 1)\\n if iszero(lt(o, end)) { break }\\n }\\n if shr(128, result) {\\n mstore(0x00, 0xc9807e0d) // `StringNot7BitASCII()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* BYTE STRING OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n // For performance and bytecode compactness, byte string operations are restricted\\n // to 7-bit ASCII strings. All offsets are byte offsets, not UTF character offsets.\\n // Usage of byte string operations on charsets with runes spanning two or more bytes\\n // can lead to undefined behavior.\\n\\n /// @dev Returns `subject` all occurrences of `needle` replaced with `replacement`.\\n function replace(string memory subject, string memory needle, string memory replacement)\\n internal\\n pure\\n returns (string memory)\\n {\\n return string(LibBytes.replace(bytes(subject), bytes(needle), bytes(replacement)));\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from left to right, starting from `from`.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function indexOf(string memory subject, string memory needle, uint256 from)\\n internal\\n pure\\n returns (uint256)\\n {\\n return LibBytes.indexOf(bytes(subject), bytes(needle), from);\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from left to right.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function indexOf(string memory subject, string memory needle) internal pure returns (uint256) {\\n return LibBytes.indexOf(bytes(subject), bytes(needle), 0);\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from right to left, starting from `from`.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function lastIndexOf(string memory subject, string memory needle, uint256 from)\\n internal\\n pure\\n returns (uint256)\\n {\\n return LibBytes.lastIndexOf(bytes(subject), bytes(needle), from);\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from right to left.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function lastIndexOf(string memory subject, string memory needle)\\n internal\\n pure\\n returns (uint256)\\n {\\n return LibBytes.lastIndexOf(bytes(subject), bytes(needle), type(uint256).max);\\n }\\n\\n /// @dev Returns true if `needle` is found in `subject`, false otherwise.\\n function contains(string memory subject, string memory needle) internal pure returns (bool) {\\n return LibBytes.contains(bytes(subject), bytes(needle));\\n }\\n\\n /// @dev Returns whether `subject` starts with `needle`.\\n function startsWith(string memory subject, string memory needle) internal pure returns (bool) {\\n return LibBytes.startsWith(bytes(subject), bytes(needle));\\n }\\n\\n /// @dev Returns whether `subject` ends with `needle`.\\n function endsWith(string memory subject, string memory needle) internal pure returns (bool) {\\n return LibBytes.endsWith(bytes(subject), bytes(needle));\\n }\\n\\n /// @dev Returns `subject` repeated `times`.\\n function repeat(string memory subject, uint256 times) internal pure returns (string memory) {\\n return string(LibBytes.repeat(bytes(subject), times));\\n }\\n\\n /// @dev Returns a copy of `subject` sliced from `start` to `end` (exclusive).\\n /// `start` and `end` are byte offsets.\\n function slice(string memory subject, uint256 start, uint256 end)\\n internal\\n pure\\n returns (string memory)\\n {\\n return string(LibBytes.slice(bytes(subject), start, end));\\n }\\n\\n /// @dev Returns a copy of `subject` sliced from `start` to the end of the string.\\n /// `start` is a byte offset.\\n function slice(string memory subject, uint256 start) internal pure returns (string memory) {\\n return string(LibBytes.slice(bytes(subject), start, type(uint256).max));\\n }\\n\\n /// @dev Returns all the indices of `needle` in `subject`.\\n /// The indices are byte offsets.\\n function indicesOf(string memory subject, string memory needle)\\n internal\\n pure\\n returns (uint256[] memory)\\n {\\n return LibBytes.indicesOf(bytes(subject), bytes(needle));\\n }\\n\\n /// @dev Returns an arrays of strings based on the `delimiter` inside of the `subject` string.\\n function split(string memory subject, string memory delimiter)\\n internal\\n pure\\n returns (string[] memory result)\\n {\\n bytes[] memory a = LibBytes.split(bytes(subject), bytes(delimiter));\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := a\\n }\\n }\\n\\n /// @dev Returns a concatenated string of `a` and `b`.\\n /// Cheaper than `string.concat()` and does not de-align the free memory pointer.\\n function concat(string memory a, string memory b) internal pure returns (string memory) {\\n return string(LibBytes.concat(bytes(a), bytes(b)));\\n }\\n\\n /// @dev Returns a copy of the string in either lowercase or UPPERCASE.\\n /// WARNING! This function is only compatible with 7-bit ASCII strings.\\n function toCase(string memory subject, bool toUpper)\\n internal\\n pure\\n returns (string memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := mload(subject)\\n if n {\\n result := mload(0x40)\\n let o := add(result, 0x20)\\n let d := sub(subject, result)\\n let flags := shl(add(70, shl(5, toUpper)), 0x3ffffff)\\n for { let end := add(o, n) } 1 {} {\\n let b := byte(0, mload(add(d, o)))\\n mstore8(o, xor(and(shr(b, flags), 0x20), b))\\n o := add(o, 1)\\n if eq(o, end) { break }\\n }\\n mstore(result, n) // Store the length.\\n mstore(o, 0) // Zeroize the slot after the string.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n }\\n }\\n }\\n\\n /// @dev Returns a string from a small bytes32 string.\\n /// `s` must be null-terminated, or behavior will be undefined.\\n function fromSmallString(bytes32 s) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n let n := 0\\n for {} byte(n, s) { n := add(n, 1) } {} // Scan for '\\\\0'.\\n mstore(result, n) // Store the length.\\n let o := add(result, 0x20)\\n mstore(o, s) // Store the bytes of the string.\\n mstore(add(o, n), 0) // Zeroize the slot after the string.\\n mstore(0x40, add(result, 0x40)) // Allocate memory.\\n }\\n }\\n\\n /// @dev Returns the small string, with all bytes after the first null byte zeroized.\\n function normalizeSmallString(bytes32 s) internal pure returns (bytes32 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n for {} byte(result, s) { result := add(result, 1) } {} // Scan for '\\\\0'.\\n mstore(0x00, s)\\n mstore(result, 0x00)\\n result := mload(0x00)\\n }\\n }\\n\\n /// @dev Returns the string as a normalized null-terminated small string.\\n function toSmallString(string memory s) internal pure returns (bytes32 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(s)\\n if iszero(lt(result, 33)) {\\n mstore(0x00, 0xec92f9a3) // `TooBigForSmallString()`.\\n revert(0x1c, 0x04)\\n }\\n result := shl(shl(3, sub(32, result)), mload(add(s, result)))\\n }\\n }\\n\\n /// @dev Returns a lowercased copy of the string.\\n /// WARNING! This function is only compatible with 7-bit ASCII strings.\\n function lower(string memory subject) internal pure returns (string memory result) {\\n result = toCase(subject, false);\\n }\\n\\n /// @dev Returns an UPPERCASED copy of the string.\\n /// WARNING! This function is only compatible with 7-bit ASCII strings.\\n function upper(string memory subject) internal pure returns (string memory result) {\\n result = toCase(subject, true);\\n }\\n\\n /// @dev Escapes the string to be used within HTML tags.\\n function escapeHTML(string memory s) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n let end := add(s, mload(s))\\n let o := add(result, 0x20)\\n // Store the bytes of the packed offsets and strides into the scratch space.\\n // `packed = (stride << 5) | offset`. Max offset is 20. Max stride is 6.\\n mstore(0x1f, 0x900094)\\n mstore(0x08, 0xc0000000a6ab)\\n // Store \\\""&'<>\\\" into the scratch space.\\n mstore(0x00, shl(64, 0x2671756f743b26616d703b262333393b266c743b2667743b))\\n for {} iszero(eq(s, end)) {} {\\n s := add(s, 1)\\n let c := and(mload(s), 0xff)\\n // Not in `[\\\"\\\\\\\"\\\",\\\"'\\\",\\\"&\\\",\\\"<\\\",\\\">\\\"]`.\\n if iszero(and(shl(c, 1), 0x500000c400000000)) {\\n mstore8(o, c)\\n o := add(o, 1)\\n continue\\n }\\n let t := shr(248, mload(c))\\n mstore(o, mload(and(t, 0x1f)))\\n o := add(o, shr(5, t))\\n }\\n mstore(o, 0) // Zeroize the slot after the string.\\n mstore(result, sub(o, add(result, 0x20))) // Store the length.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n }\\n }\\n\\n /// @dev Escapes the string to be used within double-quotes in a JSON.\\n /// If `addDoubleQuotes` is true, the result will be enclosed in double-quotes.\\n function escapeJSON(string memory s, bool addDoubleQuotes)\\n internal\\n pure\\n returns (string memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n let o := add(result, 0x20)\\n if addDoubleQuotes {\\n mstore8(o, 34)\\n o := add(1, o)\\n }\\n // Store \\\"\\\\\\\\u0000\\\" in scratch space.\\n // Store \\\"0123456789abcdef\\\" in scratch space.\\n // Also, store `{0x08:\\\"b\\\", 0x09:\\\"t\\\", 0x0a:\\\"n\\\", 0x0c:\\\"f\\\", 0x0d:\\\"r\\\"}`.\\n // into the scratch space.\\n mstore(0x15, 0x5c75303030303031323334353637383961626364656662746e006672)\\n // Bitmask for detecting `[\\\"\\\\\\\"\\\",\\\"\\\\\\\\\\\"]`.\\n let e := or(shl(0x22, 1), shl(0x5c, 1))\\n for { let end := add(s, mload(s)) } iszero(eq(s, end)) {} {\\n s := add(s, 1)\\n let c := and(mload(s), 0xff)\\n if iszero(lt(c, 0x20)) {\\n if iszero(and(shl(c, 1), e)) {\\n // Not in `[\\\"\\\\\\\"\\\",\\\"\\\\\\\\\\\"]`.\\n mstore8(o, c)\\n o := add(o, 1)\\n continue\\n }\\n mstore8(o, 0x5c) // \\\"\\\\\\\\\\\".\\n mstore8(add(o, 1), c)\\n o := add(o, 2)\\n continue\\n }\\n if iszero(and(shl(c, 1), 0x3700)) {\\n // Not in `[\\\"\\\\b\\\",\\\"\\\\t\\\",\\\"\\\\n\\\",\\\"\\\\f\\\",\\\"\\\\d\\\"]`.\\n mstore8(0x1d, mload(shr(4, c))) // Hex value.\\n mstore8(0x1e, mload(and(c, 15))) // Hex value.\\n mstore(o, mload(0x19)) // \\\"\\\\\\\\u00XX\\\".\\n o := add(o, 6)\\n continue\\n }\\n mstore8(o, 0x5c) // \\\"\\\\\\\\\\\".\\n mstore8(add(o, 1), mload(add(c, 8)))\\n o := add(o, 2)\\n }\\n if addDoubleQuotes {\\n mstore8(o, 34)\\n o := add(1, o)\\n }\\n mstore(o, 0) // Zeroize the slot after the string.\\n mstore(result, sub(o, add(result, 0x20))) // Store the length.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n }\\n }\\n\\n /// @dev Escapes the string to be used within double-quotes in a JSON.\\n function escapeJSON(string memory s) internal pure returns (string memory result) {\\n result = escapeJSON(s, false);\\n }\\n\\n /// @dev Encodes `s` so that it can be safely used in a URI,\\n /// just like `encodeURIComponent` in JavaScript.\\n /// See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent\\n /// See: https://datatracker.ietf.org/doc/html/rfc2396\\n /// See: https://datatracker.ietf.org/doc/html/rfc3986\\n function encodeURIComponent(string memory s) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n // Store \\\"0123456789ABCDEF\\\" in scratch space.\\n // Uppercased to be consistent with JavaScript's implementation.\\n mstore(0x0f, 0x30313233343536373839414243444546)\\n let o := add(result, 0x20)\\n for { let end := add(s, mload(s)) } iszero(eq(s, end)) {} {\\n s := add(s, 1)\\n let c := and(mload(s), 0xff)\\n // If not in `[0-9A-Z-a-z-_.!~*'()]`.\\n if iszero(and(1, shr(c, 0x47fffffe87fffffe03ff678200000000))) {\\n mstore8(o, 0x25) // '%'.\\n mstore8(add(o, 1), mload(and(shr(4, c), 15)))\\n mstore8(add(o, 2), mload(and(c, 15)))\\n o := add(o, 3)\\n continue\\n }\\n mstore8(o, c)\\n o := add(o, 1)\\n }\\n mstore(result, sub(o, add(result, 0x20))) // Store the length.\\n mstore(o, 0) // Zeroize the slot after the string.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n }\\n }\\n\\n /// @dev Returns whether `a` equals `b`.\\n function eq(string memory a, string memory b) internal pure returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := eq(keccak256(add(a, 0x20), mload(a)), keccak256(add(b, 0x20), mload(b)))\\n }\\n }\\n\\n /// @dev Returns whether `a` equals `b`, where `b` is a null-terminated small string.\\n function eqs(string memory a, bytes32 b) internal pure returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // These should be evaluated on compile time, as far as possible.\\n let m := not(shl(7, div(not(iszero(b)), 255))) // `0x7f7f ...`.\\n let x := not(or(m, or(b, add(m, and(b, m)))))\\n let r := shl(7, iszero(iszero(shr(128, x))))\\n r := or(r, shl(6, iszero(iszero(shr(64, shr(r, x))))))\\n r := or(r, shl(5, lt(0xffffffff, shr(r, x))))\\n r := or(r, shl(4, lt(0xffff, shr(r, x))))\\n r := or(r, shl(3, lt(0xff, shr(r, x))))\\n // forgefmt: disable-next-item\\n result := gt(eq(mload(a), add(iszero(x), xor(31, shr(3, r)))),\\n xor(shr(add(8, r), b), shr(add(8, r), mload(add(a, 0x20)))))\\n }\\n }\\n\\n /// @dev Returns 0 if `a == b`, -1 if `a < b`, +1 if `a > b`.\\n /// If `a` == b[:a.length]`, and `a.length < b.length`, returns -1.\\n function cmp(string memory a, string memory b) internal pure returns (int256) {\\n return LibBytes.cmp(bytes(a), bytes(b));\\n }\\n\\n /// @dev Packs a single string with its length into a single word.\\n /// Returns `bytes32(0)` if the length is zero or greater than 31.\\n function packOne(string memory a) internal pure returns (bytes32 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // We don't need to zero right pad the string,\\n // since this is our own custom non-standard packing scheme.\\n result :=\\n mul(\\n // Load the length and the bytes.\\n mload(add(a, 0x1f)),\\n // `length != 0 && length < 32`. Abuses underflow.\\n // Assumes that the length is valid and within the block gas limit.\\n lt(sub(mload(a), 1), 0x1f)\\n )\\n }\\n }\\n\\n /// @dev Unpacks a string packed using {packOne}.\\n /// Returns the empty string if `packed` is `bytes32(0)`.\\n /// If `packed` is not an output of {packOne}, the output behavior is undefined.\\n function unpackOne(bytes32 packed) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40) // Grab the free memory pointer.\\n mstore(0x40, add(result, 0x40)) // Allocate 2 words (1 for the length, 1 for the bytes).\\n mstore(result, 0) // Zeroize the length slot.\\n mstore(add(result, 0x1f), packed) // Store the length and bytes.\\n mstore(add(add(result, 0x20), mload(result)), 0) // Right pad with zeroes.\\n }\\n }\\n\\n /// @dev Packs two strings with their lengths into a single word.\\n /// Returns `bytes32(0)` if combined length is zero or greater than 30.\\n function packTwo(string memory a, string memory b) internal pure returns (bytes32 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let aLen := mload(a)\\n // We don't need to zero right pad the strings,\\n // since this is our own custom non-standard packing scheme.\\n result :=\\n mul(\\n or( // Load the length and the bytes of `a` and `b`.\\n shl(shl(3, sub(0x1f, aLen)), mload(add(a, aLen))), mload(sub(add(b, 0x1e), aLen))),\\n // `totalLen != 0 && totalLen < 31`. Abuses underflow.\\n // Assumes that the lengths are valid and within the block gas limit.\\n lt(sub(add(aLen, mload(b)), 1), 0x1e)\\n )\\n }\\n }\\n\\n /// @dev Unpacks strings packed using {packTwo}.\\n /// Returns the empty strings if `packed` is `bytes32(0)`.\\n /// If `packed` is not an output of {packTwo}, the output behavior is undefined.\\n function unpackTwo(bytes32 packed)\\n internal\\n pure\\n returns (string memory resultA, string memory resultB)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n resultA := mload(0x40) // Grab the free memory pointer.\\n resultB := add(resultA, 0x40)\\n // Allocate 2 words for each string (1 for the length, 1 for the byte). Total 4 words.\\n mstore(0x40, add(resultB, 0x40))\\n // Zeroize the length slots.\\n mstore(resultA, 0)\\n mstore(resultB, 0)\\n // Store the lengths and bytes.\\n mstore(add(resultA, 0x1f), packed)\\n mstore(add(resultB, 0x1f), mload(add(add(resultA, 0x20), mload(resultA))))\\n // Right pad with zeroes.\\n mstore(add(add(resultA, 0x20), mload(resultA)), 0)\\n mstore(add(add(resultB, 0x20), mload(resultB)), 0)\\n }\\n }\\n\\n /// @dev Directly returns `a` without copying.\\n function directReturn(string memory a) internal pure {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Assumes that the string does not start from the scratch space.\\n let retStart := sub(a, 0x20)\\n let retUnpaddedSize := add(mload(a), 0x40)\\n // Right pad with zeroes. Just in case the string is produced\\n // by a method that doesn't zero right pad.\\n mstore(add(retStart, retUnpaddedSize), 0)\\n mstore(retStart, 0x20) // Store the return offset.\\n // End the transaction, returning the string.\\n return(retStart, and(not(0x1f), add(0x1f, retUnpaddedSize)))\\n }\\n }\\n}\\n\",\"keccak256\":\"0x8a6b219f6ccda90c08e2debae62618d78d6f0cef086eb6c9503793d7f12815dd\",\"license\":\"MIT\"},\"lib/solady/src/utils/MerkleProofLib.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\n/// @notice Gas optimized verification of proof of inclusion for a leaf in a Merkle tree.\\n/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/MerkleProofLib.sol)\\n/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/MerkleProofLib.sol)\\n/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/MerkleProof.sol)\\nlibrary MerkleProofLib {\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* MERKLE PROOF VERIFICATION OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns whether `leaf` exists in the Merkle tree with `root`, given `proof`.\\n function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf)\\n internal\\n pure\\n returns (bool isValid)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n if mload(proof) {\\n // Initialize `offset` to the offset of `proof` elements in memory.\\n let offset := add(proof, 0x20)\\n // Left shift by 5 is equivalent to multiplying by 0x20.\\n let end := add(offset, shl(5, mload(proof)))\\n // Iterate over proof elements to compute root hash.\\n for {} 1 {} {\\n // Slot of `leaf` in scratch space.\\n // If the condition is true: 0x20, otherwise: 0x00.\\n let scratch := shl(5, gt(leaf, mload(offset)))\\n // Store elements to hash contiguously in scratch space.\\n // Scratch space is 64 bytes (0x00 - 0x3f) and both elements are 32 bytes.\\n mstore(scratch, leaf)\\n mstore(xor(scratch, 0x20), mload(offset))\\n // Reuse `leaf` to store the hash to reduce stack operations.\\n leaf := keccak256(0x00, 0x40)\\n offset := add(offset, 0x20)\\n if iszero(lt(offset, end)) { break }\\n }\\n }\\n isValid := eq(leaf, root)\\n }\\n }\\n\\n /// @dev Returns whether `leaf` exists in the Merkle tree with `root`, given `proof`.\\n function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf)\\n internal\\n pure\\n returns (bool isValid)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n if proof.length {\\n // Left shift by 5 is equivalent to multiplying by 0x20.\\n let end := add(proof.offset, shl(5, proof.length))\\n // Initialize `offset` to the offset of `proof` in the calldata.\\n let offset := proof.offset\\n // Iterate over proof elements to compute root hash.\\n for {} 1 {} {\\n // Slot of `leaf` in scratch space.\\n // If the condition is true: 0x20, otherwise: 0x00.\\n let scratch := shl(5, gt(leaf, calldataload(offset)))\\n // Store elements to hash contiguously in scratch space.\\n // Scratch space is 64 bytes (0x00 - 0x3f) and both elements are 32 bytes.\\n mstore(scratch, leaf)\\n mstore(xor(scratch, 0x20), calldataload(offset))\\n // Reuse `leaf` to store the hash to reduce stack operations.\\n leaf := keccak256(0x00, 0x40)\\n offset := add(offset, 0x20)\\n if iszero(lt(offset, end)) { break }\\n }\\n }\\n isValid := eq(leaf, root)\\n }\\n }\\n\\n /// @dev Returns whether all `leaves` exist in the Merkle tree with `root`,\\n /// given `proof` and `flags`.\\n ///\\n /// Note:\\n /// - Breaking the invariant `flags.length == (leaves.length - 1) + proof.length`\\n /// will always return false.\\n /// - The sum of the lengths of `proof` and `leaves` must never overflow.\\n /// - Any non-zero word in the `flags` array is treated as true.\\n /// - The memory offset of `proof` must be non-zero\\n /// (i.e. `proof` is not pointing to the scratch space).\\n function verifyMultiProof(\\n bytes32[] memory proof,\\n bytes32 root,\\n bytes32[] memory leaves,\\n bool[] memory flags\\n ) internal pure returns (bool isValid) {\\n // Rebuilds the root by consuming and producing values on a queue.\\n // The queue starts with the `leaves` array, and goes into a `hashes` array.\\n // After the process, the last element on the queue is verified\\n // to be equal to the `root`.\\n //\\n // The `flags` array denotes whether the sibling\\n // should be popped from the queue (`flag == true`), or\\n // should be popped from the `proof` (`flag == false`).\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Cache the lengths of the arrays.\\n let leavesLength := mload(leaves)\\n let proofLength := mload(proof)\\n let flagsLength := mload(flags)\\n\\n // Advance the pointers of the arrays to point to the data.\\n leaves := add(0x20, leaves)\\n proof := add(0x20, proof)\\n flags := add(0x20, flags)\\n\\n // If the number of flags is correct.\\n for {} eq(add(leavesLength, proofLength), add(flagsLength, 1)) {} {\\n // For the case where `proof.length + leaves.length == 1`.\\n if iszero(flagsLength) {\\n // `isValid = (proof.length == 1 ? proof[0] : leaves[0]) == root`.\\n isValid := eq(mload(xor(leaves, mul(xor(proof, leaves), proofLength))), root)\\n break\\n }\\n\\n // The required final proof offset if `flagsLength` is not zero, otherwise zero.\\n let proofEnd := add(proof, shl(5, proofLength))\\n // We can use the free memory space for the queue.\\n // We don't need to allocate, since the queue is temporary.\\n let hashesFront := mload(0x40)\\n // Copy the leaves into the hashes.\\n // Sometimes, a little memory expansion costs less than branching.\\n // Should cost less, even with a high free memory offset of 0x7d00.\\n leavesLength := shl(5, leavesLength)\\n for { let i := 0 } iszero(eq(i, leavesLength)) { i := add(i, 0x20) } {\\n mstore(add(hashesFront, i), mload(add(leaves, i)))\\n }\\n // Compute the back of the hashes.\\n let hashesBack := add(hashesFront, leavesLength)\\n // This is the end of the memory for the queue.\\n // We recycle `flagsLength` to save on stack variables (sometimes save gas).\\n flagsLength := add(hashesBack, shl(5, flagsLength))\\n\\n for {} 1 {} {\\n // Pop from `hashes`.\\n let a := mload(hashesFront)\\n // Pop from `hashes`.\\n let b := mload(add(hashesFront, 0x20))\\n hashesFront := add(hashesFront, 0x40)\\n\\n // If the flag is false, load the next proof,\\n // else, pops from the queue.\\n if iszero(mload(flags)) {\\n // Loads the next proof.\\n b := mload(proof)\\n proof := add(proof, 0x20)\\n // Unpop from `hashes`.\\n hashesFront := sub(hashesFront, 0x20)\\n }\\n\\n // Advance to the next flag.\\n flags := add(flags, 0x20)\\n\\n // Slot of `a` in scratch space.\\n // If the condition is true: 0x20, otherwise: 0x00.\\n let scratch := shl(5, gt(a, b))\\n // Hash the scratch space and push the result onto the queue.\\n mstore(scratch, a)\\n mstore(xor(scratch, 0x20), b)\\n mstore(hashesBack, keccak256(0x00, 0x40))\\n hashesBack := add(hashesBack, 0x20)\\n if iszero(lt(hashesBack, flagsLength)) { break }\\n }\\n isValid :=\\n and(\\n // Checks if the last value in the queue is same as the root.\\n eq(mload(sub(hashesBack, 0x20)), root),\\n // And whether all the proofs are used, if required.\\n eq(proofEnd, proof)\\n )\\n break\\n }\\n }\\n }\\n\\n /// @dev Returns whether all `leaves` exist in the Merkle tree with `root`,\\n /// given `proof` and `flags`.\\n ///\\n /// Note:\\n /// - Breaking the invariant `flags.length == (leaves.length - 1) + proof.length`\\n /// will always return false.\\n /// - Any non-zero word in the `flags` array is treated as true.\\n /// - The calldata offset of `proof` must be non-zero\\n /// (i.e. `proof` is from a regular Solidity function with a 4-byte selector).\\n function verifyMultiProofCalldata(\\n bytes32[] calldata proof,\\n bytes32 root,\\n bytes32[] calldata leaves,\\n bool[] calldata flags\\n ) internal pure returns (bool isValid) {\\n // Rebuilds the root by consuming and producing values on a queue.\\n // The queue starts with the `leaves` array, and goes into a `hashes` array.\\n // After the process, the last element on the queue is verified\\n // to be equal to the `root`.\\n //\\n // The `flags` array denotes whether the sibling\\n // should be popped from the queue (`flag == true`), or\\n // should be popped from the `proof` (`flag == false`).\\n /// @solidity memory-safe-assembly\\n assembly {\\n // If the number of flags is correct.\\n for {} eq(add(leaves.length, proof.length), add(flags.length, 1)) {} {\\n // For the case where `proof.length + leaves.length == 1`.\\n if iszero(flags.length) {\\n // `isValid = (proof.length == 1 ? proof[0] : leaves[0]) == root`.\\n // forgefmt: disable-next-item\\n isValid := eq(\\n calldataload(\\n xor(leaves.offset, mul(xor(proof.offset, leaves.offset), proof.length))\\n ),\\n root\\n )\\n break\\n }\\n\\n // The required final proof offset if `flagsLength` is not zero, otherwise zero.\\n let proofEnd := add(proof.offset, shl(5, proof.length))\\n // We can use the free memory space for the queue.\\n // We don't need to allocate, since the queue is temporary.\\n let hashesFront := mload(0x40)\\n // Copy the leaves into the hashes.\\n // Sometimes, a little memory expansion costs less than branching.\\n // Should cost less, even with a high free memory offset of 0x7d00.\\n calldatacopy(hashesFront, leaves.offset, shl(5, leaves.length))\\n // Compute the back of the hashes.\\n let hashesBack := add(hashesFront, shl(5, leaves.length))\\n // This is the end of the memory for the queue.\\n // We recycle `flagsLength` to save on stack variables (sometimes save gas).\\n flags.length := add(hashesBack, shl(5, flags.length))\\n\\n // We don't need to make a copy of `proof.offset` or `flags.offset`,\\n // as they are pass-by-value (this trick may not always save gas).\\n\\n for {} 1 {} {\\n // Pop from `hashes`.\\n let a := mload(hashesFront)\\n // Pop from `hashes`.\\n let b := mload(add(hashesFront, 0x20))\\n hashesFront := add(hashesFront, 0x40)\\n\\n // If the flag is false, load the next proof,\\n // else, pops from the queue.\\n if iszero(calldataload(flags.offset)) {\\n // Loads the next proof.\\n b := calldataload(proof.offset)\\n proof.offset := add(proof.offset, 0x20)\\n // Unpop from `hashes`.\\n hashesFront := sub(hashesFront, 0x20)\\n }\\n\\n // Advance to the next flag offset.\\n flags.offset := add(flags.offset, 0x20)\\n\\n // Slot of `a` in scratch space.\\n // If the condition is true: 0x20, otherwise: 0x00.\\n let scratch := shl(5, gt(a, b))\\n // Hash the scratch space and push the result onto the queue.\\n mstore(scratch, a)\\n mstore(xor(scratch, 0x20), b)\\n mstore(hashesBack, keccak256(0x00, 0x40))\\n hashesBack := add(hashesBack, 0x20)\\n if iszero(lt(hashesBack, flags.length)) { break }\\n }\\n isValid :=\\n and(\\n // Checks if the last value in the queue is same as the root.\\n eq(mload(sub(hashesBack, 0x20)), root),\\n // And whether all the proofs are used, if required.\\n eq(proofEnd, proof.offset)\\n )\\n break\\n }\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* EMPTY CALLDATA HELPERS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns an empty calldata bytes32 array.\\n function emptyProof() internal pure returns (bytes32[] calldata proof) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n proof.length := 0\\n }\\n }\\n\\n /// @dev Returns an empty calldata bytes32 array.\\n function emptyLeaves() internal pure returns (bytes32[] calldata leaves) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n leaves.length := 0\\n }\\n }\\n\\n /// @dev Returns an empty calldata bool array.\\n function emptyFlags() internal pure returns (bool[] calldata flags) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n flags.length := 0\\n }\\n }\\n}\\n\",\"keccak256\":\"0x36e0da7695b2a2316db2ee41192cddb9327394920e38ee3fadea2308d796fbd2\",\"license\":\"MIT\"},\"src/tokens/ERC1155/ERC1155BaseToken.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\nimport { ERC2981Controlled } from \\\"../common/ERC2981Controlled.sol\\\";\\nimport { SignalsImplicitModeControlled } from \\\"../common/SignalsImplicitModeControlled.sol\\\";\\nimport { ERC1155, ERC1155Supply } from \\\"./extensions/supply/ERC1155Supply.sol\\\";\\n\\nimport { LibString } from \\\"solady/utils/LibString.sol\\\";\\n\\nerror InvalidInitialization();\\n\\n/**\\n * A standard base implementation of ERC-1155 for use in Sequence library contracts.\\n */\\nabstract contract ERC1155BaseToken is ERC1155Supply, ERC2981Controlled, SignalsImplicitModeControlled {\\n\\n bytes32 internal constant METADATA_ADMIN_ROLE = keccak256(\\\"METADATA_ADMIN_ROLE\\\");\\n\\n string public name;\\n string public baseURI;\\n string public contractURI;\\n\\n bool private _initialized;\\n\\n /**\\n * Initialize the contract.\\n * @param owner Owner address.\\n * @param tokenName Token name.\\n * @param tokenBaseURI Base URI for token metadata.\\n * @param tokenContractURI Contract URI for token metadata.\\n * @param implicitModeValidator Implicit session validator address.\\n * @param implicitModeProjectId Implicit session project id.\\n * @dev This should be called immediately after deployment.\\n */\\n function _initialize(\\n address owner,\\n string memory tokenName,\\n string memory tokenBaseURI,\\n string memory tokenContractURI,\\n address implicitModeValidator,\\n bytes32 implicitModeProjectId\\n ) internal {\\n if (_initialized) {\\n revert InvalidInitialization();\\n }\\n\\n name = tokenName;\\n baseURI = tokenBaseURI;\\n contractURI = tokenContractURI;\\n\\n _grantRole(DEFAULT_ADMIN_ROLE, owner);\\n _grantRole(ROYALTY_ADMIN_ROLE, owner);\\n _grantRole(METADATA_ADMIN_ROLE, owner);\\n\\n _initializeImplicitMode(owner, implicitModeValidator, implicitModeProjectId);\\n\\n _initialized = true;\\n }\\n\\n //\\n // Metadata\\n //\\n\\n /// @inheritdoc ERC1155\\n function uri(\\n uint256 _id\\n ) public view virtual override returns (string memory) {\\n return string(abi.encodePacked(baseURI, LibString.toString(_id), \\\".json\\\"));\\n }\\n\\n /**\\n * Update the base URI of token's URI.\\n * @param tokenBaseURI New base URI of token's URI\\n */\\n function setBaseMetadataURI(\\n string memory tokenBaseURI\\n ) external onlyRole(METADATA_ADMIN_ROLE) {\\n baseURI = tokenBaseURI;\\n }\\n\\n /**\\n * Update the name of the contract.\\n * @param tokenName New contract name\\n */\\n function setContractName(\\n string memory tokenName\\n ) external onlyRole(METADATA_ADMIN_ROLE) {\\n name = tokenName;\\n }\\n\\n /**\\n * Update the contract URI of token's URI.\\n * @param tokenContractURI New contract URI of token's URI\\n * @notice Refer to https://docs.opensea.io/docs/contract-level-metadata\\n */\\n function setContractURI(\\n string memory tokenContractURI\\n ) external onlyRole(METADATA_ADMIN_ROLE) {\\n contractURI = tokenContractURI;\\n }\\n\\n //\\n // Burn\\n //\\n\\n /**\\n * Allows the owner of the token to burn their tokens.\\n * @param tokenId Id of token to burn\\n * @param amount Amount of tokens to burn\\n */\\n function burn(uint256 tokenId, uint256 amount) public virtual {\\n _burn(msg.sender, tokenId, amount);\\n }\\n\\n /**\\n * Burn tokens of given token id for each (tokenIds[i], amounts[i]) pair.\\n * @param tokenIds Array of token ids to burn\\n * @param amounts Array of the amount to be burned\\n */\\n function batchBurn(uint256[] memory tokenIds, uint256[] memory amounts) public virtual {\\n super._batchBurn(msg.sender, tokenIds, amounts);\\n }\\n\\n //\\n // Views\\n //\\n\\n /**\\n * Check interface support.\\n * @param interfaceId Interface id\\n * @return True if supported\\n */\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view virtual override(ERC1155Supply, ERC2981Controlled, SignalsImplicitModeControlled) returns (bool) {\\n return ERC1155Supply.supportsInterface(interfaceId) || ERC2981Controlled.supportsInterface(interfaceId)\\n || SignalsImplicitModeControlled.supportsInterface(interfaceId);\\n }\\n\\n}\\n\",\"keccak256\":\"0x81e8abb54378967f6c8ebb4222d2c9a5c93e730535532fa6fe56de5ef1c56c56\",\"license\":\"Apache-2.0\"},\"src/tokens/ERC1155/extensions/supply/ERC1155Supply.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\nimport { IERC1155Supply, IERC1155SupplyFunctions } from \\\"./IERC1155Supply.sol\\\";\\n\\nimport { ERC1155 } from \\\"solady/tokens/ERC1155.sol\\\";\\n\\n/**\\n * An ERC-1155 extension that tracks token supply.\\n */\\nabstract contract ERC1155Supply is ERC1155, IERC1155Supply {\\n\\n // Current supply\\n uint256 public totalSupply;\\n mapping(uint256 => uint256) public tokenSupply;\\n\\n /**\\n * Mint _amount of tokens of a given id\\n * @param _to The address to mint tokens to\\n * @param _id Token id to mint\\n * @param _amount The amount to be minted\\n * @param _data Data to pass if receiver is contract\\n */\\n function _mint(address _to, uint256 _id, uint256 _amount, bytes memory _data) internal virtual override {\\n super._mint(_to, _id, _amount, _data);\\n\\n totalSupply += _amount;\\n tokenSupply[_id] += _amount;\\n }\\n\\n /**\\n * Mint tokens for each ids in _ids\\n * @param _to The address to mint tokens to\\n * @param _ids Array of ids to mint\\n * @param _amounts Array of amount of tokens to mint per id\\n * @param _data Data to pass if receiver is contract\\n */\\n function _batchMint(\\n address _to,\\n uint256[] memory _ids,\\n uint256[] memory _amounts,\\n bytes memory _data\\n ) internal virtual override {\\n super._batchMint(_to, _ids, _amounts, _data);\\n\\n uint256 nMint = _ids.length;\\n uint256 totalAmount = 0;\\n for (uint256 i; i < nMint;) {\\n uint256 amount = _amounts[i];\\n totalAmount += amount;\\n tokenSupply[_ids[i]] += amount;\\n unchecked {\\n // Already checked in super._batchMint\\n ++i;\\n }\\n }\\n totalSupply += totalAmount;\\n }\\n\\n /**\\n * Burn _amount of tokens of a given token id\\n * @param _from The address to burn tokens from\\n * @param _id Token id to burn\\n * @param _amount The amount to be burned\\n */\\n function _burn(address _from, uint256 _id, uint256 _amount) internal virtual override {\\n super._burn(_from, _id, _amount);\\n\\n totalSupply -= _amount;\\n tokenSupply[_id] -= _amount;\\n }\\n\\n /**\\n * Burn tokens of given token id for each (_ids[i], _amounts[i]) pair\\n * @param _from The address to burn tokens from\\n * @param _ids Array of token ids to burn\\n * @param _amounts Array of the amount to be burned\\n */\\n function _batchBurn(address _from, uint256[] memory _ids, uint256[] memory _amounts) internal virtual override {\\n super._batchBurn(_from, _ids, _amounts);\\n\\n uint256 nBurn = _ids.length;\\n uint256 totalAmount = 0;\\n for (uint256 i; i < nBurn;) {\\n uint256 amount = _amounts[i];\\n tokenSupply[_ids[i]] -= amount;\\n totalAmount += amount;\\n unchecked {\\n // Already checked in super._batchBurn\\n ++i;\\n }\\n }\\n totalSupply -= totalAmount;\\n }\\n\\n //\\n // Views\\n //\\n\\n /**\\n * Check interface support.\\n * @param interfaceId Interface id\\n * @return True if supported\\n */\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view virtual override(ERC1155) returns (bool) {\\n return type(IERC1155SupplyFunctions).interfaceId == interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n}\\n\",\"keccak256\":\"0xc2cf8d5479a9cafcc2e92e3c8e9f4afce7fa2416cc811acbb766cf45db3692f0\",\"license\":\"Apache-2.0\"},\"src/tokens/ERC1155/extensions/supply/IERC1155Supply.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\ninterface IERC1155SupplyFunctions {\\n\\n /**\\n * Returns the total supply of ERC1155 tokens.\\n */\\n function totalSupply() external returns (uint256);\\n\\n /**\\n * Returns the total supply of a given ERC1155 token.\\n * @param tokenId The ERC1155 token id.\\n */\\n function tokenSupply(\\n uint256 tokenId\\n ) external returns (uint256);\\n\\n}\\n\\ninterface IERC1155SupplySignals {\\n\\n /**\\n * Invalid array input length.\\n */\\n error InvalidArrayLength();\\n\\n}\\n\\ninterface IERC1155Supply is IERC1155SupplySignals { }\\n\",\"keccak256\":\"0x135a8948daebd1229d6bada5ada73f2b3496c9bd9f8cfc78d7a68a0f117e55b5\",\"license\":\"Apache-2.0\"},\"src/tokens/ERC1155/presets/items/ERC1155Items.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\nimport { ERC1155BaseToken, ERC2981Controlled } from \\\"../../ERC1155BaseToken.sol\\\";\\nimport { IERC1155Items, IERC1155ItemsFunctions } from \\\"./IERC1155Items.sol\\\";\\n\\n/**\\n * An implementation of ERC-1155 capable of minting when role provided.\\n */\\ncontract ERC1155Items is ERC1155BaseToken, IERC1155Items {\\n\\n bytes32 internal constant MINTER_ROLE = keccak256(\\\"MINTER_ROLE\\\");\\n\\n /**\\n * Initialize the contract.\\n * @param owner Owner address\\n * @param tokenName Token name\\n * @param tokenBaseURI Base URI for token metadata\\n * @param tokenContractURI Contract URI for token metadata\\n * @param royaltyReceiver Address of who should be sent the royalty payment\\n * @param royaltyFeeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\\n * @param implicitModeValidator The implicit mode validator address\\n * @param implicitModeProjectId The implicit mode project id\\n * @dev This should be called immediately after deployment.\\n */\\n function initialize(\\n address owner,\\n string memory tokenName,\\n string memory tokenBaseURI,\\n string memory tokenContractURI,\\n address royaltyReceiver,\\n uint96 royaltyFeeNumerator,\\n address implicitModeValidator,\\n bytes32 implicitModeProjectId\\n ) public virtual {\\n ERC1155BaseToken._initialize(\\n owner, tokenName, tokenBaseURI, tokenContractURI, implicitModeValidator, implicitModeProjectId\\n );\\n _setDefaultRoyalty(royaltyReceiver, royaltyFeeNumerator);\\n\\n _grantRole(MINTER_ROLE, owner);\\n }\\n\\n //\\n // Minting\\n //\\n\\n /**\\n * Mint tokens.\\n * @param to Address to mint tokens to.\\n * @param tokenId Token ID to mint.\\n * @param amount Amount of tokens to mint.\\n * @param data Data to pass if receiver is contract.\\n */\\n function mint(address to, uint256 tokenId, uint256 amount, bytes memory data) external onlyRole(MINTER_ROLE) {\\n _mint(to, tokenId, amount, data);\\n }\\n\\n /**\\n * Mint tokens.\\n * @param to Address to mint tokens to.\\n * @param tokenIds Token IDs to mint.\\n * @param amounts Amounts of tokens to mint.\\n * @param data Data to pass if receiver is contract.\\n */\\n function batchMint(\\n address to,\\n uint256[] memory tokenIds,\\n uint256[] memory amounts,\\n bytes memory data\\n ) external onlyRole(MINTER_ROLE) {\\n _batchMint(to, tokenIds, amounts, data);\\n }\\n\\n //\\n // Views\\n //\\n\\n /**\\n * Check interface support.\\n * @param interfaceId Interface id\\n * @return True if supported\\n */\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view virtual override(ERC1155BaseToken) returns (bool) {\\n return type(IERC1155ItemsFunctions).interfaceId == interfaceId\\n || ERC1155BaseToken.supportsInterface(interfaceId) || super.supportsInterface(interfaceId);\\n }\\n\\n}\\n\",\"keccak256\":\"0x2791ebaef4b852f357f199574cbb7a923c997e28d79bc5a03929f9f8eb9dec8c\",\"license\":\"Apache-2.0\"},\"src/tokens/ERC1155/presets/items/IERC1155Items.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\ninterface IERC1155ItemsFunctions {\\n\\n /**\\n * Mint tokens.\\n * @param to Address to mint tokens to.\\n * @param tokenId Token ID to mint.\\n * @param amount Amount of tokens to mint.\\n * @param data Data to pass if receiver is contract.\\n */\\n function mint(address to, uint256 tokenId, uint256 amount, bytes memory data) external;\\n\\n /**\\n * Mint tokens.\\n * @param to Address to mint tokens to.\\n * @param tokenIds Token IDs to mint.\\n * @param amounts Amounts of tokens to mint.\\n * @param data Data to pass if receiver is contract.\\n */\\n function batchMint(address to, uint256[] memory tokenIds, uint256[] memory amounts, bytes memory data) external;\\n\\n}\\n\\ninterface IERC1155ItemsSignals {\\n\\n /**\\n * Invalid initialization error.\\n */\\n error InvalidInitialization();\\n\\n}\\n\\ninterface IERC1155Items is IERC1155ItemsFunctions, IERC1155ItemsSignals { }\\n\",\"keccak256\":\"0x4b05643201f0416f2beab08c2679e2a166a2e9b7f91021b9758fc9802f2c49ce\",\"license\":\"Apache-2.0\"},\"src/tokens/ERC1155/presets/pack/ERC1155Pack.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\nimport { IERC721ItemsFunctions } from \\\"../../../ERC721/presets/items/IERC721Items.sol\\\";\\nimport { ERC1155Items } from \\\"../items/ERC1155Items.sol\\\";\\nimport { IERC1155ItemsFunctions } from \\\"../items/IERC1155Items.sol\\\";\\nimport { IERC1155Pack } from \\\"./IERC1155Pack.sol\\\";\\n\\nimport { MerkleProofLib } from \\\"solady/utils/MerkleProofLib.sol\\\";\\n\\ncontract ERC1155Pack is ERC1155Items, IERC1155Pack {\\n\\n bytes32 internal constant PACK_ADMIN_ROLE = keccak256(\\\"PACK_ADMIN_ROLE\\\");\\n\\n address public immutable erc1155Holder;\\n\\n mapping(uint256 => bytes32) public merkleRoot;\\n mapping(uint256 => uint256) public supply;\\n mapping(uint256 => uint256) public remainingSupply;\\n\\n mapping(address => mapping(uint256 => uint256)) internal _commitments;\\n mapping(uint256 => mapping(uint256 => uint256)) internal _availableIndices;\\n\\n constructor(\\n address _erc1155Holder\\n ) {\\n erc1155Holder = _erc1155Holder;\\n }\\n\\n /// @inheritdoc ERC1155Items\\n function initialize(\\n address owner,\\n string memory tokenName,\\n string memory tokenBaseURI,\\n string memory tokenContractURI,\\n address royaltyReceiver,\\n uint96 royaltyFeeNumerator,\\n address implicitModeValidator,\\n bytes32 implicitModeProjectId\\n ) public virtual override {\\n _grantRole(PACK_ADMIN_ROLE, owner);\\n super.initialize(\\n owner,\\n tokenName,\\n tokenBaseURI,\\n tokenContractURI,\\n royaltyReceiver,\\n royaltyFeeNumerator,\\n implicitModeValidator,\\n implicitModeProjectId\\n );\\n }\\n\\n /// @inheritdoc IERC1155Pack\\n function setPacksContent(bytes32 _merkleRoot, uint256 _supply, uint256 packId) external onlyRole(PACK_ADMIN_ROLE) {\\n merkleRoot[packId] = _merkleRoot;\\n supply[packId] = _supply;\\n remainingSupply[packId] = _supply;\\n }\\n\\n /// @inheritdoc IERC1155Pack\\n function commit(\\n uint256 packId\\n ) external {\\n if (_commitments[msg.sender][packId] != 0) {\\n revert PendingReveal();\\n }\\n _burn(msg.sender, packId, 1);\\n _commitments[msg.sender][packId] = block.number + 1;\\n\\n emit Commit(msg.sender, packId);\\n }\\n\\n /// @inheritdoc IERC1155Pack\\n function reveal(\\n address user,\\n PackContent calldata packContent,\\n bytes32[] calldata proof,\\n uint256 packId\\n ) external {\\n (uint256 randomIndex, uint256 revealIdx) = _getRevealIdx(user, packId);\\n\\n bytes32 leaf = keccak256(abi.encode(revealIdx, packContent));\\n if (!MerkleProofLib.verify(proof, merkleRoot[packId], leaf)) {\\n revert InvalidProof();\\n }\\n\\n delete _commitments[user][packId];\\n remainingSupply[packId]--;\\n\\n // Point this index to the last index's value\\n _availableIndices[packId][randomIndex] = _getIndexOrDefault(remainingSupply[packId], packId);\\n\\n for (uint256 i; i < packContent.tokenAddresses.length;) {\\n address tokenAddr = packContent.tokenAddresses[i];\\n uint256[] memory tokenIds = packContent.tokenIds[i];\\n if (packContent.isERC721[i]) {\\n for (uint256 j; j < tokenIds.length;) {\\n IERC721ItemsFunctions(tokenAddr).mint(user, tokenIds[j]);\\n unchecked {\\n ++j;\\n }\\n }\\n } else {\\n // Send via the holder fallback if available\\n address to = user;\\n if (erc1155Holder != address(0) && msg.sender != user) {\\n to = erc1155Holder;\\n }\\n bytes memory packedData = abi.encode(user);\\n IERC1155ItemsFunctions(tokenAddr).batchMint(to, tokenIds, packContent.amounts[i], packedData);\\n }\\n unchecked {\\n ++i;\\n }\\n }\\n\\n emit Reveal(user, packId);\\n }\\n\\n /// @inheritdoc IERC1155Pack\\n function refundPack(address user, uint256 packId) external {\\n uint256 commitment = _commitments[user][packId];\\n if (commitment == 0) {\\n revert NoCommit();\\n }\\n if (uint256(blockhash(commitment)) != 0 || block.number <= commitment) {\\n revert PendingReveal();\\n }\\n delete _commitments[user][packId];\\n _mint(user, packId, 1, \\\"\\\");\\n }\\n\\n /// @inheritdoc IERC1155Pack\\n function getRevealIdx(address user, uint256 packId) public view returns (uint256 revealIdx) {\\n (, revealIdx) = _getRevealIdx(user, packId);\\n return revealIdx;\\n }\\n\\n function _getRevealIdx(address user, uint256 packId) internal view returns (uint256 randomIdx, uint256 revealIdx) {\\n if (remainingSupply[packId] == 0) {\\n revert AllPacksOpened();\\n }\\n\\n uint256 commitment = _commitments[user][packId];\\n if (commitment == 0) {\\n revert NoCommit();\\n }\\n bytes32 blockHash = blockhash(commitment);\\n if (uint256(blockHash) == 0) {\\n revert InvalidCommit();\\n }\\n\\n randomIdx = uint256(keccak256(abi.encode(blockHash, user))) % remainingSupply[packId];\\n revealIdx = _getIndexOrDefault(randomIdx, packId);\\n return (randomIdx, revealIdx);\\n }\\n\\n function _getIndexOrDefault(uint256 index, uint256 packId) internal view returns (uint256) {\\n uint256 value = _availableIndices[packId][index];\\n return value == 0 ? index : value;\\n }\\n\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view override returns (bool) {\\n return interfaceId == type(IERC1155Pack).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n}\\n\",\"keccak256\":\"0x0162450a09db2c5bb4292540e7fe5e779f3a1227a4d02b38b3e4195d7f7ebb33\",\"license\":\"Apache-2.0\"},\"src/tokens/ERC1155/presets/pack/IERC1155Pack.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\ninterface IERC1155Pack {\\n\\n struct PackContent {\\n address[] tokenAddresses;\\n bool[] isERC721;\\n uint256[][] tokenIds;\\n uint256[][] amounts;\\n }\\n\\n /**\\n * Commit expired or never made.\\n */\\n error InvalidCommit();\\n\\n /**\\n * Reveal is pending.\\n */\\n error PendingReveal();\\n\\n /**\\n * Commit never made.\\n */\\n error NoCommit();\\n\\n /**\\n * Invalid proof.\\n */\\n error InvalidProof();\\n\\n /**\\n * All packs opened.\\n */\\n error AllPacksOpened();\\n\\n /// @notice Emitted when a user make a commitment\\n event Commit(address indexed user, uint256 packId);\\n\\n /// @notice Emitted when a reveal is successful\\n event Reveal(address user, uint256 packId);\\n\\n /**\\n * Set all possible pack contents.\\n * @param _merkleRoot merkle root built from all possible pack contents.\\n * @param _supply total amount of packs.\\n * @param packId tokenId of pack.\\n * @dev Updating these values before all the packs have been opened may lead to undesirable behavior.\\n */\\n function setPacksContent(bytes32 _merkleRoot, uint256 _supply, uint256 packId) external;\\n\\n /**\\n * Get random reveal index.\\n * @param user address of reward recipient.\\n * @param packId tokenId of pack.\\n */\\n function getRevealIdx(address user, uint256 packId) external view returns (uint256);\\n\\n /**\\n * Commit to reveal pack content.\\n * @param packId tokenId of pack.\\n * @notice this function burns user's pack.\\n */\\n function commit(\\n uint256 packId\\n ) external;\\n\\n /**\\n * Reveal pack content.\\n * @param user address of reward recipient.\\n * @param packContent reward selected with random index.\\n * @param proof Pack contents merkle proof.\\n * @param packId tokenId of pack.\\n */\\n function reveal(\\n address user,\\n PackContent calldata packContent,\\n bytes32[] calldata proof,\\n uint256 packId\\n ) external;\\n\\n /**\\n * Ask for pack refund after commit expiration.\\n * @param user address of pack owner.\\n * @param packId tokenId of pack.\\n * @notice this function mints a pack for the user when his commit is expired.\\n */\\n function refundPack(address user, uint256 packId) external;\\n\\n}\\n\",\"keccak256\":\"0x75d783b098a2fc433b06126023ad9bae5a1d11138c3c9bd39c66b16b1d014c88\",\"license\":\"Apache-2.0\"},\"src/tokens/ERC721/presets/items/IERC721Items.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\ninterface IERC721ItemsFunctions {\\n\\n /**\\n * Mint tokens.\\n * @param to Address to mint tokens to.\\n * @param tokenId Token id to mint.\\n */\\n function mint(address to, uint256 tokenId) external;\\n\\n /**\\n * Mint a sequential token.\\n * @param to Address to mint token to.\\n * @param amount Amount of tokens to mint.\\n */\\n function mintSequential(address to, uint256 amount) external;\\n\\n /**\\n * Get the total supply of tokens.\\n * @return totalSupply The total supply of tokens.\\n */\\n function totalSupply() external view returns (uint256 totalSupply);\\n\\n}\\n\\ninterface IERC721ItemsSignals {\\n\\n /**\\n * Invalid initialization error.\\n */\\n error InvalidInitialization();\\n\\n}\\n\\ninterface IERC721Items is IERC721ItemsFunctions, IERC721ItemsSignals { }\\n\",\"keccak256\":\"0x3170e3d97e03d070d03c50cbe5a77ea84209bb8e2bcff3bd8fc55b88cc7f2ba1\",\"license\":\"Apache-2.0\"},\"src/tokens/common/ERC2981Controlled.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\nimport { IERC2981Controlled } from \\\"./IERC2981Controlled.sol\\\";\\n\\nimport { AccessControlEnumerable } from \\\"openzeppelin-contracts/contracts/access/AccessControlEnumerable.sol\\\";\\nimport { ERC2981 } from \\\"openzeppelin-contracts/contracts/token/common/ERC2981.sol\\\";\\n\\n/**\\n * An implementation of ERC-2981 that allows updates by roles.\\n */\\nabstract contract ERC2981Controlled is ERC2981, AccessControlEnumerable, IERC2981Controlled {\\n\\n bytes32 internal constant ROYALTY_ADMIN_ROLE = keccak256(\\\"ROYALTY_ADMIN_ROLE\\\");\\n\\n //\\n // Royalty\\n //\\n\\n /**\\n * Sets the royalty information that all ids in this contract will default to.\\n * @param receiver Address of who should be sent the royalty payment\\n * @param feeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\\n */\\n function setDefaultRoyalty(address receiver, uint96 feeNumerator) external onlyRole(ROYALTY_ADMIN_ROLE) {\\n _setDefaultRoyalty(receiver, feeNumerator);\\n }\\n\\n /**\\n * Sets the royalty information that a given token id in this contract will use.\\n * @param tokenId The token id to set the royalty information for\\n * @param receiver Address of who should be sent the royalty payment\\n * @param feeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\\n * @notice This overrides the default royalty information for this token id\\n */\\n function setTokenRoyalty(\\n uint256 tokenId,\\n address receiver,\\n uint96 feeNumerator\\n ) external onlyRole(ROYALTY_ADMIN_ROLE) {\\n _setTokenRoyalty(tokenId, receiver, feeNumerator);\\n }\\n\\n //\\n // Views\\n //\\n\\n /**\\n * Check interface support.\\n * @param interfaceId Interface id\\n * @return True if supported\\n */\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view virtual override(ERC2981, AccessControlEnumerable) returns (bool) {\\n return ERC2981.supportsInterface(interfaceId) || AccessControlEnumerable.supportsInterface(interfaceId)\\n || type(IERC2981Controlled).interfaceId == interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n}\\n\",\"keccak256\":\"0xf02124d449f7dc76b4b1a26d9b1728d42facfc5f84771e73352e2b0c4b6c566b\",\"license\":\"Apache-2.0\"},\"src/tokens/common/IERC2981Controlled.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\ninterface IERC2981ControlledFunctions {\\n\\n /**\\n * Sets the royalty information that all ids in this contract will default to.\\n * @param receiver Address of who should be sent the royalty payment\\n * @param feeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\\n */\\n function setDefaultRoyalty(address receiver, uint96 feeNumerator) external;\\n\\n /**\\n * Sets the royalty information that a given token id in this contract will use.\\n * @param tokenId The token id to set the royalty information for\\n * @param receiver Address of who should be sent the royalty payment\\n * @param feeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\\n * @notice This overrides the default royalty information for this token id\\n */\\n function setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) external;\\n\\n}\\n\\ninterface IERC2981Controlled is IERC2981ControlledFunctions { }\\n\",\"keccak256\":\"0x65d66b30719fb4161fc4ef666794f8dcb7660528bdff9bf126b12999fac79ee0\",\"license\":\"Apache-2.0\"},\"src/tokens/common/SignalsImplicitModeControlled.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\nimport { AccessControlEnumerable } from \\\"openzeppelin-contracts/contracts/access/AccessControlEnumerable.sol\\\";\\nimport {\\n IERC165,\\n IImplicitProjectValidation,\\n SignalsImplicitMode\\n} from \\\"signals-implicit-mode/src/helper/SignalsImplicitMode.sol\\\";\\n\\n/**\\n * An abstract contract that allows implicit session access for a given project.\\n */\\nabstract contract SignalsImplicitModeControlled is AccessControlEnumerable, SignalsImplicitMode {\\n\\n bytes32 internal constant _IMPLICIT_MODE_ADMIN_ROLE = keccak256(\\\"IMPLICIT_MODE_ADMIN_ROLE\\\");\\n\\n function _initializeImplicitMode(address owner, address validator, bytes32 projectId) internal {\\n _grantRole(_IMPLICIT_MODE_ADMIN_ROLE, owner);\\n _initializeSignalsImplicitMode(validator, projectId);\\n }\\n\\n /**\\n * Updates the validator for implicit mode validation.\\n * @param validator The validator address.\\n * @notice Only callable by an address with the project admin role.\\n */\\n function setImplicitModeValidator(\\n address validator\\n ) external onlyRole(_IMPLICIT_MODE_ADMIN_ROLE) {\\n _validator = IImplicitProjectValidation(validator);\\n }\\n\\n /**\\n * Updates the settings for implicit mode validation.\\n * @param projectId The project id.\\n * @notice Only callable by an address with the project admin role.\\n */\\n function setImplicitModeProjectId(\\n bytes32 projectId\\n ) external onlyRole(_IMPLICIT_MODE_ADMIN_ROLE) {\\n _projectId = projectId;\\n }\\n\\n /// @inheritdoc IERC165\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view virtual override(AccessControlEnumerable, SignalsImplicitMode) returns (bool) {\\n return\\n AccessControlEnumerable.supportsInterface(interfaceId) || SignalsImplicitMode.supportsInterface(interfaceId);\\n }\\n\\n}\\n\",\"keccak256\":\"0xb1a20575f188af254f90ec7df7f70415610ba5f41f7966ce383b50063220b860\",\"license\":\"Apache-2.0\"}},\"version\":1}", + "userdoc": { + "errors": { + "AllPacksOpened()": [ + { + "notice": "All packs opened." + } + ], + "InvalidArrayLength()": [ + { + "notice": "Invalid array input length." + } + ], + "InvalidCommit()": [ + { + "notice": "Commit expired or never made." + } + ], + "InvalidInitialization()": [ + { + "notice": "Invalid initialization error." + } + ], + "InvalidProof()": [ + { + "notice": "Invalid proof." + } + ], + "NoCommit()": [ + { + "notice": "Commit never made." + } + ], + "PendingReveal()": [ + { + "notice": "Reveal is pending." + } + ] + }, + "events": { + "Commit(address,uint256)": { + "notice": "Emitted when a user make a commitment" + }, + "Reveal(address,uint256)": { + "notice": "Emitted when a reveal is successful" + } + }, + "kind": "user", + "methods": { + "acceptImplicitRequest(address,(address,bytes4,bytes32,bytes32,bytes,(string,uint64)),(address,uint256,bytes,uint256,bool,bool,uint256))": { + "notice": "Determines if an implicit request is valid" + }, + "batchBurn(uint256[],uint256[])": { + "notice": "Burn tokens of given token id for each (tokenIds[i], amounts[i]) pair." + }, + "batchMint(address,uint256[],uint256[],bytes)": { + "notice": "Mint tokens." + }, + "burn(uint256,uint256)": { + "notice": "Allows the owner of the token to burn their tokens." + }, + "commit(uint256)": { + "notice": "Commit to reveal pack content.this function burns user's pack." + }, + "getRevealIdx(address,uint256)": { + "notice": "Get random reveal index." + }, + "initialize(address,string,string,string,address,uint96,address,bytes32)": { + "notice": "Initialize the contract." + }, + "mint(address,uint256,uint256,bytes)": { + "notice": "Mint tokens." + }, + "refundPack(address,uint256)": { + "notice": "Ask for pack refund after commit expiration.this function mints a pack for the user when his commit is expired." + }, + "reveal(address,(address[],bool[],uint256[][],uint256[][]),bytes32[],uint256)": { + "notice": "Reveal pack content." + }, + "setBaseMetadataURI(string)": { + "notice": "Update the base URI of token's URI." + }, + "setContractName(string)": { + "notice": "Update the name of the contract." + }, + "setContractURI(string)": { + "notice": "Update the contract URI of token's URI.Refer to https://docs.opensea.io/docs/contract-level-metadata" + }, + "setDefaultRoyalty(address,uint96)": { + "notice": "Sets the royalty information that all ids in this contract will default to." + }, + "setImplicitModeProjectId(bytes32)": { + "notice": "Updates the settings for implicit mode validation.Only callable by an address with the project admin role." + }, + "setImplicitModeValidator(address)": { + "notice": "Updates the validator for implicit mode validation.Only callable by an address with the project admin role." + }, + "setPacksContent(bytes32,uint256,uint256)": { + "notice": "Set all possible pack contents." + }, + "setTokenRoyalty(uint256,address,uint96)": { + "notice": "Sets the royalty information that a given token id in this contract will use.This overrides the default royalty information for this token id" + }, + "supportsInterface(bytes4)": { + "notice": "Check interface support." + } + }, + "version": 1 + } + } + }, + "src/tokens/ERC1155/presets/pack/ERC1155PackFactory.sol": { + "ERC1155PackFactory": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "factoryOwner", + "type": "address" + }, + { + "internalType": "address", + "name": "holderFallback", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "proxyAddr", + "type": "address" + } + ], + "name": "ERC1155PackDeployed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "beacon", + "outputs": [ + { + "internalType": "contract UpgradeableBeacon", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "proxyOwner", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenOwner", + "type": "address" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "baseURI", + "type": "string" + }, + { + "internalType": "string", + "name": "contractURI", + "type": "string" + }, + { + "internalType": "address", + "name": "royaltyReceiver", + "type": "address" + }, + { + "internalType": "uint96", + "name": "royaltyFeeNumerator", + "type": "uint96" + }, + { + "internalType": "address", + "name": "implicitModeValidator", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "implicitModeProjectId", + "type": "bytes32" + } + ], + "name": "deploy", + "outputs": [ + { + "internalType": "address", + "name": "proxyAddr", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "proxyOwner", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenOwner", + "type": "address" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "baseURI", + "type": "string" + }, + { + "internalType": "string", + "name": "contractURI", + "type": "string" + }, + { + "internalType": "address", + "name": "royaltyReceiver", + "type": "address" + }, + { + "internalType": "uint96", + "name": "royaltyFeeNumerator", + "type": "uint96" + }, + { + "internalType": "address", + "name": "implicitModeValidator", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "implicitModeProjectId", + "type": "bytes32" + } + ], + "name": "determineAddress", + "outputs": [ + { + "internalType": "address", + "name": "proxyAddr", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "upgradeBeacon", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "devdoc": { + "events": { + "ERC1155PackDeployed(address)": { + "params": { + "proxyAddr": "The address of the deployed proxy." + } + } + }, + "kind": "dev", + "methods": { + "constructor": { + "params": { + "factoryOwner": "The owner of the ERC-1155 Pack Factory", + "holderFallback": "The address of the ERC1155Holder fallback" + } + }, + "deploy(address,address,string,string,string,address,uint96,address,bytes32)": { + "params": { + "baseURI": "The base URI of the ERC-1155 Pack proxy", + "contractURI": "The contract URI of the ERC-1155 Pack proxy", + "implicitModeProjectId": "The implicit mode project id", + "implicitModeValidator": "The implicit mode validator address", + "name": "The name of the ERC-1155 Pack proxy", + "proxyOwner": "The owner of the ERC-1155 Pack proxy", + "royaltyFeeNumerator": "The royalty fee numerator in basis points (e.g. 15% would be 1500)", + "royaltyReceiver": "Address of who should be sent the royalty payment", + "tokenOwner": "The owner of the ERC-1155 Pack implementation" + }, + "returns": { + "proxyAddr": "The address of the ERC-1155 Pack Proxy" + } + }, + "determineAddress(address,address,string,string,string,address,uint96,address,bytes32)": { + "params": { + "baseURI": "The base URI of the ERC-1155 Pack proxy", + "contractURI": "The contract URI of the ERC-1155 Pack proxy", + "implicitModeProjectId": "The implicit mode project id", + "implicitModeValidator": "The implicit mode validator address", + "name": "The name of the ERC-1155 Pack proxy", + "proxyOwner": "The owner of the ERC-1155 Pack proxy", + "royaltyFeeNumerator": "The royalty fee numerator in basis points (e.g. 15% would be 1500)", + "royaltyReceiver": "Address of who should be sent the royalty payment", + "tokenOwner": "The owner of the ERC-1155 Pack implementation" + }, + "returns": { + "proxyAddr": "The address of the ERC-1155 Pack Proxy" + } + }, + "owner()": { + "details": "Returns the address of the current owner." + }, + "renounceOwnership()": { + "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner." + }, + "transferOwnership(address)": { + "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." + }, + "upgradeBeacon(address)": { + "params": { + "implementation": "The new beacon implementation." + } + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": { + "abi_decode_address_fromMemory": { + "entryPoint": 205, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_addresst_address_fromMemory": { + "entryPoint": 220, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_encode_address": { + "entryPoint": 300, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_tuple": { + "entryPoint": 835, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple_address": { + "entryPoint": 313, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "allocate_memory": { + "entryPoint": 135, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "allocate_unbounded": { + "entryPoint": 53, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "cleanup_address": { + "entryPoint": 172, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_from_storage_address": { + "entryPoint": 744, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_uint160": { + "entryPoint": 161, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "constructor_ERC1155PackFactory": { + "entryPoint": 407, + "id": 9607, + "parameterSlots": 2, + "returnSlots": 0 + }, + "constructor_Ownable": { + "entryPoint": 517, + "id": 562, + "parameterSlots": 0, + "returnSlots": 0 + }, + "constructor_SequenceProxyFactory": { + "entryPoint": 507, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "convert_address_to_address": { + "entryPoint": 788, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_contract_ERC1155Pack_to_address": { + "entryPoint": 395, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_contract_UpgradeableBeacon_to_contract_UpgradeableBeacon": { + "entryPoint": 580, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint160_to_address": { + "entryPoint": 383, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint160_to_contract_UpgradeableBeacon": { + "entryPoint": 568, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint160_to_uint160": { + "entryPoint": 355, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "copy_arguments_for_constructor_object_ERC1155PackFactory": { + "entryPoint": 266, + "id": null, + "parameterSlots": 0, + "returnSlots": 2 + }, + "extract_from_storage_value_offsett_address": { + "entryPoint": 755, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "finalize_allocation": { + "entryPoint": 96, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun_initialize": { + "entryPoint": 627, + "id": 7675, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun_msgSender": { + "entryPoint": 725, + "id": 1682, + "parameterSlots": 0, + "returnSlots": 1 + }, + "fun_transferOwnership": { + "entryPoint": 841, + "id": 650, + "parameterSlots": 1, + "returnSlots": 0 + }, + "identity": { + "entryPoint": 352, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "panic_error_0x41": { + "entryPoint": 74, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "prepare_store_address": { + "entryPoint": 800, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "prepare_store_contract_UpgradeableBeacon": { + "entryPoint": 592, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "read_from_storage_split_offset_address": { + "entryPoint": 775, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb": { + "entryPoint": 59, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b": { + "entryPoint": 156, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_forward": { + "entryPoint": 335, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "round_up_to_mul_of": { + "entryPoint": 64, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_left": { + "entryPoint": 535, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_right_unsigned": { + "entryPoint": 738, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "update_byte_slice_shift": { + "entryPoint": 541, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "update_storage_value_offsett_address_to_address": { + "entryPoint": 803, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "update_storage_value_offsett_contract_UpgradeableBeacon_to_contract_UpgradeableBeacon": { + "entryPoint": 595, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "validator_revert_address": { + "entryPoint": 184, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "zero_value_for_split_address": { + "entryPoint": 720, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + } + }, + "generatedSources": [], + "linkReferences": {}, + "object": "6080604052346100305761001a61001461010a565b90610197565b610022610035565b61271a6103ab823961271a90f35b61003b565b60405190565b600080fd5b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b9061006a90610040565b810190811060018060401b0382111761008257604052565b61004a565b9061009a610093610035565b9283610060565b565b600080fd5b60018060a01b031690565b6100b5906100a1565b90565b6100c1816100ac565b036100c857565b600080fd5b905051906100da826100b8565b565b919060408382031261010557806100f961010292600086016100cd565b936020016100cd565b90565b61009c565b6101286196688038038061011d81610087565b9283398101906100dc565b9091565b610135906100ac565b9052565b919061014d9060006020850194019061012c565b565b610157610035565b3d6000823e3d90fd5b90565b61017761017261017c926100a1565b610160565b6100a1565b90565b61018890610163565b90565b6101949061017f565b90565b906101a06101fb565b6101a8610035565b90616101820182811060018060401b038211176101f65782916101d291616101612ac58539610139565b03906000f09081156101f1576101ea6101ef9261018b565b610273565b565b61014f565b61004a565b610203610205565b565b6102156102106102d5565b610349565b565b60001b90565b9061022e60018060a01b0391610217565b9181191691161790565b61024190610163565b90565b61024d90610238565b90565b90565b9061026861026361026f92610244565b610250565b825461021d565b9055565b61027b610035565b90610aa2820182811060018060401b038211176102cb5782916102a591610aa2618bc68539610139565b03906000f09081156102c6576102bf6102c4926001610253565b610349565b565b61014f565b61004a565b600090565b6102dd6102d0565b503390565b60001c90565b60018060a01b031690565b6102ff610304916102e2565b6102e8565b90565b61031190546102f3565b90565b61031d9061017f565b90565b90565b9061033861033361033f92610314565b610320565b825461021d565b9055565b60000190565b6103536000610307565b61035e826000610323565b9061039261038c7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610314565b91610314565b9161039b610035565b806103a581610343565b0390a356fe60806040526004361015610013575b610580565b61001e60003561008d565b80631bce45831461008857806359659e901461008357806359a347bd1461007e578063715018a6146100795780638da5cb5b14610074578063cfcc59411461006f5763f2fde38b0361000e5761054d565b61050e565b6104d9565b6104a6565b610467565b6101ea565b610108565b60e01c90565b60405190565b600080fd5b600080fd5b600080fd5b60018060a01b031690565b6100bc906100a8565b90565b6100c8816100b3565b036100cf57565b600080fd5b905035906100e1826100bf565b565b906020828203126100fd576100fa916000016100d4565b90565b61009e565b60000190565b346101365761012061011b3660046100e3565b61067e565b610128610093565b8061013281610102565b0390f35b610099565b600091031261014657565b61009e565b1c90565b60018060a01b031690565b61016a90600861016f930261014b565b61014f565b90565b9061017d915461015a565b90565b61018d6001600090610172565b90565b90565b6101a76101a26101ac926100a8565b610190565b6100a8565b90565b6101b890610193565b90565b6101c4906101af565b90565b6101d0906101bb565b9052565b91906101e8906000602085019401906101c7565b565b3461021a576101fa36600461013b565b610216610205610180565b61020d610093565b918291826101d4565b0390f35b610099565b600080fd5b600080fd5b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b9061025390610229565b810190811067ffffffffffffffff82111761026d57604052565b610233565b9061028561027e610093565b9283610249565b565b67ffffffffffffffff81116102a5576102a1602091610229565b0190565b610233565b90826000939282370152565b909291926102cb6102c682610287565b610272565b938185526020850190828401116102e7576102e5926102aa565b565b610224565b9080601f8301121561030a57816020610307933591016102b6565b90565b61021f565b6bffffffffffffffffffffffff1690565b6103298161030f565b0361033057565b600080fd5b9050359061034282610320565b565b90565b61035081610344565b0361035757565b600080fd5b9050359061036982610347565b565b90916101208284031261043f5761038583600084016100d4565b9261039381602085016100d4565b92604081013567ffffffffffffffff811161043a57826103b49183016102ec565b92606082013567ffffffffffffffff811161043557836103d59184016102ec565b92608083013567ffffffffffffffff811161043057816103f69185016102ec565b926104048260a083016100d4565b9261042d6104158460c08501610335565b936104238160e086016100d4565b936101000161035c565b90565b6100a3565b6100a3565b6100a3565b61009e565b61044d906100b3565b9052565b919061046590600060208501940190610444565b565b346104a15761049d61048c61047d36600461036b565b979690969591959492946107ee565b610494610093565b91829182610451565b0390f35b610099565b346104d4576104b636600461013b565b6104be610985565b6104c6610093565b806104d081610102565b0390f35b610099565b34610509576104e936600461013b565b6105056104f46109bb565b6104fc610093565b91829182610451565b0390f35b610099565b346105485761054461053361052436600461036b565b979690969591959492946109d1565b61053b610093565b91829182610451565b0390f35b610099565b3461057b576105656105603660046100e3565b610b2a565b61056d610093565b8061057781610102565b0390f35b610099565b600080fd5b61059690610591610bb8565b6105eb565b565b60001c90565b6105aa6105af91610598565b61014f565b90565b6105bc905461059e565b90565b600080fd5b60e01b90565b60009103126105d557565b61009e565b6105e2610093565b3d6000823e3d90fd5b6105fd6105f860016105b2565b6101bb565b90633659cfe690823b15610679576106359261062a6000809461061e610093565b968795869485936105c4565b835260048301610451565b03925af1801561067457610647575b50565b6106679060003d811161066d575b61065f8183610249565b8101906105ca565b38610644565b503d610655565b6105da565b6105bf565b61068790610585565b565b600090565b5190565b60209181520190565b60005b8381106106af575050906000910152565b80602091830151818501520161069e565b6106df6106e86020936106ed936106d68161068e565b93848093610692565b9586910161069b565b610229565b0190565b6106fa9061030f565b9052565b61070790610344565b9052565b939561077461076960e0979b9a9861075b6107889761074d8a61078f9e9961073f61077e9a60006101008501940190610444565b8c60208184039101526106c0565b908a820360408c01526106c0565b9088820360608a01526106c0565b9a6080870190610444565b60a08501906106f1565b60c0830190610444565b01906106fe565b565b60200190565b5190565b906107ad6107a883610287565b610272565b918252565b6107bc600061079b565b90565b6107c76107b2565b90565b6107d390610193565b90565b6107df906107ca565b90565b6107eb906101af565b90565b61085e9098949897969397959295610804610689565b508861083c8461082d8d8a8d8d96928b908d929394610821610093565b998a9860208a0161070b565b60208201810382520382610249565b61084e61084882610797565b91610791565b20906108586107bf565b91610d5d565b9761087061086b8a6107d6565b6107e2565b94638ff83ac192969891939497863b1561092f576000986108a5968a966108b095610899610093565b9d8e9c8d9b8c9a6105c4565b8a5260048a0161070b565b03925af1801561092a576108fd575b50806108f77fe3049ee698743dac343b02bfe6b441269ca8b5f5dd610b74d96c1c02034ee566916108ee610093565b91829182610451565b0390a190565b61091d9060003d8111610923575b6109158183610249565b8101906105ca565b386108bf565b503d61090b565b6105da565b6105bf565b61093c610bb8565b610944610971565b565b90565b61095d61095861096292610946565b610190565b6100a8565b90565b61096e90610949565b90565b61098361097e6000610965565b610eec565b565b61098d610934565b565b60018060a01b031690565b6109a66109ab91610598565b61098f565b90565b6109b8905461099a565b90565b6109c3610689565b506109ce60006109ae565b90565b96610a089396610a1796610a399a939694966109eb610689565b5096989490919293946109fc610093565b998a9860208a0161070b565b60208201810382520382610249565b610a29610a2382610797565b91610791565b2090610a336107bf565b91610f4d565b90565b610a4d90610a48610bb8565b610af9565b565b60207f6464726573730000000000000000000000000000000000000000000000000000917f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201520152565b610aaa6026604092610692565b610ab381610a4f565b0190565b610acd9060208101906000818303910152610a9d565b90565b15610ad757565b610adf610093565b62461bcd60e51b815280610af560048201610ab7565b0390fd5b610b2890610b2381610b1c610b16610b116000610965565b6100b3565b916100b3565b1415610ad0565b610eec565b565b610b3390610a3c565b565b60007f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572910152565b610b6960208092610692565b610b7281610b35565b0190565b610b8c9060208101906000818303910152610b5d565b90565b15610b9657565b610b9e610093565b62461bcd60e51b815280610bb460048201610b76565b0390fd5b610be2610bc36109bb565b610bdc610bd6610bd1610fe3565b6100b3565b916100b3565b14610b8f565b565b90565b610bf3610bf891610344565b610be4565b9052565b60601b90565b610c0b90610bfc565b90565b610c1790610c02565b90565b610c26610c2b916100b3565b610c0e565b9052565b905090565b610c59610c5092602092610c4781610797565b94858093610c2f565b9384910161069b565b0190565b60148093610c81602084610c79610c8996610c909b9a98610be7565b018092610c1a565b018092610c1a565b0190610c34565b90565b90565b610caa610ca5610caf92610946565b610190565b610c93565b90565b610cbb90610193565b90565b610cc790610cb2565b90565b610cd390610193565b90565b610cdf90610cca565b90565b610ceb906101af565b90565b60209181520190565b610d16610d1f602093610d2493610d0d81610797565b93848093610cee565b9586910161069b565b610229565b0190565b610d4d610d5a949293610d4360608401956000850190610444565b6020830190610444565b6040818403910152610cf7565b90565b610ded9093929193610d6d610689565b50610dad8591610d9e610d88610d8360016105b2565b6101bb565b8690610d92610093565b95869460208601610c5d565b60208201810382520382610249565b610dbf610db982610797565b91610791565b2061148a610dcf60208201610272565b9080825261125b6020830139610de86000929192610c96565b611187565b92610e07610e02610dfd86610cbe565b610cd6565b610ce2565b63cf7a1d779190610e20610e1b60016105b2565b6101bb565b9392813b15610e97576000610e4891610e538296610e3c610093565b988997889687956105c4565b855260048501610d28565b03925af18015610e9257610e65575b50565b610e859060003d8111610e8b575b610e7d8183610249565b8101906105ca565b38610e62565b503d610e73565b6105da565b6105bf565b60001b90565b90610eb360018060a01b0391610e9c565b9181191691161790565b610ec6906101af565b90565b90565b90610ee1610edc610ee892610ebd565b610ec9565b8254610ea2565b9055565b610ef660006109ae565b610f01826000610ecc565b90610f35610f2f7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610ebd565b91610ebd565b91610f3e610093565b80610f4881610102565b0390a3565b610fe09291610f8a610f9992610f61610689565b509193610f76610f7160016105b2565b6101bb565b610f7e610093565b95869460208601610c5d565b60208201810382520382610249565b610fab610fa582610797565b91610791565b2061148a610fbb60208201610272565b9080825261125b6020830139610fd9610fd382610797565b91610791565b2090611210565b90565b610feb610689565b503390565b610ff9906101af565b90565b60007f437265617465323a20696e73756666696369656e742062616c616e6365000000910152565b611031601d602092610692565b61103a81610ffc565b0190565b6110549060208101906000818303910152611024565b90565b1561105e57565b611066610093565b62461bcd60e51b81528061107c6004820161103e565b0390fd5b60007f437265617465323a2062797465636f6465206c656e677468206973207a65726f910152565b6110b460208092610692565b6110bd81611080565b0190565b6110d790602081019060008183039101526110a8565b90565b156110e157565b6110e9610093565b62461bcd60e51b8152806110ff600482016110c1565b0390fd5b60007f437265617465323a204661696c6564206f6e206465706c6f7900000000000000910152565b6111386019602092610692565b61114181611103565b0190565b61115b906020810190600081830391015261112b565b90565b1561116557565b61116d610093565b62461bcd60e51b81528061118360048201611145565b0390fd5b919091611192610689565b506111b961119f30610ff0565b316111b26111ac84610c93565b91610c93565b1015611057565b6111df6111c583610797565b6111d86111d26000610c96565b91610c93565b14156110da565b60208251920190f59061120e826112076112016111fc6000610965565b6100b3565b916100b3565b141561115e565b565b9061122e9161121d610689565b509061122830610ff0565b91611231565b90565b90605592600b92611240610689565b50604051926040840152602083015281520160ff8153209056fe608060405234601c57600e6020565b61145e61002c823961145e90f35b6026565b60405190565b600080fdfe6080604052361561006b5761006b565b90565b60018060a01b031690565b90565b61003461002f6100399261000f565b61001d565b610012565b90565b61004590610020565b90565b61005190610012565b90565b606090565b63ffffffff60e01b1690565b60000190565b61007361017e565b61008e610088610083600061003c565b610048565b91610048565b0361046c5761009b610054565b5063ffffffff60e01b600035166100c16100bb63cf7a1d7760e01b610059565b91610059565b146100e357600063f92ee8a960e01b8152806100df60048201610065565b0390fd5b6100eb610401565b602081519101f35b600090565b90565b90565b60001b90565b61011861011361011d926100f8565b6100fe565b6100fb565b90565b6101497fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103610104565b90565b60001c90565b60018060a01b031690565b61016961016e9161014c565b610152565b90565b61017b905461015d565b90565b6101866100f3565b506101a2600061019c610197610120565b6105a2565b01610171565b90565b90565b90565b6101bf6101ba6101c4926101a5565b61001d565b6101a8565b90565b60405190565b600080fd5b600080fd5b909392938483116101f75784116101f2576001820201920390565b6101d2565b6101cd565b91565b600080fd5b600080fd5b61021290610012565b90565b61021e81610209565b0361022557565b600080fd5b9050359061023782610215565b565b600080fd5b600080fd5b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b9061026d90610243565b810190811067ffffffffffffffff82111761028757604052565b61024d565b9061029f6102986101c7565b9283610263565b565b67ffffffffffffffff81116102bf576102bb602091610243565b0190565b61024d565b90826000939282370152565b909291926102e56102e0826102a1565b61028c565b93818552602085019082840111610301576102ff926102c4565b565b61023e565b9080601f8301121561032457816020610321933591016102d0565b90565b610239565b9160608383031261037657610341826000850161022a565b9261034f836020830161022a565b92604082013567ffffffffffffffff81116103715761036e9201610306565b90565b610204565b6101ff565b61038f61038a61039492610012565b61001d565b610012565b90565b6103a09061037b565b90565b6103ac90610397565b90565b67ffffffffffffffff81116103cd576103c9602091610243565b0190565b61024d565b906103e46103df836103af565b61028c565b918252565b6103f360006103d2565b90565b6103fe6103e9565b90565b610409610054565b506104126105cd565b61046161045761045161044761043f61043960003661043160046101ab565b9080926101d7565b906101fc565b810190610329565b93919290926103a3565b916103a3565b91909190916105ec565b6104696103f6565b90565b3361048661048061047b61017e565b610048565b91610048565b1460001461059d57610496610054565b5063ffffffff60e01b60003516806104bd6104b7631b2ce7f360e11b610059565b91610059565b146000146104d757506104ce610817565b5b602081519101f35b806104f16104eb63278f794360e11b610059565b91610059565b1460001461050857506105026107c1565b5b6104cf565b8061052261051c6308f2839760e41b610059565b91610059565b146000146105395750610533610723565b5b610503565b8061055361054d6303e1469160e61b610059565b91610059565b1460001461056a57506105646106bf565b5b610534565b61058361057d635c60da1b60e01b610059565b91610059565b146000146105985761059361067a565b610565565b61064a565b61064a565b90565b6105b96105b46105be9261000f565b61001d565b6101a8565b90565b156105c857565b600080fd5b6105ea346105e46105de60006105a5565b916101a8565b146105c1565b565b91906105f661087a565b61061161060b610606600061003c565b610048565b91610048565b0361062d5761062261062b936108b2565b9060009161098d565b565b600063f92ee8a960e01b81528061064660048201610065565b0390fd5b610652610aa6565b610ae7565b61066090610048565b9052565b919061067890600060208501940190610657565b565b610682610054565b5061068b6105cd565b6106ad6106bc610699610aa6565b6106a16101c7565b92839160208301610664565b60208201810382520382610263565b90565b6106c7610054565b506106d06105cd565b6106f26107016106de61017e565b6106e66101c7565b92839160208301610664565b60208201810382520382610263565b90565b9060208282031261071e5761071b9160000161022a565b90565b6101ff565b61072b610054565b506107346105cd565b61077061076b61076661075e61075860003661075060046101ab565b9080926101d7565b906101fc565b810190610704565b6103a3565b6108b2565b6107786103f6565b90565b9190916040818403126107bc57610795836000830161022a565b92602082013567ffffffffffffffff81116107b7576107b49201610306565b90565b610204565b6101ff565b6107c9610054565b5061080c6108036107fc6107f46107ee6000366107e660046101ab565b9080926101d7565b906101fc565b81019061077b565b91906103a3565b90600191610b0a565b6108146103f6565b90565b61081f610054565b506108286105cd565b61086f61085f61085a61085261084c60003661084460046101ab565b9080926101d7565b906101fc565b810190610704565b6103a3565b6108676103f6565b600091610b0a565b6108776103f6565b90565b6108826100f3565b5061088b61017e565b90565b9160206108b09294936108a960408201966000830190610657565b0190610657565b565b6108fd906108be61017e565b817f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f916108f56108ec6101c7565b9283928361088e565b0390a1610c4d565b565b61090890610397565b90565b5190565b6109189061037b565b90565b6109249061090f565b90565b61093090610397565b90565b60e01b90565b61094281610048565b0361094957565b600080fd5b9050519061095b82610939565b565b90602082820312610977576109749160000161094e565b90565b6101ff565b6109846101c7565b3d6000823e3d90fd5b9161099783610e30565b826109c27f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e916108ff565b906109cb6101c7565b806109d581610065565b0390a26109e18261090b565b6109f46109ee60006105a5565b916101a8565b11908115610a9e575b50610a07575b5050565b6020610a1d610a18610a339461091b565b610927565b635c60da1b90610a2b6101c7565b948592610933565b82528180610a4360048201610065565b03915afa908115610a9957610a6192600092610a69575b5090610f65565b503880610a03565b610a8b91925060203d8111610a92575b610a838183610263565b81019061095d565b9038610a5a565b503d610a79565b61097c565b9050386109fd565b610aae6100f3565b50610ab7610f85565b80610ad3610acd610ac8600061003c565b610048565b91610048565b03610ae45750610ae1610f99565b90565b90565b60008091368280378136915af43d6000803e600014610b05573d6000f35b3d6000fd5b91610b148361102f565b610b1d8261090b565b610b30610b2a60006105a5565b916101a8565b11908115610b54575b50610b43575b5050565b610b4c91610f65565b503880610b3f565b905038610b39565b60209181520190565b60207f6464726573730000000000000000000000000000000000000000000000000000917f455243313936373a206e65772061646d696e20697320746865207a65726f206160008201520152565b610bc06026604092610b5c565b610bc981610b65565b0190565b610be39060208101906000818303910152610bb3565b90565b15610bed57565b610bf56101c7565b62461bcd60e51b815280610c0b60048201610bcd565b0390fd5b90610c2060018060a01b03916100fe565b9181191691161790565b90565b90610c42610c3d610c49926108ff565b610c2a565b8254610c0f565b9055565b610c8f90610c7781610c70610c6a610c65600061003c565b610048565b91610048565b1415610be6565b6000610c89610c84610120565b6105a2565b01610c2d565b565b60207f7472616374000000000000000000000000000000000000000000000000000000917f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e60008201520152565b610cec6025604092610b5c565b610cf581610c91565b0190565b610d0f9060208101906000818303910152610cdf565b90565b15610d1957565b610d216101c7565b62461bcd60e51b815280610d3760048201610cf9565b0390fd5b60207f73206e6f74206120636f6e747261637400000000000000000000000000000000917f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960008201520152565b610d966030604092610b5c565b610d9f81610d3b565b0190565b610db99060208101906000818303910152610d89565b90565b15610dc357565b610dcb6101c7565b62461bcd60e51b815280610de160048201610da3565b0390fd5b90565b610dfc610df7610e0192610de5565b6100fe565b6100fb565b90565b610e2d7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50610de8565b90565b610e6e90610e45610e408261107f565b610d12565b6020610e58610e538361091b565b610927565b635c60da1b90610e666101c7565b948592610933565b82528180610e7e60048201610065565b03915afa8015610eee57610ea1610ea691610ebe94600091610ec0575b5061107f565b610dbc565b6000610eb8610eb3610e04565b6105a2565b01610c2d565b565b610ee1915060203d8111610ee7575b610ed98183610263565b81019061095d565b38610e9b565b503d610ecf565b61097c565b60207f206661696c656400000000000000000000000000000000000000000000000000917f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c60008201520152565b610f4b60276103d2565b90610f5860208301610ef3565b565b610f62610f41565b90565b90610f8291610f72610054565b5090610f7c610f5a565b916110e2565b90565b610f8d6100f3565b50610f96611160565b90565b610fa16100f3565b50610fd56020610fbf610fba610fb5611187565b61091b565b610927565b635c60da1b90610fcd6101c7565b938492610933565b82528180610fe560048201610065565b03915afa90811561102a57600091610ffc575b5090565b61101d915060203d8111611023575b6110158183610263565b81019061095d565b38610ff8565b503d61100b565b61097c565b61103881611258565b6110627fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b916108ff565b9061106b6101c7565b8061107581610065565b0390a2565b600090565b61108761107a565b503b61109c61109660006105a5565b916101a8565b1190565b906110b26110ad836102a1565b61028c565b918252565b3d6000146110d4576110c83d6110a0565b903d6000602084013e5b565b6110dc610054565b906110d2565b9091600080611112946110f3610054565b508490602081019051915af4916111086110b7565b909290919261130b565b90565b90565b61112c61112761113192611115565b6100fe565b6100fb565b90565b61115d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc611118565b90565b6111686100f3565b50611184600061117e611179611134565b6105a2565b01610171565b90565b61118f6100f3565b506111ab60006111a56111a0610e04565b6105a2565b01610171565b90565b60207f6f74206120636f6e747261637400000000000000000000000000000000000000917f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60008201520152565b611209602d604092610b5c565b611212816111ae565b0190565b61122c90602081019060008183039101526111fc565b90565b1561123657565b61123e6101c7565b62461bcd60e51b81528061125460048201611216565b0390fd5b6112859061126d6112688261107f565b61122f565b600061127f61127a611134565b6105a2565b01610c2d565b565b60007f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000910152565b6112bc601d602092610b5c565b6112c581611287565b0190565b6112df90602081019060008183039101526112af565b90565b156112e957565b6112f16101c7565b62461bcd60e51b815280611307600482016112c9565b0390fd5b919290611316610054565b5060001461135c57506113288261090b565b61133b61133560006105a5565b916101a8565b14611345575b5090565b6113516113569161107f565b6112e2565b38611341565b826113d5565b5190565b60005b83811061137a575050906000910152565b806020918301518185015201611369565b6113aa6113b36020936113b8936113a181611362565b93848093610b5c565b95869101611366565b610243565b0190565b6113d2916020820191600081840391015261138b565b90565b906113df8261090b565b6113f26113ec60006105a5565b916101a8565b116000146114035750805190602001fd5b6114249061140f6101c7565b91829162461bcd60e51b8352600483016113bc565b0390fdfea2646970667358221220fb1899e61f38faa78bfbab79b8dc2fa613357c2fce2699411f9fee80b624365564736f6c634300081b0033a2646970667358221220b00215e680d7f0fbcd2602e1f57d6dbac930c10d2445be6bf9979a142780b5f064736f6c634300081b003360a06040523461004657610019610014610111565b610132565b61002161004b565b615fc961013882396080518181816111d701528181613c440152613d710152615fc990f35b610051565b60405190565b600080fd5b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b9061008090610056565b810190811060018060401b0382111761009857604052565b610060565b906100b06100a961004b565b9283610076565b565b600080fd5b60018060a01b031690565b6100cb906100b7565b90565b6100d7816100c2565b036100de57565b600080fd5b905051906100f0826100ce565b565b9060208282031261010c57610109916000016100e3565b90565b6100b2565b61012f616101803803806101248161009d565b9283398101906100f2565b90565b60805256fe60806040526004361015610013575b611c2e565b61001e6000356102dc565b8062fdd58e146102d757806301ffc9a7146102d257806304634d8d146102cd57806306fdde03146102c85780630b5ee006146102c35780630bb310de146102be5780630e89341c146102b9578063167a59f7146102b457806318160ddd146102af57806320ec271b146102aa578063248a9ca3146102a55780632693ebf2146102a05780632a55205a1461029b5780632eb2c2d6146102965780632f2ff15d14610291578063354030231461028c57806336568abe146102875780633c70b3571461028257806347fda41a1461027d5780634e1273f41461027857806350336a0314610273578063513046831461026e5780635377ab8f146102695780635944c753146102645780636c0360eb1461025f578063731133e91461025a5780637e518ec8146102555780638ff83ac1146102505780639010d07c1461024b57806391d1485414610246578063938e3d7b146102415780639d043a661461023c578063a217fddf14610237578063a22cb46514610232578063b390c0ab1461022d578063b48ab8b614610228578063ca15c87314610223578063d547741f1461021e578063d67b333b14610219578063e8a3d48514610214578063e985e9c51461020f578063ed4c2ac71461020a578063f242432a146102055763f4f98ad50361000e57611bfb565b611bc1565b611b1d565b611ae7565b611a84565b611a3d565b61193b565b611906565b6118cf565b61180b565b6117d7565b611750565b6116dd565b611615565b6115df565b6115a9565b61153e565b611441565b61140a565b6112f9565b6112b5565b611244565b61120f565b6111a1565b61112d565b610fb8565b610f69565b610eda565b610ea5565b610e57565b610dec565b610c8f565b610bfb565b610b75565b610ad8565b6109a9565b61093a565b610905565b6108b3565b610861565b61074f565b6104f5565b610457565b6103aa565b60e01c90565b60405190565b600080fd5b600080fd5b600080fd5b60018060a01b031690565b61030b906102f7565b90565b61031781610302565b0361031e57565b600080fd5b905035906103308261030e565b565b90565b61033e81610332565b0361034557565b600080fd5b9050359061035782610335565b565b9190604083820312610382578061037661037f9260008601610323565b9360200161034a565b90565b6102ed565b61039090610332565b9052565b91906103a890600060208501940190610387565b565b346103db576103d76103c66103c0366004610359565b90611c38565b6103ce6102e2565b91829182610394565b0390f35b6102e8565b63ffffffff60e01b1690565b6103f5816103e0565b036103fc57565b600080fd5b9050359061040e826103ec565b565b9060208282031261042a5761042791600001610401565b90565b6102ed565b151590565b61043d9061042f565b9052565b919061045590600060208501940190610434565b565b346104875761048361047261046d366004610410565b611c61565b61047a6102e2565b91829182610441565b0390f35b6102e8565b6bffffffffffffffffffffffff1690565b6104a68161048c565b036104ad57565b600080fd5b905035906104bf8261049d565b565b91906040838203126104ea57806104de6104e79260008601610323565b936020016104b2565b90565b6102ed565b60000190565b346105245761050e6105083660046104c1565b90611ced565b6105166102e2565b80610520816104ef565b0390f35b6102e8565b600091031261053457565b6102ed565b634e487b7160e01b600052600060045260246000fd5b634e487b7160e01b600052602260045260246000fd5b9060016002830492168015610585575b602083101461058057565b61054f565b91607f1691610575565b60209181520190565b600052602060002090565b90600092918054906105be6105b783610565565b809461058f565b9160018116908160001461061757506001146105da575b505050565b6105e79192939450610598565b916000925b8184106105ff57505001903880806105d5565b600181602092959395548486015201910192906105ec565b92949550505060ff19168252151560200201903880806105d5565b9061063c916105a3565b90565b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b906106699061063f565b810190811067ffffffffffffffff82111761068357604052565b610649565b906106a86106a1926106986102e2565b93848092610632565b038361065f565b565b906000106106be576106bb90610688565b90565b610539565b6106d060086000906106aa565b90565b5190565b60209181520190565b60005b8381106106f4575050906000910152565b8060209183015181850152016106e3565b61072461072d6020936107329361071b816106d3565b938480936106d7565b958691016106e0565b61063f565b0190565b61074c9160208201916000818403910152610705565b90565b3461077f5761075f366004610529565b61077b61076a6106c3565b6107726102e2565b91829182610736565b0390f35b6102e8565b600080fd5b600080fd5b906107a161079a6102e2565b928361065f565b565b67ffffffffffffffff81116107c1576107bd60209161063f565b0190565b610649565b90826000939282370152565b909291926107e76107e2826107a3565b61078e565b9381855260208501908284011161080357610801926107c6565b565b610789565b9080601f8301121561082657816020610823933591016107d2565b90565b610784565b9060208282031261085c57600082013567ffffffffffffffff8111610857576108549201610808565b90565b6102f2565b6102ed565b3461088f5761087961087436600461082b565b611f2e565b6108816102e2565b8061088b816104ef565b0390f35b6102e8565b906020828203126108ae576108ab91600001610323565b90565b6102ed565b346108e1576108cb6108c6366004610894565b61200b565b6108d36102e2565b806108dd816104ef565b0390f35b6102e8565b90602082820312610900576108fd9160000161034a565b90565b6102ed565b346109355761093161092061091b3660046108e6565b612135565b6109286102e2565b91829182610736565b0390f35b6102e8565b346109695761095361094d366004610359565b90612254565b61095b6102e2565b80610965816104ef565b0390f35b6102e8565b1c90565b90565b61098590600861098a930261096e565b610972565b90565b906109989154610975565b90565b6109a660008061098d565b90565b346109d9576109b9366004610529565b6109d56109c461099b565b6109cc6102e2565b91829182610394565b0390f35b6102e8565b67ffffffffffffffff81116109f65760208091020190565b610649565b600080fd5b90929192610a15610a10826109de565b61078e565b9381855260208086019202830192818411610a5257915b838310610a395750505050565b60208091610a47848661034a565b815201920191610a2c565b6109fb565b9080601f83011215610a7557816020610a7293359101610a00565b90565b610784565b919091604081840312610ad357600081013567ffffffffffffffff8111610ace5783610aa7918301610a57565b92602082013567ffffffffffffffff8111610ac957610ac69201610a57565b90565b6102f2565b6102f2565b6102ed565b34610b0757610af1610aeb366004610a7a565b9061234f565b610af96102e2565b80610b03816104ef565b0390f35b6102e8565b90565b610b1881610b0c565b03610b1f57565b600080fd5b90503590610b3182610b0f565b565b90602082820312610b4d57610b4a91600001610b24565b90565b6102ed565b610b5b90610b0c565b9052565b9190610b7390600060208501940190610b52565b565b34610ba557610ba1610b90610b8b366004610b33565b6123a8565b610b986102e2565b91829182610b5f565b0390f35b6102e8565b90565b610bc1610bbc610bc692610332565b610baa565b610332565b90565b90610bd390610bad565b600052602052604060002090565b610bf890610bf3600191600092610bc9565b61098d565b90565b34610c2b57610c27610c16610c113660046108e6565b610be1565b610c1e6102e2565b91829182610394565b0390f35b6102e8565b9190604083820312610c595780610c4d610c56926000860161034a565b9360200161034a565b90565b6102ed565b610c6790610302565b9052565b916020610c8d929493610c8660408201966000830190610c5e565b0190610387565b565b34610cc157610ca8610ca2366004610c30565b9061259a565b90610cbd610cb46102e2565b92839283610c6b565b0390f35b6102e8565b600080fd5b909182601f83011215610d055781359167ffffffffffffffff8311610d00576020019260208302840111610cfb57565b6109fb565b610cc6565b610784565b909182601f83011215610d445781359167ffffffffffffffff8311610d3f576020019260018302840111610d3a57565b6109fb565b610cc6565b610784565b9160a083830312610de757610d618260008501610323565b92610d6f8360208301610323565b92604082013567ffffffffffffffff8111610de25781610d90918401610ccb565b929093606082013567ffffffffffffffff8111610ddd5783610db3918401610ccb565b929093608082013567ffffffffffffffff8111610dd857610dd49201610d0a565b9091565b6102f2565b6102f2565b6102f2565b6102ed565b34610e2457610e0e610dff366004610d49565b96959095949194939293612675565b610e166102e2565b80610e20816104ef565b0390f35b6102e8565b9190604083820312610e525780610e46610e4f9260008601610b24565b93602001610323565b90565b6102ed565b34610e8657610e70610e6a366004610e29565b90612911565b610e786102e2565b80610e82816104ef565b0390f35b6102e8565b610ea290610e9d600d91600092610bc9565b61098d565b90565b34610ed557610ed1610ec0610ebb3660046108e6565b610e8b565b610ec86102e2565b91829182610394565b0390f35b6102e8565b34610f0957610ef3610eed366004610e29565b906129c7565b610efb6102e2565b80610f05816104ef565b0390f35b6102e8565b90610f1890610bad565b600052602052604060002090565b90565b610f39906008610f3e930261096e565b610f26565b90565b90610f4c9154610f29565b90565b610f6690610f61600c91600092610f0e565b610f41565b90565b34610f9957610f95610f84610f7f3660046108e6565b610f4f565b610f8c6102e2565b91829182610b5f565b0390f35b6102e8565b610fb590610fb0600e91600092610bc9565b61098d565b90565b34610fe857610fe4610fd3610fce3660046108e6565b610f9e565b610fdb6102e2565b91829182610394565b0390f35b6102e8565b909182601f830112156110275781359167ffffffffffffffff831161102257602001926020830284011161101d57565b6109fb565b610cc6565b610784565b909160408284031261108757600082013567ffffffffffffffff81116110825783611058918401610fed565b929093602082013567ffffffffffffffff811161107d576110799201610ccb565b9091565b6102f2565b6102f2565b6102ed565b5190565b60209181520190565b60200190565b6110a890610332565b9052565b906110b98160209361109f565b0190565b60200190565b906110e06110da6110d38461108c565b8093611090565b92611099565b9060005b8181106110f15750505090565b90919261110a61110460019286516110ac565b946110bd565b91019190916110e4565b61112a91602082019160008184039101526110c3565b90565b346111615761115d61114c61114336600461102c565b929190916129fb565b6111546102e2565b91829182611114565b0390f35b6102e8565b909160608284031261119c576111996111828460008501610b24565b93611190816020860161034a565b9360400161034a565b90565b6102ed565b346111d0576111ba6111b4366004611166565b91612b51565b6111c26102e2565b806111cc816104ef565b0390f35b6102e8565b7f000000000000000000000000000000000000000000000000000000000000000090565b919061120d90600060208501940190610c5e565b565b3461123f5761121f366004610529565b61123b61122a6111d5565b6112326102e2565b918291826111f9565b0390f35b6102e8565b346112755761127161126061125a366004610359565b90612b5e565b6112686102e2565b91829182610394565b0390f35b6102e8565b90916060828403126112b0576112ad611296846000850161034a565b936112a48160208601610323565b936040016104b2565b90565b6102ed565b346112e4576112ce6112c836600461127a565b91612ba2565b6112d66102e2565b806112e0816104ef565b0390f35b6102e8565b6112f660096000906106aa565b90565b3461132957611309366004610529565b6113256113146112e9565b61131c6102e2565b91829182610736565b0390f35b6102e8565b67ffffffffffffffff811161134c5761134860209161063f565b0190565b610649565b909291926113666113618261132e565b61078e565b9381855260208501908284011161138257611380926107c6565b565b610789565b9080601f830112156113a5578160206113a293359101611351565b90565b610784565b90608082820312611405576113c28160008401610323565b926113d0826020850161034a565b926113de836040830161034a565b92606082013567ffffffffffffffff8111611400576113fd9201611387565b90565b6102f2565b6102ed565b3461143c5761142661141d3660046113aa565b92919091612c01565b61142e6102e2565b80611438816104ef565b0390f35b6102e8565b3461146f5761145961145436600461082b565b612c37565b6114616102e2565b8061146b816104ef565b0390f35b6102e8565b9190610100838203126115395761148e8160008501610323565b92602081013567ffffffffffffffff811161153457826114af918301610808565b92604082013567ffffffffffffffff811161152f57836114d0918401610808565b92606083013567ffffffffffffffff811161152a57816114f1918501610808565b926114ff8260808301610323565b926115276115108460a085016104b2565b9361151e8160c08601610323565b9360e001610b24565b90565b6102f2565b6102f2565b6102f2565b6102ed565b3461157657611560611551366004611474565b96959095949194939293612c42565b6115686102e2565b80611572816104ef565b0390f35b6102e8565b91906040838203126115a457806115986115a19260008601610b24565b9360200161034a565b90565b6102ed565b346115da576115d66115c56115bf36600461157b565b90612c89565b6115cd6102e2565b918291826111f9565b0390f35b6102e8565b346116105761160c6115fb6115f5366004610e29565b90612cf0565b6116036102e2565b91829182610441565b0390f35b6102e8565b346116435761162d61162836600461082b565b612d43565b6116356102e2565b8061163f816104ef565b0390f35b6102e8565b600080fd5b908160c091031261165b5790565b611648565b908160e091031261166e5790565b611648565b916060838303126116d85761168b8260008501610323565b92602081013567ffffffffffffffff81116116d357836116ac91830161164d565b92604082013567ffffffffffffffff81116116ce576116cb9201611660565b90565b6102f2565b6102f2565b6102ed565b3461170e5761170a6116f96116f3366004611673565b916130a6565b6117016102e2565b91829182610b5f565b0390f35b6102e8565b90565b60001b90565b61173061172b61173592611713565b611716565b610b0c565b90565b611742600061171c565b90565b61174d611738565b90565b3461178057611760366004610529565b61177c61176b611745565b6117736102e2565b91829182610b5f565b0390f35b6102e8565b61178e8161042f565b0361179557565b600080fd5b905035906117a782611785565b565b91906040838203126117d257806117c66117cf9260008601610323565b9360200161179a565b90565b6102ed565b34611806576117f06117ea3660046117a9565b90613147565b6117f86102e2565b80611802816104ef565b0390f35b6102e8565b3461183a5761182461181e366004610c30565b90613197565b61182c6102e2565b80611836816104ef565b0390f35b6102e8565b906080828203126118ca576118578160008401610323565b92602083013567ffffffffffffffff81116118c55782611878918501610a57565b92604081013567ffffffffffffffff81116118c05783611899918301610a57565b92606082013567ffffffffffffffff81116118bb576118b89201611387565b90565b6102f2565b6102f2565b6102f2565b6102ed565b34611901576118eb6118e236600461183f565b929190916131d4565b6118f36102e2565b806118fd816104ef565b0390f35b6102e8565b346119365761193261192161191c366004610b33565b6131e2565b6119296102e2565b91829182610394565b0390f35b6102e8565b3461196a5761195461194e366004610e29565b90613232565b61195c6102e2565b80611966816104ef565b0390f35b6102e8565b9081608091031261197d5790565b611648565b909182601f830112156119bc5781359167ffffffffffffffff83116119b75760200192602083028401116119b257565b6109fb565b610cc6565b610784565b919091608081840312611a38576119db8360008301610323565b92602082013567ffffffffffffffff8111611a3357816119fc91840161196f565b92604083013567ffffffffffffffff8111611a2e57611a2083611a2b928601611982565b93909460600161034a565b90565b6102f2565b6102f2565b6102ed565b34611a6f57611a59611a503660046119c1565b93929092613997565b611a616102e2565b80611a6b816104ef565b0390f35b6102e8565b611a81600a6000906106aa565b90565b34611ab457611a94366004610529565b611ab0611a9f611a74565b611aa76102e2565b91829182610736565b0390f35b6102e8565b9190604083820312611ae25780611ad6611adf9260008601610323565b93602001610323565b90565b6102ed565b34611b1857611b14611b03611afd366004611ab9565b90613e0e565b611b0b6102e2565b91829182610441565b0390f35b6102e8565b34611b4b57611b35611b30366004610b33565b613e5a565b611b3d6102e2565b80611b47816104ef565b0390f35b6102e8565b91909160a081840312611bbc57611b6a8360008301610323565b92611b788160208401610323565b92611b86826040850161034a565b92611b94836060830161034a565b92608082013567ffffffffffffffff8111611bb757611bb39201610d0a565b9091565b6102f2565b6102ed565b34611bf657611be0611bd4366004611b50565b94939093929192613e65565b611be86102e2565b80611bf2816104ef565b0390f35b6102e8565b34611c2957611c13611c0e3660046108e6565b614059565b611c1b6102e2565b80611c25816104ef565b0390f35b6102e8565b600080fd5b600090565b611c40611c33565b50679a31110384e0b0c960205260145260005260406000205490565b600090565b611c69611c5c565b5080611c84611c7e6337bc219560e01b6103e0565b916103e0565b14908115611c91575b5090565b611c9b9150614138565b38611c8d565b7f6db4061a20ca83a3be756ee172bd37a029093ac5afe4ce968c6d5435b43cb01190565b90611cdf91611cda611cd5611ca1565b61418e565b611ce1565b565b90611ceb916143a8565b565b90611cf791611cc5565b565b7fe02a0315b383857ac496e9d2b2546a699afaeb4e5e83a1fdef64376d0b74e5a590565b611d3690611d31611d2c611cf9565b61418e565b611f21565b565b601f602091010490565b1b90565b91906008611d62910291611d5c60001984611d42565b92611d42565b9181191691161790565b90565b9190611d85611d80611d8d93610bad565b611d6c565b908354611d46565b9055565b611da391611d9d611c33565b91611d6f565b565b5b818110611db1575050565b80611dbf6000600193611d91565b01611da6565b9190601f8111611dd5575b505050565b611de1611e0693610598565b906020611ded84611d38565b83019310611e0e575b611dff90611d38565b0190611da5565b388080611dd0565b9150611dff81929050611df6565b90611e2d906000199060080261096e565b191690565b81611e3c91611e1c565b906002021790565b90611e4e816106d3565b9067ffffffffffffffff8211611f1057611e7282611e6c8554610565565b85611dc5565b602090601f8311600114611ea757918091611e9693600092611e9b575b5050611e32565b90555b565b90915001513880611e8f565b601f19831691611eb685610598565b9260005b818110611ef857509160029391856001969410611ede575b50505002019055611e99565b611eee910151601f841690611e1c565b9055388080611ed2565b91936020600181928787015181550195019201611eba565b610649565b90611f1f91611e44565b565b611f2c906008611f15565b565b611f3790611d1d565b565b7f70649ec320b507febad3e8ef750e5f580b9ae32f9f50d4c7b121332c8197153090565b611f7690611f71611f6c611f39565b61418e565b611ff6565b565b611f8c611f87611f91926102f7565b610baa565b6102f7565b90565b611f9d90611f78565b90565b611fa990611f94565b90565b90611fbd60018060a01b0391611716565b9181191691161790565b611fd090611f94565b90565b90565b90611feb611fe6611ff292611fc7565b611fd3565b8254611fac565b9055565b61200261200991611fa0565b6006611fd6565b565b61201490611f5d565b565b606090565b905090565b906000929180549061203b61203483610565565b809461201b565b9160018116908160001461208f5750600114612057575b505050565b6120649192939450610598565b6000905b83821061207b5750500190388080612052565b600181602092548486015201910190612068565b92949550505060ff19168252801515020190388080612052565b6120ce6120c5926020926120bc816106d3565b9485809361201b565b938491016106e0565b0190565b60007f2e6a736f6e000000000000000000000000000000000000000000000000000000910152565b6121066005809261201b565b61210f816120d2565b0190565b9161212461212f9361212a93612020565b906120a9565b6120fa565b90565b90565b61217c90612141612016565b50612177612150600992614422565b9161216861215c6102e2565b93849260208401612113565b6020820181038252038261065f565b612132565b90565b61218890611f78565b90565b6121949061217f565b90565b906121a19061218b565b600052602052604060002090565b60001c90565b6121c16121c6916121af565b610972565b90565b6121d390546121b5565b90565b6121ea6121e56121ef92611713565b610baa565b610332565b90565b6121fe612203916121af565b610bad565b90565b90565b61221d61221861222292612206565b610baa565b610332565b90565b90612237612232836107a3565b61078e565b918252565b6122466000612225565b90565b61225161223c565b90565b9061227361226e612267600f8590612197565b8390610bc9565b6121c9565b8061228761228160006121d6565b91610332565b146123325761229681406121f2565b6122a96122a360006121d6565b91610332565b1415908115612315575b506122f8576122f6916122dc60006122d76122d0600f8590612197565b8590610bc9565b611d91565b906122e76001612209565b906122f0612249565b92614477565b565b600063156f904360e21b815280612311600482016104ef565b0390fd5b905061232a6123244392610332565b91610332565b1115386122b3565b6000637de832b560e11b81528061234b600482016104ef565b0390fd5b61235c91339190916144f2565b565b600090565b61236c90610b0c565b90565b9061237990612363565b600052602052604060002090565b612393612398916121af565b610f26565b90565b6123a59054612387565b90565b60016123c16123c7926123b961235e565b50600461236f565b0161239b565b90565b600090565b906123d990610bad565b600052602052604060002090565b60018060a01b031690565b6123fe612403916121af565b6123e7565b90565b61241090546123f2565b90565b9061241d90610302565b9052565b60a01c90565b6bffffffffffffffffffffffff1690565b61244461244991612421565b612427565b90565b6124569054612438565b90565b906124639061048c565b9052565b612471604061078e565b90565b906124ab6124a26000612485612467565b9461249c612494838301612406565b838801612413565b0161244c565b60208401612459565b565b6124b690612474565b90565b6124c39051610302565b90565b6124da6124d56124df92611713565b610baa565b6102f7565b90565b6124eb906124c6565b90565b6124f8905161048c565b90565b61250f61250a6125149261048c565b610baa565b610332565b90565b634e487b7160e01b600052601160045260246000fd5b61253c61254291939293610332565b92610332565b9161254e838202610332565b92818404149015171561255d57565b612517565b634e487b7160e01b600052601260045260246000fd5b61258461258a91610332565b91610332565b908115612595570490565b612562565b6125bd6125c2919392936125ac6123ca565b506125b5611c33565b5060036123cf565b6124ad565b916125cf600084016124b9565b6125ea6125e46125df60006124e2565b610302565b91610302565b14612637575b600061262c6126166126339361261061260b602089016124ee565b6124fb565b9061252d565b6126266126216145ea565b6124fb565b90612578565b93016124b9565b9190565b9150612633600061262c61261661264e60026124ad565b9593505050506125f0565b612664913691610a00565b90565b612672913691611351565b90565b969396959094919295612686614601565b6128bf575b8287036128b15760601b679a31110384e0b0c9179460601b679a31110384e0b0c91791856020528560601c958360601c9384156128a357873303612887575b8860051b805b61282757505050828660207f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb604051604081528b8d8160051b948286936040860152838d6060870137836060018286015260608486010190815201376080339380010190a461273d61460f565b61280a575b50813b612753575b50505050505050565b602080809786946000528060c06040519b8c9a63bc197c818c5233868d015260408c015260a060608c01528a8360051b998a9586948593015260e08d01378160c00160808c015260e0828c010192835284830137818060e0010160a08a01520101838152013780010161010401601c60405101600080515af1156127fb575b63bc197c8160e01b9051036127ed573880808080808061274a565b639c05499b6000526004601cfd5b3d156127d2573d6000823e3d90fd5b612821908690849086908a8c919287948b9661461d565b38612742565b60209003808b013583602052818801356000526040600020805480831161287957829003905582602052604060002090815490810190811061286b578291556126d0565b6301336cea6000526004601cfd5b63f4d678b86000526004601cfd5b336000526034600c20546126ca57634b6e7f186000526004601cfd5b63ea553b346000526004601cfd5b633b800a466000526004601cfd5b6128e284886128dc8b87906128d688948c96612659565b50612659565b50612667565b5061268b565b90612903916128fe6128f9826123a8565b61418e565b612905565b565b9061290f91614667565b565b9061291b916128e8565b565b60207f20726f6c657320666f722073656c660000000000000000000000000000000000917f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201520152565b612978602f6040926106d7565b6129818161291d565b0190565b61299b906020810190600081830391015261296b565b90565b156129a557565b6129ad6102e2565b62461bcd60e51b8152806129c360048201612985565b0390fd5b906129f4916129ef826129e96129e36129de614691565b610302565b91610302565b1461299e565b61469e565b565b606090565b93929190612a076129f6565b508203612a5e5760405193828552602085019260051b808481016040525b612a2f5750505050565b602090038082013560601b679a31110384e0b0c917602052808301356000528060406000205481860152612a25565b633b800a466000526004601cfd5b7fbaa5ee745de68a3095827d2ee7dd2043afc932834d02cc1b8be3da78577f6c1a90565b90612aab9291612aa6612aa1612a6c565b61418e565b612b10565b565b90612aba60001991611716565b9181191691161790565b612acd906121af565b90565b90612ae5612ae0612aec92612363565b612ac4565b8254612aad565b9055565b90612b05612b00612b0c92610bad565b611d6c565b8254612aad565b9055565b612b4f9291612b2d612b4a92612b28600c8690610f0e565b612ad0565b612b4281612b3d600d8690610bc9565b612af0565b91600e610bc9565b612af0565b565b90612b5c9291612a90565b565b90612b7191612b6b611c33565b5061470e565b905090565b90612b919291612b8c612b87611ca1565b61418e565b612b93565b565b91612ba0929190916148f4565b565b90612bad9291612b76565b565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a690565b90612bef939291612bea612be5612baf565b61418e565b612bf1565b565b91612bff9391909192614477565b565b90612c0d939291612bd3565b565b612c2890612c23612c1e611cf9565b61418e565b612c2a565b565b612c35906009611f15565b565b612c4090612c0f565b565b91612c6c97959391969492612c5f612c58612a6c565b8290614667565b9690919293949596614977565b565b90612c7890612363565b600052602052604060002090565b90565b90612ca9612ca4612cae93612c9c6123ca565b506005612c6e565b612c86565b6149c6565b90565b90612cbb9061218b565b600052602052604060002090565b60ff1690565b612cdb612ce0916121af565b612cc9565b90565b612ced9054612ccf565b90565b612d18916000612d0d612d1393612d05611c5c565b50600461236f565b01612cb1565b612ce3565b90565b612d3490612d2f612d2a611cf9565b61418e565b612d36565b565b612d4190600a611f15565b565b612d4c90612d1b565b565b60018060a01b031690565b612d65612d6a916121af565b612d4e565b90565b612d779054612d59565b90565b612d839061217f565b90565b600080fd5b60e01b90565b90505190612d9e82610b0f565b565b90602082820312612dba57612db791600001612d91565b90565b6102ed565b50612dce906020810190610323565b90565b612dda90610302565b9052565b50612ded906020810190610401565b90565b612df9906103e0565b9052565b50612e0c906020810190610b24565b90565b612e1890610b0c565b9052565b600080fd5b600080fd5b600080fd5b9035600160200382360303811215612e6c57016020813591019167ffffffffffffffff8211612e67576001820236038313612e6257565b612e21565b612e1c565b612e26565b60209181520190565b9190612e9481612e8d81612e9995612e71565b80956107c6565b61063f565b0190565b9035600160400382360303811215612eb3570190565b612e26565b9035600160200382360303811215612ef957016020813591019167ffffffffffffffff8211612ef4576001820236038313612eef57565b612e21565b612e1c565b612e26565b9190612f1881612f1181612f1d9561058f565b80956107c6565b61063f565b0190565b67ffffffffffffffff1690565b612f3781612f21565b03612f3e57565b600080fd5b90503590612f5082612f2e565b565b50612f61906020810190612f43565b90565b612f6d90612f21565b9052565b90612faf906020612fa7612f9d60408401612f8f6000880188612eb8565b908683036000880152612efe565b9482810190612f52565b910190612f64565b90565b61305c9161304e61304360c08301612fda612fd06000870187612dbf565b6000860190612dd1565b612ff4612fea6020870187612dde565b6020860190612df0565b61300e6130046040870187612dfd565b6040860190612e0f565b61302861301e6060870187612dfd565b6060860190612e0f565b6130356080860186612e2b565b908583036080870152612e7a565b9260a0810190612e9d565b9060a0818403910152612f71565b90565b93929061308b6040916130939461307e606089019260008a0190610c5e565b8782036020890152612fb2565b940190610b52565b565b61309d6102e2565b3d6000823e3d90fd5b91506020906130b361235e565b506130c66130c16006612d6d565b612d7a565b6130f2633808a90b9492946130fd6130de600761239b565b6130e66102e2565b97889687958695612d8b565b85526004850161305f565b03915afa90811561314257600091613114575b5090565b613135915060203d811161313b575b61312d818361065f565b810190612da0565b38613110565b503d613123565b613095565b901515679a31110384e0b0c96020523360145281600052806034600c205560005260601b60601c337f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160206000a3565b6131a491339190916149ff565b565b906131c29392916131bd6131b8612baf565b61418e565b6131c4565b565b916131d29391909192614a51565b565b906131e09392916131a6565b565b6132016131fc613206926131f4611c33565b506005612c6e565b612c86565b614b25565b90565b906132249161321f61321a826123a8565b61418e565b613226565b565b906132309161469e565b565b9061323c91613209565b565b903560016020038236030381121561327f57016020813591019167ffffffffffffffff821161327a57602082023603831361327557565b612e21565b612e1c565b612e26565b60209181520190565b90565b9061329d81602093612dd1565b0190565b60200190565b916132b5826132bb92613284565b9261328d565b90816000905b8282106132cf575050505090565b909192936132f16132eb6001926132e68886612dbf565b613290565b956132a1565b9201909291926132c1565b903560016020038236030381121561333d57016020813591019167ffffffffffffffff821161333857602082023603831361333357565b612e21565b612e1c565b612e26565b60209181520190565b90565b6133579061042f565b9052565b906133688160209361334e565b0190565b5061337b90602081019061179a565b90565b60200190565b916133928261339892613342565b9261334b565b90816000905b8282106133ac575050505090565b909192936133ce6133c86001926133c3888661336c565b61335b565b9561337e565b92019092919261339e565b903560016020038236030381121561341a57016020813591019167ffffffffffffffff821161341557602082023603831361341057565b612e21565b612e1c565b612e26565b60209181520190565b90565b60209181520190565b600080fd5b9037565b9091826134499161342b565b9160018060fb1b03811161346c57829160206134689202938491613439565b0190565b613434565b9061347c929161343d565b90565b90356001602003823603038112156134c057016020813591019167ffffffffffffffff82116134bb5760208202360383136134b657565b612e21565b612e1c565b612e26565b60200190565b91816134d69161341f565b90816134e760208302840194613428565b92836000925b8484106134fd5750505050505090565b9091929394956020613529613523838560019503885261351d8b8861347f565b90613471565b986134c5565b9401940192949391906134ed565b6135b5916135a761359c61358161356660808501613558600088018861323e565b9087830360008901526132a7565b61357360208701876132fc565b908683036020880152613384565b61358e60408601866133d9565b9085830360408701526134cb565b9260608101906133d9565b9160608185039101526134cb565b90565b916135dc926135cf60408201936000830190610387565b6020818403910152613537565b90565b60200190565b5190565b67ffffffffffffffff81116136015760208091020190565b610649565b9092919261361b613616826135e9565b61078e565b938185526020808601920283019281841161365857915b83831061363f5750505050565b6020809161364d8486610b24565b815201920191613632565b6109fb565b613668913691613606565b90565b61367490610332565b60008114613683576001900390565b612517565b9061369290610bad565b600052602052604060002090565b600080fd5b600080fd5b600080fd5b9035906001602003813603038212156136f1570180359067ffffffffffffffff82116136ec576020019160208202360383136136e757565b6136aa565b6136a5565b6136a0565b5090565b634e487b7160e01b600052603260045260246000fd5b9190811015613720576020020190565b6136fa565b3561372f8161030e565b90565b903590600160200381360303821215613774570180359067ffffffffffffffff821161376f5760200191602082023603831361376a57565b6136aa565b6136a5565b6136a0565b9035906001602003813603038212156137bb570180359067ffffffffffffffff82116137b6576020019160208202360383136137b157565b6136aa565b6136a5565b6136a0565b908210156137db5760206137d79202810190613779565b9091565b6136fa565b903590600160200381360303821215613822570180359067ffffffffffffffff821161381d5760200191602082023603831361381857565b6136aa565b6136a5565b6136a0565b9190811015613837576020020190565b6136fa565b3561384681611785565b90565b61385290611f78565b90565b61385e90613849565b90565b61386a9061217f565b90565b600091031261387857565b6102ed565b90918261388991611090565b9160018060fb1b0381116138ac57829160206138a89202938491613439565b0190565b613434565b60209181520190565b6138d96138e26020936138e7936138d0816135e5565b938480936138b1565b958691016106e0565b61063f565b0190565b936139186139349694926139269461390b608089019260008a0190610c5e565b87820360208901526110c3565b91858303604087015261387d565b9160608184039101526138ba565b90565b61394090611f78565b90565b61394c90613937565b90565b6139589061217f565b90565b906139658261108c565b811015613976576020809102010190565b6136fa565b6139859051610332565b90565b60016139949101610332565b90565b92613a13613a1991613a0e9397946139b087899061470e565b9590956139de8b916139cf6139c36102e2565b938492602084016135b8565b6020820181038252038261065f565b6139f06139ea826135e5565b916135df565b209192613a07613a02600c8c90610f0e565b61239b565b929361365d565b614b45565b1561042f565b613df157613aa390613a456000613a40613a39600f999698998890612197565b8990610bc9565b611d91565b613a6b613a54600e8890610bc9565b613a65613a60826121c9565b61366b565b90612af0565b613a9e613a8c613a85613a80600e8a90610bc9565b6121c9565b8890614b96565b91613a9960108990613688565b610bc9565b612af0565b613aab611c33565b925b83613ad6613ad0613acb613ac58660008101906136af565b906136f6565b610332565b91610332565b1015613db157613afc613af7613af08460008101906136af565b8791613710565b613725565b91613b1e613b18613b11836040810190613732565b88916137c0565b90612659565b95613b3f613b3a613b338460208101906137e0565b8991613827565b61383c565b600014613c3b57613b4e611c33565b5b80613b6a613b64613b5f8b61108c565b610332565b91610332565b1015613c2257613b81613b7c86613943565b61394f565b906340c10f1987613b9b613b968c859061395b565b61397b565b93803b15613c1d57613bc160008094613bcc613bb56102e2565b98899687958694612d8b565b845260048401610c6b565b03925af1918215613c1857613be692613beb575b50613988565b613b4f565b613c0b9060003d8111613c11575b613c03818361065f565b81019061386d565b38613be0565b503d613bf9565b613095565b612d86565b5094909550613c339192505b613988565b929390613aad565b949095919284927f0000000000000000000000000000000000000000000000000000000000000000613c7e613c78613c7360006124e2565b610302565b91610302565b141580613d96575b613d6d575b613cc6613cc1613cac613cbb89613ca06102e2565b928391602083016111f9565b6020820181038252038261065f565b93613855565b613861565b63b48ab8b6949194613ce6613cdf8b6060810190613732565b87916137c0565b909491833b15613d6857613d1c613d1193600097938894613d056102e2565b9b8c998a988997612d8b565b8752600487016138eb565b03925af1918215613d6357613c3392613d36575b50613c2e565b613d569060003d8111613d5c575b613d4e818361065f565b81019061386d565b38613d30565b503d613d44565b613095565b612d86565b92507f000000000000000000000000000000000000000000000000000000000000000092613c8b565b5033613daa613da488610302565b91610302565b1415613c86565b93925050907ff254aace0ef98d6ac1a0d84c95648f8e3f7a1881dbb43393709ecd004b00f10391613dec613de36102e2565b92839283610c6b565b0390a1565b60006309bde33960e01b815280613e0a600482016104ef565b0390fd5b613e16611c5c565b50679a31110384e0b0c96020526014526000526034600c205490565b613e4b90613e46613e41611f39565b61418e565b613e4d565b565b613e58906007612ad0565b565b613e6390613e32565b565b94909194613e71614601565b61400f575b60601b679a31110384e0b0c9179160601b679a31110384e0b0c917918060205260601c928260601c92831561400157843303613fe5575b8660005260406000208054808411613fd75783900390556020526040600020805490828201918210613fc95755806020528284337fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6260406000a4613f0f61460f565b613fa4575b823b613f23575b505050505050565b602094829160405197889663f23a6e618852338989015260408801526060870152608086015260a0808601528160c086015260e085013760c401906000601c8401915af115613f95575b63f23a6e6160e01b905103613f8757388080808080613f1b565b639c05499b6000526004601cfd5b3d15613f6d573d6000823e3d90fd5b613fad86614be5565b50613fb781614be5565b50613fc3858390612667565b50613f14565b6301336cea6000526004601cfd5b63f4d678b86000526004601cfd5b336000526034600c2054613ead57634b6e7f186000526004601cfd5b63ea553b346000526004601cfd5b61401886614be5565b5061402284614be5565b5061402e858390612667565b50613e76565b61404361404991939293610332565b92610332565b820180921161405457565b612517565b61407761407261406b600f3390612197565b8390610bc9565b6121c9565b61408a61408460006121d6565b91610332565b0361411b576140a4338261409e6001612209565b916149ff565b6140d66140bb436140b56001612209565b90614034565b6140d16140ca600f3390612197565b8490610bc9565b612af0565b336141166141047f5e1dd8c4451717d5ca4ffbefdada35e22e0871220b9ed9dd03a351f0938c5ed79261218b565b9261410d6102e2565b91829182610394565b0390a2565b600063156f904360e21b815280614134600482016104ef565b0390fd5b614140611c5c565b5063c79b8b5f60e01b61415b614155836103e0565b916103e0565b14801561417f575b90811561416f575b5090565b6141799150614c05565b3861416b565b5061418981614c05565b614163565b6141a09061419a614691565b90614d12565b565b60207f2073616c65507269636500000000000000000000000000000000000000000000917f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201520152565b6141fd602a6040926106d7565b614206816141a2565b0190565b61422090602081019060008183039101526141f0565b90565b1561422a57565b6142326102e2565b62461bcd60e51b8152806142486004820161420a565b0390fd5b60007f455243323938313a20696e76616c696420726563656976657200000000000000910152565b61428160196020926106d7565b61428a8161424c565b0190565b6142a49060208101906000818303910152614274565b90565b156142ae57565b6142b66102e2565b62461bcd60e51b8152806142cc6004820161428e565b0390fd5b6142da604061078e565b90565b90565b906142f56142f06142fc9261218b565b6142dd565b8254611fac565b9055565b60a01b90565b906143206bffffffffffffffffffffffff60a01b91614300565b9181191691161790565b61433e6143396143439261048c565b610baa565b61048c565b90565b90565b9061435e6143596143659261432a565b614346565b8254614306565b9055565b906143946020600061439a9461438c8282016143868488016124b9565b906142e0565b0192016124ee565b90614349565b565b906143a691614369565b565b90614419614420926143d4836143cd6143c76143c26145ea565b61048c565b9161048c565b1115614223565b6143fa816143f36143ed6143e860006124e2565b610302565b91610302565b14156142a7565b916144106144066142d0565b9360008501612413565b60208301612459565b600261439c565b565b9061442b612016565b506080604051019160208301604052600083528290600a6000198092955b01948181066030018653049384156144685790600a9190809291614449565b93505082602091039203918252565b6144c591926144916144cb956144b6939086849192614dab565b6144ae6144a7826144a260006121c9565b614034565b6000612af0565b926001610bc9565b916144c0836121c9565b614034565b90612af0565b565b6144dc6144e291939293610332565b92610332565b82039182116144ed57565b612517565b61450190939293828591614eac565b61450a8161108c565b9261451560006121d6565b9261451e611c33565b935b8461453361452d88610332565b91610332565b10156145a05761459461459a9161455361454e86899061395b565b61397b565b61458e886145886145798a61457361456e879560019361395b565b61397b565b90610bc9565b91614583836121c9565b6144cd565b90612af0565b90614034565b94613988565b93614520565b915093506145c492506145bd91506145b860006121c9565b6144cd565b6000612af0565b565b600090565b90565b6145e26145dd6145e7926145cb565b610baa565b61048c565b90565b6145f26145c6565b506145fe6127106145ce565b90565b614609611c5c565b50600090565b614617611c5c565b50600090565b5050949293909361462c61460f565b614639575b505050505050565b61464f6146559361465b97969092939596612659565b50612659565b50612667565b50388080808080614631565b9061468961468461468e9361467d818590614f0c565b6005612c6e565b612c86565b614ff3565b50565b6146996123ca565b503390565b906146c06146bb6146c5936146b481859061502e565b6005612c6e565b612c86565b6150c8565b50565b9160206146ea9294936146e360408201966000830190610b52565b0190610c5e565b565b6146f86146fe91610332565b91610332565b908115614709570690565b612562565b919091614719611c33565b50614722611c33565b50614737614732600e8590610bc9565b6121c9565b61474a61474460006121d6565b91610332565b146148535761476d614768614761600f8490612197565b8590610bc9565b6121c9565b8061478161477b60006121d6565b91610332565b14614836574090614791826121f2565b6147a461479e60006121d6565b91610332565b14614819576147f561480f916147dd614816946147ce6147c26102e2565b938492602084016146c8565b6020820181038252038261065f565b6147ef6147e9826135e5565b916135df565b206121f2565b614809614804600e8790610bc9565b6121c9565b906146ec565b9283614b96565b90565b600063b7b3378760e01b815280614832600482016104ef565b0390fd5b6000637de832b560e11b81528061484f600482016104ef565b0390fd5b6000630b56c82b60e31b81528061486c600482016104ef565b0390fd5b60007f455243323938313a20496e76616c696420706172616d65746572730000000000910152565b6148a5601b6020926106d7565b6148ae81614870565b0190565b6148c89060208101906000818303910152614898565b90565b156148d257565b6148da6102e2565b62461bcd60e51b8152806148f0600482016148b2565b0390fd5b6149709061496961497594936149248561491d6149176149126145ea565b61048c565b9161048c565b1115614223565b61494a8161494361493d61493860006124e2565b610302565b91610302565b14156148cb565b936149606149566142d0565b9560008701612413565b60208501612459565b60036123cf565b61439c565b565b95966149a5976149989695946149939489949091929394615103565b6143a8565b6149a0612baf565b614667565b565b90565b6149be6149b96149c392610332565b610baa565b6102f7565b90565b6149f26149ed6149fc936149e860006149f7956149e16123ca565b50016149a7565b6151d9565b6121f2565b6149aa565b61217f565b90565b614a3a614a4f93614a15614a49938583916151fb565b614a32614a2b82614a2660006121c9565b6144cd565b6000612af0565b926001610bc9565b91614a44836121c9565b6144cd565b90612af0565b565b92614a63919492939085859192615216565b614a6c8361108c565b91614a7760006121d6565b91614a80611c33565b5b80614a94614a8e87610332565b91610332565b1015614b0057614afb90614af6614abf614ab7614ab287859061395b565b61397b565b968790614034565b95614af0614ae16001614adb614ad68d889061395b565b61397b565b90610bc9565b91614aeb836121c9565b614034565b90612af0565b613988565b614a81565b50935050614b239150614b1c90614b1760006121c9565b614034565b6000612af0565b565b614b3d6000614b4292614b36611c33565b50016149a7565b615359565b90565b919091614b50611c5c565b508051614b5d575b501490565b9060208201915160051b8201905b8251811160051b9081526020835191185260206040600020920191818310614b6b5791505038614b58565b90614bb8614bb1614bbd92614ba9611c33565b506010613688565b8390610bc9565b6121c9565b80614bd1614bcb60006121d6565b91610332565b14600014614bde57505b90565b9050614bdb565b90614bee6129f6565b506040519160408301604052600183526020830152565b614c0d611c5c565b50614c1781615371565b8015614c3a575b908115614c2a575b5090565b614c349150615417565b38614c26565b50614c44816153b1565b614c1e565b90565b614c60614c5b614c6592614c49565b610baa565b610332565b90565b60007f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000910152565b614c9c6017809261201b565b614ca581614c68565b0190565b60007f206973206d697373696e6720726f6c6520000000000000000000000000000000910152565b614cdd6011809261201b565b614ce681614ca9565b0190565b614d04614d0f9392614cfe614d0993614c90565b906120a9565b614cd1565b906120a9565b90565b90614d27614d21838390612cf0565b1561042f565b614d2f575050565b614da791614d85614d5e614d4e614d48614d8a95615493565b936121f2565b614d586020614c4c565b9061566c565b91614d76614d6a6102e2565b93849260208401614cea565b6020820181038252038261065f565b612132565b614d926102e2565b91829162461bcd60e51b835260048301610736565b0390fd5b91929092614db7614601565b614e93575b8260601b8015614e8557679a31110384e0b0c960205283601452846000526040600020805490838201918210614e7757558160205260601c6000337fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604083a4614e2461460f565b614e5e575b614e32836157b8565b614e3d575b50505050565b614e5593614e4b60006124e2565b93909192936157c5565b38808080614e37565b614e6784614be5565b50614e7181614be5565b50614e29565b6301336cea6000526004601cfd5b63ea553b346000526004601cfd5b614e9c84614be5565b50614ea681614be5565b50614dbc565b9091614ec592614ebc60006124e2565b9290919261585e565b565b90614ed360ff91611716565b9181191691161790565b614ee69061042f565b90565b90565b90614f01614efc614f0892614edd565b614ee9565b8254614ec7565b9055565b614f20614f1a828490612cf0565b1561042f565b614f29575b5050565b614f4c6001614f476000614f3f6004869061236f565b018590612cb1565b614eec565b90614f55614691565b90614f92614f8c614f867f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d95612363565b9261218b565b9261218b565b92614f9b6102e2565b80614fa5816104ef565b0390a43880614f25565b614fb890611f78565b90565b614fcf614fca614fd4926102f7565b610baa565b610332565b90565b614feb614fe6614ff092610332565b611716565b610b0c565b90565b9061502661502061501b615016600061502b9661500e611c5c565b500194614faf565b614fbb565b614fd7565b916149a7565b615a4e565b90565b615039818390612cf0565b615042575b5050565b615065600061506060006150586004869061236f565b018590612cb1565b614eec565b9061506e614691565b906150ab6150a561509f7ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b95612363565b9261218b565b9261218b565b926150b46102e2565b806150be816104ef565b0390a4388061503e565b906150fb6150f56150f06150eb6000615100966150e3611c5c565b500194614faf565b614fbb565b614fd7565b916149a7565b615b0e565b90565b91909492615111600b612ce3565b615184576151316151389261512a615176986008611f15565b6009611f15565b600a611f15565b61514a615143611738565b8290614667565b61515c615155611ca1565b8290614667565b61516e615167611cf9565b8290614667565b919091615c18565b6151826001600b614eec565b565b600063f92ee8a960e01b81528061519d600482016104ef565b0390fd5b5490565b600052602060002090565b6151b9816151a1565b8210156151d4576151cb6001916151a5565b91020190600090565b6136fa565b6151f89160006151f2926151eb61235e565b50016151b0565b90610f41565b90565b90916152149261520b60006124e2565b92909192615c35565b565b91929092615222614601565b615354575b8051845103615346578260601b80156153385780679a31110384e0b0c917602052845160051b805b61530157506000604051604081527f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb81885160051b602001604082019081818c60045afa503d60400160208301523d01865160051b60200181818960045afa503d01039360601c933392a46152c261460f565b6152fc575b6152d0836157b8565b6152db575b50505050565b6152f3936152e960006124e2565b9390919293615d39565b388080806152d5565b6152c7565b808301519080870151600052604060002091825490810190811061532a5760209255038061524f565b6301336cea6000526004601cfd5b63ea553b346000526004601cfd5b633b800a466000526004601cfd5b615227565b600061536e91615367611c33565b50016151a1565b90565b615379611c5c565b50633e85e62f60e01b61539461538e836103e0565b916103e0565b149081156153a1575b5090565b6153ab9150615df0565b3861539d565b6153b9611c5c565b506153c381615e17565b8015615408575b80156153ed575b9081156153dd575b5090565b6153e79150615e57565b386153d9565b5060006154026153fc836103e0565b916103e0565b146153d1565b5061541281615e57565b6153ca565b61541f611c5c565b5061542981615e57565b908115615435575b5090565b61543f9150615e97565b38615431565b90565b60ff1690565b61546261545d61546792615445565b610baa565b615448565b90565b615474601461544e565b90565b61548b61548661549092615448565b610baa565b610332565b90565b6154b06154ab6154c6926154a5612016565b50614faf565b614fbb565b6154c06154bb61546a565b615477565b9061566c565b90565b90565b6154e06154db6154e5926154c9565b610baa565b610332565b90565b906154fa6154f58361132e565b61078e565b918252565b369037565b90615529615511836154e8565b9260208061551f869361132e565b92019103906154ff565b565b600360fc1b90565b9061553d826135e5565b81101561554f57600160209102010190565b6136fa565b600f60fb1b90565b6f181899199a1a9b1b9c1cb0b131b232b360811b90565b61557b61555c565b90565b90565b61559561559061559a9261557e565b610baa565b610332565b90565b60f81b90565b90565b6155ba6155b56155bf926155a3565b610baa565b615448565b90565b6155e1906155db6155d56155e694615448565b91610332565b9061096e565b610332565b90565b60007f537472696e67733a20686578206c656e67746820696e73756666696369656e74910152565b61561d602080926106d7565b615626816155e9565b0190565b6156409060208101906000818303910152615611565b90565b1561564a57565b6156526102e2565b62461bcd60e51b8152806156686004820161562a565b0390fd5b9190615676612016565b506157106157006156ac6156a7615697600261569287916154cc565b61252d565b6156a160026154cc565b90614034565b615504565b926156b561552b565b6156ce856156c860009360001a936121d6565b90615533565b536156d7615554565b6156f0856156ea60019360001a93612209565b90615533565b536156fb60026154cc565b61252d565b61570a6001612209565b90614034565b925b836157266157206001612209565b91610332565b111561578d57615734615573565b8161573f600f615581565b169160108310156157885761575b61577c92615782941a61559d565b61576b8591889060001a92615533565b5361577660046155a6565b906155c2565b9361366b565b92615712565b6136fa565b6157b59293506157b0906157aa6157a460006121d6565b91610332565b14615643565b612132565b90565b6157c0611c5c565b503b90565b919360209360405195869463f23a6e618652338787015260601b60601c60408601526060850152608084015260a08084015280518091818060c087015261584a575b505060c401906000601c8401915af11561583b575b63f23a6e6160e01b90510361582d57565b639c05499b6000526004601cfd5b3d1561581c573d6000823e3d90fd5b818660e08701920160045afa508038615807565b9193929061586a614601565b615996575b81518551036159885760601b9182679a31110384e0b0c9176020528060601b83811490151715615966575b50835160051b805b61593057507f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb6000939460405192839160408352805160051b60200180916040850192839160045afa503d60400160208401523d019081815160051b602001809260045afa503d01039260601c923392a461591b61460f565b615922575b565b61592a612249565b50615920565b80820151908086015160005260406000208054928381116159585760209303905503806158a2565b63f4d678b86000526004601cfd5b6000526034600c20541561597a573861589a565b634b6e7f186000526004601cfd5b633b800a466000526004601cfd5b61599e612249565b5061586f565b90565b600052602060002090565b5490565b6159bf816159b2565b8210156159da576159d16001916159a7565b91020190600090565b6136fa565b91906159f56159f06159fd93612363565b612ac4565b908354611d46565b9055565b9081549168010000000000000000831015615a315782615a29916001615a2f950181556159b6565b906159df565b565b610649565b90615a4090612363565b600052602052604060002090565b615a56611c5c565b50615a6b615a65828490615ed7565b1561042f565b600014615aae57615aa4615aa992615a8f615a88600085016159a4565b8290615a01565b6001615a9d600085016151a1565b9301615a36565b612af0565b600190565b5050600090565b634e487b7160e01b600052603160045260246000fd5b615add91615ad761235e565b916159df565b565b615ae8816159b2565b8015615b09576001900390615b06615b0083836159b6565b90615acb565b55565b615ab5565b615b16611c5c565b50615b2d615b28600183018490615a36565b6121c9565b9081615b42615b3c60006121d6565b91610332565b1415600014615c1057615bc2926001615bbd9284615b6b600096615b6585612209565b906144cd565b615b88615b798885016151a1565b615b8286612209565b906144cd565b80615b9b615b9584610332565b91610332565b03615bc7575b505050615bb7615bb28683016159a4565b615adf565b01615a36565b611d91565b600190565b615c0892615bfa615be6615be0615c03948c89016151b0565b90610f41565b93615bf485918c89016151b0565b906159df565b91858501615a36565b612af0565b388080615ba1565b505050600090565b90615c2e615c339392615c29611f39565b614667565b615f0d565b565b90929192615c41614601565b615d17575b60601b9081679a31110384e0b0c917602052818160601b148160601b151715615cf5575b5082600052604060002090815491828411615ce757836000930390558260205260601c337fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62604084a4615cbb61460f565b615cc4575b5050565b615cd0615cd692614be5565b50614be5565b50615cdf612249565b503880615cc0565b63f4d678b86000526004601cfd5b6000526034600c205415615d095738615c6a565b634b6e7f186000526004601cfd5b615d2084614be5565b50615d2a83614be5565b50615d33612249565b50615c46565b919360209360405195869463bc197c818652338787015260601b60601c604086015260a06060860152805160051b8601809160c0870192839160045afa503d60a001908160808701523d019182815160051b8801809260045afa503d0160a08501523d01908181518601809260045afa50601c8301903d0103906000601c8401915af115615de1575b63bc197c8160e01b905103615dd357565b639c05499b6000526004601cfd5b3d15615dc2573d6000823e3d90fd5b615df8611c5c565b5060e01c630e89341c8114906301ffc9a763d9b67a2682149114171790565b615e1f611c5c565b5080615e3a615e3463152a902d60e11b6103e0565b916103e0565b14908115615e47575b5090565b615e519150615f2d565b38615e43565b615e5f611c5c565b5080615e7a615e74635a05180f60e01b6103e0565b916103e0565b14908115615e87575b5090565b615e919150615f53565b38615e83565b615e9f611c5c565b5080615eba615eb4634e821d3360e11b6103e0565b916103e0565b14908115615ec7575b5090565b615ed191506153b1565b38615ec3565b615ef5916001615ef092615ee9611c5c565b5001615a36565b6121c9565b615f08615f0260006121d6565b91610332565b141590565b90615f24615f1d615f2b93611fa0565b6006611fd6565b6007612ad0565b565b615f35611c5c565b50615f4f615f496301ffc9a760e01b6103e0565b916103e0565b1490565b615f5b611c5c565b5080615f76615f70637965db0b60e01b6103e0565b916103e0565b14908115615f83575b5090565b615f8d9150615e17565b38615f7f56fea264697066735822122023af99d012f9c0397549fa6d414ea97a8c70379f7b83dd92c49e8264e57f39ad64736f6c634300081b003360806040523461002f576100196100146100fa565b61011b565b610021610034565b610722610380823961072290f35b61003a565b60405190565b600080fd5b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b906100699061003f565b810190811060018060401b0382111761008157604052565b610049565b90610099610092610034565b928361005f565b565b600080fd5b60018060a01b031690565b6100b4906100a0565b90565b6100c0816100ab565b036100c757565b600080fd5b905051906100d9826100b7565b565b906020828203126100f5576100f2916000016100cc565b90565b61009b565b610118610aa28038038061010d81610086565b9283398101906100db565b90565b61012c9061012761012e565b61026e565b565b61013e610139610291565b6102d6565b565b60209181520190565b60207f6e206973206e6f74206120636f6e747261637400000000000000000000000000917f5570677261646561626c65426561636f6e3a20696d706c656d656e746174696f60008201520152565b6101a46033604092610140565b6101ad81610149565b0190565b6101c79060208101906000818303910152610197565b90565b156101d157565b6101d9610034565b62461bcd60e51b8152806101ef600482016101b1565b0390fd5b60001b90565b9061020a60018060a01b03916101f3565b9181191691161790565b90565b61022b610226610230926100a0565b610214565b6100a0565b90565b61023c90610217565b90565b61024890610233565b90565b90565b9061026361025e61026a9261023f565b61024b565b82546101f9565b9055565b61028a9061028361027e8261035e565b6101ca565b600161024e565b565b600090565b61029961028c565b503390565b60001c90565b60018060a01b031690565b6102bb6102c09161029e565b6102a4565b90565b6102cd90546102af565b90565b60000190565b6102e060006102c3565b6102eb82600061024e565b9061031f6103197f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09361023f565b9161023f565b91610328610034565b80610332816102d0565b0390a3565b600090565b90565b90565b61035661035161035b9261033f565b610214565b61033c565b90565b610366610337565b503b61037b6103756000610342565b9161033c565b119056fe60806040526004361015610013575b610219565b61001e60003561006d565b80633659cfe6146100685780635c60da1b14610063578063715018a61461005e5780638da5cb5b146100595763f2fde38b0361000e576101e6565b6101b1565b61017e565b610149565b6100e3565b60e01c90565b60405190565b600080fd5b600080fd5b60018060a01b031690565b61009790610083565b90565b6100a38161008e565b036100aa57565b600080fd5b905035906100bc8261009a565b565b906020828203126100d8576100d5916000016100af565b90565b61007e565b60000190565b34610111576100fb6100f63660046100be565b6102b3565b610103610073565b8061010d816100dd565b0390f35b610079565b600091031261012157565b61007e565b61012f9061008e565b9052565b919061014790600060208501940190610126565b565b3461017957610159366004610116565b6101756101646102f5565b61016c610073565b91829182610133565b0390f35b610079565b346101ac5761018e366004610116565b61019661035c565b61019e610073565b806101a8816100dd565b0390f35b610079565b346101e1576101c1366004610116565b6101dd6101cc610366565b6101d4610073565b91829182610133565b0390f35b610079565b34610214576101fe6101f93660046100be565b610473565b610206610073565b80610210816100dd565b0390f35b610079565b600080fd5b61022f9061022a610501565b610268565b565b90565b61024861024361024d92610083565b610231565b610083565b90565b61025990610234565b90565b61026590610250565b90565b6102718161061b565b61029b7fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b9161025c565b906102a4610073565b806102ae816100dd565b0390a2565b6102bc9061021e565b565b600090565b60001c90565b60018060a01b031690565b6102e06102e5916102c3565b6102c9565b90565b6102f290546102d4565b90565b6102fd6102be565b5061030860016102e8565b90565b610313610501565b61031b610348565b565b90565b61033461032f6103399261031d565b610231565b610083565b90565b61034590610320565b90565b61035a610355600061033c565b610639565b565b61036461030b565b565b61036e6102be565b5061037960006102e8565b90565b61038d90610388610501565b610442565b565b60209181520190565b60207f6464726573730000000000000000000000000000000000000000000000000000917f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201520152565b6103f3602660409261038f565b6103fc81610398565b0190565b61041690602081019060008183039101526103e6565b90565b1561042057565b610428610073565b62461bcd60e51b81528061043e60048201610400565b0390fd5b6104719061046c8161046561045f61045a600061033c565b61008e565b9161008e565b1415610419565b610639565b565b61047c9061037c565b565b60007f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572910152565b6104b26020809261038f565b6104bb8161047e565b0190565b6104d590602081019060008183039101526104a6565b90565b156104df57565b6104e7610073565b62461bcd60e51b8152806104fd600482016104bf565b0390fd5b61052b61050c610366565b61052561051f61051a61069a565b61008e565b9161008e565b146104d8565b565b60207f6e206973206e6f74206120636f6e747261637400000000000000000000000000917f5570677261646561626c65426561636f6e3a20696d706c656d656e746174696f60008201520152565b610588603360409261038f565b6105918161052d565b0190565b6105ab906020810190600081830391015261057b565b90565b156105b557565b6105bd610073565b62461bcd60e51b8152806105d360048201610595565b0390fd5b60001b90565b906105ee60018060a01b03916105d7565b9181191691161790565b90565b9061061061060b6106179261025c565b6105f8565b82546105dd565b9055565b6106379061063061062b826106cb565b6105ae565b60016105fb565b565b61064360006102e8565b61064e8260006105fb565b9061068261067c7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09361025c565b9161025c565b9161068b610073565b80610695816100dd565b0390a3565b6106a26102be565b503390565b600090565b90565b6106c36106be6106c89261031d565b610231565b6106ac565b90565b6106d36106a7565b503b6106e86106e260006106af565b916106ac565b119056fea26469706673582212203fbf94b3aa182e7120f7ee578f52eecce106fbe2a323e7e4f1511d9f27768ead64736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE PUSH2 0x30 JUMPI PUSH2 0x1A PUSH2 0x14 PUSH2 0x10A JUMP JUMPDEST SWAP1 PUSH2 0x197 JUMP JUMPDEST PUSH2 0x22 PUSH2 0x35 JUMP JUMPDEST PUSH2 0x271A PUSH2 0x3AB DUP3 CODECOPY PUSH2 0x271A SWAP1 RETURN JUMPDEST PUSH2 0x3B JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1F DUP1 NOT SWAP2 ADD AND SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH2 0x6A SWAP1 PUSH2 0x40 JUMP JUMPDEST DUP2 ADD SWAP1 DUP2 LT PUSH1 0x1 DUP1 PUSH1 0x40 SHL SUB DUP3 GT OR PUSH2 0x82 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH2 0x4A JUMP JUMPDEST SWAP1 PUSH2 0x9A PUSH2 0x93 PUSH2 0x35 JUMP JUMPDEST SWAP3 DUP4 PUSH2 0x60 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0xB5 SWAP1 PUSH2 0xA1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xC1 DUP2 PUSH2 0xAC JUMP JUMPDEST SUB PUSH2 0xC8 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP MLOAD SWAP1 PUSH2 0xDA DUP3 PUSH2 0xB8 JUMP JUMPDEST JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0x105 JUMPI DUP1 PUSH2 0xF9 PUSH2 0x102 SWAP3 PUSH1 0x0 DUP7 ADD PUSH2 0xCD JUMP JUMPDEST SWAP4 PUSH1 0x20 ADD PUSH2 0xCD JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x9C JUMP JUMPDEST PUSH2 0x128 PUSH2 0x9668 DUP1 CODESIZE SUB DUP1 PUSH2 0x11D DUP2 PUSH2 0x87 JUMP JUMPDEST SWAP3 DUP4 CODECOPY DUP2 ADD SWAP1 PUSH2 0xDC JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH2 0x135 SWAP1 PUSH2 0xAC JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x14D SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0x12C JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x157 PUSH2 0x35 JUMP JUMPDEST RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x177 PUSH2 0x172 PUSH2 0x17C SWAP3 PUSH2 0xA1 JUMP JUMPDEST PUSH2 0x160 JUMP JUMPDEST PUSH2 0xA1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x188 SWAP1 PUSH2 0x163 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x194 SWAP1 PUSH2 0x17F JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x1A0 PUSH2 0x1FB JUMP JUMPDEST PUSH2 0x1A8 PUSH2 0x35 JUMP JUMPDEST SWAP1 PUSH2 0x6101 DUP3 ADD DUP3 DUP2 LT PUSH1 0x1 DUP1 PUSH1 0x40 SHL SUB DUP3 GT OR PUSH2 0x1F6 JUMPI DUP3 SWAP2 PUSH2 0x1D2 SWAP2 PUSH2 0x6101 PUSH2 0x2AC5 DUP6 CODECOPY PUSH2 0x139 JUMP JUMPDEST SUB SWAP1 PUSH1 0x0 CREATE SWAP1 DUP2 ISZERO PUSH2 0x1F1 JUMPI PUSH2 0x1EA PUSH2 0x1EF SWAP3 PUSH2 0x18B JUMP JUMPDEST PUSH2 0x273 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x14F JUMP JUMPDEST PUSH2 0x4A JUMP JUMPDEST PUSH2 0x203 PUSH2 0x205 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x215 PUSH2 0x210 PUSH2 0x2D5 JUMP JUMPDEST PUSH2 0x349 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 SHL SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x22E PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB SWAP2 PUSH2 0x217 JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST PUSH2 0x241 SWAP1 PUSH2 0x163 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x24D SWAP1 PUSH2 0x238 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x268 PUSH2 0x263 PUSH2 0x26F SWAP3 PUSH2 0x244 JUMP JUMPDEST PUSH2 0x250 JUMP JUMPDEST DUP3 SLOAD PUSH2 0x21D JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x27B PUSH2 0x35 JUMP JUMPDEST SWAP1 PUSH2 0xAA2 DUP3 ADD DUP3 DUP2 LT PUSH1 0x1 DUP1 PUSH1 0x40 SHL SUB DUP3 GT OR PUSH2 0x2CB JUMPI DUP3 SWAP2 PUSH2 0x2A5 SWAP2 PUSH2 0xAA2 PUSH2 0x8BC6 DUP6 CODECOPY PUSH2 0x139 JUMP JUMPDEST SUB SWAP1 PUSH1 0x0 CREATE SWAP1 DUP2 ISZERO PUSH2 0x2C6 JUMPI PUSH2 0x2BF PUSH2 0x2C4 SWAP3 PUSH1 0x1 PUSH2 0x253 JUMP JUMPDEST PUSH2 0x349 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x14F JUMP JUMPDEST PUSH2 0x4A JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x2DD PUSH2 0x2D0 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 SHR SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x2FF PUSH2 0x304 SWAP2 PUSH2 0x2E2 JUMP JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x311 SWAP1 SLOAD PUSH2 0x2F3 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x31D SWAP1 PUSH2 0x17F JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x338 PUSH2 0x333 PUSH2 0x33F SWAP3 PUSH2 0x314 JUMP JUMPDEST PUSH2 0x320 JUMP JUMPDEST DUP3 SLOAD PUSH2 0x21D JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 ADD SWAP1 JUMP JUMPDEST PUSH2 0x353 PUSH1 0x0 PUSH2 0x307 JUMP JUMPDEST PUSH2 0x35E DUP3 PUSH1 0x0 PUSH2 0x323 JUMP JUMPDEST SWAP1 PUSH2 0x392 PUSH2 0x38C PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP4 PUSH2 0x314 JUMP JUMPDEST SWAP2 PUSH2 0x314 JUMP JUMPDEST SWAP2 PUSH2 0x39B PUSH2 0x35 JUMP JUMPDEST DUP1 PUSH2 0x3A5 DUP2 PUSH2 0x343 JUMP JUMPDEST SUB SWAP1 LOG3 JUMP INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x13 JUMPI JUMPDEST PUSH2 0x580 JUMP JUMPDEST PUSH2 0x1E PUSH1 0x0 CALLDATALOAD PUSH2 0x8D JUMP JUMPDEST DUP1 PUSH4 0x1BCE4583 EQ PUSH2 0x88 JUMPI DUP1 PUSH4 0x59659E90 EQ PUSH2 0x83 JUMPI DUP1 PUSH4 0x59A347BD EQ PUSH2 0x7E JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x79 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x74 JUMPI DUP1 PUSH4 0xCFCC5941 EQ PUSH2 0x6F JUMPI PUSH4 0xF2FDE38B SUB PUSH2 0xE JUMPI PUSH2 0x54D JUMP JUMPDEST PUSH2 0x50E JUMP JUMPDEST PUSH2 0x4D9 JUMP JUMPDEST PUSH2 0x4A6 JUMP JUMPDEST PUSH2 0x467 JUMP JUMPDEST PUSH2 0x1EA JUMP JUMPDEST PUSH2 0x108 JUMP JUMPDEST PUSH1 0xE0 SHR SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0xBC SWAP1 PUSH2 0xA8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xC8 DUP2 PUSH2 0xB3 JUMP JUMPDEST SUB PUSH2 0xCF JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0xE1 DUP3 PUSH2 0xBF JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0xFD JUMPI PUSH2 0xFA SWAP2 PUSH1 0x0 ADD PUSH2 0xD4 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x9E JUMP JUMPDEST PUSH1 0x0 ADD SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x136 JUMPI PUSH2 0x120 PUSH2 0x11B CALLDATASIZE PUSH1 0x4 PUSH2 0xE3 JUMP JUMPDEST PUSH2 0x67E JUMP JUMPDEST PUSH2 0x128 PUSH2 0x93 JUMP JUMPDEST DUP1 PUSH2 0x132 DUP2 PUSH2 0x102 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x99 JUMP JUMPDEST PUSH1 0x0 SWAP2 SUB SLT PUSH2 0x146 JUMPI JUMP JUMPDEST PUSH2 0x9E JUMP JUMPDEST SHR SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x16A SWAP1 PUSH1 0x8 PUSH2 0x16F SWAP4 MUL PUSH2 0x14B JUMP JUMPDEST PUSH2 0x14F JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x17D SWAP2 SLOAD PUSH2 0x15A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x18D PUSH1 0x1 PUSH1 0x0 SWAP1 PUSH2 0x172 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1A7 PUSH2 0x1A2 PUSH2 0x1AC SWAP3 PUSH2 0xA8 JUMP JUMPDEST PUSH2 0x190 JUMP JUMPDEST PUSH2 0xA8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1B8 SWAP1 PUSH2 0x193 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1C4 SWAP1 PUSH2 0x1AF JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1D0 SWAP1 PUSH2 0x1BB JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x1E8 SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0x1C7 JUMP JUMPDEST JUMP JUMPDEST CALLVALUE PUSH2 0x21A JUMPI PUSH2 0x1FA CALLDATASIZE PUSH1 0x4 PUSH2 0x13B JUMP JUMPDEST PUSH2 0x216 PUSH2 0x205 PUSH2 0x180 JUMP JUMPDEST PUSH2 0x20D PUSH2 0x93 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x1D4 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x99 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1F DUP1 NOT SWAP2 ADD AND SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH2 0x253 SWAP1 PUSH2 0x229 JUMP JUMPDEST DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x26D JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH2 0x233 JUMP JUMPDEST SWAP1 PUSH2 0x285 PUSH2 0x27E PUSH2 0x93 JUMP JUMPDEST SWAP3 DUP4 PUSH2 0x249 JUMP JUMPDEST JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2A5 JUMPI PUSH2 0x2A1 PUSH1 0x20 SWAP2 PUSH2 0x229 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x233 JUMP JUMPDEST SWAP1 DUP3 PUSH1 0x0 SWAP4 SWAP3 DUP3 CALLDATACOPY ADD MSTORE JUMP JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x2CB PUSH2 0x2C6 DUP3 PUSH2 0x287 JUMP JUMPDEST PUSH2 0x272 JUMP JUMPDEST SWAP4 DUP2 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP1 DUP3 DUP5 ADD GT PUSH2 0x2E7 JUMPI PUSH2 0x2E5 SWAP3 PUSH2 0x2AA JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x224 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x30A JUMPI DUP2 PUSH1 0x20 PUSH2 0x307 SWAP4 CALLDATALOAD SWAP2 ADD PUSH2 0x2B6 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x21F JUMP JUMPDEST PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0x329 DUP2 PUSH2 0x30F JUMP JUMPDEST SUB PUSH2 0x330 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x342 DUP3 PUSH2 0x320 JUMP JUMPDEST JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x350 DUP2 PUSH2 0x344 JUMP JUMPDEST SUB PUSH2 0x357 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x369 DUP3 PUSH2 0x347 JUMP JUMPDEST JUMP JUMPDEST SWAP1 SWAP2 PUSH2 0x120 DUP3 DUP5 SUB SLT PUSH2 0x43F JUMPI PUSH2 0x385 DUP4 PUSH1 0x0 DUP5 ADD PUSH2 0xD4 JUMP JUMPDEST SWAP3 PUSH2 0x393 DUP2 PUSH1 0x20 DUP6 ADD PUSH2 0xD4 JUMP JUMPDEST SWAP3 PUSH1 0x40 DUP2 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x43A JUMPI DUP3 PUSH2 0x3B4 SWAP2 DUP4 ADD PUSH2 0x2EC JUMP JUMPDEST SWAP3 PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x435 JUMPI DUP4 PUSH2 0x3D5 SWAP2 DUP5 ADD PUSH2 0x2EC JUMP JUMPDEST SWAP3 PUSH1 0x80 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x430 JUMPI DUP2 PUSH2 0x3F6 SWAP2 DUP6 ADD PUSH2 0x2EC JUMP JUMPDEST SWAP3 PUSH2 0x404 DUP3 PUSH1 0xA0 DUP4 ADD PUSH2 0xD4 JUMP JUMPDEST SWAP3 PUSH2 0x42D PUSH2 0x415 DUP5 PUSH1 0xC0 DUP6 ADD PUSH2 0x335 JUMP JUMPDEST SWAP4 PUSH2 0x423 DUP2 PUSH1 0xE0 DUP7 ADD PUSH2 0xD4 JUMP JUMPDEST SWAP4 PUSH2 0x100 ADD PUSH2 0x35C JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xA3 JUMP JUMPDEST PUSH2 0xA3 JUMP JUMPDEST PUSH2 0xA3 JUMP JUMPDEST PUSH2 0x9E JUMP JUMPDEST PUSH2 0x44D SWAP1 PUSH2 0xB3 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x465 SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0x444 JUMP JUMPDEST JUMP JUMPDEST CALLVALUE PUSH2 0x4A1 JUMPI PUSH2 0x49D PUSH2 0x48C PUSH2 0x47D CALLDATASIZE PUSH1 0x4 PUSH2 0x36B JUMP JUMPDEST SWAP8 SWAP7 SWAP1 SWAP7 SWAP6 SWAP2 SWAP6 SWAP5 SWAP3 SWAP5 PUSH2 0x7EE JUMP JUMPDEST PUSH2 0x494 PUSH2 0x93 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x451 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x99 JUMP JUMPDEST CALLVALUE PUSH2 0x4D4 JUMPI PUSH2 0x4B6 CALLDATASIZE PUSH1 0x4 PUSH2 0x13B JUMP JUMPDEST PUSH2 0x4BE PUSH2 0x985 JUMP JUMPDEST PUSH2 0x4C6 PUSH2 0x93 JUMP JUMPDEST DUP1 PUSH2 0x4D0 DUP2 PUSH2 0x102 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x99 JUMP JUMPDEST CALLVALUE PUSH2 0x509 JUMPI PUSH2 0x4E9 CALLDATASIZE PUSH1 0x4 PUSH2 0x13B JUMP JUMPDEST PUSH2 0x505 PUSH2 0x4F4 PUSH2 0x9BB JUMP JUMPDEST PUSH2 0x4FC PUSH2 0x93 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x451 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x99 JUMP JUMPDEST CALLVALUE PUSH2 0x548 JUMPI PUSH2 0x544 PUSH2 0x533 PUSH2 0x524 CALLDATASIZE PUSH1 0x4 PUSH2 0x36B JUMP JUMPDEST SWAP8 SWAP7 SWAP1 SWAP7 SWAP6 SWAP2 SWAP6 SWAP5 SWAP3 SWAP5 PUSH2 0x9D1 JUMP JUMPDEST PUSH2 0x53B PUSH2 0x93 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x451 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x99 JUMP JUMPDEST CALLVALUE PUSH2 0x57B JUMPI PUSH2 0x565 PUSH2 0x560 CALLDATASIZE PUSH1 0x4 PUSH2 0xE3 JUMP JUMPDEST PUSH2 0xB2A JUMP JUMPDEST PUSH2 0x56D PUSH2 0x93 JUMP JUMPDEST DUP1 PUSH2 0x577 DUP2 PUSH2 0x102 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x99 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x596 SWAP1 PUSH2 0x591 PUSH2 0xBB8 JUMP JUMPDEST PUSH2 0x5EB JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 SHR SWAP1 JUMP JUMPDEST PUSH2 0x5AA PUSH2 0x5AF SWAP2 PUSH2 0x598 JUMP JUMPDEST PUSH2 0x14F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x5BC SWAP1 SLOAD PUSH2 0x59E JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0xE0 SHL SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP2 SUB SLT PUSH2 0x5D5 JUMPI JUMP JUMPDEST PUSH2 0x9E JUMP JUMPDEST PUSH2 0x5E2 PUSH2 0x93 JUMP JUMPDEST RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH2 0x5FD PUSH2 0x5F8 PUSH1 0x1 PUSH2 0x5B2 JUMP JUMPDEST PUSH2 0x1BB JUMP JUMPDEST SWAP1 PUSH4 0x3659CFE6 SWAP1 DUP3 EXTCODESIZE ISZERO PUSH2 0x679 JUMPI PUSH2 0x635 SWAP3 PUSH2 0x62A PUSH1 0x0 DUP1 SWAP5 PUSH2 0x61E PUSH2 0x93 JUMP JUMPDEST SWAP7 DUP8 SWAP6 DUP7 SWAP5 DUP6 SWAP4 PUSH2 0x5C4 JUMP JUMPDEST DUP4 MSTORE PUSH1 0x4 DUP4 ADD PUSH2 0x451 JUMP JUMPDEST SUB SWAP3 GAS CALL DUP1 ISZERO PUSH2 0x674 JUMPI PUSH2 0x647 JUMPI JUMPDEST POP JUMP JUMPDEST PUSH2 0x667 SWAP1 PUSH1 0x0 RETURNDATASIZE DUP2 GT PUSH2 0x66D JUMPI JUMPDEST PUSH2 0x65F DUP2 DUP4 PUSH2 0x249 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x5CA JUMP JUMPDEST CODESIZE PUSH2 0x644 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x655 JUMP JUMPDEST PUSH2 0x5DA JUMP JUMPDEST PUSH2 0x5BF JUMP JUMPDEST PUSH2 0x687 SWAP1 PUSH2 0x585 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x6AF JUMPI POP POP SWAP1 PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP1 PUSH1 0x20 SWAP2 DUP4 ADD MLOAD DUP2 DUP6 ADD MSTORE ADD PUSH2 0x69E JUMP JUMPDEST PUSH2 0x6DF PUSH2 0x6E8 PUSH1 0x20 SWAP4 PUSH2 0x6ED SWAP4 PUSH2 0x6D6 DUP2 PUSH2 0x68E JUMP JUMPDEST SWAP4 DUP5 DUP1 SWAP4 PUSH2 0x692 JUMP JUMPDEST SWAP6 DUP7 SWAP2 ADD PUSH2 0x69B JUMP JUMPDEST PUSH2 0x229 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x6FA SWAP1 PUSH2 0x30F JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST PUSH2 0x707 SWAP1 PUSH2 0x344 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP4 SWAP6 PUSH2 0x774 PUSH2 0x769 PUSH1 0xE0 SWAP8 SWAP12 SWAP11 SWAP9 PUSH2 0x75B PUSH2 0x788 SWAP8 PUSH2 0x74D DUP11 PUSH2 0x78F SWAP15 SWAP10 PUSH2 0x73F PUSH2 0x77E SWAP11 PUSH1 0x0 PUSH2 0x100 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0x444 JUMP JUMPDEST DUP13 PUSH1 0x20 DUP2 DUP5 SUB SWAP2 ADD MSTORE PUSH2 0x6C0 JUMP JUMPDEST SWAP1 DUP11 DUP3 SUB PUSH1 0x40 DUP13 ADD MSTORE PUSH2 0x6C0 JUMP JUMPDEST SWAP1 DUP9 DUP3 SUB PUSH1 0x60 DUP11 ADD MSTORE PUSH2 0x6C0 JUMP JUMPDEST SWAP11 PUSH1 0x80 DUP8 ADD SWAP1 PUSH2 0x444 JUMP JUMPDEST PUSH1 0xA0 DUP6 ADD SWAP1 PUSH2 0x6F1 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD SWAP1 PUSH2 0x444 JUMP JUMPDEST ADD SWAP1 PUSH2 0x6FE JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x7AD PUSH2 0x7A8 DUP4 PUSH2 0x287 JUMP JUMPDEST PUSH2 0x272 JUMP JUMPDEST SWAP2 DUP3 MSTORE JUMP JUMPDEST PUSH2 0x7BC PUSH1 0x0 PUSH2 0x79B JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x7C7 PUSH2 0x7B2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x7D3 SWAP1 PUSH2 0x193 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x7DF SWAP1 PUSH2 0x7CA JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x7EB SWAP1 PUSH2 0x1AF JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x85E SWAP1 SWAP9 SWAP5 SWAP9 SWAP8 SWAP7 SWAP4 SWAP8 SWAP6 SWAP3 SWAP6 PUSH2 0x804 PUSH2 0x689 JUMP JUMPDEST POP DUP9 PUSH2 0x83C DUP5 PUSH2 0x82D DUP14 DUP11 DUP14 DUP14 SWAP7 SWAP3 DUP12 SWAP1 DUP14 SWAP3 SWAP4 SWAP5 PUSH2 0x821 PUSH2 0x93 JUMP JUMPDEST SWAP10 DUP11 SWAP9 PUSH1 0x20 DUP11 ADD PUSH2 0x70B JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE SUB DUP3 PUSH2 0x249 JUMP JUMPDEST PUSH2 0x84E PUSH2 0x848 DUP3 PUSH2 0x797 JUMP JUMPDEST SWAP2 PUSH2 0x791 JUMP JUMPDEST KECCAK256 SWAP1 PUSH2 0x858 PUSH2 0x7BF JUMP JUMPDEST SWAP2 PUSH2 0xD5D JUMP JUMPDEST SWAP8 PUSH2 0x870 PUSH2 0x86B DUP11 PUSH2 0x7D6 JUMP JUMPDEST PUSH2 0x7E2 JUMP JUMPDEST SWAP5 PUSH4 0x8FF83AC1 SWAP3 SWAP7 SWAP9 SWAP2 SWAP4 SWAP5 SWAP8 DUP7 EXTCODESIZE ISZERO PUSH2 0x92F JUMPI PUSH1 0x0 SWAP9 PUSH2 0x8A5 SWAP7 DUP11 SWAP7 PUSH2 0x8B0 SWAP6 PUSH2 0x899 PUSH2 0x93 JUMP JUMPDEST SWAP14 DUP15 SWAP13 DUP14 SWAP12 DUP13 SWAP11 PUSH2 0x5C4 JUMP JUMPDEST DUP11 MSTORE PUSH1 0x4 DUP11 ADD PUSH2 0x70B JUMP JUMPDEST SUB SWAP3 GAS CALL DUP1 ISZERO PUSH2 0x92A JUMPI PUSH2 0x8FD JUMPI JUMPDEST POP DUP1 PUSH2 0x8F7 PUSH32 0xE3049EE698743DAC343B02BFE6B441269CA8B5F5DD610B74D96C1C02034EE566 SWAP2 PUSH2 0x8EE PUSH2 0x93 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x451 JUMP JUMPDEST SUB SWAP1 LOG1 SWAP1 JUMP JUMPDEST PUSH2 0x91D SWAP1 PUSH1 0x0 RETURNDATASIZE DUP2 GT PUSH2 0x923 JUMPI JUMPDEST PUSH2 0x915 DUP2 DUP4 PUSH2 0x249 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x5CA JUMP JUMPDEST CODESIZE PUSH2 0x8BF JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x90B JUMP JUMPDEST PUSH2 0x5DA JUMP JUMPDEST PUSH2 0x5BF JUMP JUMPDEST PUSH2 0x93C PUSH2 0xBB8 JUMP JUMPDEST PUSH2 0x944 PUSH2 0x971 JUMP JUMPDEST JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x95D PUSH2 0x958 PUSH2 0x962 SWAP3 PUSH2 0x946 JUMP JUMPDEST PUSH2 0x190 JUMP JUMPDEST PUSH2 0xA8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x96E SWAP1 PUSH2 0x949 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x983 PUSH2 0x97E PUSH1 0x0 PUSH2 0x965 JUMP JUMPDEST PUSH2 0xEEC JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x98D PUSH2 0x934 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x9A6 PUSH2 0x9AB SWAP2 PUSH2 0x598 JUMP JUMPDEST PUSH2 0x98F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x9B8 SWAP1 SLOAD PUSH2 0x99A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x9C3 PUSH2 0x689 JUMP JUMPDEST POP PUSH2 0x9CE PUSH1 0x0 PUSH2 0x9AE JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP7 PUSH2 0xA08 SWAP4 SWAP7 PUSH2 0xA17 SWAP7 PUSH2 0xA39 SWAP11 SWAP4 SWAP7 SWAP5 SWAP7 PUSH2 0x9EB PUSH2 0x689 JUMP JUMPDEST POP SWAP7 SWAP9 SWAP5 SWAP1 SWAP2 SWAP3 SWAP4 SWAP5 PUSH2 0x9FC PUSH2 0x93 JUMP JUMPDEST SWAP10 DUP11 SWAP9 PUSH1 0x20 DUP11 ADD PUSH2 0x70B JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE SUB DUP3 PUSH2 0x249 JUMP JUMPDEST PUSH2 0xA29 PUSH2 0xA23 DUP3 PUSH2 0x797 JUMP JUMPDEST SWAP2 PUSH2 0x791 JUMP JUMPDEST KECCAK256 SWAP1 PUSH2 0xA33 PUSH2 0x7BF JUMP JUMPDEST SWAP2 PUSH2 0xF4D JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xA4D SWAP1 PUSH2 0xA48 PUSH2 0xBB8 JUMP JUMPDEST PUSH2 0xAF9 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x20 PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xAAA PUSH1 0x26 PUSH1 0x40 SWAP3 PUSH2 0x692 JUMP JUMPDEST PUSH2 0xAB3 DUP2 PUSH2 0xA4F JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0xACD SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0xA9D JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0xAD7 JUMPI JUMP JUMPDEST PUSH2 0xADF PUSH2 0x93 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0xAF5 PUSH1 0x4 DUP3 ADD PUSH2 0xAB7 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0xB28 SWAP1 PUSH2 0xB23 DUP2 PUSH2 0xB1C PUSH2 0xB16 PUSH2 0xB11 PUSH1 0x0 PUSH2 0x965 JUMP JUMPDEST PUSH2 0xB3 JUMP JUMPDEST SWAP2 PUSH2 0xB3 JUMP JUMPDEST EQ ISZERO PUSH2 0xAD0 JUMP JUMPDEST PUSH2 0xEEC JUMP JUMPDEST JUMP JUMPDEST PUSH2 0xB33 SWAP1 PUSH2 0xA3C JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0xB69 PUSH1 0x20 DUP1 SWAP3 PUSH2 0x692 JUMP JUMPDEST PUSH2 0xB72 DUP2 PUSH2 0xB35 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0xB8C SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0xB5D JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0xB96 JUMPI JUMP JUMPDEST PUSH2 0xB9E PUSH2 0x93 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0xBB4 PUSH1 0x4 DUP3 ADD PUSH2 0xB76 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0xBE2 PUSH2 0xBC3 PUSH2 0x9BB JUMP JUMPDEST PUSH2 0xBDC PUSH2 0xBD6 PUSH2 0xBD1 PUSH2 0xFE3 JUMP JUMPDEST PUSH2 0xB3 JUMP JUMPDEST SWAP2 PUSH2 0xB3 JUMP JUMPDEST EQ PUSH2 0xB8F JUMP JUMPDEST JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xBF3 PUSH2 0xBF8 SWAP2 PUSH2 0x344 JUMP JUMPDEST PUSH2 0xBE4 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x60 SHL SWAP1 JUMP JUMPDEST PUSH2 0xC0B SWAP1 PUSH2 0xBFC JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xC17 SWAP1 PUSH2 0xC02 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xC26 PUSH2 0xC2B SWAP2 PUSH2 0xB3 JUMP JUMPDEST PUSH2 0xC0E JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0xC59 PUSH2 0xC50 SWAP3 PUSH1 0x20 SWAP3 PUSH2 0xC47 DUP2 PUSH2 0x797 JUMP JUMPDEST SWAP5 DUP6 DUP1 SWAP4 PUSH2 0xC2F JUMP JUMPDEST SWAP4 DUP5 SWAP2 ADD PUSH2 0x69B JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH1 0x14 DUP1 SWAP4 PUSH2 0xC81 PUSH1 0x20 DUP5 PUSH2 0xC79 PUSH2 0xC89 SWAP7 PUSH2 0xC90 SWAP12 SWAP11 SWAP9 PUSH2 0xBE7 JUMP JUMPDEST ADD DUP1 SWAP3 PUSH2 0xC1A JUMP JUMPDEST ADD DUP1 SWAP3 PUSH2 0xC1A JUMP JUMPDEST ADD SWAP1 PUSH2 0xC34 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xCAA PUSH2 0xCA5 PUSH2 0xCAF SWAP3 PUSH2 0x946 JUMP JUMPDEST PUSH2 0x190 JUMP JUMPDEST PUSH2 0xC93 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xCBB SWAP1 PUSH2 0x193 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xCC7 SWAP1 PUSH2 0xCB2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xCD3 SWAP1 PUSH2 0x193 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xCDF SWAP1 PUSH2 0xCCA JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xCEB SWAP1 PUSH2 0x1AF JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH2 0xD16 PUSH2 0xD1F PUSH1 0x20 SWAP4 PUSH2 0xD24 SWAP4 PUSH2 0xD0D DUP2 PUSH2 0x797 JUMP JUMPDEST SWAP4 DUP5 DUP1 SWAP4 PUSH2 0xCEE JUMP JUMPDEST SWAP6 DUP7 SWAP2 ADD PUSH2 0x69B JUMP JUMPDEST PUSH2 0x229 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0xD4D PUSH2 0xD5A SWAP5 SWAP3 SWAP4 PUSH2 0xD43 PUSH1 0x60 DUP5 ADD SWAP6 PUSH1 0x0 DUP6 ADD SWAP1 PUSH2 0x444 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x444 JUMP JUMPDEST PUSH1 0x40 DUP2 DUP5 SUB SWAP2 ADD MSTORE PUSH2 0xCF7 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xDED SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH2 0xD6D PUSH2 0x689 JUMP JUMPDEST POP PUSH2 0xDAD DUP6 SWAP2 PUSH2 0xD9E PUSH2 0xD88 PUSH2 0xD83 PUSH1 0x1 PUSH2 0x5B2 JUMP JUMPDEST PUSH2 0x1BB JUMP JUMPDEST DUP7 SWAP1 PUSH2 0xD92 PUSH2 0x93 JUMP JUMPDEST SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 ADD PUSH2 0xC5D JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE SUB DUP3 PUSH2 0x249 JUMP JUMPDEST PUSH2 0xDBF PUSH2 0xDB9 DUP3 PUSH2 0x797 JUMP JUMPDEST SWAP2 PUSH2 0x791 JUMP JUMPDEST KECCAK256 PUSH2 0x148A PUSH2 0xDCF PUSH1 0x20 DUP3 ADD PUSH2 0x272 JUMP JUMPDEST SWAP1 DUP1 DUP3 MSTORE PUSH2 0x125B PUSH1 0x20 DUP4 ADD CODECOPY PUSH2 0xDE8 PUSH1 0x0 SWAP3 SWAP2 SWAP3 PUSH2 0xC96 JUMP JUMPDEST PUSH2 0x1187 JUMP JUMPDEST SWAP3 PUSH2 0xE07 PUSH2 0xE02 PUSH2 0xDFD DUP7 PUSH2 0xCBE JUMP JUMPDEST PUSH2 0xCD6 JUMP JUMPDEST PUSH2 0xCE2 JUMP JUMPDEST PUSH4 0xCF7A1D77 SWAP2 SWAP1 PUSH2 0xE20 PUSH2 0xE1B PUSH1 0x1 PUSH2 0x5B2 JUMP JUMPDEST PUSH2 0x1BB JUMP JUMPDEST SWAP4 SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0xE97 JUMPI PUSH1 0x0 PUSH2 0xE48 SWAP2 PUSH2 0xE53 DUP3 SWAP7 PUSH2 0xE3C PUSH2 0x93 JUMP JUMPDEST SWAP9 DUP10 SWAP8 DUP9 SWAP7 DUP8 SWAP6 PUSH2 0x5C4 JUMP JUMPDEST DUP6 MSTORE PUSH1 0x4 DUP6 ADD PUSH2 0xD28 JUMP JUMPDEST SUB SWAP3 GAS CALL DUP1 ISZERO PUSH2 0xE92 JUMPI PUSH2 0xE65 JUMPI JUMPDEST POP JUMP JUMPDEST PUSH2 0xE85 SWAP1 PUSH1 0x0 RETURNDATASIZE DUP2 GT PUSH2 0xE8B JUMPI JUMPDEST PUSH2 0xE7D DUP2 DUP4 PUSH2 0x249 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x5CA JUMP JUMPDEST CODESIZE PUSH2 0xE62 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xE73 JUMP JUMPDEST PUSH2 0x5DA JUMP JUMPDEST PUSH2 0x5BF JUMP JUMPDEST PUSH1 0x0 SHL SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0xEB3 PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB SWAP2 PUSH2 0xE9C JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST PUSH2 0xEC6 SWAP1 PUSH2 0x1AF JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0xEE1 PUSH2 0xEDC PUSH2 0xEE8 SWAP3 PUSH2 0xEBD JUMP JUMPDEST PUSH2 0xEC9 JUMP JUMPDEST DUP3 SLOAD PUSH2 0xEA2 JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH2 0xEF6 PUSH1 0x0 PUSH2 0x9AE JUMP JUMPDEST PUSH2 0xF01 DUP3 PUSH1 0x0 PUSH2 0xECC JUMP JUMPDEST SWAP1 PUSH2 0xF35 PUSH2 0xF2F PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP4 PUSH2 0xEBD JUMP JUMPDEST SWAP2 PUSH2 0xEBD JUMP JUMPDEST SWAP2 PUSH2 0xF3E PUSH2 0x93 JUMP JUMPDEST DUP1 PUSH2 0xF48 DUP2 PUSH2 0x102 JUMP JUMPDEST SUB SWAP1 LOG3 JUMP JUMPDEST PUSH2 0xFE0 SWAP3 SWAP2 PUSH2 0xF8A PUSH2 0xF99 SWAP3 PUSH2 0xF61 PUSH2 0x689 JUMP JUMPDEST POP SWAP2 SWAP4 PUSH2 0xF76 PUSH2 0xF71 PUSH1 0x1 PUSH2 0x5B2 JUMP JUMPDEST PUSH2 0x1BB JUMP JUMPDEST PUSH2 0xF7E PUSH2 0x93 JUMP JUMPDEST SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 ADD PUSH2 0xC5D JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE SUB DUP3 PUSH2 0x249 JUMP JUMPDEST PUSH2 0xFAB PUSH2 0xFA5 DUP3 PUSH2 0x797 JUMP JUMPDEST SWAP2 PUSH2 0x791 JUMP JUMPDEST KECCAK256 PUSH2 0x148A PUSH2 0xFBB PUSH1 0x20 DUP3 ADD PUSH2 0x272 JUMP JUMPDEST SWAP1 DUP1 DUP3 MSTORE PUSH2 0x125B PUSH1 0x20 DUP4 ADD CODECOPY PUSH2 0xFD9 PUSH2 0xFD3 DUP3 PUSH2 0x797 JUMP JUMPDEST SWAP2 PUSH2 0x791 JUMP JUMPDEST KECCAK256 SWAP1 PUSH2 0x1210 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xFEB PUSH2 0x689 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST PUSH2 0xFF9 SWAP1 PUSH2 0x1AF JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x437265617465323A20696E73756666696369656E742062616C616E6365000000 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x1031 PUSH1 0x1D PUSH1 0x20 SWAP3 PUSH2 0x692 JUMP JUMPDEST PUSH2 0x103A DUP2 PUSH2 0xFFC JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x1054 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x1024 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x105E JUMPI JUMP JUMPDEST PUSH2 0x1066 PUSH2 0x93 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x107C PUSH1 0x4 DUP3 ADD PUSH2 0x103E JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH32 0x437265617465323A2062797465636F6465206C656E677468206973207A65726F SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x10B4 PUSH1 0x20 DUP1 SWAP3 PUSH2 0x692 JUMP JUMPDEST PUSH2 0x10BD DUP2 PUSH2 0x1080 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x10D7 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x10A8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x10E1 JUMPI JUMP JUMPDEST PUSH2 0x10E9 PUSH2 0x93 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x10FF PUSH1 0x4 DUP3 ADD PUSH2 0x10C1 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH32 0x437265617465323A204661696C6564206F6E206465706C6F7900000000000000 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x1138 PUSH1 0x19 PUSH1 0x20 SWAP3 PUSH2 0x692 JUMP JUMPDEST PUSH2 0x1141 DUP2 PUSH2 0x1103 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x115B SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x112B JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x1165 JUMPI JUMP JUMPDEST PUSH2 0x116D PUSH2 0x93 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x1183 PUSH1 0x4 DUP3 ADD PUSH2 0x1145 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP2 SWAP1 SWAP2 PUSH2 0x1192 PUSH2 0x689 JUMP JUMPDEST POP PUSH2 0x11B9 PUSH2 0x119F ADDRESS PUSH2 0xFF0 JUMP JUMPDEST BALANCE PUSH2 0x11B2 PUSH2 0x11AC DUP5 PUSH2 0xC93 JUMP JUMPDEST SWAP2 PUSH2 0xC93 JUMP JUMPDEST LT ISZERO PUSH2 0x1057 JUMP JUMPDEST PUSH2 0x11DF PUSH2 0x11C5 DUP4 PUSH2 0x797 JUMP JUMPDEST PUSH2 0x11D8 PUSH2 0x11D2 PUSH1 0x0 PUSH2 0xC96 JUMP JUMPDEST SWAP2 PUSH2 0xC93 JUMP JUMPDEST EQ ISZERO PUSH2 0x10DA JUMP JUMPDEST PUSH1 0x20 DUP3 MLOAD SWAP3 ADD SWAP1 CREATE2 SWAP1 PUSH2 0x120E DUP3 PUSH2 0x1207 PUSH2 0x1201 PUSH2 0x11FC PUSH1 0x0 PUSH2 0x965 JUMP JUMPDEST PUSH2 0xB3 JUMP JUMPDEST SWAP2 PUSH2 0xB3 JUMP JUMPDEST EQ ISZERO PUSH2 0x115E JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x122E SWAP2 PUSH2 0x121D PUSH2 0x689 JUMP JUMPDEST POP SWAP1 PUSH2 0x1228 ADDRESS PUSH2 0xFF0 JUMP JUMPDEST SWAP2 PUSH2 0x1231 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x55 SWAP3 PUSH1 0xB SWAP3 PUSH2 0x1240 PUSH2 0x689 JUMP JUMPDEST POP PUSH1 0x40 MLOAD SWAP3 PUSH1 0x40 DUP5 ADD MSTORE PUSH1 0x20 DUP4 ADD MSTORE DUP2 MSTORE ADD PUSH1 0xFF DUP2 MSTORE8 KECCAK256 SWAP1 JUMP INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x1C JUMPI PUSH1 0xE PUSH1 0x20 JUMP JUMPDEST PUSH2 0x145E PUSH2 0x2C DUP3 CODECOPY PUSH2 0x145E SWAP1 RETURN JUMPDEST PUSH1 0x26 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLDATASIZE ISZERO PUSH2 0x6B JUMPI PUSH2 0x6B JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x34 PUSH2 0x2F PUSH2 0x39 SWAP3 PUSH2 0xF JUMP JUMPDEST PUSH2 0x1D JUMP JUMPDEST PUSH2 0x12 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x45 SWAP1 PUSH2 0x20 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x51 SWAP1 PUSH2 0x12 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x60 SWAP1 JUMP JUMPDEST PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL AND SWAP1 JUMP JUMPDEST PUSH1 0x0 ADD SWAP1 JUMP JUMPDEST PUSH2 0x73 PUSH2 0x17E JUMP JUMPDEST PUSH2 0x8E PUSH2 0x88 PUSH2 0x83 PUSH1 0x0 PUSH2 0x3C JUMP JUMPDEST PUSH2 0x48 JUMP JUMPDEST SWAP2 PUSH2 0x48 JUMP JUMPDEST SUB PUSH2 0x46C JUMPI PUSH2 0x9B PUSH2 0x54 JUMP JUMPDEST POP PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL PUSH1 0x0 CALLDATALOAD AND PUSH2 0xC1 PUSH2 0xBB PUSH4 0xCF7A1D77 PUSH1 0xE0 SHL PUSH2 0x59 JUMP JUMPDEST SWAP2 PUSH2 0x59 JUMP JUMPDEST EQ PUSH2 0xE3 JUMPI PUSH1 0x0 PUSH4 0xF92EE8A9 PUSH1 0xE0 SHL DUP2 MSTORE DUP1 PUSH2 0xDF PUSH1 0x4 DUP3 ADD PUSH2 0x65 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0xEB PUSH2 0x401 JUMP JUMPDEST PUSH1 0x20 DUP2 MLOAD SWAP2 ADD RETURN JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SHL SWAP1 JUMP JUMPDEST PUSH2 0x118 PUSH2 0x113 PUSH2 0x11D SWAP3 PUSH2 0xF8 JUMP JUMPDEST PUSH2 0xFE JUMP JUMPDEST PUSH2 0xFB JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x149 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 PUSH2 0x104 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SHR SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x169 PUSH2 0x16E SWAP2 PUSH2 0x14C JUMP JUMPDEST PUSH2 0x152 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x17B SWAP1 SLOAD PUSH2 0x15D JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x186 PUSH2 0xF3 JUMP JUMPDEST POP PUSH2 0x1A2 PUSH1 0x0 PUSH2 0x19C PUSH2 0x197 PUSH2 0x120 JUMP JUMPDEST PUSH2 0x5A2 JUMP JUMPDEST ADD PUSH2 0x171 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1BF PUSH2 0x1BA PUSH2 0x1C4 SWAP3 PUSH2 0x1A5 JUMP JUMPDEST PUSH2 0x1D JUMP JUMPDEST PUSH2 0x1A8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP4 SWAP3 SWAP4 DUP5 DUP4 GT PUSH2 0x1F7 JUMPI DUP5 GT PUSH2 0x1F2 JUMPI PUSH1 0x1 DUP3 MUL ADD SWAP3 SUB SWAP1 JUMP JUMPDEST PUSH2 0x1D2 JUMP JUMPDEST PUSH2 0x1CD JUMP JUMPDEST SWAP2 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x212 SWAP1 PUSH2 0x12 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x21E DUP2 PUSH2 0x209 JUMP JUMPDEST SUB PUSH2 0x225 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x237 DUP3 PUSH2 0x215 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1F DUP1 NOT SWAP2 ADD AND SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH2 0x26D SWAP1 PUSH2 0x243 JUMP JUMPDEST DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x287 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH2 0x24D JUMP JUMPDEST SWAP1 PUSH2 0x29F PUSH2 0x298 PUSH2 0x1C7 JUMP JUMPDEST SWAP3 DUP4 PUSH2 0x263 JUMP JUMPDEST JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BF JUMPI PUSH2 0x2BB PUSH1 0x20 SWAP2 PUSH2 0x243 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x24D JUMP JUMPDEST SWAP1 DUP3 PUSH1 0x0 SWAP4 SWAP3 DUP3 CALLDATACOPY ADD MSTORE JUMP JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x2E5 PUSH2 0x2E0 DUP3 PUSH2 0x2A1 JUMP JUMPDEST PUSH2 0x28C JUMP JUMPDEST SWAP4 DUP2 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP1 DUP3 DUP5 ADD GT PUSH2 0x301 JUMPI PUSH2 0x2FF SWAP3 PUSH2 0x2C4 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x23E JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x324 JUMPI DUP2 PUSH1 0x20 PUSH2 0x321 SWAP4 CALLDATALOAD SWAP2 ADD PUSH2 0x2D0 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x239 JUMP JUMPDEST SWAP2 PUSH1 0x60 DUP4 DUP4 SUB SLT PUSH2 0x376 JUMPI PUSH2 0x341 DUP3 PUSH1 0x0 DUP6 ADD PUSH2 0x22A JUMP JUMPDEST SWAP3 PUSH2 0x34F DUP4 PUSH1 0x20 DUP4 ADD PUSH2 0x22A JUMP JUMPDEST SWAP3 PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x371 JUMPI PUSH2 0x36E SWAP3 ADD PUSH2 0x306 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x204 JUMP JUMPDEST PUSH2 0x1FF JUMP JUMPDEST PUSH2 0x38F PUSH2 0x38A PUSH2 0x394 SWAP3 PUSH2 0x12 JUMP JUMPDEST PUSH2 0x1D JUMP JUMPDEST PUSH2 0x12 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3A0 SWAP1 PUSH2 0x37B JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3AC SWAP1 PUSH2 0x397 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3CD JUMPI PUSH2 0x3C9 PUSH1 0x20 SWAP2 PUSH2 0x243 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x24D JUMP JUMPDEST SWAP1 PUSH2 0x3E4 PUSH2 0x3DF DUP4 PUSH2 0x3AF JUMP JUMPDEST PUSH2 0x28C JUMP JUMPDEST SWAP2 DUP3 MSTORE JUMP JUMPDEST PUSH2 0x3F3 PUSH1 0x0 PUSH2 0x3D2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3FE PUSH2 0x3E9 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x409 PUSH2 0x54 JUMP JUMPDEST POP PUSH2 0x412 PUSH2 0x5CD JUMP JUMPDEST PUSH2 0x461 PUSH2 0x457 PUSH2 0x451 PUSH2 0x447 PUSH2 0x43F PUSH2 0x439 PUSH1 0x0 CALLDATASIZE PUSH2 0x431 PUSH1 0x4 PUSH2 0x1AB JUMP JUMPDEST SWAP1 DUP1 SWAP3 PUSH2 0x1D7 JUMP JUMPDEST SWAP1 PUSH2 0x1FC JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x329 JUMP JUMPDEST SWAP4 SWAP2 SWAP3 SWAP1 SWAP3 PUSH2 0x3A3 JUMP JUMPDEST SWAP2 PUSH2 0x3A3 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 SWAP1 SWAP2 PUSH2 0x5EC JUMP JUMPDEST PUSH2 0x469 PUSH2 0x3F6 JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLER PUSH2 0x486 PUSH2 0x480 PUSH2 0x47B PUSH2 0x17E JUMP JUMPDEST PUSH2 0x48 JUMP JUMPDEST SWAP2 PUSH2 0x48 JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0x59D JUMPI PUSH2 0x496 PUSH2 0x54 JUMP JUMPDEST POP PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL PUSH1 0x0 CALLDATALOAD AND DUP1 PUSH2 0x4BD PUSH2 0x4B7 PUSH4 0x1B2CE7F3 PUSH1 0xE1 SHL PUSH2 0x59 JUMP JUMPDEST SWAP2 PUSH2 0x59 JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0x4D7 JUMPI POP PUSH2 0x4CE PUSH2 0x817 JUMP JUMPDEST JUMPDEST PUSH1 0x20 DUP2 MLOAD SWAP2 ADD RETURN JUMPDEST DUP1 PUSH2 0x4F1 PUSH2 0x4EB PUSH4 0x278F7943 PUSH1 0xE1 SHL PUSH2 0x59 JUMP JUMPDEST SWAP2 PUSH2 0x59 JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0x508 JUMPI POP PUSH2 0x502 PUSH2 0x7C1 JUMP JUMPDEST JUMPDEST PUSH2 0x4CF JUMP JUMPDEST DUP1 PUSH2 0x522 PUSH2 0x51C PUSH4 0x8F28397 PUSH1 0xE4 SHL PUSH2 0x59 JUMP JUMPDEST SWAP2 PUSH2 0x59 JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0x539 JUMPI POP PUSH2 0x533 PUSH2 0x723 JUMP JUMPDEST JUMPDEST PUSH2 0x503 JUMP JUMPDEST DUP1 PUSH2 0x553 PUSH2 0x54D PUSH4 0x3E14691 PUSH1 0xE6 SHL PUSH2 0x59 JUMP JUMPDEST SWAP2 PUSH2 0x59 JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0x56A JUMPI POP PUSH2 0x564 PUSH2 0x6BF JUMP JUMPDEST JUMPDEST PUSH2 0x534 JUMP JUMPDEST PUSH2 0x583 PUSH2 0x57D PUSH4 0x5C60DA1B PUSH1 0xE0 SHL PUSH2 0x59 JUMP JUMPDEST SWAP2 PUSH2 0x59 JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0x598 JUMPI PUSH2 0x593 PUSH2 0x67A JUMP JUMPDEST PUSH2 0x565 JUMP JUMPDEST PUSH2 0x64A JUMP JUMPDEST PUSH2 0x64A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x5B9 PUSH2 0x5B4 PUSH2 0x5BE SWAP3 PUSH2 0xF JUMP JUMPDEST PUSH2 0x1D JUMP JUMPDEST PUSH2 0x1A8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x5C8 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5EA CALLVALUE PUSH2 0x5E4 PUSH2 0x5DE PUSH1 0x0 PUSH2 0x5A5 JUMP JUMPDEST SWAP2 PUSH2 0x1A8 JUMP JUMPDEST EQ PUSH2 0x5C1 JUMP JUMPDEST JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x5F6 PUSH2 0x87A JUMP JUMPDEST PUSH2 0x611 PUSH2 0x60B PUSH2 0x606 PUSH1 0x0 PUSH2 0x3C JUMP JUMPDEST PUSH2 0x48 JUMP JUMPDEST SWAP2 PUSH2 0x48 JUMP JUMPDEST SUB PUSH2 0x62D JUMPI PUSH2 0x622 PUSH2 0x62B SWAP4 PUSH2 0x8B2 JUMP JUMPDEST SWAP1 PUSH1 0x0 SWAP2 PUSH2 0x98D JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 PUSH4 0xF92EE8A9 PUSH1 0xE0 SHL DUP2 MSTORE DUP1 PUSH2 0x646 PUSH1 0x4 DUP3 ADD PUSH2 0x65 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x652 PUSH2 0xAA6 JUMP JUMPDEST PUSH2 0xAE7 JUMP JUMPDEST PUSH2 0x660 SWAP1 PUSH2 0x48 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x678 SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0x657 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x682 PUSH2 0x54 JUMP JUMPDEST POP PUSH2 0x68B PUSH2 0x5CD JUMP JUMPDEST PUSH2 0x6AD PUSH2 0x6BC PUSH2 0x699 PUSH2 0xAA6 JUMP JUMPDEST PUSH2 0x6A1 PUSH2 0x1C7 JUMP JUMPDEST SWAP3 DUP4 SWAP2 PUSH1 0x20 DUP4 ADD PUSH2 0x664 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE SUB DUP3 PUSH2 0x263 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x6C7 PUSH2 0x54 JUMP JUMPDEST POP PUSH2 0x6D0 PUSH2 0x5CD JUMP JUMPDEST PUSH2 0x6F2 PUSH2 0x701 PUSH2 0x6DE PUSH2 0x17E JUMP JUMPDEST PUSH2 0x6E6 PUSH2 0x1C7 JUMP JUMPDEST SWAP3 DUP4 SWAP2 PUSH1 0x20 DUP4 ADD PUSH2 0x664 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE SUB DUP3 PUSH2 0x263 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x71E JUMPI PUSH2 0x71B SWAP2 PUSH1 0x0 ADD PUSH2 0x22A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1FF JUMP JUMPDEST PUSH2 0x72B PUSH2 0x54 JUMP JUMPDEST POP PUSH2 0x734 PUSH2 0x5CD JUMP JUMPDEST PUSH2 0x770 PUSH2 0x76B PUSH2 0x766 PUSH2 0x75E PUSH2 0x758 PUSH1 0x0 CALLDATASIZE PUSH2 0x750 PUSH1 0x4 PUSH2 0x1AB JUMP JUMPDEST SWAP1 DUP1 SWAP3 PUSH2 0x1D7 JUMP JUMPDEST SWAP1 PUSH2 0x1FC JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x704 JUMP JUMPDEST PUSH2 0x3A3 JUMP JUMPDEST PUSH2 0x8B2 JUMP JUMPDEST PUSH2 0x778 PUSH2 0x3F6 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH1 0x40 DUP2 DUP5 SUB SLT PUSH2 0x7BC JUMPI PUSH2 0x795 DUP4 PUSH1 0x0 DUP4 ADD PUSH2 0x22A JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x7B7 JUMPI PUSH2 0x7B4 SWAP3 ADD PUSH2 0x306 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x204 JUMP JUMPDEST PUSH2 0x1FF JUMP JUMPDEST PUSH2 0x7C9 PUSH2 0x54 JUMP JUMPDEST POP PUSH2 0x80C PUSH2 0x803 PUSH2 0x7FC PUSH2 0x7F4 PUSH2 0x7EE PUSH1 0x0 CALLDATASIZE PUSH2 0x7E6 PUSH1 0x4 PUSH2 0x1AB JUMP JUMPDEST SWAP1 DUP1 SWAP3 PUSH2 0x1D7 JUMP JUMPDEST SWAP1 PUSH2 0x1FC JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x77B JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x3A3 JUMP JUMPDEST SWAP1 PUSH1 0x1 SWAP2 PUSH2 0xB0A JUMP JUMPDEST PUSH2 0x814 PUSH2 0x3F6 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x81F PUSH2 0x54 JUMP JUMPDEST POP PUSH2 0x828 PUSH2 0x5CD JUMP JUMPDEST PUSH2 0x86F PUSH2 0x85F PUSH2 0x85A PUSH2 0x852 PUSH2 0x84C PUSH1 0x0 CALLDATASIZE PUSH2 0x844 PUSH1 0x4 PUSH2 0x1AB JUMP JUMPDEST SWAP1 DUP1 SWAP3 PUSH2 0x1D7 JUMP JUMPDEST SWAP1 PUSH2 0x1FC JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x704 JUMP JUMPDEST PUSH2 0x3A3 JUMP JUMPDEST PUSH2 0x867 PUSH2 0x3F6 JUMP JUMPDEST PUSH1 0x0 SWAP2 PUSH2 0xB0A JUMP JUMPDEST PUSH2 0x877 PUSH2 0x3F6 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x882 PUSH2 0xF3 JUMP JUMPDEST POP PUSH2 0x88B PUSH2 0x17E JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP2 PUSH1 0x20 PUSH2 0x8B0 SWAP3 SWAP5 SWAP4 PUSH2 0x8A9 PUSH1 0x40 DUP3 ADD SWAP7 PUSH1 0x0 DUP4 ADD SWAP1 PUSH2 0x657 JUMP JUMPDEST ADD SWAP1 PUSH2 0x657 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x8FD SWAP1 PUSH2 0x8BE PUSH2 0x17E JUMP JUMPDEST DUP2 PUSH32 0x7E644D79422F17C01E4894B5F4F588D331EBFA28653D42AE832DC59E38C9798F SWAP2 PUSH2 0x8F5 PUSH2 0x8EC PUSH2 0x1C7 JUMP JUMPDEST SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x88E JUMP JUMPDEST SUB SWAP1 LOG1 PUSH2 0xC4D JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x908 SWAP1 PUSH2 0x397 JUMP JUMPDEST SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH2 0x918 SWAP1 PUSH2 0x37B JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x924 SWAP1 PUSH2 0x90F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x930 SWAP1 PUSH2 0x397 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xE0 SHL SWAP1 JUMP JUMPDEST PUSH2 0x942 DUP2 PUSH2 0x48 JUMP JUMPDEST SUB PUSH2 0x949 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP MLOAD SWAP1 PUSH2 0x95B DUP3 PUSH2 0x939 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x977 JUMPI PUSH2 0x974 SWAP2 PUSH1 0x0 ADD PUSH2 0x94E JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1FF JUMP JUMPDEST PUSH2 0x984 PUSH2 0x1C7 JUMP JUMPDEST RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST SWAP2 PUSH2 0x997 DUP4 PUSH2 0xE30 JUMP JUMPDEST DUP3 PUSH2 0x9C2 PUSH32 0x1CF3B03A6CF19FA2BABA4DF148E9DCABEDEA7F8A5C07840E207E5C089BE95D3E SWAP2 PUSH2 0x8FF JUMP JUMPDEST SWAP1 PUSH2 0x9CB PUSH2 0x1C7 JUMP JUMPDEST DUP1 PUSH2 0x9D5 DUP2 PUSH2 0x65 JUMP JUMPDEST SUB SWAP1 LOG2 PUSH2 0x9E1 DUP3 PUSH2 0x90B JUMP JUMPDEST PUSH2 0x9F4 PUSH2 0x9EE PUSH1 0x0 PUSH2 0x5A5 JUMP JUMPDEST SWAP2 PUSH2 0x1A8 JUMP JUMPDEST GT SWAP1 DUP2 ISZERO PUSH2 0xA9E JUMPI JUMPDEST POP PUSH2 0xA07 JUMPI JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x20 PUSH2 0xA1D PUSH2 0xA18 PUSH2 0xA33 SWAP5 PUSH2 0x91B JUMP JUMPDEST PUSH2 0x927 JUMP JUMPDEST PUSH4 0x5C60DA1B SWAP1 PUSH2 0xA2B PUSH2 0x1C7 JUMP JUMPDEST SWAP5 DUP6 SWAP3 PUSH2 0x933 JUMP JUMPDEST DUP3 MSTORE DUP2 DUP1 PUSH2 0xA43 PUSH1 0x4 DUP3 ADD PUSH2 0x65 JUMP JUMPDEST SUB SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xA99 JUMPI PUSH2 0xA61 SWAP3 PUSH1 0x0 SWAP3 PUSH2 0xA69 JUMPI JUMPDEST POP SWAP1 PUSH2 0xF65 JUMP JUMPDEST POP CODESIZE DUP1 PUSH2 0xA03 JUMP JUMPDEST PUSH2 0xA8B SWAP2 SWAP3 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xA92 JUMPI JUMPDEST PUSH2 0xA83 DUP2 DUP4 PUSH2 0x263 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x95D JUMP JUMPDEST SWAP1 CODESIZE PUSH2 0xA5A JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xA79 JUMP JUMPDEST PUSH2 0x97C JUMP JUMPDEST SWAP1 POP CODESIZE PUSH2 0x9FD JUMP JUMPDEST PUSH2 0xAAE PUSH2 0xF3 JUMP JUMPDEST POP PUSH2 0xAB7 PUSH2 0xF85 JUMP JUMPDEST DUP1 PUSH2 0xAD3 PUSH2 0xACD PUSH2 0xAC8 PUSH1 0x0 PUSH2 0x3C JUMP JUMPDEST PUSH2 0x48 JUMP JUMPDEST SWAP2 PUSH2 0x48 JUMP JUMPDEST SUB PUSH2 0xAE4 JUMPI POP PUSH2 0xAE1 PUSH2 0xF99 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP2 CALLDATASIZE DUP3 DUP1 CALLDATACOPY DUP2 CALLDATASIZE SWAP2 GAS DELEGATECALL RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY PUSH1 0x0 EQ PUSH2 0xB05 JUMPI RETURNDATASIZE PUSH1 0x0 RETURN JUMPDEST RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH2 0xB14 DUP4 PUSH2 0x102F JUMP JUMPDEST PUSH2 0xB1D DUP3 PUSH2 0x90B JUMP JUMPDEST PUSH2 0xB30 PUSH2 0xB2A PUSH1 0x0 PUSH2 0x5A5 JUMP JUMPDEST SWAP2 PUSH2 0x1A8 JUMP JUMPDEST GT SWAP1 DUP2 ISZERO PUSH2 0xB54 JUMPI JUMPDEST POP PUSH2 0xB43 JUMPI JUMPDEST POP POP JUMP JUMPDEST PUSH2 0xB4C SWAP2 PUSH2 0xF65 JUMP JUMPDEST POP CODESIZE DUP1 PUSH2 0xB3F JUMP JUMPDEST SWAP1 POP CODESIZE PUSH2 0xB39 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0x455243313936373A206E65772061646D696E20697320746865207A65726F2061 PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xBC0 PUSH1 0x26 PUSH1 0x40 SWAP3 PUSH2 0xB5C JUMP JUMPDEST PUSH2 0xBC9 DUP2 PUSH2 0xB65 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0xBE3 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0xBB3 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0xBED JUMPI JUMP JUMPDEST PUSH2 0xBF5 PUSH2 0x1C7 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0xC0B PUSH1 0x4 DUP3 ADD PUSH2 0xBCD JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP1 PUSH2 0xC20 PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB SWAP2 PUSH2 0xFE JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0xC42 PUSH2 0xC3D PUSH2 0xC49 SWAP3 PUSH2 0x8FF JUMP JUMPDEST PUSH2 0xC2A JUMP JUMPDEST DUP3 SLOAD PUSH2 0xC0F JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH2 0xC8F SWAP1 PUSH2 0xC77 DUP2 PUSH2 0xC70 PUSH2 0xC6A PUSH2 0xC65 PUSH1 0x0 PUSH2 0x3C JUMP JUMPDEST PUSH2 0x48 JUMP JUMPDEST SWAP2 PUSH2 0x48 JUMP JUMPDEST EQ ISZERO PUSH2 0xBE6 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC89 PUSH2 0xC84 PUSH2 0x120 JUMP JUMPDEST PUSH2 0x5A2 JUMP JUMPDEST ADD PUSH2 0xC2D JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x20 PUSH32 0x7472616374000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0x455243313936373A206E657720626561636F6E206973206E6F74206120636F6E PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xCEC PUSH1 0x25 PUSH1 0x40 SWAP3 PUSH2 0xB5C JUMP JUMPDEST PUSH2 0xCF5 DUP2 PUSH2 0xC91 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0xD0F SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0xCDF JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0xD19 JUMPI JUMP JUMPDEST PUSH2 0xD21 PUSH2 0x1C7 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0xD37 PUSH1 0x4 DUP3 ADD PUSH2 0xCF9 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH1 0x20 PUSH32 0x73206E6F74206120636F6E747261637400000000000000000000000000000000 SWAP2 PUSH32 0x455243313936373A20626561636F6E20696D706C656D656E746174696F6E2069 PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xD96 PUSH1 0x30 PUSH1 0x40 SWAP3 PUSH2 0xB5C JUMP JUMPDEST PUSH2 0xD9F DUP2 PUSH2 0xD3B JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0xDB9 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0xD89 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0xDC3 JUMPI JUMP JUMPDEST PUSH2 0xDCB PUSH2 0x1C7 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0xDE1 PUSH1 0x4 DUP3 ADD PUSH2 0xDA3 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xDFC PUSH2 0xDF7 PUSH2 0xE01 SWAP3 PUSH2 0xDE5 JUMP JUMPDEST PUSH2 0xFE JUMP JUMPDEST PUSH2 0xFB JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xE2D PUSH32 0xA3F0AD74E5423AEBFD80D3EF4346578335A9A72AEAEE59FF6CB3582B35133D50 PUSH2 0xDE8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xE6E SWAP1 PUSH2 0xE45 PUSH2 0xE40 DUP3 PUSH2 0x107F JUMP JUMPDEST PUSH2 0xD12 JUMP JUMPDEST PUSH1 0x20 PUSH2 0xE58 PUSH2 0xE53 DUP4 PUSH2 0x91B JUMP JUMPDEST PUSH2 0x927 JUMP JUMPDEST PUSH4 0x5C60DA1B SWAP1 PUSH2 0xE66 PUSH2 0x1C7 JUMP JUMPDEST SWAP5 DUP6 SWAP3 PUSH2 0x933 JUMP JUMPDEST DUP3 MSTORE DUP2 DUP1 PUSH2 0xE7E PUSH1 0x4 DUP3 ADD PUSH2 0x65 JUMP JUMPDEST SUB SWAP2 GAS STATICCALL DUP1 ISZERO PUSH2 0xEEE JUMPI PUSH2 0xEA1 PUSH2 0xEA6 SWAP2 PUSH2 0xEBE SWAP5 PUSH1 0x0 SWAP2 PUSH2 0xEC0 JUMPI JUMPDEST POP PUSH2 0x107F JUMP JUMPDEST PUSH2 0xDBC JUMP JUMPDEST PUSH1 0x0 PUSH2 0xEB8 PUSH2 0xEB3 PUSH2 0xE04 JUMP JUMPDEST PUSH2 0x5A2 JUMP JUMPDEST ADD PUSH2 0xC2D JUMP JUMPDEST JUMP JUMPDEST PUSH2 0xEE1 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xEE7 JUMPI JUMPDEST PUSH2 0xED9 DUP2 DUP4 PUSH2 0x263 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x95D JUMP JUMPDEST CODESIZE PUSH2 0xE9B JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xECF JUMP JUMPDEST PUSH2 0x97C JUMP JUMPDEST PUSH1 0x20 PUSH32 0x206661696C656400000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0x416464726573733A206C6F772D6C6576656C2064656C65676174652063616C6C PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xF4B PUSH1 0x27 PUSH2 0x3D2 JUMP JUMPDEST SWAP1 PUSH2 0xF58 PUSH1 0x20 DUP4 ADD PUSH2 0xEF3 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0xF62 PUSH2 0xF41 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0xF82 SWAP2 PUSH2 0xF72 PUSH2 0x54 JUMP JUMPDEST POP SWAP1 PUSH2 0xF7C PUSH2 0xF5A JUMP JUMPDEST SWAP2 PUSH2 0x10E2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xF8D PUSH2 0xF3 JUMP JUMPDEST POP PUSH2 0xF96 PUSH2 0x1160 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xFA1 PUSH2 0xF3 JUMP JUMPDEST POP PUSH2 0xFD5 PUSH1 0x20 PUSH2 0xFBF PUSH2 0xFBA PUSH2 0xFB5 PUSH2 0x1187 JUMP JUMPDEST PUSH2 0x91B JUMP JUMPDEST PUSH2 0x927 JUMP JUMPDEST PUSH4 0x5C60DA1B SWAP1 PUSH2 0xFCD PUSH2 0x1C7 JUMP JUMPDEST SWAP4 DUP5 SWAP3 PUSH2 0x933 JUMP JUMPDEST DUP3 MSTORE DUP2 DUP1 PUSH2 0xFE5 PUSH1 0x4 DUP3 ADD PUSH2 0x65 JUMP JUMPDEST SUB SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x102A JUMPI PUSH1 0x0 SWAP2 PUSH2 0xFFC JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x101D SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x1023 JUMPI JUMPDEST PUSH2 0x1015 DUP2 DUP4 PUSH2 0x263 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x95D JUMP JUMPDEST CODESIZE PUSH2 0xFF8 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x100B JUMP JUMPDEST PUSH2 0x97C JUMP JUMPDEST PUSH2 0x1038 DUP2 PUSH2 0x1258 JUMP JUMPDEST PUSH2 0x1062 PUSH32 0xBC7CD75A20EE27FD9ADEBAB32041F755214DBC6BFFA90CC0225B39DA2E5C2D3B SWAP2 PUSH2 0x8FF JUMP JUMPDEST SWAP1 PUSH2 0x106B PUSH2 0x1C7 JUMP JUMPDEST DUP1 PUSH2 0x1075 DUP2 PUSH2 0x65 JUMP JUMPDEST SUB SWAP1 LOG2 JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x1087 PUSH2 0x107A JUMP JUMPDEST POP EXTCODESIZE PUSH2 0x109C PUSH2 0x1096 PUSH1 0x0 PUSH2 0x5A5 JUMP JUMPDEST SWAP2 PUSH2 0x1A8 JUMP JUMPDEST GT SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x10B2 PUSH2 0x10AD DUP4 PUSH2 0x2A1 JUMP JUMPDEST PUSH2 0x28C JUMP JUMPDEST SWAP2 DUP3 MSTORE JUMP JUMPDEST RETURNDATASIZE PUSH1 0x0 EQ PUSH2 0x10D4 JUMPI PUSH2 0x10C8 RETURNDATASIZE PUSH2 0x10A0 JUMP JUMPDEST SWAP1 RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST JUMP JUMPDEST PUSH2 0x10DC PUSH2 0x54 JUMP JUMPDEST SWAP1 PUSH2 0x10D2 JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x0 DUP1 PUSH2 0x1112 SWAP5 PUSH2 0x10F3 PUSH2 0x54 JUMP JUMPDEST POP DUP5 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 MLOAD SWAP2 GAS DELEGATECALL SWAP2 PUSH2 0x1108 PUSH2 0x10B7 JUMP JUMPDEST SWAP1 SWAP3 SWAP1 SWAP2 SWAP3 PUSH2 0x130B JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x112C PUSH2 0x1127 PUSH2 0x1131 SWAP3 PUSH2 0x1115 JUMP JUMPDEST PUSH2 0xFE JUMP JUMPDEST PUSH2 0xFB JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x115D PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC PUSH2 0x1118 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1168 PUSH2 0xF3 JUMP JUMPDEST POP PUSH2 0x1184 PUSH1 0x0 PUSH2 0x117E PUSH2 0x1179 PUSH2 0x1134 JUMP JUMPDEST PUSH2 0x5A2 JUMP JUMPDEST ADD PUSH2 0x171 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x118F PUSH2 0xF3 JUMP JUMPDEST POP PUSH2 0x11AB PUSH1 0x0 PUSH2 0x11A5 PUSH2 0x11A0 PUSH2 0xE04 JUMP JUMPDEST PUSH2 0x5A2 JUMP JUMPDEST ADD PUSH2 0x171 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x20 PUSH32 0x6F74206120636F6E747261637400000000000000000000000000000000000000 SWAP2 PUSH32 0x455243313936373A206E657720696D706C656D656E746174696F6E206973206E PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x1209 PUSH1 0x2D PUSH1 0x40 SWAP3 PUSH2 0xB5C JUMP JUMPDEST PUSH2 0x1212 DUP2 PUSH2 0x11AE JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x122C SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x11FC JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x1236 JUMPI JUMP JUMPDEST PUSH2 0x123E PUSH2 0x1C7 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x1254 PUSH1 0x4 DUP3 ADD PUSH2 0x1216 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x1285 SWAP1 PUSH2 0x126D PUSH2 0x1268 DUP3 PUSH2 0x107F JUMP JUMPDEST PUSH2 0x122F JUMP JUMPDEST PUSH1 0x0 PUSH2 0x127F PUSH2 0x127A PUSH2 0x1134 JUMP JUMPDEST PUSH2 0x5A2 JUMP JUMPDEST ADD PUSH2 0xC2D JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x12BC PUSH1 0x1D PUSH1 0x20 SWAP3 PUSH2 0xB5C JUMP JUMPDEST PUSH2 0x12C5 DUP2 PUSH2 0x1287 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x12DF SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x12AF JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x12E9 JUMPI JUMP JUMPDEST PUSH2 0x12F1 PUSH2 0x1C7 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x1307 PUSH1 0x4 DUP3 ADD PUSH2 0x12C9 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP2 SWAP3 SWAP1 PUSH2 0x1316 PUSH2 0x54 JUMP JUMPDEST POP PUSH1 0x0 EQ PUSH2 0x135C JUMPI POP PUSH2 0x1328 DUP3 PUSH2 0x90B JUMP JUMPDEST PUSH2 0x133B PUSH2 0x1335 PUSH1 0x0 PUSH2 0x5A5 JUMP JUMPDEST SWAP2 PUSH2 0x1A8 JUMP JUMPDEST EQ PUSH2 0x1345 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x1351 PUSH2 0x1356 SWAP2 PUSH2 0x107F JUMP JUMPDEST PUSH2 0x12E2 JUMP JUMPDEST CODESIZE PUSH2 0x1341 JUMP JUMPDEST DUP3 PUSH2 0x13D5 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x137A JUMPI POP POP SWAP1 PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP1 PUSH1 0x20 SWAP2 DUP4 ADD MLOAD DUP2 DUP6 ADD MSTORE ADD PUSH2 0x1369 JUMP JUMPDEST PUSH2 0x13AA PUSH2 0x13B3 PUSH1 0x20 SWAP4 PUSH2 0x13B8 SWAP4 PUSH2 0x13A1 DUP2 PUSH2 0x1362 JUMP JUMPDEST SWAP4 DUP5 DUP1 SWAP4 PUSH2 0xB5C JUMP JUMPDEST SWAP6 DUP7 SWAP2 ADD PUSH2 0x1366 JUMP JUMPDEST PUSH2 0x243 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x13D2 SWAP2 PUSH1 0x20 DUP3 ADD SWAP2 PUSH1 0x0 DUP2 DUP5 SUB SWAP2 ADD MSTORE PUSH2 0x138B JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x13DF DUP3 PUSH2 0x90B JUMP JUMPDEST PUSH2 0x13F2 PUSH2 0x13EC PUSH1 0x0 PUSH2 0x5A5 JUMP JUMPDEST SWAP2 PUSH2 0x1A8 JUMP JUMPDEST GT PUSH1 0x0 EQ PUSH2 0x1403 JUMPI POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD REVERT JUMPDEST PUSH2 0x1424 SWAP1 PUSH2 0x140F PUSH2 0x1C7 JUMP JUMPDEST SWAP2 DUP3 SWAP2 PUSH3 0x461BCD PUSH1 0xE5 SHL DUP4 MSTORE PUSH1 0x4 DUP4 ADD PUSH2 0x13BC JUMP JUMPDEST SUB SWAP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xFB XOR SWAP10 0xE6 0x1F CODESIZE STATICCALL 0xA7 DUP12 0xFB 0xAB PUSH26 0xB8DC2FA613357C2FCE2699411F9FEE80B624365564736F6C6343 STOP ADDMOD SHL STOP CALLER LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB0 MUL ISZERO 0xE6 DUP1 0xD7 CREATE 0xFB 0xCD 0x26 MUL 0xE1 CREATE2 PUSH30 0x6DBAC930C10D2445BE6BF9979A142780B5F064736F6C634300081B003360 LOG0 PUSH1 0x40 MSTORE CALLVALUE PUSH2 0x46 JUMPI PUSH2 0x19 PUSH2 0x14 PUSH2 0x111 JUMP JUMPDEST PUSH2 0x132 JUMP JUMPDEST PUSH2 0x21 PUSH2 0x4B JUMP JUMPDEST PUSH2 0x5FC9 PUSH2 0x138 DUP3 CODECOPY PUSH1 0x80 MLOAD DUP2 DUP2 DUP2 PUSH2 0x11D7 ADD MSTORE DUP2 DUP2 PUSH2 0x3C44 ADD MSTORE PUSH2 0x3D71 ADD MSTORE PUSH2 0x5FC9 SWAP1 RETURN JUMPDEST PUSH2 0x51 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1F DUP1 NOT SWAP2 ADD AND SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH2 0x80 SWAP1 PUSH2 0x56 JUMP JUMPDEST DUP2 ADD SWAP1 DUP2 LT PUSH1 0x1 DUP1 PUSH1 0x40 SHL SUB DUP3 GT OR PUSH2 0x98 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH2 0x60 JUMP JUMPDEST SWAP1 PUSH2 0xB0 PUSH2 0xA9 PUSH2 0x4B JUMP JUMPDEST SWAP3 DUP4 PUSH2 0x76 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0xCB SWAP1 PUSH2 0xB7 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xD7 DUP2 PUSH2 0xC2 JUMP JUMPDEST SUB PUSH2 0xDE JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP MLOAD SWAP1 PUSH2 0xF0 DUP3 PUSH2 0xCE JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x10C JUMPI PUSH2 0x109 SWAP2 PUSH1 0x0 ADD PUSH2 0xE3 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xB2 JUMP JUMPDEST PUSH2 0x12F PUSH2 0x6101 DUP1 CODESIZE SUB DUP1 PUSH2 0x124 DUP2 PUSH2 0x9D JUMP JUMPDEST SWAP3 DUP4 CODECOPY DUP2 ADD SWAP1 PUSH2 0xF2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x80 MSTORE JUMP INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x13 JUMPI JUMPDEST PUSH2 0x1C2E JUMP JUMPDEST PUSH2 0x1E PUSH1 0x0 CALLDATALOAD PUSH2 0x2DC JUMP JUMPDEST DUP1 PUSH3 0xFDD58E EQ PUSH2 0x2D7 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x2D2 JUMPI DUP1 PUSH4 0x4634D8D EQ PUSH2 0x2CD JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x2C8 JUMPI DUP1 PUSH4 0xB5EE006 EQ PUSH2 0x2C3 JUMPI DUP1 PUSH4 0xBB310DE EQ PUSH2 0x2BE JUMPI DUP1 PUSH4 0xE89341C EQ PUSH2 0x2B9 JUMPI DUP1 PUSH4 0x167A59F7 EQ PUSH2 0x2B4 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x2AF JUMPI DUP1 PUSH4 0x20EC271B EQ PUSH2 0x2AA JUMPI DUP1 PUSH4 0x248A9CA3 EQ PUSH2 0x2A5 JUMPI DUP1 PUSH4 0x2693EBF2 EQ PUSH2 0x2A0 JUMPI DUP1 PUSH4 0x2A55205A EQ PUSH2 0x29B JUMPI DUP1 PUSH4 0x2EB2C2D6 EQ PUSH2 0x296 JUMPI DUP1 PUSH4 0x2F2FF15D EQ PUSH2 0x291 JUMPI DUP1 PUSH4 0x35403023 EQ PUSH2 0x28C JUMPI DUP1 PUSH4 0x36568ABE EQ PUSH2 0x287 JUMPI DUP1 PUSH4 0x3C70B357 EQ PUSH2 0x282 JUMPI DUP1 PUSH4 0x47FDA41A EQ PUSH2 0x27D JUMPI DUP1 PUSH4 0x4E1273F4 EQ PUSH2 0x278 JUMPI DUP1 PUSH4 0x50336A03 EQ PUSH2 0x273 JUMPI DUP1 PUSH4 0x51304683 EQ PUSH2 0x26E JUMPI DUP1 PUSH4 0x5377AB8F EQ PUSH2 0x269 JUMPI DUP1 PUSH4 0x5944C753 EQ PUSH2 0x264 JUMPI DUP1 PUSH4 0x6C0360EB EQ PUSH2 0x25F JUMPI DUP1 PUSH4 0x731133E9 EQ PUSH2 0x25A JUMPI DUP1 PUSH4 0x7E518EC8 EQ PUSH2 0x255 JUMPI DUP1 PUSH4 0x8FF83AC1 EQ PUSH2 0x250 JUMPI DUP1 PUSH4 0x9010D07C EQ PUSH2 0x24B JUMPI DUP1 PUSH4 0x91D14854 EQ PUSH2 0x246 JUMPI DUP1 PUSH4 0x938E3D7B EQ PUSH2 0x241 JUMPI DUP1 PUSH4 0x9D043A66 EQ PUSH2 0x23C JUMPI DUP1 PUSH4 0xA217FDDF EQ PUSH2 0x237 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x232 JUMPI DUP1 PUSH4 0xB390C0AB EQ PUSH2 0x22D JUMPI DUP1 PUSH4 0xB48AB8B6 EQ PUSH2 0x228 JUMPI DUP1 PUSH4 0xCA15C873 EQ PUSH2 0x223 JUMPI DUP1 PUSH4 0xD547741F EQ PUSH2 0x21E JUMPI DUP1 PUSH4 0xD67B333B EQ PUSH2 0x219 JUMPI DUP1 PUSH4 0xE8A3D485 EQ PUSH2 0x214 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x20F JUMPI DUP1 PUSH4 0xED4C2AC7 EQ PUSH2 0x20A JUMPI DUP1 PUSH4 0xF242432A EQ PUSH2 0x205 JUMPI PUSH4 0xF4F98AD5 SUB PUSH2 0xE JUMPI PUSH2 0x1BFB JUMP JUMPDEST PUSH2 0x1BC1 JUMP JUMPDEST PUSH2 0x1B1D JUMP JUMPDEST PUSH2 0x1AE7 JUMP JUMPDEST PUSH2 0x1A84 JUMP JUMPDEST PUSH2 0x1A3D JUMP JUMPDEST PUSH2 0x193B JUMP JUMPDEST PUSH2 0x1906 JUMP JUMPDEST PUSH2 0x18CF JUMP JUMPDEST PUSH2 0x180B JUMP JUMPDEST PUSH2 0x17D7 JUMP JUMPDEST PUSH2 0x1750 JUMP JUMPDEST PUSH2 0x16DD JUMP JUMPDEST PUSH2 0x1615 JUMP JUMPDEST PUSH2 0x15DF JUMP JUMPDEST PUSH2 0x15A9 JUMP JUMPDEST PUSH2 0x153E JUMP JUMPDEST PUSH2 0x1441 JUMP JUMPDEST PUSH2 0x140A JUMP JUMPDEST PUSH2 0x12F9 JUMP JUMPDEST PUSH2 0x12B5 JUMP JUMPDEST PUSH2 0x1244 JUMP JUMPDEST PUSH2 0x120F JUMP JUMPDEST PUSH2 0x11A1 JUMP JUMPDEST PUSH2 0x112D JUMP JUMPDEST PUSH2 0xFB8 JUMP JUMPDEST PUSH2 0xF69 JUMP JUMPDEST PUSH2 0xEDA JUMP JUMPDEST PUSH2 0xEA5 JUMP JUMPDEST PUSH2 0xE57 JUMP JUMPDEST PUSH2 0xDEC JUMP JUMPDEST PUSH2 0xC8F JUMP JUMPDEST PUSH2 0xBFB JUMP JUMPDEST PUSH2 0xB75 JUMP JUMPDEST PUSH2 0xAD8 JUMP JUMPDEST PUSH2 0x9A9 JUMP JUMPDEST PUSH2 0x93A JUMP JUMPDEST PUSH2 0x905 JUMP JUMPDEST PUSH2 0x8B3 JUMP JUMPDEST PUSH2 0x861 JUMP JUMPDEST PUSH2 0x74F JUMP JUMPDEST PUSH2 0x4F5 JUMP JUMPDEST PUSH2 0x457 JUMP JUMPDEST PUSH2 0x3AA JUMP JUMPDEST PUSH1 0xE0 SHR SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x30B SWAP1 PUSH2 0x2F7 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x317 DUP2 PUSH2 0x302 JUMP JUMPDEST SUB PUSH2 0x31E JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x330 DUP3 PUSH2 0x30E JUMP JUMPDEST JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x33E DUP2 PUSH2 0x332 JUMP JUMPDEST SUB PUSH2 0x345 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x357 DUP3 PUSH2 0x335 JUMP JUMPDEST JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0x382 JUMPI DUP1 PUSH2 0x376 PUSH2 0x37F SWAP3 PUSH1 0x0 DUP7 ADD PUSH2 0x323 JUMP JUMPDEST SWAP4 PUSH1 0x20 ADD PUSH2 0x34A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST PUSH2 0x390 SWAP1 PUSH2 0x332 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x3A8 SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0x387 JUMP JUMPDEST JUMP JUMPDEST CALLVALUE PUSH2 0x3DB JUMPI PUSH2 0x3D7 PUSH2 0x3C6 PUSH2 0x3C0 CALLDATASIZE PUSH1 0x4 PUSH2 0x359 JUMP JUMPDEST SWAP1 PUSH2 0x1C38 JUMP JUMPDEST PUSH2 0x3CE PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x394 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL AND SWAP1 JUMP JUMPDEST PUSH2 0x3F5 DUP2 PUSH2 0x3E0 JUMP JUMPDEST SUB PUSH2 0x3FC JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x40E DUP3 PUSH2 0x3EC JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x42A JUMPI PUSH2 0x427 SWAP2 PUSH1 0x0 ADD PUSH2 0x401 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH2 0x43D SWAP1 PUSH2 0x42F JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x455 SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0x434 JUMP JUMPDEST JUMP JUMPDEST CALLVALUE PUSH2 0x487 JUMPI PUSH2 0x483 PUSH2 0x472 PUSH2 0x46D CALLDATASIZE PUSH1 0x4 PUSH2 0x410 JUMP JUMPDEST PUSH2 0x1C61 JUMP JUMPDEST PUSH2 0x47A PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x441 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0x4A6 DUP2 PUSH2 0x48C JUMP JUMPDEST SUB PUSH2 0x4AD JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x4BF DUP3 PUSH2 0x49D JUMP JUMPDEST JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0x4EA JUMPI DUP1 PUSH2 0x4DE PUSH2 0x4E7 SWAP3 PUSH1 0x0 DUP7 ADD PUSH2 0x323 JUMP JUMPDEST SWAP4 PUSH1 0x20 ADD PUSH2 0x4B2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST PUSH1 0x0 ADD SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x524 JUMPI PUSH2 0x50E PUSH2 0x508 CALLDATASIZE PUSH1 0x4 PUSH2 0x4C1 JUMP JUMPDEST SWAP1 PUSH2 0x1CED JUMP JUMPDEST PUSH2 0x516 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x520 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH1 0x0 SWAP2 SUB SLT PUSH2 0x534 JUMPI JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x1 PUSH1 0x2 DUP4 DIV SWAP3 AND DUP1 ISZERO PUSH2 0x585 JUMPI JUMPDEST PUSH1 0x20 DUP4 LT EQ PUSH2 0x580 JUMPI JUMP JUMPDEST PUSH2 0x54F JUMP JUMPDEST SWAP2 PUSH1 0x7F AND SWAP2 PUSH2 0x575 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x0 SWAP3 SWAP2 DUP1 SLOAD SWAP1 PUSH2 0x5BE PUSH2 0x5B7 DUP4 PUSH2 0x565 JUMP JUMPDEST DUP1 SWAP5 PUSH2 0x58F JUMP JUMPDEST SWAP2 PUSH1 0x1 DUP2 AND SWAP1 DUP2 PUSH1 0x0 EQ PUSH2 0x617 JUMPI POP PUSH1 0x1 EQ PUSH2 0x5DA JUMPI JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x5E7 SWAP2 SWAP3 SWAP4 SWAP5 POP PUSH2 0x598 JUMP JUMPDEST SWAP2 PUSH1 0x0 SWAP3 JUMPDEST DUP2 DUP5 LT PUSH2 0x5FF JUMPI POP POP ADD SWAP1 CODESIZE DUP1 DUP1 PUSH2 0x5D5 JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x20 SWAP3 SWAP6 SWAP4 SWAP6 SLOAD DUP5 DUP7 ADD MSTORE ADD SWAP2 ADD SWAP3 SWAP1 PUSH2 0x5EC JUMP JUMPDEST SWAP3 SWAP5 SWAP6 POP POP POP PUSH1 0xFF NOT AND DUP3 MSTORE ISZERO ISZERO PUSH1 0x20 MUL ADD SWAP1 CODESIZE DUP1 DUP1 PUSH2 0x5D5 JUMP JUMPDEST SWAP1 PUSH2 0x63C SWAP2 PUSH2 0x5A3 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1F DUP1 NOT SWAP2 ADD AND SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH2 0x669 SWAP1 PUSH2 0x63F JUMP JUMPDEST DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x683 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH2 0x649 JUMP JUMPDEST SWAP1 PUSH2 0x6A8 PUSH2 0x6A1 SWAP3 PUSH2 0x698 PUSH2 0x2E2 JUMP JUMPDEST SWAP4 DUP5 DUP1 SWAP3 PUSH2 0x632 JUMP JUMPDEST SUB DUP4 PUSH2 0x65F JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x0 LT PUSH2 0x6BE JUMPI PUSH2 0x6BB SWAP1 PUSH2 0x688 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x539 JUMP JUMPDEST PUSH2 0x6D0 PUSH1 0x8 PUSH1 0x0 SWAP1 PUSH2 0x6AA JUMP JUMPDEST SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x6F4 JUMPI POP POP SWAP1 PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP1 PUSH1 0x20 SWAP2 DUP4 ADD MLOAD DUP2 DUP6 ADD MSTORE ADD PUSH2 0x6E3 JUMP JUMPDEST PUSH2 0x724 PUSH2 0x72D PUSH1 0x20 SWAP4 PUSH2 0x732 SWAP4 PUSH2 0x71B DUP2 PUSH2 0x6D3 JUMP JUMPDEST SWAP4 DUP5 DUP1 SWAP4 PUSH2 0x6D7 JUMP JUMPDEST SWAP6 DUP7 SWAP2 ADD PUSH2 0x6E0 JUMP JUMPDEST PUSH2 0x63F JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x74C SWAP2 PUSH1 0x20 DUP3 ADD SWAP2 PUSH1 0x0 DUP2 DUP5 SUB SWAP2 ADD MSTORE PUSH2 0x705 JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x77F JUMPI PUSH2 0x75F CALLDATASIZE PUSH1 0x4 PUSH2 0x529 JUMP JUMPDEST PUSH2 0x77B PUSH2 0x76A PUSH2 0x6C3 JUMP JUMPDEST PUSH2 0x772 PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x736 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 PUSH2 0x7A1 PUSH2 0x79A PUSH2 0x2E2 JUMP JUMPDEST SWAP3 DUP4 PUSH2 0x65F JUMP JUMPDEST JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x7C1 JUMPI PUSH2 0x7BD PUSH1 0x20 SWAP2 PUSH2 0x63F JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x649 JUMP JUMPDEST SWAP1 DUP3 PUSH1 0x0 SWAP4 SWAP3 DUP3 CALLDATACOPY ADD MSTORE JUMP JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x7E7 PUSH2 0x7E2 DUP3 PUSH2 0x7A3 JUMP JUMPDEST PUSH2 0x78E JUMP JUMPDEST SWAP4 DUP2 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP1 DUP3 DUP5 ADD GT PUSH2 0x803 JUMPI PUSH2 0x801 SWAP3 PUSH2 0x7C6 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x789 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x826 JUMPI DUP2 PUSH1 0x20 PUSH2 0x823 SWAP4 CALLDATALOAD SWAP2 ADD PUSH2 0x7D2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x784 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x85C JUMPI PUSH1 0x0 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x857 JUMPI PUSH2 0x854 SWAP3 ADD PUSH2 0x808 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x88F JUMPI PUSH2 0x879 PUSH2 0x874 CALLDATASIZE PUSH1 0x4 PUSH2 0x82B JUMP JUMPDEST PUSH2 0x1F2E JUMP JUMPDEST PUSH2 0x881 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x88B DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x8AE JUMPI PUSH2 0x8AB SWAP2 PUSH1 0x0 ADD PUSH2 0x323 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x8E1 JUMPI PUSH2 0x8CB PUSH2 0x8C6 CALLDATASIZE PUSH1 0x4 PUSH2 0x894 JUMP JUMPDEST PUSH2 0x200B JUMP JUMPDEST PUSH2 0x8D3 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x8DD DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x900 JUMPI PUSH2 0x8FD SWAP2 PUSH1 0x0 ADD PUSH2 0x34A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x935 JUMPI PUSH2 0x931 PUSH2 0x920 PUSH2 0x91B CALLDATASIZE PUSH1 0x4 PUSH2 0x8E6 JUMP JUMPDEST PUSH2 0x2135 JUMP JUMPDEST PUSH2 0x928 PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x736 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST CALLVALUE PUSH2 0x969 JUMPI PUSH2 0x953 PUSH2 0x94D CALLDATASIZE PUSH1 0x4 PUSH2 0x359 JUMP JUMPDEST SWAP1 PUSH2 0x2254 JUMP JUMPDEST PUSH2 0x95B PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x965 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SHR SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x985 SWAP1 PUSH1 0x8 PUSH2 0x98A SWAP4 MUL PUSH2 0x96E JUMP JUMPDEST PUSH2 0x972 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x998 SWAP2 SLOAD PUSH2 0x975 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x9A6 PUSH1 0x0 DUP1 PUSH2 0x98D JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x9D9 JUMPI PUSH2 0x9B9 CALLDATASIZE PUSH1 0x4 PUSH2 0x529 JUMP JUMPDEST PUSH2 0x9D5 PUSH2 0x9C4 PUSH2 0x99B JUMP JUMPDEST PUSH2 0x9CC PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x394 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x9F6 JUMPI PUSH1 0x20 DUP1 SWAP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH2 0x649 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0xA15 PUSH2 0xA10 DUP3 PUSH2 0x9DE JUMP JUMPDEST PUSH2 0x78E JUMP JUMPDEST SWAP4 DUP2 DUP6 MSTORE PUSH1 0x20 DUP1 DUP7 ADD SWAP3 MUL DUP4 ADD SWAP3 DUP2 DUP5 GT PUSH2 0xA52 JUMPI SWAP2 JUMPDEST DUP4 DUP4 LT PUSH2 0xA39 JUMPI POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 SWAP2 PUSH2 0xA47 DUP5 DUP7 PUSH2 0x34A JUMP JUMPDEST DUP2 MSTORE ADD SWAP3 ADD SWAP2 PUSH2 0xA2C JUMP JUMPDEST PUSH2 0x9FB JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0xA75 JUMPI DUP2 PUSH1 0x20 PUSH2 0xA72 SWAP4 CALLDATALOAD SWAP2 ADD PUSH2 0xA00 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x784 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH1 0x40 DUP2 DUP5 SUB SLT PUSH2 0xAD3 JUMPI PUSH1 0x0 DUP2 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xACE JUMPI DUP4 PUSH2 0xAA7 SWAP2 DUP4 ADD PUSH2 0xA57 JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xAC9 JUMPI PUSH2 0xAC6 SWAP3 ADD PUSH2 0xA57 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0xB07 JUMPI PUSH2 0xAF1 PUSH2 0xAEB CALLDATASIZE PUSH1 0x4 PUSH2 0xA7A JUMP JUMPDEST SWAP1 PUSH2 0x234F JUMP JUMPDEST PUSH2 0xAF9 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0xB03 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xB18 DUP2 PUSH2 0xB0C JUMP JUMPDEST SUB PUSH2 0xB1F JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0xB31 DUP3 PUSH2 0xB0F JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0xB4D JUMPI PUSH2 0xB4A SWAP2 PUSH1 0x0 ADD PUSH2 0xB24 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST PUSH2 0xB5B SWAP1 PUSH2 0xB0C JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0xB73 SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0xB52 JUMP JUMPDEST JUMP JUMPDEST CALLVALUE PUSH2 0xBA5 JUMPI PUSH2 0xBA1 PUSH2 0xB90 PUSH2 0xB8B CALLDATASIZE PUSH1 0x4 PUSH2 0xB33 JUMP JUMPDEST PUSH2 0x23A8 JUMP JUMPDEST PUSH2 0xB98 PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xB5F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xBC1 PUSH2 0xBBC PUSH2 0xBC6 SWAP3 PUSH2 0x332 JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x332 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0xBD3 SWAP1 PUSH2 0xBAD JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH2 0xBF8 SWAP1 PUSH2 0xBF3 PUSH1 0x1 SWAP2 PUSH1 0x0 SWAP3 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x98D JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0xC2B JUMPI PUSH2 0xC27 PUSH2 0xC16 PUSH2 0xC11 CALLDATASIZE PUSH1 0x4 PUSH2 0x8E6 JUMP JUMPDEST PUSH2 0xBE1 JUMP JUMPDEST PUSH2 0xC1E PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x394 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0xC59 JUMPI DUP1 PUSH2 0xC4D PUSH2 0xC56 SWAP3 PUSH1 0x0 DUP7 ADD PUSH2 0x34A JUMP JUMPDEST SWAP4 PUSH1 0x20 ADD PUSH2 0x34A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST PUSH2 0xC67 SWAP1 PUSH2 0x302 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 PUSH1 0x20 PUSH2 0xC8D SWAP3 SWAP5 SWAP4 PUSH2 0xC86 PUSH1 0x40 DUP3 ADD SWAP7 PUSH1 0x0 DUP4 ADD SWAP1 PUSH2 0xC5E JUMP JUMPDEST ADD SWAP1 PUSH2 0x387 JUMP JUMPDEST JUMP JUMPDEST CALLVALUE PUSH2 0xCC1 JUMPI PUSH2 0xCA8 PUSH2 0xCA2 CALLDATASIZE PUSH1 0x4 PUSH2 0xC30 JUMP JUMPDEST SWAP1 PUSH2 0x259A JUMP JUMPDEST SWAP1 PUSH2 0xCBD PUSH2 0xCB4 PUSH2 0x2E2 JUMP JUMPDEST SWAP3 DUP4 SWAP3 DUP4 PUSH2 0xC6B JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP2 DUP3 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0xD05 JUMPI DUP2 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xD00 JUMPI PUSH1 0x20 ADD SWAP3 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH2 0xCFB JUMPI JUMP JUMPDEST PUSH2 0x9FB JUMP JUMPDEST PUSH2 0xCC6 JUMP JUMPDEST PUSH2 0x784 JUMP JUMPDEST SWAP1 SWAP2 DUP3 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0xD44 JUMPI DUP2 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0xD3F JUMPI PUSH1 0x20 ADD SWAP3 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH2 0xD3A JUMPI JUMP JUMPDEST PUSH2 0x9FB JUMP JUMPDEST PUSH2 0xCC6 JUMP JUMPDEST PUSH2 0x784 JUMP JUMPDEST SWAP2 PUSH1 0xA0 DUP4 DUP4 SUB SLT PUSH2 0xDE7 JUMPI PUSH2 0xD61 DUP3 PUSH1 0x0 DUP6 ADD PUSH2 0x323 JUMP JUMPDEST SWAP3 PUSH2 0xD6F DUP4 PUSH1 0x20 DUP4 ADD PUSH2 0x323 JUMP JUMPDEST SWAP3 PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xDE2 JUMPI DUP2 PUSH2 0xD90 SWAP2 DUP5 ADD PUSH2 0xCCB JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xDDD JUMPI DUP4 PUSH2 0xDB3 SWAP2 DUP5 ADD PUSH2 0xCCB JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH1 0x80 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xDD8 JUMPI PUSH2 0xDD4 SWAP3 ADD PUSH2 0xD0A JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0xE24 JUMPI PUSH2 0xE0E PUSH2 0xDFF CALLDATASIZE PUSH1 0x4 PUSH2 0xD49 JUMP JUMPDEST SWAP7 SWAP6 SWAP1 SWAP6 SWAP5 SWAP2 SWAP5 SWAP4 SWAP3 SWAP4 PUSH2 0x2675 JUMP JUMPDEST PUSH2 0xE16 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0xE20 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0xE52 JUMPI DUP1 PUSH2 0xE46 PUSH2 0xE4F SWAP3 PUSH1 0x0 DUP7 ADD PUSH2 0xB24 JUMP JUMPDEST SWAP4 PUSH1 0x20 ADD PUSH2 0x323 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0xE86 JUMPI PUSH2 0xE70 PUSH2 0xE6A CALLDATASIZE PUSH1 0x4 PUSH2 0xE29 JUMP JUMPDEST SWAP1 PUSH2 0x2911 JUMP JUMPDEST PUSH2 0xE78 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0xE82 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH2 0xEA2 SWAP1 PUSH2 0xE9D PUSH1 0xD SWAP2 PUSH1 0x0 SWAP3 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x98D JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0xED5 JUMPI PUSH2 0xED1 PUSH2 0xEC0 PUSH2 0xEBB CALLDATASIZE PUSH1 0x4 PUSH2 0x8E6 JUMP JUMPDEST PUSH2 0xE8B JUMP JUMPDEST PUSH2 0xEC8 PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x394 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST CALLVALUE PUSH2 0xF09 JUMPI PUSH2 0xEF3 PUSH2 0xEED CALLDATASIZE PUSH1 0x4 PUSH2 0xE29 JUMP JUMPDEST SWAP1 PUSH2 0x29C7 JUMP JUMPDEST PUSH2 0xEFB PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0xF05 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP1 PUSH2 0xF18 SWAP1 PUSH2 0xBAD JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xF39 SWAP1 PUSH1 0x8 PUSH2 0xF3E SWAP4 MUL PUSH2 0x96E JUMP JUMPDEST PUSH2 0xF26 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0xF4C SWAP2 SLOAD PUSH2 0xF29 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xF66 SWAP1 PUSH2 0xF61 PUSH1 0xC SWAP2 PUSH1 0x0 SWAP3 PUSH2 0xF0E JUMP JUMPDEST PUSH2 0xF41 JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0xF99 JUMPI PUSH2 0xF95 PUSH2 0xF84 PUSH2 0xF7F CALLDATASIZE PUSH1 0x4 PUSH2 0x8E6 JUMP JUMPDEST PUSH2 0xF4F JUMP JUMPDEST PUSH2 0xF8C PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xB5F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH2 0xFB5 SWAP1 PUSH2 0xFB0 PUSH1 0xE SWAP2 PUSH1 0x0 SWAP3 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x98D JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0xFE8 JUMPI PUSH2 0xFE4 PUSH2 0xFD3 PUSH2 0xFCE CALLDATASIZE PUSH1 0x4 PUSH2 0x8E6 JUMP JUMPDEST PUSH2 0xF9E JUMP JUMPDEST PUSH2 0xFDB PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x394 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP1 SWAP2 DUP3 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x1027 JUMPI DUP2 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x1022 JUMPI PUSH1 0x20 ADD SWAP3 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH2 0x101D JUMPI JUMP JUMPDEST PUSH2 0x9FB JUMP JUMPDEST PUSH2 0xCC6 JUMP JUMPDEST PUSH2 0x784 JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x40 DUP3 DUP5 SUB SLT PUSH2 0x1087 JUMPI PUSH1 0x0 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1082 JUMPI DUP4 PUSH2 0x1058 SWAP2 DUP5 ADD PUSH2 0xFED JUMP JUMPDEST SWAP3 SWAP1 SWAP4 PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x107D JUMPI PUSH2 0x1079 SWAP3 ADD PUSH2 0xCCB JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH2 0x10A8 SWAP1 PUSH2 0x332 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP1 PUSH2 0x10B9 DUP2 PUSH1 0x20 SWAP4 PUSH2 0x109F JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x10E0 PUSH2 0x10DA PUSH2 0x10D3 DUP5 PUSH2 0x108C JUMP JUMPDEST DUP1 SWAP4 PUSH2 0x1090 JUMP JUMPDEST SWAP3 PUSH2 0x1099 JUMP JUMPDEST SWAP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x10F1 JUMPI POP POP POP SWAP1 JUMP JUMPDEST SWAP1 SWAP2 SWAP3 PUSH2 0x110A PUSH2 0x1104 PUSH1 0x1 SWAP3 DUP7 MLOAD PUSH2 0x10AC JUMP JUMPDEST SWAP5 PUSH2 0x10BD JUMP JUMPDEST SWAP2 ADD SWAP2 SWAP1 SWAP2 PUSH2 0x10E4 JUMP JUMPDEST PUSH2 0x112A SWAP2 PUSH1 0x20 DUP3 ADD SWAP2 PUSH1 0x0 DUP2 DUP5 SUB SWAP2 ADD MSTORE PUSH2 0x10C3 JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x1161 JUMPI PUSH2 0x115D PUSH2 0x114C PUSH2 0x1143 CALLDATASIZE PUSH1 0x4 PUSH2 0x102C JUMP JUMPDEST SWAP3 SWAP2 SWAP1 SWAP2 PUSH2 0x29FB JUMP JUMPDEST PUSH2 0x1154 PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x1114 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x60 DUP3 DUP5 SUB SLT PUSH2 0x119C JUMPI PUSH2 0x1199 PUSH2 0x1182 DUP5 PUSH1 0x0 DUP6 ADD PUSH2 0xB24 JUMP JUMPDEST SWAP4 PUSH2 0x1190 DUP2 PUSH1 0x20 DUP7 ADD PUSH2 0x34A JUMP JUMPDEST SWAP4 PUSH1 0x40 ADD PUSH2 0x34A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x11D0 JUMPI PUSH2 0x11BA PUSH2 0x11B4 CALLDATASIZE PUSH1 0x4 PUSH2 0x1166 JUMP JUMPDEST SWAP2 PUSH2 0x2B51 JUMP JUMPDEST PUSH2 0x11C2 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x11CC DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH32 0x0 SWAP1 JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x120D SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0xC5E JUMP JUMPDEST JUMP JUMPDEST CALLVALUE PUSH2 0x123F JUMPI PUSH2 0x121F CALLDATASIZE PUSH1 0x4 PUSH2 0x529 JUMP JUMPDEST PUSH2 0x123B PUSH2 0x122A PUSH2 0x11D5 JUMP JUMPDEST PUSH2 0x1232 PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x11F9 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST CALLVALUE PUSH2 0x1275 JUMPI PUSH2 0x1271 PUSH2 0x1260 PUSH2 0x125A CALLDATASIZE PUSH1 0x4 PUSH2 0x359 JUMP JUMPDEST SWAP1 PUSH2 0x2B5E JUMP JUMPDEST PUSH2 0x1268 PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x394 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x60 DUP3 DUP5 SUB SLT PUSH2 0x12B0 JUMPI PUSH2 0x12AD PUSH2 0x1296 DUP5 PUSH1 0x0 DUP6 ADD PUSH2 0x34A JUMP JUMPDEST SWAP4 PUSH2 0x12A4 DUP2 PUSH1 0x20 DUP7 ADD PUSH2 0x323 JUMP JUMPDEST SWAP4 PUSH1 0x40 ADD PUSH2 0x4B2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x12E4 JUMPI PUSH2 0x12CE PUSH2 0x12C8 CALLDATASIZE PUSH1 0x4 PUSH2 0x127A JUMP JUMPDEST SWAP2 PUSH2 0x2BA2 JUMP JUMPDEST PUSH2 0x12D6 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x12E0 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH2 0x12F6 PUSH1 0x9 PUSH1 0x0 SWAP1 PUSH2 0x6AA JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x1329 JUMPI PUSH2 0x1309 CALLDATASIZE PUSH1 0x4 PUSH2 0x529 JUMP JUMPDEST PUSH2 0x1325 PUSH2 0x1314 PUSH2 0x12E9 JUMP JUMPDEST PUSH2 0x131C PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x736 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x134C JUMPI PUSH2 0x1348 PUSH1 0x20 SWAP2 PUSH2 0x63F JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x649 JUMP JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x1366 PUSH2 0x1361 DUP3 PUSH2 0x132E JUMP JUMPDEST PUSH2 0x78E JUMP JUMPDEST SWAP4 DUP2 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP1 DUP3 DUP5 ADD GT PUSH2 0x1382 JUMPI PUSH2 0x1380 SWAP3 PUSH2 0x7C6 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x789 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x13A5 JUMPI DUP2 PUSH1 0x20 PUSH2 0x13A2 SWAP4 CALLDATALOAD SWAP2 ADD PUSH2 0x1351 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x784 JUMP JUMPDEST SWAP1 PUSH1 0x80 DUP3 DUP3 SUB SLT PUSH2 0x1405 JUMPI PUSH2 0x13C2 DUP2 PUSH1 0x0 DUP5 ADD PUSH2 0x323 JUMP JUMPDEST SWAP3 PUSH2 0x13D0 DUP3 PUSH1 0x20 DUP6 ADD PUSH2 0x34A JUMP JUMPDEST SWAP3 PUSH2 0x13DE DUP4 PUSH1 0x40 DUP4 ADD PUSH2 0x34A JUMP JUMPDEST SWAP3 PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1400 JUMPI PUSH2 0x13FD SWAP3 ADD PUSH2 0x1387 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x143C JUMPI PUSH2 0x1426 PUSH2 0x141D CALLDATASIZE PUSH1 0x4 PUSH2 0x13AA JUMP JUMPDEST SWAP3 SWAP2 SWAP1 SWAP2 PUSH2 0x2C01 JUMP JUMPDEST PUSH2 0x142E PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x1438 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST CALLVALUE PUSH2 0x146F JUMPI PUSH2 0x1459 PUSH2 0x1454 CALLDATASIZE PUSH1 0x4 PUSH2 0x82B JUMP JUMPDEST PUSH2 0x2C37 JUMP JUMPDEST PUSH2 0x1461 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x146B DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x100 DUP4 DUP3 SUB SLT PUSH2 0x1539 JUMPI PUSH2 0x148E DUP2 PUSH1 0x0 DUP6 ADD PUSH2 0x323 JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1534 JUMPI DUP3 PUSH2 0x14AF SWAP2 DUP4 ADD PUSH2 0x808 JUMP JUMPDEST SWAP3 PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x152F JUMPI DUP4 PUSH2 0x14D0 SWAP2 DUP5 ADD PUSH2 0x808 JUMP JUMPDEST SWAP3 PUSH1 0x60 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x152A JUMPI DUP2 PUSH2 0x14F1 SWAP2 DUP6 ADD PUSH2 0x808 JUMP JUMPDEST SWAP3 PUSH2 0x14FF DUP3 PUSH1 0x80 DUP4 ADD PUSH2 0x323 JUMP JUMPDEST SWAP3 PUSH2 0x1527 PUSH2 0x1510 DUP5 PUSH1 0xA0 DUP6 ADD PUSH2 0x4B2 JUMP JUMPDEST SWAP4 PUSH2 0x151E DUP2 PUSH1 0xC0 DUP7 ADD PUSH2 0x323 JUMP JUMPDEST SWAP4 PUSH1 0xE0 ADD PUSH2 0xB24 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x1576 JUMPI PUSH2 0x1560 PUSH2 0x1551 CALLDATASIZE PUSH1 0x4 PUSH2 0x1474 JUMP JUMPDEST SWAP7 SWAP6 SWAP1 SWAP6 SWAP5 SWAP2 SWAP5 SWAP4 SWAP3 SWAP4 PUSH2 0x2C42 JUMP JUMPDEST PUSH2 0x1568 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x1572 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0x15A4 JUMPI DUP1 PUSH2 0x1598 PUSH2 0x15A1 SWAP3 PUSH1 0x0 DUP7 ADD PUSH2 0xB24 JUMP JUMPDEST SWAP4 PUSH1 0x20 ADD PUSH2 0x34A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x15DA JUMPI PUSH2 0x15D6 PUSH2 0x15C5 PUSH2 0x15BF CALLDATASIZE PUSH1 0x4 PUSH2 0x157B JUMP JUMPDEST SWAP1 PUSH2 0x2C89 JUMP JUMPDEST PUSH2 0x15CD PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x11F9 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST CALLVALUE PUSH2 0x1610 JUMPI PUSH2 0x160C PUSH2 0x15FB PUSH2 0x15F5 CALLDATASIZE PUSH1 0x4 PUSH2 0xE29 JUMP JUMPDEST SWAP1 PUSH2 0x2CF0 JUMP JUMPDEST PUSH2 0x1603 PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x441 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST CALLVALUE PUSH2 0x1643 JUMPI PUSH2 0x162D PUSH2 0x1628 CALLDATASIZE PUSH1 0x4 PUSH2 0x82B JUMP JUMPDEST PUSH2 0x2D43 JUMP JUMPDEST PUSH2 0x1635 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x163F DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 DUP2 PUSH1 0xC0 SWAP2 SUB SLT PUSH2 0x165B JUMPI SWAP1 JUMP JUMPDEST PUSH2 0x1648 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0xE0 SWAP2 SUB SLT PUSH2 0x166E JUMPI SWAP1 JUMP JUMPDEST PUSH2 0x1648 JUMP JUMPDEST SWAP2 PUSH1 0x60 DUP4 DUP4 SUB SLT PUSH2 0x16D8 JUMPI PUSH2 0x168B DUP3 PUSH1 0x0 DUP6 ADD PUSH2 0x323 JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x16D3 JUMPI DUP4 PUSH2 0x16AC SWAP2 DUP4 ADD PUSH2 0x164D JUMP JUMPDEST SWAP3 PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x16CE JUMPI PUSH2 0x16CB SWAP3 ADD PUSH2 0x1660 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x170E JUMPI PUSH2 0x170A PUSH2 0x16F9 PUSH2 0x16F3 CALLDATASIZE PUSH1 0x4 PUSH2 0x1673 JUMP JUMPDEST SWAP2 PUSH2 0x30A6 JUMP JUMPDEST PUSH2 0x1701 PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xB5F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SHL SWAP1 JUMP JUMPDEST PUSH2 0x1730 PUSH2 0x172B PUSH2 0x1735 SWAP3 PUSH2 0x1713 JUMP JUMPDEST PUSH2 0x1716 JUMP JUMPDEST PUSH2 0xB0C JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1742 PUSH1 0x0 PUSH2 0x171C JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x174D PUSH2 0x1738 JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x1780 JUMPI PUSH2 0x1760 CALLDATASIZE PUSH1 0x4 PUSH2 0x529 JUMP JUMPDEST PUSH2 0x177C PUSH2 0x176B PUSH2 0x1745 JUMP JUMPDEST PUSH2 0x1773 PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0xB5F JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH2 0x178E DUP2 PUSH2 0x42F JUMP JUMPDEST SUB PUSH2 0x1795 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x17A7 DUP3 PUSH2 0x1785 JUMP JUMPDEST JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0x17D2 JUMPI DUP1 PUSH2 0x17C6 PUSH2 0x17CF SWAP3 PUSH1 0x0 DUP7 ADD PUSH2 0x323 JUMP JUMPDEST SWAP4 PUSH1 0x20 ADD PUSH2 0x179A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x1806 JUMPI PUSH2 0x17F0 PUSH2 0x17EA CALLDATASIZE PUSH1 0x4 PUSH2 0x17A9 JUMP JUMPDEST SWAP1 PUSH2 0x3147 JUMP JUMPDEST PUSH2 0x17F8 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x1802 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST CALLVALUE PUSH2 0x183A JUMPI PUSH2 0x1824 PUSH2 0x181E CALLDATASIZE PUSH1 0x4 PUSH2 0xC30 JUMP JUMPDEST SWAP1 PUSH2 0x3197 JUMP JUMPDEST PUSH2 0x182C PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x1836 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP1 PUSH1 0x80 DUP3 DUP3 SUB SLT PUSH2 0x18CA JUMPI PUSH2 0x1857 DUP2 PUSH1 0x0 DUP5 ADD PUSH2 0x323 JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x18C5 JUMPI DUP3 PUSH2 0x1878 SWAP2 DUP6 ADD PUSH2 0xA57 JUMP JUMPDEST SWAP3 PUSH1 0x40 DUP2 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x18C0 JUMPI DUP4 PUSH2 0x1899 SWAP2 DUP4 ADD PUSH2 0xA57 JUMP JUMPDEST SWAP3 PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x18BB JUMPI PUSH2 0x18B8 SWAP3 ADD PUSH2 0x1387 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x1901 JUMPI PUSH2 0x18EB PUSH2 0x18E2 CALLDATASIZE PUSH1 0x4 PUSH2 0x183F JUMP JUMPDEST SWAP3 SWAP2 SWAP1 SWAP2 PUSH2 0x31D4 JUMP JUMPDEST PUSH2 0x18F3 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x18FD DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST CALLVALUE PUSH2 0x1936 JUMPI PUSH2 0x1932 PUSH2 0x1921 PUSH2 0x191C CALLDATASIZE PUSH1 0x4 PUSH2 0xB33 JUMP JUMPDEST PUSH2 0x31E2 JUMP JUMPDEST PUSH2 0x1929 PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x394 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST CALLVALUE PUSH2 0x196A JUMPI PUSH2 0x1954 PUSH2 0x194E CALLDATASIZE PUSH1 0x4 PUSH2 0xE29 JUMP JUMPDEST SWAP1 PUSH2 0x3232 JUMP JUMPDEST PUSH2 0x195C PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x1966 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x80 SWAP2 SUB SLT PUSH2 0x197D JUMPI SWAP1 JUMP JUMPDEST PUSH2 0x1648 JUMP JUMPDEST SWAP1 SWAP2 DUP3 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x19BC JUMPI DUP2 CALLDATALOAD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP4 GT PUSH2 0x19B7 JUMPI PUSH1 0x20 ADD SWAP3 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH2 0x19B2 JUMPI JUMP JUMPDEST PUSH2 0x9FB JUMP JUMPDEST PUSH2 0xCC6 JUMP JUMPDEST PUSH2 0x784 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH1 0x80 DUP2 DUP5 SUB SLT PUSH2 0x1A38 JUMPI PUSH2 0x19DB DUP4 PUSH1 0x0 DUP4 ADD PUSH2 0x323 JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1A33 JUMPI DUP2 PUSH2 0x19FC SWAP2 DUP5 ADD PUSH2 0x196F JUMP JUMPDEST SWAP3 PUSH1 0x40 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1A2E JUMPI PUSH2 0x1A20 DUP4 PUSH2 0x1A2B SWAP3 DUP7 ADD PUSH2 0x1982 JUMP JUMPDEST SWAP4 SWAP1 SWAP5 PUSH1 0x60 ADD PUSH2 0x34A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x1A6F JUMPI PUSH2 0x1A59 PUSH2 0x1A50 CALLDATASIZE PUSH1 0x4 PUSH2 0x19C1 JUMP JUMPDEST SWAP4 SWAP3 SWAP1 SWAP3 PUSH2 0x3997 JUMP JUMPDEST PUSH2 0x1A61 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x1A6B DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH2 0x1A81 PUSH1 0xA PUSH1 0x0 SWAP1 PUSH2 0x6AA JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x1AB4 JUMPI PUSH2 0x1A94 CALLDATASIZE PUSH1 0x4 PUSH2 0x529 JUMP JUMPDEST PUSH2 0x1AB0 PUSH2 0x1A9F PUSH2 0x1A74 JUMP JUMPDEST PUSH2 0x1AA7 PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x736 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x40 DUP4 DUP3 SUB SLT PUSH2 0x1AE2 JUMPI DUP1 PUSH2 0x1AD6 PUSH2 0x1ADF SWAP3 PUSH1 0x0 DUP7 ADD PUSH2 0x323 JUMP JUMPDEST SWAP4 PUSH1 0x20 ADD PUSH2 0x323 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x1B18 JUMPI PUSH2 0x1B14 PUSH2 0x1B03 PUSH2 0x1AFD CALLDATASIZE PUSH1 0x4 PUSH2 0x1AB9 JUMP JUMPDEST SWAP1 PUSH2 0x3E0E JUMP JUMPDEST PUSH2 0x1B0B PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x441 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST CALLVALUE PUSH2 0x1B4B JUMPI PUSH2 0x1B35 PUSH2 0x1B30 CALLDATASIZE PUSH1 0x4 PUSH2 0xB33 JUMP JUMPDEST PUSH2 0x3E5A JUMP JUMPDEST PUSH2 0x1B3D PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x1B47 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH1 0xA0 DUP2 DUP5 SUB SLT PUSH2 0x1BBC JUMPI PUSH2 0x1B6A DUP4 PUSH1 0x0 DUP4 ADD PUSH2 0x323 JUMP JUMPDEST SWAP3 PUSH2 0x1B78 DUP2 PUSH1 0x20 DUP5 ADD PUSH2 0x323 JUMP JUMPDEST SWAP3 PUSH2 0x1B86 DUP3 PUSH1 0x40 DUP6 ADD PUSH2 0x34A JUMP JUMPDEST SWAP3 PUSH2 0x1B94 DUP4 PUSH1 0x60 DUP4 ADD PUSH2 0x34A JUMP JUMPDEST SWAP3 PUSH1 0x80 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1BB7 JUMPI PUSH2 0x1BB3 SWAP3 ADD PUSH2 0xD0A JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH2 0x2F2 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST CALLVALUE PUSH2 0x1BF6 JUMPI PUSH2 0x1BE0 PUSH2 0x1BD4 CALLDATASIZE PUSH1 0x4 PUSH2 0x1B50 JUMP JUMPDEST SWAP5 SWAP4 SWAP1 SWAP4 SWAP3 SWAP2 SWAP3 PUSH2 0x3E65 JUMP JUMPDEST PUSH2 0x1BE8 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x1BF2 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST CALLVALUE PUSH2 0x1C29 JUMPI PUSH2 0x1C13 PUSH2 0x1C0E CALLDATASIZE PUSH1 0x4 PUSH2 0x8E6 JUMP JUMPDEST PUSH2 0x4059 JUMP JUMPDEST PUSH2 0x1C1B PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x1C25 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x2E8 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x1C40 PUSH2 0x1C33 JUMP JUMPDEST POP PUSH8 0x9A31110384E0B0C9 PUSH1 0x20 MSTORE PUSH1 0x14 MSTORE PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x1C69 PUSH2 0x1C5C JUMP JUMPDEST POP DUP1 PUSH2 0x1C84 PUSH2 0x1C7E PUSH4 0x37BC2195 PUSH1 0xE0 SHL PUSH2 0x3E0 JUMP JUMPDEST SWAP2 PUSH2 0x3E0 JUMP JUMPDEST EQ SWAP1 DUP2 ISZERO PUSH2 0x1C91 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x1C9B SWAP2 POP PUSH2 0x4138 JUMP JUMPDEST CODESIZE PUSH2 0x1C8D JUMP JUMPDEST PUSH32 0x6DB4061A20CA83A3BE756EE172BD37A029093AC5AFE4CE968C6D5435B43CB011 SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x1CDF SWAP2 PUSH2 0x1CDA PUSH2 0x1CD5 PUSH2 0x1CA1 JUMP JUMPDEST PUSH2 0x418E JUMP JUMPDEST PUSH2 0x1CE1 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x1CEB SWAP2 PUSH2 0x43A8 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x1CF7 SWAP2 PUSH2 0x1CC5 JUMP JUMPDEST JUMP JUMPDEST PUSH32 0xE02A0315B383857AC496E9D2B2546A699AFAEB4E5E83A1FDEF64376D0B74E5A5 SWAP1 JUMP JUMPDEST PUSH2 0x1D36 SWAP1 PUSH2 0x1D31 PUSH2 0x1D2C PUSH2 0x1CF9 JUMP JUMPDEST PUSH2 0x418E JUMP JUMPDEST PUSH2 0x1F21 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x1F PUSH1 0x20 SWAP2 ADD DIV SWAP1 JUMP JUMPDEST SHL SWAP1 JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x8 PUSH2 0x1D62 SWAP2 MUL SWAP2 PUSH2 0x1D5C PUSH1 0x0 NOT DUP5 PUSH2 0x1D42 JUMP JUMPDEST SWAP3 PUSH2 0x1D42 JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x1D85 PUSH2 0x1D80 PUSH2 0x1D8D SWAP4 PUSH2 0xBAD JUMP JUMPDEST PUSH2 0x1D6C JUMP JUMPDEST SWAP1 DUP4 SLOAD PUSH2 0x1D46 JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x1DA3 SWAP2 PUSH2 0x1D9D PUSH2 0x1C33 JUMP JUMPDEST SWAP2 PUSH2 0x1D6F JUMP JUMPDEST JUMP JUMPDEST JUMPDEST DUP2 DUP2 LT PUSH2 0x1DB1 JUMPI POP POP JUMP JUMPDEST DUP1 PUSH2 0x1DBF PUSH1 0x0 PUSH1 0x1 SWAP4 PUSH2 0x1D91 JUMP JUMPDEST ADD PUSH2 0x1DA6 JUMP JUMPDEST SWAP2 SWAP1 PUSH1 0x1F DUP2 GT PUSH2 0x1DD5 JUMPI JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x1DE1 PUSH2 0x1E06 SWAP4 PUSH2 0x598 JUMP JUMPDEST SWAP1 PUSH1 0x20 PUSH2 0x1DED DUP5 PUSH2 0x1D38 JUMP JUMPDEST DUP4 ADD SWAP4 LT PUSH2 0x1E0E JUMPI JUMPDEST PUSH2 0x1DFF SWAP1 PUSH2 0x1D38 JUMP JUMPDEST ADD SWAP1 PUSH2 0x1DA5 JUMP JUMPDEST CODESIZE DUP1 DUP1 PUSH2 0x1DD0 JUMP JUMPDEST SWAP2 POP PUSH2 0x1DFF DUP2 SWAP3 SWAP1 POP PUSH2 0x1DF6 JUMP JUMPDEST SWAP1 PUSH2 0x1E2D SWAP1 PUSH1 0x0 NOT SWAP1 PUSH1 0x8 MUL PUSH2 0x96E JUMP JUMPDEST NOT AND SWAP1 JUMP JUMPDEST DUP2 PUSH2 0x1E3C SWAP2 PUSH2 0x1E1C JUMP JUMPDEST SWAP1 PUSH1 0x2 MUL OR SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x1E4E DUP2 PUSH2 0x6D3 JUMP JUMPDEST SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x1F10 JUMPI PUSH2 0x1E72 DUP3 PUSH2 0x1E6C DUP6 SLOAD PUSH2 0x565 JUMP JUMPDEST DUP6 PUSH2 0x1DC5 JUMP JUMPDEST PUSH1 0x20 SWAP1 PUSH1 0x1F DUP4 GT PUSH1 0x1 EQ PUSH2 0x1EA7 JUMPI SWAP2 DUP1 SWAP2 PUSH2 0x1E96 SWAP4 PUSH1 0x0 SWAP3 PUSH2 0x1E9B JUMPI JUMPDEST POP POP PUSH2 0x1E32 JUMP JUMPDEST SWAP1 SSTORE JUMPDEST JUMP JUMPDEST SWAP1 SWAP2 POP ADD MLOAD CODESIZE DUP1 PUSH2 0x1E8F JUMP JUMPDEST PUSH1 0x1F NOT DUP4 AND SWAP2 PUSH2 0x1EB6 DUP6 PUSH2 0x598 JUMP JUMPDEST SWAP3 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT PUSH2 0x1EF8 JUMPI POP SWAP2 PUSH1 0x2 SWAP4 SWAP2 DUP6 PUSH1 0x1 SWAP7 SWAP5 LT PUSH2 0x1EDE JUMPI JUMPDEST POP POP POP MUL ADD SWAP1 SSTORE PUSH2 0x1E99 JUMP JUMPDEST PUSH2 0x1EEE SWAP2 ADD MLOAD PUSH1 0x1F DUP5 AND SWAP1 PUSH2 0x1E1C JUMP JUMPDEST SWAP1 SSTORE CODESIZE DUP1 DUP1 PUSH2 0x1ED2 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 PUSH1 0x1 DUP2 SWAP3 DUP8 DUP8 ADD MLOAD DUP2 SSTORE ADD SWAP6 ADD SWAP3 ADD PUSH2 0x1EBA JUMP JUMPDEST PUSH2 0x649 JUMP JUMPDEST SWAP1 PUSH2 0x1F1F SWAP2 PUSH2 0x1E44 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x1F2C SWAP1 PUSH1 0x8 PUSH2 0x1F15 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x1F37 SWAP1 PUSH2 0x1D1D JUMP JUMPDEST JUMP JUMPDEST PUSH32 0x70649EC320B507FEBAD3E8EF750E5F580B9AE32F9F50D4C7B121332C81971530 SWAP1 JUMP JUMPDEST PUSH2 0x1F76 SWAP1 PUSH2 0x1F71 PUSH2 0x1F6C PUSH2 0x1F39 JUMP JUMPDEST PUSH2 0x418E JUMP JUMPDEST PUSH2 0x1FF6 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x1F8C PUSH2 0x1F87 PUSH2 0x1F91 SWAP3 PUSH2 0x2F7 JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x2F7 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1F9D SWAP1 PUSH2 0x1F78 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1FA9 SWAP1 PUSH2 0x1F94 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x1FBD PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB SWAP2 PUSH2 0x1716 JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST PUSH2 0x1FD0 SWAP1 PUSH2 0x1F94 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x1FEB PUSH2 0x1FE6 PUSH2 0x1FF2 SWAP3 PUSH2 0x1FC7 JUMP JUMPDEST PUSH2 0x1FD3 JUMP JUMPDEST DUP3 SLOAD PUSH2 0x1FAC JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x2002 PUSH2 0x2009 SWAP2 PUSH2 0x1FA0 JUMP JUMPDEST PUSH1 0x6 PUSH2 0x1FD6 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x2014 SWAP1 PUSH2 0x1F5D JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x60 SWAP1 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x0 SWAP3 SWAP2 DUP1 SLOAD SWAP1 PUSH2 0x203B PUSH2 0x2034 DUP4 PUSH2 0x565 JUMP JUMPDEST DUP1 SWAP5 PUSH2 0x201B JUMP JUMPDEST SWAP2 PUSH1 0x1 DUP2 AND SWAP1 DUP2 PUSH1 0x0 EQ PUSH2 0x208F JUMPI POP PUSH1 0x1 EQ PUSH2 0x2057 JUMPI JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x2064 SWAP2 SWAP3 SWAP4 SWAP5 POP PUSH2 0x598 JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMPDEST DUP4 DUP3 LT PUSH2 0x207B JUMPI POP POP ADD SWAP1 CODESIZE DUP1 DUP1 PUSH2 0x2052 JUMP JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x20 SWAP3 SLOAD DUP5 DUP7 ADD MSTORE ADD SWAP2 ADD SWAP1 PUSH2 0x2068 JUMP JUMPDEST SWAP3 SWAP5 SWAP6 POP POP POP PUSH1 0xFF NOT AND DUP3 MSTORE DUP1 ISZERO ISZERO MUL ADD SWAP1 CODESIZE DUP1 DUP1 PUSH2 0x2052 JUMP JUMPDEST PUSH2 0x20CE PUSH2 0x20C5 SWAP3 PUSH1 0x20 SWAP3 PUSH2 0x20BC DUP2 PUSH2 0x6D3 JUMP JUMPDEST SWAP5 DUP6 DUP1 SWAP4 PUSH2 0x201B JUMP JUMPDEST SWAP4 DUP5 SWAP2 ADD PUSH2 0x6E0 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x2E6A736F6E000000000000000000000000000000000000000000000000000000 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x2106 PUSH1 0x5 DUP1 SWAP3 PUSH2 0x201B JUMP JUMPDEST PUSH2 0x210F DUP2 PUSH2 0x20D2 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST SWAP2 PUSH2 0x2124 PUSH2 0x212F SWAP4 PUSH2 0x212A SWAP4 PUSH2 0x2020 JUMP JUMPDEST SWAP1 PUSH2 0x20A9 JUMP JUMPDEST PUSH2 0x20FA JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x217C SWAP1 PUSH2 0x2141 PUSH2 0x2016 JUMP JUMPDEST POP PUSH2 0x2177 PUSH2 0x2150 PUSH1 0x9 SWAP3 PUSH2 0x4422 JUMP JUMPDEST SWAP2 PUSH2 0x2168 PUSH2 0x215C PUSH2 0x2E2 JUMP JUMPDEST SWAP4 DUP5 SWAP3 PUSH1 0x20 DUP5 ADD PUSH2 0x2113 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE SUB DUP3 PUSH2 0x65F JUMP JUMPDEST PUSH2 0x2132 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2188 SWAP1 PUSH2 0x1F78 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2194 SWAP1 PUSH2 0x217F JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x21A1 SWAP1 PUSH2 0x218B JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x0 SHR SWAP1 JUMP JUMPDEST PUSH2 0x21C1 PUSH2 0x21C6 SWAP2 PUSH2 0x21AF JUMP JUMPDEST PUSH2 0x972 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x21D3 SWAP1 SLOAD PUSH2 0x21B5 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x21EA PUSH2 0x21E5 PUSH2 0x21EF SWAP3 PUSH2 0x1713 JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x332 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x21FE PUSH2 0x2203 SWAP2 PUSH2 0x21AF JUMP JUMPDEST PUSH2 0xBAD JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x221D PUSH2 0x2218 PUSH2 0x2222 SWAP3 PUSH2 0x2206 JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x332 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2237 PUSH2 0x2232 DUP4 PUSH2 0x7A3 JUMP JUMPDEST PUSH2 0x78E JUMP JUMPDEST SWAP2 DUP3 MSTORE JUMP JUMPDEST PUSH2 0x2246 PUSH1 0x0 PUSH2 0x2225 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2251 PUSH2 0x223C JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2273 PUSH2 0x226E PUSH2 0x2267 PUSH1 0xF DUP6 SWAP1 PUSH2 0x2197 JUMP JUMPDEST DUP4 SWAP1 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x21C9 JUMP JUMPDEST DUP1 PUSH2 0x2287 PUSH2 0x2281 PUSH1 0x0 PUSH2 0x21D6 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST EQ PUSH2 0x2332 JUMPI PUSH2 0x2296 DUP2 BLOCKHASH PUSH2 0x21F2 JUMP JUMPDEST PUSH2 0x22A9 PUSH2 0x22A3 PUSH1 0x0 PUSH2 0x21D6 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST EQ ISZERO SWAP1 DUP2 ISZERO PUSH2 0x2315 JUMPI JUMPDEST POP PUSH2 0x22F8 JUMPI PUSH2 0x22F6 SWAP2 PUSH2 0x22DC PUSH1 0x0 PUSH2 0x22D7 PUSH2 0x22D0 PUSH1 0xF DUP6 SWAP1 PUSH2 0x2197 JUMP JUMPDEST DUP6 SWAP1 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x1D91 JUMP JUMPDEST SWAP1 PUSH2 0x22E7 PUSH1 0x1 PUSH2 0x2209 JUMP JUMPDEST SWAP1 PUSH2 0x22F0 PUSH2 0x2249 JUMP JUMPDEST SWAP3 PUSH2 0x4477 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 PUSH4 0x156F9043 PUSH1 0xE2 SHL DUP2 MSTORE DUP1 PUSH2 0x2311 PUSH1 0x4 DUP3 ADD PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP1 POP PUSH2 0x232A PUSH2 0x2324 NUMBER SWAP3 PUSH2 0x332 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST GT ISZERO CODESIZE PUSH2 0x22B3 JUMP JUMPDEST PUSH1 0x0 PUSH4 0x7DE832B5 PUSH1 0xE1 SHL DUP2 MSTORE DUP1 PUSH2 0x234B PUSH1 0x4 DUP3 ADD PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x235C SWAP2 CALLER SWAP2 SWAP1 SWAP2 PUSH2 0x44F2 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x236C SWAP1 PUSH2 0xB0C JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2379 SWAP1 PUSH2 0x2363 JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH2 0x2393 PUSH2 0x2398 SWAP2 PUSH2 0x21AF JUMP JUMPDEST PUSH2 0xF26 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x23A5 SWAP1 SLOAD PUSH2 0x2387 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH2 0x23C1 PUSH2 0x23C7 SWAP3 PUSH2 0x23B9 PUSH2 0x235E JUMP JUMPDEST POP PUSH1 0x4 PUSH2 0x236F JUMP JUMPDEST ADD PUSH2 0x239B JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x23D9 SWAP1 PUSH2 0xBAD JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x23FE PUSH2 0x2403 SWAP2 PUSH2 0x21AF JUMP JUMPDEST PUSH2 0x23E7 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2410 SWAP1 SLOAD PUSH2 0x23F2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x241D SWAP1 PUSH2 0x302 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST PUSH1 0xA0 SHR SWAP1 JUMP JUMPDEST PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0x2444 PUSH2 0x2449 SWAP2 PUSH2 0x2421 JUMP JUMPDEST PUSH2 0x2427 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2456 SWAP1 SLOAD PUSH2 0x2438 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2463 SWAP1 PUSH2 0x48C JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST PUSH2 0x2471 PUSH1 0x40 PUSH2 0x78E JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x24AB PUSH2 0x24A2 PUSH1 0x0 PUSH2 0x2485 PUSH2 0x2467 JUMP JUMPDEST SWAP5 PUSH2 0x249C PUSH2 0x2494 DUP4 DUP4 ADD PUSH2 0x2406 JUMP JUMPDEST DUP4 DUP9 ADD PUSH2 0x2413 JUMP JUMPDEST ADD PUSH2 0x244C JUMP JUMPDEST PUSH1 0x20 DUP5 ADD PUSH2 0x2459 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x24B6 SWAP1 PUSH2 0x2474 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x24C3 SWAP1 MLOAD PUSH2 0x302 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x24DA PUSH2 0x24D5 PUSH2 0x24DF SWAP3 PUSH2 0x1713 JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x2F7 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x24EB SWAP1 PUSH2 0x24C6 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x24F8 SWAP1 MLOAD PUSH2 0x48C JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x250F PUSH2 0x250A PUSH2 0x2514 SWAP3 PUSH2 0x48C JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x332 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x253C PUSH2 0x2542 SWAP2 SWAP4 SWAP3 SWAP4 PUSH2 0x332 JUMP JUMPDEST SWAP3 PUSH2 0x332 JUMP JUMPDEST SWAP2 PUSH2 0x254E DUP4 DUP3 MUL PUSH2 0x332 JUMP JUMPDEST SWAP3 DUP2 DUP5 DIV EQ SWAP1 ISZERO OR ISZERO PUSH2 0x255D JUMPI JUMP JUMPDEST PUSH2 0x2517 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x2584 PUSH2 0x258A SWAP2 PUSH2 0x332 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST SWAP1 DUP2 ISZERO PUSH2 0x2595 JUMPI DIV SWAP1 JUMP JUMPDEST PUSH2 0x2562 JUMP JUMPDEST PUSH2 0x25BD PUSH2 0x25C2 SWAP2 SWAP4 SWAP3 SWAP4 PUSH2 0x25AC PUSH2 0x23CA JUMP JUMPDEST POP PUSH2 0x25B5 PUSH2 0x1C33 JUMP JUMPDEST POP PUSH1 0x3 PUSH2 0x23CF JUMP JUMPDEST PUSH2 0x24AD JUMP JUMPDEST SWAP2 PUSH2 0x25CF PUSH1 0x0 DUP5 ADD PUSH2 0x24B9 JUMP JUMPDEST PUSH2 0x25EA PUSH2 0x25E4 PUSH2 0x25DF PUSH1 0x0 PUSH2 0x24E2 JUMP JUMPDEST PUSH2 0x302 JUMP JUMPDEST SWAP2 PUSH2 0x302 JUMP JUMPDEST EQ PUSH2 0x2637 JUMPI JUMPDEST PUSH1 0x0 PUSH2 0x262C PUSH2 0x2616 PUSH2 0x2633 SWAP4 PUSH2 0x2610 PUSH2 0x260B PUSH1 0x20 DUP10 ADD PUSH2 0x24EE JUMP JUMPDEST PUSH2 0x24FB JUMP JUMPDEST SWAP1 PUSH2 0x252D JUMP JUMPDEST PUSH2 0x2626 PUSH2 0x2621 PUSH2 0x45EA JUMP JUMPDEST PUSH2 0x24FB JUMP JUMPDEST SWAP1 PUSH2 0x2578 JUMP JUMPDEST SWAP4 ADD PUSH2 0x24B9 JUMP JUMPDEST SWAP2 SWAP1 JUMP JUMPDEST SWAP2 POP PUSH2 0x2633 PUSH1 0x0 PUSH2 0x262C PUSH2 0x2616 PUSH2 0x264E PUSH1 0x2 PUSH2 0x24AD JUMP JUMPDEST SWAP6 SWAP4 POP POP POP POP PUSH2 0x25F0 JUMP JUMPDEST PUSH2 0x2664 SWAP2 CALLDATASIZE SWAP2 PUSH2 0xA00 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2672 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x1351 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP7 SWAP4 SWAP7 SWAP6 SWAP1 SWAP5 SWAP2 SWAP3 SWAP6 PUSH2 0x2686 PUSH2 0x4601 JUMP JUMPDEST PUSH2 0x28BF JUMPI JUMPDEST DUP3 DUP8 SUB PUSH2 0x28B1 JUMPI PUSH1 0x60 SHL PUSH8 0x9A31110384E0B0C9 OR SWAP5 PUSH1 0x60 SHL PUSH8 0x9A31110384E0B0C9 OR SWAP2 DUP6 PUSH1 0x20 MSTORE DUP6 PUSH1 0x60 SHR SWAP6 DUP4 PUSH1 0x60 SHR SWAP4 DUP5 ISZERO PUSH2 0x28A3 JUMPI DUP8 CALLER SUB PUSH2 0x2887 JUMPI JUMPDEST DUP9 PUSH1 0x5 SHL DUP1 JUMPDEST PUSH2 0x2827 JUMPI POP POP POP DUP3 DUP7 PUSH1 0x20 PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH1 0x40 MLOAD PUSH1 0x40 DUP2 MSTORE DUP12 DUP14 DUP2 PUSH1 0x5 SHL SWAP5 DUP3 DUP7 SWAP4 PUSH1 0x40 DUP7 ADD MSTORE DUP4 DUP14 PUSH1 0x60 DUP8 ADD CALLDATACOPY DUP4 PUSH1 0x60 ADD DUP3 DUP7 ADD MSTORE PUSH1 0x60 DUP5 DUP7 ADD ADD SWAP1 DUP2 MSTORE ADD CALLDATACOPY PUSH1 0x80 CALLER SWAP4 DUP1 ADD ADD SWAP1 LOG4 PUSH2 0x273D PUSH2 0x460F JUMP JUMPDEST PUSH2 0x280A JUMPI JUMPDEST POP DUP2 EXTCODESIZE PUSH2 0x2753 JUMPI JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP1 SWAP8 DUP7 SWAP5 PUSH1 0x0 MSTORE DUP1 PUSH1 0xC0 PUSH1 0x40 MLOAD SWAP12 DUP13 SWAP11 PUSH4 0xBC197C81 DUP13 MSTORE CALLER DUP7 DUP14 ADD MSTORE PUSH1 0x40 DUP13 ADD MSTORE PUSH1 0xA0 PUSH1 0x60 DUP13 ADD MSTORE DUP11 DUP4 PUSH1 0x5 SHL SWAP10 DUP11 SWAP6 DUP7 SWAP5 DUP6 SWAP4 ADD MSTORE PUSH1 0xE0 DUP14 ADD CALLDATACOPY DUP2 PUSH1 0xC0 ADD PUSH1 0x80 DUP13 ADD MSTORE PUSH1 0xE0 DUP3 DUP13 ADD ADD SWAP3 DUP4 MSTORE DUP5 DUP4 ADD CALLDATACOPY DUP2 DUP1 PUSH1 0xE0 ADD ADD PUSH1 0xA0 DUP11 ADD MSTORE ADD ADD DUP4 DUP2 MSTORE ADD CALLDATACOPY DUP1 ADD ADD PUSH2 0x104 ADD PUSH1 0x1C PUSH1 0x40 MLOAD ADD PUSH1 0x0 DUP1 MLOAD GAS CALL ISZERO PUSH2 0x27FB JUMPI JUMPDEST PUSH4 0xBC197C81 PUSH1 0xE0 SHL SWAP1 MLOAD SUB PUSH2 0x27ED JUMPI CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x274A JUMP JUMPDEST PUSH4 0x9C05499B PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x27D2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH2 0x2821 SWAP1 DUP7 SWAP1 DUP5 SWAP1 DUP7 SWAP1 DUP11 DUP13 SWAP2 SWAP3 DUP8 SWAP5 DUP12 SWAP7 PUSH2 0x461D JUMP JUMPDEST CODESIZE PUSH2 0x2742 JUMP JUMPDEST PUSH1 0x20 SWAP1 SUB DUP1 DUP12 ADD CALLDATALOAD DUP4 PUSH1 0x20 MSTORE DUP2 DUP9 ADD CALLDATALOAD PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP1 SLOAD DUP1 DUP4 GT PUSH2 0x2879 JUMPI DUP3 SWAP1 SUB SWAP1 SSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD SWAP1 DUP2 ADD SWAP1 DUP2 LT PUSH2 0x286B JUMPI DUP3 SWAP2 SSTORE PUSH2 0x26D0 JUMP JUMPDEST PUSH4 0x1336CEA PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0xF4D678B8 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST CALLER PUSH1 0x0 MSTORE PUSH1 0x34 PUSH1 0xC KECCAK256 SLOAD PUSH2 0x26CA JUMPI PUSH4 0x4B6E7F18 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0xEA553B34 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0x3B800A46 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH2 0x28E2 DUP5 DUP9 PUSH2 0x28DC DUP12 DUP8 SWAP1 PUSH2 0x28D6 DUP9 SWAP5 DUP13 SWAP7 PUSH2 0x2659 JUMP JUMPDEST POP PUSH2 0x2659 JUMP JUMPDEST POP PUSH2 0x2667 JUMP JUMPDEST POP PUSH2 0x268B JUMP JUMPDEST SWAP1 PUSH2 0x2903 SWAP2 PUSH2 0x28FE PUSH2 0x28F9 DUP3 PUSH2 0x23A8 JUMP JUMPDEST PUSH2 0x418E JUMP JUMPDEST PUSH2 0x2905 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x290F SWAP2 PUSH2 0x4667 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x291B SWAP2 PUSH2 0x28E8 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x20 PUSH32 0x20726F6C657320666F722073656C660000000000000000000000000000000000 SWAP2 PUSH32 0x416363657373436F6E74726F6C3A2063616E206F6E6C792072656E6F756E6365 PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x2978 PUSH1 0x2F PUSH1 0x40 SWAP3 PUSH2 0x6D7 JUMP JUMPDEST PUSH2 0x2981 DUP2 PUSH2 0x291D JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x299B SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x296B JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x29A5 JUMPI JUMP JUMPDEST PUSH2 0x29AD PUSH2 0x2E2 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x29C3 PUSH1 0x4 DUP3 ADD PUSH2 0x2985 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP1 PUSH2 0x29F4 SWAP2 PUSH2 0x29EF DUP3 PUSH2 0x29E9 PUSH2 0x29E3 PUSH2 0x29DE PUSH2 0x4691 JUMP JUMPDEST PUSH2 0x302 JUMP JUMPDEST SWAP2 PUSH2 0x302 JUMP JUMPDEST EQ PUSH2 0x299E JUMP JUMPDEST PUSH2 0x469E JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x60 SWAP1 JUMP JUMPDEST SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2A07 PUSH2 0x29F6 JUMP JUMPDEST POP DUP3 SUB PUSH2 0x2A5E JUMPI PUSH1 0x40 MLOAD SWAP4 DUP3 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP3 PUSH1 0x5 SHL DUP1 DUP5 DUP2 ADD PUSH1 0x40 MSTORE JUMPDEST PUSH2 0x2A2F JUMPI POP POP POP POP JUMP JUMPDEST PUSH1 0x20 SWAP1 SUB DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x60 SHL PUSH8 0x9A31110384E0B0C9 OR PUSH1 0x20 MSTORE DUP1 DUP4 ADD CALLDATALOAD PUSH1 0x0 MSTORE DUP1 PUSH1 0x40 PUSH1 0x0 KECCAK256 SLOAD DUP2 DUP7 ADD MSTORE PUSH2 0x2A25 JUMP JUMPDEST PUSH4 0x3B800A46 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH32 0xBAA5EE745DE68A3095827D2EE7DD2043AFC932834D02CC1B8BE3DA78577F6C1A SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2AAB SWAP3 SWAP2 PUSH2 0x2AA6 PUSH2 0x2AA1 PUSH2 0x2A6C JUMP JUMPDEST PUSH2 0x418E JUMP JUMPDEST PUSH2 0x2B10 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x2ABA PUSH1 0x0 NOT SWAP2 PUSH2 0x1716 JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST PUSH2 0x2ACD SWAP1 PUSH2 0x21AF JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2AE5 PUSH2 0x2AE0 PUSH2 0x2AEC SWAP3 PUSH2 0x2363 JUMP JUMPDEST PUSH2 0x2AC4 JUMP JUMPDEST DUP3 SLOAD PUSH2 0x2AAD JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST SWAP1 PUSH2 0x2B05 PUSH2 0x2B00 PUSH2 0x2B0C SWAP3 PUSH2 0xBAD JUMP JUMPDEST PUSH2 0x1D6C JUMP JUMPDEST DUP3 SLOAD PUSH2 0x2AAD JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x2B4F SWAP3 SWAP2 PUSH2 0x2B2D PUSH2 0x2B4A SWAP3 PUSH2 0x2B28 PUSH1 0xC DUP7 SWAP1 PUSH2 0xF0E JUMP JUMPDEST PUSH2 0x2AD0 JUMP JUMPDEST PUSH2 0x2B42 DUP2 PUSH2 0x2B3D PUSH1 0xD DUP7 SWAP1 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x2AF0 JUMP JUMPDEST SWAP2 PUSH1 0xE PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x2AF0 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x2B5C SWAP3 SWAP2 PUSH2 0x2A90 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x2B71 SWAP2 PUSH2 0x2B6B PUSH2 0x1C33 JUMP JUMPDEST POP PUSH2 0x470E JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2B91 SWAP3 SWAP2 PUSH2 0x2B8C PUSH2 0x2B87 PUSH2 0x1CA1 JUMP JUMPDEST PUSH2 0x418E JUMP JUMPDEST PUSH2 0x2B93 JUMP JUMPDEST JUMP JUMPDEST SWAP2 PUSH2 0x2BA0 SWAP3 SWAP2 SWAP1 SWAP2 PUSH2 0x48F4 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x2BAD SWAP3 SWAP2 PUSH2 0x2B76 JUMP JUMPDEST JUMP JUMPDEST PUSH32 0x9F2DF0FED2C77648DE5860A4CC508CD0818C85B8B8A1AB4CEEEF8D981C8956A6 SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2BEF SWAP4 SWAP3 SWAP2 PUSH2 0x2BEA PUSH2 0x2BE5 PUSH2 0x2BAF JUMP JUMPDEST PUSH2 0x418E JUMP JUMPDEST PUSH2 0x2BF1 JUMP JUMPDEST JUMP JUMPDEST SWAP2 PUSH2 0x2BFF SWAP4 SWAP2 SWAP1 SWAP2 SWAP3 PUSH2 0x4477 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x2C0D SWAP4 SWAP3 SWAP2 PUSH2 0x2BD3 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x2C28 SWAP1 PUSH2 0x2C23 PUSH2 0x2C1E PUSH2 0x1CF9 JUMP JUMPDEST PUSH2 0x418E JUMP JUMPDEST PUSH2 0x2C2A JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x2C35 SWAP1 PUSH1 0x9 PUSH2 0x1F15 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x2C40 SWAP1 PUSH2 0x2C0F JUMP JUMPDEST JUMP JUMPDEST SWAP2 PUSH2 0x2C6C SWAP8 SWAP6 SWAP4 SWAP2 SWAP7 SWAP5 SWAP3 PUSH2 0x2C5F PUSH2 0x2C58 PUSH2 0x2A6C JUMP JUMPDEST DUP3 SWAP1 PUSH2 0x4667 JUMP JUMPDEST SWAP7 SWAP1 SWAP2 SWAP3 SWAP4 SWAP5 SWAP6 SWAP7 PUSH2 0x4977 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x2C78 SWAP1 PUSH2 0x2363 JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2CA9 PUSH2 0x2CA4 PUSH2 0x2CAE SWAP4 PUSH2 0x2C9C PUSH2 0x23CA JUMP JUMPDEST POP PUSH1 0x5 PUSH2 0x2C6E JUMP JUMPDEST PUSH2 0x2C86 JUMP JUMPDEST PUSH2 0x49C6 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x2CBB SWAP1 PUSH2 0x218B JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH2 0x2CDB PUSH2 0x2CE0 SWAP2 PUSH2 0x21AF JUMP JUMPDEST PUSH2 0x2CC9 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2CED SWAP1 SLOAD PUSH2 0x2CCF JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2D18 SWAP2 PUSH1 0x0 PUSH2 0x2D0D PUSH2 0x2D13 SWAP4 PUSH2 0x2D05 PUSH2 0x1C5C JUMP JUMPDEST POP PUSH1 0x4 PUSH2 0x236F JUMP JUMPDEST ADD PUSH2 0x2CB1 JUMP JUMPDEST PUSH2 0x2CE3 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2D34 SWAP1 PUSH2 0x2D2F PUSH2 0x2D2A PUSH2 0x1CF9 JUMP JUMPDEST PUSH2 0x418E JUMP JUMPDEST PUSH2 0x2D36 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x2D41 SWAP1 PUSH1 0xA PUSH2 0x1F15 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x2D4C SWAP1 PUSH2 0x2D1B JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x2D65 PUSH2 0x2D6A SWAP2 PUSH2 0x21AF JUMP JUMPDEST PUSH2 0x2D4E JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2D77 SWAP1 SLOAD PUSH2 0x2D59 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2D83 SWAP1 PUSH2 0x217F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0xE0 SHL SWAP1 JUMP JUMPDEST SWAP1 POP MLOAD SWAP1 PUSH2 0x2D9E DUP3 PUSH2 0xB0F JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x2DBA JUMPI PUSH2 0x2DB7 SWAP2 PUSH1 0x0 ADD PUSH2 0x2D91 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST POP PUSH2 0x2DCE SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x323 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2DDA SWAP1 PUSH2 0x302 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST POP PUSH2 0x2DED SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x401 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2DF9 SWAP1 PUSH2 0x3E0 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST POP PUSH2 0x2E0C SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0xB24 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2E18 SWAP1 PUSH2 0xB0C JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SUB DUP3 CALLDATASIZE SUB SUB DUP2 SLT ISZERO PUSH2 0x2E6C JUMPI ADD PUSH1 0x20 DUP2 CALLDATALOAD SWAP2 ADD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2E67 JUMPI PUSH1 0x1 DUP3 MUL CALLDATASIZE SUB DUP4 SGT PUSH2 0x2E62 JUMPI JUMP JUMPDEST PUSH2 0x2E21 JUMP JUMPDEST PUSH2 0x2E1C JUMP JUMPDEST PUSH2 0x2E26 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x2E94 DUP2 PUSH2 0x2E8D DUP2 PUSH2 0x2E99 SWAP6 PUSH2 0x2E71 JUMP JUMPDEST DUP1 SWAP6 PUSH2 0x7C6 JUMP JUMPDEST PUSH2 0x63F JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST SWAP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x40 SUB DUP3 CALLDATASIZE SUB SUB DUP2 SLT ISZERO PUSH2 0x2EB3 JUMPI ADD SWAP1 JUMP JUMPDEST PUSH2 0x2E26 JUMP JUMPDEST SWAP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SUB DUP3 CALLDATASIZE SUB SUB DUP2 SLT ISZERO PUSH2 0x2EF9 JUMPI ADD PUSH1 0x20 DUP2 CALLDATALOAD SWAP2 ADD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x2EF4 JUMPI PUSH1 0x1 DUP3 MUL CALLDATASIZE SUB DUP4 SGT PUSH2 0x2EEF JUMPI JUMP JUMPDEST PUSH2 0x2E21 JUMP JUMPDEST PUSH2 0x2E1C JUMP JUMPDEST PUSH2 0x2E26 JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x2F18 DUP2 PUSH2 0x2F11 DUP2 PUSH2 0x2F1D SWAP6 PUSH2 0x58F JUMP JUMPDEST DUP1 SWAP6 PUSH2 0x7C6 JUMP JUMPDEST PUSH2 0x63F JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0x2F37 DUP2 PUSH2 0x2F21 JUMP JUMPDEST SUB PUSH2 0x2F3E JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x2F50 DUP3 PUSH2 0x2F2E JUMP JUMPDEST JUMP JUMPDEST POP PUSH2 0x2F61 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x2F43 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2F6D SWAP1 PUSH2 0x2F21 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP1 PUSH2 0x2FAF SWAP1 PUSH1 0x20 PUSH2 0x2FA7 PUSH2 0x2F9D PUSH1 0x40 DUP5 ADD PUSH2 0x2F8F PUSH1 0x0 DUP9 ADD DUP9 PUSH2 0x2EB8 JUMP JUMPDEST SWAP1 DUP7 DUP4 SUB PUSH1 0x0 DUP9 ADD MSTORE PUSH2 0x2EFE JUMP JUMPDEST SWAP5 DUP3 DUP2 ADD SWAP1 PUSH2 0x2F52 JUMP JUMPDEST SWAP2 ADD SWAP1 PUSH2 0x2F64 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x305C SWAP2 PUSH2 0x304E PUSH2 0x3043 PUSH1 0xC0 DUP4 ADD PUSH2 0x2FDA PUSH2 0x2FD0 PUSH1 0x0 DUP8 ADD DUP8 PUSH2 0x2DBF JUMP JUMPDEST PUSH1 0x0 DUP7 ADD SWAP1 PUSH2 0x2DD1 JUMP JUMPDEST PUSH2 0x2FF4 PUSH2 0x2FEA PUSH1 0x20 DUP8 ADD DUP8 PUSH2 0x2DDE JUMP JUMPDEST PUSH1 0x20 DUP7 ADD SWAP1 PUSH2 0x2DF0 JUMP JUMPDEST PUSH2 0x300E PUSH2 0x3004 PUSH1 0x40 DUP8 ADD DUP8 PUSH2 0x2DFD JUMP JUMPDEST PUSH1 0x40 DUP7 ADD SWAP1 PUSH2 0x2E0F JUMP JUMPDEST PUSH2 0x3028 PUSH2 0x301E PUSH1 0x60 DUP8 ADD DUP8 PUSH2 0x2DFD JUMP JUMPDEST PUSH1 0x60 DUP7 ADD SWAP1 PUSH2 0x2E0F JUMP JUMPDEST PUSH2 0x3035 PUSH1 0x80 DUP7 ADD DUP7 PUSH2 0x2E2B JUMP JUMPDEST SWAP1 DUP6 DUP4 SUB PUSH1 0x80 DUP8 ADD MSTORE PUSH2 0x2E7A JUMP JUMPDEST SWAP3 PUSH1 0xA0 DUP2 ADD SWAP1 PUSH2 0x2E9D JUMP JUMPDEST SWAP1 PUSH1 0xA0 DUP2 DUP5 SUB SWAP2 ADD MSTORE PUSH2 0x2F71 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP4 SWAP3 SWAP1 PUSH2 0x308B PUSH1 0x40 SWAP2 PUSH2 0x3093 SWAP5 PUSH2 0x307E PUSH1 0x60 DUP10 ADD SWAP3 PUSH1 0x0 DUP11 ADD SWAP1 PUSH2 0xC5E JUMP JUMPDEST DUP8 DUP3 SUB PUSH1 0x20 DUP10 ADD MSTORE PUSH2 0x2FB2 JUMP JUMPDEST SWAP5 ADD SWAP1 PUSH2 0xB52 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x309D PUSH2 0x2E2 JUMP JUMPDEST RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST SWAP2 POP PUSH1 0x20 SWAP1 PUSH2 0x30B3 PUSH2 0x235E JUMP JUMPDEST POP PUSH2 0x30C6 PUSH2 0x30C1 PUSH1 0x6 PUSH2 0x2D6D JUMP JUMPDEST PUSH2 0x2D7A JUMP JUMPDEST PUSH2 0x30F2 PUSH4 0x3808A90B SWAP5 SWAP3 SWAP5 PUSH2 0x30FD PUSH2 0x30DE PUSH1 0x7 PUSH2 0x239B JUMP JUMPDEST PUSH2 0x30E6 PUSH2 0x2E2 JUMP JUMPDEST SWAP8 DUP9 SWAP7 DUP8 SWAP6 DUP7 SWAP6 PUSH2 0x2D8B JUMP JUMPDEST DUP6 MSTORE PUSH1 0x4 DUP6 ADD PUSH2 0x305F JUMP JUMPDEST SUB SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x3142 JUMPI PUSH1 0x0 SWAP2 PUSH2 0x3114 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x3135 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x313B JUMPI JUMPDEST PUSH2 0x312D DUP2 DUP4 PUSH2 0x65F JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x2DA0 JUMP JUMPDEST CODESIZE PUSH2 0x3110 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x3123 JUMP JUMPDEST PUSH2 0x3095 JUMP JUMPDEST SWAP1 ISZERO ISZERO PUSH8 0x9A31110384E0B0C9 PUSH1 0x20 MSTORE CALLER PUSH1 0x14 MSTORE DUP2 PUSH1 0x0 MSTORE DUP1 PUSH1 0x34 PUSH1 0xC KECCAK256 SSTORE PUSH1 0x0 MSTORE PUSH1 0x60 SHL PUSH1 0x60 SHR CALLER PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 PUSH1 0x20 PUSH1 0x0 LOG3 JUMP JUMPDEST PUSH2 0x31A4 SWAP2 CALLER SWAP2 SWAP1 SWAP2 PUSH2 0x49FF JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x31C2 SWAP4 SWAP3 SWAP2 PUSH2 0x31BD PUSH2 0x31B8 PUSH2 0x2BAF JUMP JUMPDEST PUSH2 0x418E JUMP JUMPDEST PUSH2 0x31C4 JUMP JUMPDEST JUMP JUMPDEST SWAP2 PUSH2 0x31D2 SWAP4 SWAP2 SWAP1 SWAP2 SWAP3 PUSH2 0x4A51 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x31E0 SWAP4 SWAP3 SWAP2 PUSH2 0x31A6 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x3201 PUSH2 0x31FC PUSH2 0x3206 SWAP3 PUSH2 0x31F4 PUSH2 0x1C33 JUMP JUMPDEST POP PUSH1 0x5 PUSH2 0x2C6E JUMP JUMPDEST PUSH2 0x2C86 JUMP JUMPDEST PUSH2 0x4B25 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x3224 SWAP2 PUSH2 0x321F PUSH2 0x321A DUP3 PUSH2 0x23A8 JUMP JUMPDEST PUSH2 0x418E JUMP JUMPDEST PUSH2 0x3226 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x3230 SWAP2 PUSH2 0x469E JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x323C SWAP2 PUSH2 0x3209 JUMP JUMPDEST JUMP JUMPDEST SWAP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SUB DUP3 CALLDATASIZE SUB SUB DUP2 SLT ISZERO PUSH2 0x327F JUMPI ADD PUSH1 0x20 DUP2 CALLDATALOAD SWAP2 ADD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x327A JUMPI PUSH1 0x20 DUP3 MUL CALLDATASIZE SUB DUP4 SGT PUSH2 0x3275 JUMPI JUMP JUMPDEST PUSH2 0x2E21 JUMP JUMPDEST PUSH2 0x2E1C JUMP JUMPDEST PUSH2 0x2E26 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x329D DUP2 PUSH1 0x20 SWAP4 PUSH2 0x2DD1 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP2 PUSH2 0x32B5 DUP3 PUSH2 0x32BB SWAP3 PUSH2 0x3284 JUMP JUMPDEST SWAP3 PUSH2 0x328D JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x0 SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x32CF JUMPI POP POP POP POP SWAP1 JUMP JUMPDEST SWAP1 SWAP2 SWAP3 SWAP4 PUSH2 0x32F1 PUSH2 0x32EB PUSH1 0x1 SWAP3 PUSH2 0x32E6 DUP9 DUP7 PUSH2 0x2DBF JUMP JUMPDEST PUSH2 0x3290 JUMP JUMPDEST SWAP6 PUSH2 0x32A1 JUMP JUMPDEST SWAP3 ADD SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x32C1 JUMP JUMPDEST SWAP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SUB DUP3 CALLDATASIZE SUB SUB DUP2 SLT ISZERO PUSH2 0x333D JUMPI ADD PUSH1 0x20 DUP2 CALLDATALOAD SWAP2 ADD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x3338 JUMPI PUSH1 0x20 DUP3 MUL CALLDATASIZE SUB DUP4 SGT PUSH2 0x3333 JUMPI JUMP JUMPDEST PUSH2 0x2E21 JUMP JUMPDEST PUSH2 0x2E1C JUMP JUMPDEST PUSH2 0x2E26 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3357 SWAP1 PUSH2 0x42F JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP1 PUSH2 0x3368 DUP2 PUSH1 0x20 SWAP4 PUSH2 0x334E JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST POP PUSH2 0x337B SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x179A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP2 PUSH2 0x3392 DUP3 PUSH2 0x3398 SWAP3 PUSH2 0x3342 JUMP JUMPDEST SWAP3 PUSH2 0x334B JUMP JUMPDEST SWAP1 DUP2 PUSH1 0x0 SWAP1 JUMPDEST DUP3 DUP3 LT PUSH2 0x33AC JUMPI POP POP POP POP SWAP1 JUMP JUMPDEST SWAP1 SWAP2 SWAP3 SWAP4 PUSH2 0x33CE PUSH2 0x33C8 PUSH1 0x1 SWAP3 PUSH2 0x33C3 DUP9 DUP7 PUSH2 0x336C JUMP JUMPDEST PUSH2 0x335B JUMP JUMPDEST SWAP6 PUSH2 0x337E JUMP JUMPDEST SWAP3 ADD SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x339E JUMP JUMPDEST SWAP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SUB DUP3 CALLDATASIZE SUB SUB DUP2 SLT ISZERO PUSH2 0x341A JUMPI ADD PUSH1 0x20 DUP2 CALLDATALOAD SWAP2 ADD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x3415 JUMPI PUSH1 0x20 DUP3 MUL CALLDATASIZE SUB DUP4 SGT PUSH2 0x3410 JUMPI JUMP JUMPDEST PUSH2 0x2E21 JUMP JUMPDEST PUSH2 0x2E1C JUMP JUMPDEST PUSH2 0x2E26 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 CALLDATACOPY JUMP JUMPDEST SWAP1 SWAP2 DUP3 PUSH2 0x3449 SWAP2 PUSH2 0x342B JUMP JUMPDEST SWAP2 PUSH1 0x1 DUP1 PUSH1 0xFB SHL SUB DUP2 GT PUSH2 0x346C JUMPI DUP3 SWAP2 PUSH1 0x20 PUSH2 0x3468 SWAP3 MUL SWAP4 DUP5 SWAP2 PUSH2 0x3439 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x3434 JUMP JUMPDEST SWAP1 PUSH2 0x347C SWAP3 SWAP2 PUSH2 0x343D JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SUB DUP3 CALLDATASIZE SUB SUB DUP2 SLT ISZERO PUSH2 0x34C0 JUMPI ADD PUSH1 0x20 DUP2 CALLDATALOAD SWAP2 ADD SWAP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x34BB JUMPI PUSH1 0x20 DUP3 MUL CALLDATASIZE SUB DUP4 SGT PUSH2 0x34B6 JUMPI JUMP JUMPDEST PUSH2 0x2E21 JUMP JUMPDEST PUSH2 0x2E1C JUMP JUMPDEST PUSH2 0x2E26 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP2 DUP2 PUSH2 0x34D6 SWAP2 PUSH2 0x341F JUMP JUMPDEST SWAP1 DUP2 PUSH2 0x34E7 PUSH1 0x20 DUP4 MUL DUP5 ADD SWAP5 PUSH2 0x3428 JUMP JUMPDEST SWAP3 DUP4 PUSH1 0x0 SWAP3 JUMPDEST DUP5 DUP5 LT PUSH2 0x34FD JUMPI POP POP POP POP POP POP SWAP1 JUMP JUMPDEST SWAP1 SWAP2 SWAP3 SWAP4 SWAP5 SWAP6 PUSH1 0x20 PUSH2 0x3529 PUSH2 0x3523 DUP4 DUP6 PUSH1 0x1 SWAP6 SUB DUP9 MSTORE PUSH2 0x351D DUP12 DUP9 PUSH2 0x347F JUMP JUMPDEST SWAP1 PUSH2 0x3471 JUMP JUMPDEST SWAP9 PUSH2 0x34C5 JUMP JUMPDEST SWAP5 ADD SWAP5 ADD SWAP3 SWAP5 SWAP4 SWAP2 SWAP1 PUSH2 0x34ED JUMP JUMPDEST PUSH2 0x35B5 SWAP2 PUSH2 0x35A7 PUSH2 0x359C PUSH2 0x3581 PUSH2 0x3566 PUSH1 0x80 DUP6 ADD PUSH2 0x3558 PUSH1 0x0 DUP9 ADD DUP9 PUSH2 0x323E JUMP JUMPDEST SWAP1 DUP8 DUP4 SUB PUSH1 0x0 DUP10 ADD MSTORE PUSH2 0x32A7 JUMP JUMPDEST PUSH2 0x3573 PUSH1 0x20 DUP8 ADD DUP8 PUSH2 0x32FC JUMP JUMPDEST SWAP1 DUP7 DUP4 SUB PUSH1 0x20 DUP9 ADD MSTORE PUSH2 0x3384 JUMP JUMPDEST PUSH2 0x358E PUSH1 0x40 DUP7 ADD DUP7 PUSH2 0x33D9 JUMP JUMPDEST SWAP1 DUP6 DUP4 SUB PUSH1 0x40 DUP8 ADD MSTORE PUSH2 0x34CB JUMP JUMPDEST SWAP3 PUSH1 0x60 DUP2 ADD SWAP1 PUSH2 0x33D9 JUMP JUMPDEST SWAP2 PUSH1 0x60 DUP2 DUP6 SUB SWAP2 ADD MSTORE PUSH2 0x34CB JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP2 PUSH2 0x35DC SWAP3 PUSH2 0x35CF PUSH1 0x40 DUP3 ADD SWAP4 PUSH1 0x0 DUP4 ADD SWAP1 PUSH2 0x387 JUMP JUMPDEST PUSH1 0x20 DUP2 DUP5 SUB SWAP2 ADD MSTORE PUSH2 0x3537 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3601 JUMPI PUSH1 0x20 DUP1 SWAP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH2 0x649 JUMP JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x361B PUSH2 0x3616 DUP3 PUSH2 0x35E9 JUMP JUMPDEST PUSH2 0x78E JUMP JUMPDEST SWAP4 DUP2 DUP6 MSTORE PUSH1 0x20 DUP1 DUP7 ADD SWAP3 MUL DUP4 ADD SWAP3 DUP2 DUP5 GT PUSH2 0x3658 JUMPI SWAP2 JUMPDEST DUP4 DUP4 LT PUSH2 0x363F JUMPI POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 SWAP2 PUSH2 0x364D DUP5 DUP7 PUSH2 0xB24 JUMP JUMPDEST DUP2 MSTORE ADD SWAP3 ADD SWAP2 PUSH2 0x3632 JUMP JUMPDEST PUSH2 0x9FB JUMP JUMPDEST PUSH2 0x3668 SWAP2 CALLDATASIZE SWAP2 PUSH2 0x3606 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3674 SWAP1 PUSH2 0x332 JUMP JUMPDEST PUSH1 0x0 DUP2 EQ PUSH2 0x3683 JUMPI PUSH1 0x1 SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH2 0x2517 JUMP JUMPDEST SWAP1 PUSH2 0x3692 SWAP1 PUSH2 0xBAD JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 CALLDATALOAD SWAP1 PUSH1 0x1 PUSH1 0x20 SUB DUP2 CALLDATASIZE SUB SUB DUP3 SLT ISZERO PUSH2 0x36F1 JUMPI ADD DUP1 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x36EC JUMPI PUSH1 0x20 ADD SWAP2 PUSH1 0x20 DUP3 MUL CALLDATASIZE SUB DUP4 SGT PUSH2 0x36E7 JUMPI JUMP JUMPDEST PUSH2 0x36AA JUMP JUMPDEST PUSH2 0x36A5 JUMP JUMPDEST PUSH2 0x36A0 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x3720 JUMPI PUSH1 0x20 MUL ADD SWAP1 JUMP JUMPDEST PUSH2 0x36FA JUMP JUMPDEST CALLDATALOAD PUSH2 0x372F DUP2 PUSH2 0x30E JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 CALLDATALOAD SWAP1 PUSH1 0x1 PUSH1 0x20 SUB DUP2 CALLDATASIZE SUB SUB DUP3 SLT ISZERO PUSH2 0x3774 JUMPI ADD DUP1 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x376F JUMPI PUSH1 0x20 ADD SWAP2 PUSH1 0x20 DUP3 MUL CALLDATASIZE SUB DUP4 SGT PUSH2 0x376A JUMPI JUMP JUMPDEST PUSH2 0x36AA JUMP JUMPDEST PUSH2 0x36A5 JUMP JUMPDEST PUSH2 0x36A0 JUMP JUMPDEST SWAP1 CALLDATALOAD SWAP1 PUSH1 0x1 PUSH1 0x20 SUB DUP2 CALLDATASIZE SUB SUB DUP3 SLT ISZERO PUSH2 0x37BB JUMPI ADD DUP1 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x37B6 JUMPI PUSH1 0x20 ADD SWAP2 PUSH1 0x20 DUP3 MUL CALLDATASIZE SUB DUP4 SGT PUSH2 0x37B1 JUMPI JUMP JUMPDEST PUSH2 0x36AA JUMP JUMPDEST PUSH2 0x36A5 JUMP JUMPDEST PUSH2 0x36A0 JUMP JUMPDEST SWAP1 DUP3 LT ISZERO PUSH2 0x37DB JUMPI PUSH1 0x20 PUSH2 0x37D7 SWAP3 MUL DUP2 ADD SWAP1 PUSH2 0x3779 JUMP JUMPDEST SWAP1 SWAP2 JUMP JUMPDEST PUSH2 0x36FA JUMP JUMPDEST SWAP1 CALLDATALOAD SWAP1 PUSH1 0x1 PUSH1 0x20 SUB DUP2 CALLDATASIZE SUB SUB DUP3 SLT ISZERO PUSH2 0x3822 JUMPI ADD DUP1 CALLDATALOAD SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT PUSH2 0x381D JUMPI PUSH1 0x20 ADD SWAP2 PUSH1 0x20 DUP3 MUL CALLDATASIZE SUB DUP4 SGT PUSH2 0x3818 JUMPI JUMP JUMPDEST PUSH2 0x36AA JUMP JUMPDEST PUSH2 0x36A5 JUMP JUMPDEST PUSH2 0x36A0 JUMP JUMPDEST SWAP2 SWAP1 DUP2 LT ISZERO PUSH2 0x3837 JUMPI PUSH1 0x20 MUL ADD SWAP1 JUMP JUMPDEST PUSH2 0x36FA JUMP JUMPDEST CALLDATALOAD PUSH2 0x3846 DUP2 PUSH2 0x1785 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3852 SWAP1 PUSH2 0x1F78 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x385E SWAP1 PUSH2 0x3849 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x386A SWAP1 PUSH2 0x217F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP2 SUB SLT PUSH2 0x3878 JUMPI JUMP JUMPDEST PUSH2 0x2ED JUMP JUMPDEST SWAP1 SWAP2 DUP3 PUSH2 0x3889 SWAP2 PUSH2 0x1090 JUMP JUMPDEST SWAP2 PUSH1 0x1 DUP1 PUSH1 0xFB SHL SUB DUP2 GT PUSH2 0x38AC JUMPI DUP3 SWAP2 PUSH1 0x20 PUSH2 0x38A8 SWAP3 MUL SWAP4 DUP5 SWAP2 PUSH2 0x3439 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x3434 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH2 0x38D9 PUSH2 0x38E2 PUSH1 0x20 SWAP4 PUSH2 0x38E7 SWAP4 PUSH2 0x38D0 DUP2 PUSH2 0x35E5 JUMP JUMPDEST SWAP4 DUP5 DUP1 SWAP4 PUSH2 0x38B1 JUMP JUMPDEST SWAP6 DUP7 SWAP2 ADD PUSH2 0x6E0 JUMP JUMPDEST PUSH2 0x63F JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST SWAP4 PUSH2 0x3918 PUSH2 0x3934 SWAP7 SWAP5 SWAP3 PUSH2 0x3926 SWAP5 PUSH2 0x390B PUSH1 0x80 DUP10 ADD SWAP3 PUSH1 0x0 DUP11 ADD SWAP1 PUSH2 0xC5E JUMP JUMPDEST DUP8 DUP3 SUB PUSH1 0x20 DUP10 ADD MSTORE PUSH2 0x10C3 JUMP JUMPDEST SWAP2 DUP6 DUP4 SUB PUSH1 0x40 DUP8 ADD MSTORE PUSH2 0x387D JUMP JUMPDEST SWAP2 PUSH1 0x60 DUP2 DUP5 SUB SWAP2 ADD MSTORE PUSH2 0x38BA JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3940 SWAP1 PUSH2 0x1F78 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x394C SWAP1 PUSH2 0x3937 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3958 SWAP1 PUSH2 0x217F JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x3965 DUP3 PUSH2 0x108C JUMP JUMPDEST DUP2 LT ISZERO PUSH2 0x3976 JUMPI PUSH1 0x20 DUP1 SWAP2 MUL ADD ADD SWAP1 JUMP JUMPDEST PUSH2 0x36FA JUMP JUMPDEST PUSH2 0x3985 SWAP1 MLOAD PUSH2 0x332 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH2 0x3994 SWAP2 ADD PUSH2 0x332 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP3 PUSH2 0x3A13 PUSH2 0x3A19 SWAP2 PUSH2 0x3A0E SWAP4 SWAP8 SWAP5 PUSH2 0x39B0 DUP8 DUP10 SWAP1 PUSH2 0x470E JUMP JUMPDEST SWAP6 SWAP1 SWAP6 PUSH2 0x39DE DUP12 SWAP2 PUSH2 0x39CF PUSH2 0x39C3 PUSH2 0x2E2 JUMP JUMPDEST SWAP4 DUP5 SWAP3 PUSH1 0x20 DUP5 ADD PUSH2 0x35B8 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE SUB DUP3 PUSH2 0x65F JUMP JUMPDEST PUSH2 0x39F0 PUSH2 0x39EA DUP3 PUSH2 0x35E5 JUMP JUMPDEST SWAP2 PUSH2 0x35DF JUMP JUMPDEST KECCAK256 SWAP2 SWAP3 PUSH2 0x3A07 PUSH2 0x3A02 PUSH1 0xC DUP13 SWAP1 PUSH2 0xF0E JUMP JUMPDEST PUSH2 0x239B JUMP JUMPDEST SWAP3 SWAP4 PUSH2 0x365D JUMP JUMPDEST PUSH2 0x4B45 JUMP JUMPDEST ISZERO PUSH2 0x42F JUMP JUMPDEST PUSH2 0x3DF1 JUMPI PUSH2 0x3AA3 SWAP1 PUSH2 0x3A45 PUSH1 0x0 PUSH2 0x3A40 PUSH2 0x3A39 PUSH1 0xF SWAP10 SWAP7 SWAP9 SWAP10 DUP9 SWAP1 PUSH2 0x2197 JUMP JUMPDEST DUP10 SWAP1 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x1D91 JUMP JUMPDEST PUSH2 0x3A6B PUSH2 0x3A54 PUSH1 0xE DUP9 SWAP1 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x3A65 PUSH2 0x3A60 DUP3 PUSH2 0x21C9 JUMP JUMPDEST PUSH2 0x366B JUMP JUMPDEST SWAP1 PUSH2 0x2AF0 JUMP JUMPDEST PUSH2 0x3A9E PUSH2 0x3A8C PUSH2 0x3A85 PUSH2 0x3A80 PUSH1 0xE DUP11 SWAP1 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x21C9 JUMP JUMPDEST DUP9 SWAP1 PUSH2 0x4B96 JUMP JUMPDEST SWAP2 PUSH2 0x3A99 PUSH1 0x10 DUP10 SWAP1 PUSH2 0x3688 JUMP JUMPDEST PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x2AF0 JUMP JUMPDEST PUSH2 0x3AAB PUSH2 0x1C33 JUMP JUMPDEST SWAP3 JUMPDEST DUP4 PUSH2 0x3AD6 PUSH2 0x3AD0 PUSH2 0x3ACB PUSH2 0x3AC5 DUP7 PUSH1 0x0 DUP2 ADD SWAP1 PUSH2 0x36AF JUMP JUMPDEST SWAP1 PUSH2 0x36F6 JUMP JUMPDEST PUSH2 0x332 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST LT ISZERO PUSH2 0x3DB1 JUMPI PUSH2 0x3AFC PUSH2 0x3AF7 PUSH2 0x3AF0 DUP5 PUSH1 0x0 DUP2 ADD SWAP1 PUSH2 0x36AF JUMP JUMPDEST DUP8 SWAP2 PUSH2 0x3710 JUMP JUMPDEST PUSH2 0x3725 JUMP JUMPDEST SWAP2 PUSH2 0x3B1E PUSH2 0x3B18 PUSH2 0x3B11 DUP4 PUSH1 0x40 DUP2 ADD SWAP1 PUSH2 0x3732 JUMP JUMPDEST DUP9 SWAP2 PUSH2 0x37C0 JUMP JUMPDEST SWAP1 PUSH2 0x2659 JUMP JUMPDEST SWAP6 PUSH2 0x3B3F PUSH2 0x3B3A PUSH2 0x3B33 DUP5 PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x37E0 JUMP JUMPDEST DUP10 SWAP2 PUSH2 0x3827 JUMP JUMPDEST PUSH2 0x383C JUMP JUMPDEST PUSH1 0x0 EQ PUSH2 0x3C3B JUMPI PUSH2 0x3B4E PUSH2 0x1C33 JUMP JUMPDEST JUMPDEST DUP1 PUSH2 0x3B6A PUSH2 0x3B64 PUSH2 0x3B5F DUP12 PUSH2 0x108C JUMP JUMPDEST PUSH2 0x332 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST LT ISZERO PUSH2 0x3C22 JUMPI PUSH2 0x3B81 PUSH2 0x3B7C DUP7 PUSH2 0x3943 JUMP JUMPDEST PUSH2 0x394F JUMP JUMPDEST SWAP1 PUSH4 0x40C10F19 DUP8 PUSH2 0x3B9B PUSH2 0x3B96 DUP13 DUP6 SWAP1 PUSH2 0x395B JUMP JUMPDEST PUSH2 0x397B JUMP JUMPDEST SWAP4 DUP1 EXTCODESIZE ISZERO PUSH2 0x3C1D JUMPI PUSH2 0x3BC1 PUSH1 0x0 DUP1 SWAP5 PUSH2 0x3BCC PUSH2 0x3BB5 PUSH2 0x2E2 JUMP JUMPDEST SWAP9 DUP10 SWAP7 DUP8 SWAP6 DUP7 SWAP5 PUSH2 0x2D8B JUMP JUMPDEST DUP5 MSTORE PUSH1 0x4 DUP5 ADD PUSH2 0xC6B JUMP JUMPDEST SUB SWAP3 GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x3C18 JUMPI PUSH2 0x3BE6 SWAP3 PUSH2 0x3BEB JUMPI JUMPDEST POP PUSH2 0x3988 JUMP JUMPDEST PUSH2 0x3B4F JUMP JUMPDEST PUSH2 0x3C0B SWAP1 PUSH1 0x0 RETURNDATASIZE DUP2 GT PUSH2 0x3C11 JUMPI JUMPDEST PUSH2 0x3C03 DUP2 DUP4 PUSH2 0x65F JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x386D JUMP JUMPDEST CODESIZE PUSH2 0x3BE0 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x3BF9 JUMP JUMPDEST PUSH2 0x3095 JUMP JUMPDEST PUSH2 0x2D86 JUMP JUMPDEST POP SWAP5 SWAP1 SWAP6 POP PUSH2 0x3C33 SWAP2 SWAP3 POP JUMPDEST PUSH2 0x3988 JUMP JUMPDEST SWAP3 SWAP4 SWAP1 PUSH2 0x3AAD JUMP JUMPDEST SWAP5 SWAP1 SWAP6 SWAP2 SWAP3 DUP5 SWAP3 PUSH32 0x0 PUSH2 0x3C7E PUSH2 0x3C78 PUSH2 0x3C73 PUSH1 0x0 PUSH2 0x24E2 JUMP JUMPDEST PUSH2 0x302 JUMP JUMPDEST SWAP2 PUSH2 0x302 JUMP JUMPDEST EQ ISZERO DUP1 PUSH2 0x3D96 JUMPI JUMPDEST PUSH2 0x3D6D JUMPI JUMPDEST PUSH2 0x3CC6 PUSH2 0x3CC1 PUSH2 0x3CAC PUSH2 0x3CBB DUP10 PUSH2 0x3CA0 PUSH2 0x2E2 JUMP JUMPDEST SWAP3 DUP4 SWAP2 PUSH1 0x20 DUP4 ADD PUSH2 0x11F9 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE SUB DUP3 PUSH2 0x65F JUMP JUMPDEST SWAP4 PUSH2 0x3855 JUMP JUMPDEST PUSH2 0x3861 JUMP JUMPDEST PUSH4 0xB48AB8B6 SWAP5 SWAP2 SWAP5 PUSH2 0x3CE6 PUSH2 0x3CDF DUP12 PUSH1 0x60 DUP2 ADD SWAP1 PUSH2 0x3732 JUMP JUMPDEST DUP8 SWAP2 PUSH2 0x37C0 JUMP JUMPDEST SWAP1 SWAP5 SWAP2 DUP4 EXTCODESIZE ISZERO PUSH2 0x3D68 JUMPI PUSH2 0x3D1C PUSH2 0x3D11 SWAP4 PUSH1 0x0 SWAP8 SWAP4 DUP9 SWAP5 PUSH2 0x3D05 PUSH2 0x2E2 JUMP JUMPDEST SWAP12 DUP13 SWAP10 DUP11 SWAP9 DUP10 SWAP8 PUSH2 0x2D8B JUMP JUMPDEST DUP8 MSTORE PUSH1 0x4 DUP8 ADD PUSH2 0x38EB JUMP JUMPDEST SUB SWAP3 GAS CALL SWAP2 DUP3 ISZERO PUSH2 0x3D63 JUMPI PUSH2 0x3C33 SWAP3 PUSH2 0x3D36 JUMPI JUMPDEST POP PUSH2 0x3C2E JUMP JUMPDEST PUSH2 0x3D56 SWAP1 PUSH1 0x0 RETURNDATASIZE DUP2 GT PUSH2 0x3D5C JUMPI JUMPDEST PUSH2 0x3D4E DUP2 DUP4 PUSH2 0x65F JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x386D JUMP JUMPDEST CODESIZE PUSH2 0x3D30 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x3D44 JUMP JUMPDEST PUSH2 0x3095 JUMP JUMPDEST PUSH2 0x2D86 JUMP JUMPDEST SWAP3 POP PUSH32 0x0 SWAP3 PUSH2 0x3C8B JUMP JUMPDEST POP CALLER PUSH2 0x3DAA PUSH2 0x3DA4 DUP9 PUSH2 0x302 JUMP JUMPDEST SWAP2 PUSH2 0x302 JUMP JUMPDEST EQ ISZERO PUSH2 0x3C86 JUMP JUMPDEST SWAP4 SWAP3 POP POP SWAP1 PUSH32 0xF254AACE0EF98D6AC1A0D84C95648F8E3F7A1881DBB43393709ECD004B00F103 SWAP2 PUSH2 0x3DEC PUSH2 0x3DE3 PUSH2 0x2E2 JUMP JUMPDEST SWAP3 DUP4 SWAP3 DUP4 PUSH2 0xC6B JUMP JUMPDEST SUB SWAP1 LOG1 JUMP JUMPDEST PUSH1 0x0 PUSH4 0x9BDE339 PUSH1 0xE0 SHL DUP2 MSTORE DUP1 PUSH2 0x3E0A PUSH1 0x4 DUP3 ADD PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x3E16 PUSH2 0x1C5C JUMP JUMPDEST POP PUSH8 0x9A31110384E0B0C9 PUSH1 0x20 MSTORE PUSH1 0x14 MSTORE PUSH1 0x0 MSTORE PUSH1 0x34 PUSH1 0xC KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH2 0x3E4B SWAP1 PUSH2 0x3E46 PUSH2 0x3E41 PUSH2 0x1F39 JUMP JUMPDEST PUSH2 0x418E JUMP JUMPDEST PUSH2 0x3E4D JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x3E58 SWAP1 PUSH1 0x7 PUSH2 0x2AD0 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x3E63 SWAP1 PUSH2 0x3E32 JUMP JUMPDEST JUMP JUMPDEST SWAP5 SWAP1 SWAP2 SWAP5 PUSH2 0x3E71 PUSH2 0x4601 JUMP JUMPDEST PUSH2 0x400F JUMPI JUMPDEST PUSH1 0x60 SHL PUSH8 0x9A31110384E0B0C9 OR SWAP2 PUSH1 0x60 SHL PUSH8 0x9A31110384E0B0C9 OR SWAP2 DUP1 PUSH1 0x20 MSTORE PUSH1 0x60 SHR SWAP3 DUP3 PUSH1 0x60 SHR SWAP3 DUP4 ISZERO PUSH2 0x4001 JUMPI DUP5 CALLER SUB PUSH2 0x3FE5 JUMPI JUMPDEST DUP7 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP1 SLOAD DUP1 DUP5 GT PUSH2 0x3FD7 JUMPI DUP4 SWAP1 SUB SWAP1 SSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP1 SLOAD SWAP1 DUP3 DUP3 ADD SWAP2 DUP3 LT PUSH2 0x3FC9 JUMPI SSTORE DUP1 PUSH1 0x20 MSTORE DUP3 DUP5 CALLER PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 PUSH1 0x0 LOG4 PUSH2 0x3F0F PUSH2 0x460F JUMP JUMPDEST PUSH2 0x3FA4 JUMPI JUMPDEST DUP3 EXTCODESIZE PUSH2 0x3F23 JUMPI JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 SWAP5 DUP3 SWAP2 PUSH1 0x40 MLOAD SWAP8 DUP9 SWAP7 PUSH4 0xF23A6E61 DUP9 MSTORE CALLER DUP10 DUP10 ADD MSTORE PUSH1 0x40 DUP9 ADD MSTORE PUSH1 0x60 DUP8 ADD MSTORE PUSH1 0x80 DUP7 ADD MSTORE PUSH1 0xA0 DUP1 DUP7 ADD MSTORE DUP2 PUSH1 0xC0 DUP7 ADD MSTORE PUSH1 0xE0 DUP6 ADD CALLDATACOPY PUSH1 0xC4 ADD SWAP1 PUSH1 0x0 PUSH1 0x1C DUP5 ADD SWAP2 GAS CALL ISZERO PUSH2 0x3F95 JUMPI JUMPDEST PUSH4 0xF23A6E61 PUSH1 0xE0 SHL SWAP1 MLOAD SUB PUSH2 0x3F87 JUMPI CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x3F1B JUMP JUMPDEST PUSH4 0x9C05499B PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x3F6D JUMPI RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH2 0x3FAD DUP7 PUSH2 0x4BE5 JUMP JUMPDEST POP PUSH2 0x3FB7 DUP2 PUSH2 0x4BE5 JUMP JUMPDEST POP PUSH2 0x3FC3 DUP6 DUP4 SWAP1 PUSH2 0x2667 JUMP JUMPDEST POP PUSH2 0x3F14 JUMP JUMPDEST PUSH4 0x1336CEA PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0xF4D678B8 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST CALLER PUSH1 0x0 MSTORE PUSH1 0x34 PUSH1 0xC KECCAK256 SLOAD PUSH2 0x3EAD JUMPI PUSH4 0x4B6E7F18 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0xEA553B34 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH2 0x4018 DUP7 PUSH2 0x4BE5 JUMP JUMPDEST POP PUSH2 0x4022 DUP5 PUSH2 0x4BE5 JUMP JUMPDEST POP PUSH2 0x402E DUP6 DUP4 SWAP1 PUSH2 0x2667 JUMP JUMPDEST POP PUSH2 0x3E76 JUMP JUMPDEST PUSH2 0x4043 PUSH2 0x4049 SWAP2 SWAP4 SWAP3 SWAP4 PUSH2 0x332 JUMP JUMPDEST SWAP3 PUSH2 0x332 JUMP JUMPDEST DUP3 ADD DUP1 SWAP3 GT PUSH2 0x4054 JUMPI JUMP JUMPDEST PUSH2 0x2517 JUMP JUMPDEST PUSH2 0x4077 PUSH2 0x4072 PUSH2 0x406B PUSH1 0xF CALLER SWAP1 PUSH2 0x2197 JUMP JUMPDEST DUP4 SWAP1 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x21C9 JUMP JUMPDEST PUSH2 0x408A PUSH2 0x4084 PUSH1 0x0 PUSH2 0x21D6 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST SUB PUSH2 0x411B JUMPI PUSH2 0x40A4 CALLER DUP3 PUSH2 0x409E PUSH1 0x1 PUSH2 0x2209 JUMP JUMPDEST SWAP2 PUSH2 0x49FF JUMP JUMPDEST PUSH2 0x40D6 PUSH2 0x40BB NUMBER PUSH2 0x40B5 PUSH1 0x1 PUSH2 0x2209 JUMP JUMPDEST SWAP1 PUSH2 0x4034 JUMP JUMPDEST PUSH2 0x40D1 PUSH2 0x40CA PUSH1 0xF CALLER SWAP1 PUSH2 0x2197 JUMP JUMPDEST DUP5 SWAP1 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x2AF0 JUMP JUMPDEST CALLER PUSH2 0x4116 PUSH2 0x4104 PUSH32 0x5E1DD8C4451717D5CA4FFBEFDADA35E22E0871220B9ED9DD03A351F0938C5ED7 SWAP3 PUSH2 0x218B JUMP JUMPDEST SWAP3 PUSH2 0x410D PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x394 JUMP JUMPDEST SUB SWAP1 LOG2 JUMP JUMPDEST PUSH1 0x0 PUSH4 0x156F9043 PUSH1 0xE2 SHL DUP2 MSTORE DUP1 PUSH2 0x4134 PUSH1 0x4 DUP3 ADD PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x4140 PUSH2 0x1C5C JUMP JUMPDEST POP PUSH4 0xC79B8B5F PUSH1 0xE0 SHL PUSH2 0x415B PUSH2 0x4155 DUP4 PUSH2 0x3E0 JUMP JUMPDEST SWAP2 PUSH2 0x3E0 JUMP JUMPDEST EQ DUP1 ISZERO PUSH2 0x417F JUMPI JUMPDEST SWAP1 DUP2 ISZERO PUSH2 0x416F JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x4179 SWAP2 POP PUSH2 0x4C05 JUMP JUMPDEST CODESIZE PUSH2 0x416B JUMP JUMPDEST POP PUSH2 0x4189 DUP2 PUSH2 0x4C05 JUMP JUMPDEST PUSH2 0x4163 JUMP JUMPDEST PUSH2 0x41A0 SWAP1 PUSH2 0x419A PUSH2 0x4691 JUMP JUMPDEST SWAP1 PUSH2 0x4D12 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x20 PUSH32 0x2073616C65507269636500000000000000000000000000000000000000000000 SWAP2 PUSH32 0x455243323938313A20726F79616C7479206665652077696C6C20657863656564 PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x41FD PUSH1 0x2A PUSH1 0x40 SWAP3 PUSH2 0x6D7 JUMP JUMPDEST PUSH2 0x4206 DUP2 PUSH2 0x41A2 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x4220 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x41F0 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x422A JUMPI JUMP JUMPDEST PUSH2 0x4232 PUSH2 0x2E2 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x4248 PUSH1 0x4 DUP3 ADD PUSH2 0x420A JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH32 0x455243323938313A20696E76616C696420726563656976657200000000000000 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x4281 PUSH1 0x19 PUSH1 0x20 SWAP3 PUSH2 0x6D7 JUMP JUMPDEST PUSH2 0x428A DUP2 PUSH2 0x424C JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x42A4 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x4274 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x42AE JUMPI JUMP JUMPDEST PUSH2 0x42B6 PUSH2 0x2E2 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x42CC PUSH1 0x4 DUP3 ADD PUSH2 0x428E JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x42DA PUSH1 0x40 PUSH2 0x78E JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x42F5 PUSH2 0x42F0 PUSH2 0x42FC SWAP3 PUSH2 0x218B JUMP JUMPDEST PUSH2 0x42DD JUMP JUMPDEST DUP3 SLOAD PUSH2 0x1FAC JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH1 0xA0 SHL SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x4320 PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0xA0 SHL SWAP2 PUSH2 0x4300 JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST PUSH2 0x433E PUSH2 0x4339 PUSH2 0x4343 SWAP3 PUSH2 0x48C JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x48C JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x435E PUSH2 0x4359 PUSH2 0x4365 SWAP3 PUSH2 0x432A JUMP JUMPDEST PUSH2 0x4346 JUMP JUMPDEST DUP3 SLOAD PUSH2 0x4306 JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST SWAP1 PUSH2 0x4394 PUSH1 0x20 PUSH1 0x0 PUSH2 0x439A SWAP5 PUSH2 0x438C DUP3 DUP3 ADD PUSH2 0x4386 DUP5 DUP9 ADD PUSH2 0x24B9 JUMP JUMPDEST SWAP1 PUSH2 0x42E0 JUMP JUMPDEST ADD SWAP3 ADD PUSH2 0x24EE JUMP JUMPDEST SWAP1 PUSH2 0x4349 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x43A6 SWAP2 PUSH2 0x4369 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x4419 PUSH2 0x4420 SWAP3 PUSH2 0x43D4 DUP4 PUSH2 0x43CD PUSH2 0x43C7 PUSH2 0x43C2 PUSH2 0x45EA JUMP JUMPDEST PUSH2 0x48C JUMP JUMPDEST SWAP2 PUSH2 0x48C JUMP JUMPDEST GT ISZERO PUSH2 0x4223 JUMP JUMPDEST PUSH2 0x43FA DUP2 PUSH2 0x43F3 PUSH2 0x43ED PUSH2 0x43E8 PUSH1 0x0 PUSH2 0x24E2 JUMP JUMPDEST PUSH2 0x302 JUMP JUMPDEST SWAP2 PUSH2 0x302 JUMP JUMPDEST EQ ISZERO PUSH2 0x42A7 JUMP JUMPDEST SWAP2 PUSH2 0x4410 PUSH2 0x4406 PUSH2 0x42D0 JUMP JUMPDEST SWAP4 PUSH1 0x0 DUP6 ADD PUSH2 0x2413 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD PUSH2 0x2459 JUMP JUMPDEST PUSH1 0x2 PUSH2 0x439C JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x442B PUSH2 0x2016 JUMP JUMPDEST POP PUSH1 0x80 PUSH1 0x40 MLOAD ADD SWAP2 PUSH1 0x20 DUP4 ADD PUSH1 0x40 MSTORE PUSH1 0x0 DUP4 MSTORE DUP3 SWAP1 PUSH1 0xA PUSH1 0x0 NOT DUP1 SWAP3 SWAP6 JUMPDEST ADD SWAP5 DUP2 DUP2 MOD PUSH1 0x30 ADD DUP7 MSTORE8 DIV SWAP4 DUP5 ISZERO PUSH2 0x4468 JUMPI SWAP1 PUSH1 0xA SWAP2 SWAP1 DUP1 SWAP3 SWAP2 PUSH2 0x4449 JUMP JUMPDEST SWAP4 POP POP DUP3 PUSH1 0x20 SWAP2 SUB SWAP3 SUB SWAP2 DUP3 MSTORE JUMP JUMPDEST PUSH2 0x44C5 SWAP2 SWAP3 PUSH2 0x4491 PUSH2 0x44CB SWAP6 PUSH2 0x44B6 SWAP4 SWAP1 DUP7 DUP5 SWAP2 SWAP3 PUSH2 0x4DAB JUMP JUMPDEST PUSH2 0x44AE PUSH2 0x44A7 DUP3 PUSH2 0x44A2 PUSH1 0x0 PUSH2 0x21C9 JUMP JUMPDEST PUSH2 0x4034 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2AF0 JUMP JUMPDEST SWAP3 PUSH1 0x1 PUSH2 0xBC9 JUMP JUMPDEST SWAP2 PUSH2 0x44C0 DUP4 PUSH2 0x21C9 JUMP JUMPDEST PUSH2 0x4034 JUMP JUMPDEST SWAP1 PUSH2 0x2AF0 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x44DC PUSH2 0x44E2 SWAP2 SWAP4 SWAP3 SWAP4 PUSH2 0x332 JUMP JUMPDEST SWAP3 PUSH2 0x332 JUMP JUMPDEST DUP3 SUB SWAP2 DUP3 GT PUSH2 0x44ED JUMPI JUMP JUMPDEST PUSH2 0x2517 JUMP JUMPDEST PUSH2 0x4501 SWAP1 SWAP4 SWAP3 SWAP4 DUP3 DUP6 SWAP2 PUSH2 0x4EAC JUMP JUMPDEST PUSH2 0x450A DUP2 PUSH2 0x108C JUMP JUMPDEST SWAP3 PUSH2 0x4515 PUSH1 0x0 PUSH2 0x21D6 JUMP JUMPDEST SWAP3 PUSH2 0x451E PUSH2 0x1C33 JUMP JUMPDEST SWAP4 JUMPDEST DUP5 PUSH2 0x4533 PUSH2 0x452D DUP9 PUSH2 0x332 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST LT ISZERO PUSH2 0x45A0 JUMPI PUSH2 0x4594 PUSH2 0x459A SWAP2 PUSH2 0x4553 PUSH2 0x454E DUP7 DUP10 SWAP1 PUSH2 0x395B JUMP JUMPDEST PUSH2 0x397B JUMP JUMPDEST PUSH2 0x458E DUP9 PUSH2 0x4588 PUSH2 0x4579 DUP11 PUSH2 0x4573 PUSH2 0x456E DUP8 SWAP6 PUSH1 0x1 SWAP4 PUSH2 0x395B JUMP JUMPDEST PUSH2 0x397B JUMP JUMPDEST SWAP1 PUSH2 0xBC9 JUMP JUMPDEST SWAP2 PUSH2 0x4583 DUP4 PUSH2 0x21C9 JUMP JUMPDEST PUSH2 0x44CD JUMP JUMPDEST SWAP1 PUSH2 0x2AF0 JUMP JUMPDEST SWAP1 PUSH2 0x4034 JUMP JUMPDEST SWAP5 PUSH2 0x3988 JUMP JUMPDEST SWAP4 PUSH2 0x4520 JUMP JUMPDEST SWAP2 POP SWAP4 POP PUSH2 0x45C4 SWAP3 POP PUSH2 0x45BD SWAP2 POP PUSH2 0x45B8 PUSH1 0x0 PUSH2 0x21C9 JUMP JUMPDEST PUSH2 0x44CD JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2AF0 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x45E2 PUSH2 0x45DD PUSH2 0x45E7 SWAP3 PUSH2 0x45CB JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x48C JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x45F2 PUSH2 0x45C6 JUMP JUMPDEST POP PUSH2 0x45FE PUSH2 0x2710 PUSH2 0x45CE JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x4609 PUSH2 0x1C5C JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x4617 PUSH2 0x1C5C JUMP JUMPDEST POP PUSH1 0x0 SWAP1 JUMP JUMPDEST POP POP SWAP5 SWAP3 SWAP4 SWAP1 SWAP4 PUSH2 0x462C PUSH2 0x460F JUMP JUMPDEST PUSH2 0x4639 JUMPI JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x464F PUSH2 0x4655 SWAP4 PUSH2 0x465B SWAP8 SWAP7 SWAP1 SWAP3 SWAP4 SWAP6 SWAP7 PUSH2 0x2659 JUMP JUMPDEST POP PUSH2 0x2659 JUMP JUMPDEST POP PUSH2 0x2667 JUMP JUMPDEST POP CODESIZE DUP1 DUP1 DUP1 DUP1 DUP1 PUSH2 0x4631 JUMP JUMPDEST SWAP1 PUSH2 0x4689 PUSH2 0x4684 PUSH2 0x468E SWAP4 PUSH2 0x467D DUP2 DUP6 SWAP1 PUSH2 0x4F0C JUMP JUMPDEST PUSH1 0x5 PUSH2 0x2C6E JUMP JUMPDEST PUSH2 0x2C86 JUMP JUMPDEST PUSH2 0x4FF3 JUMP JUMPDEST POP JUMP JUMPDEST PUSH2 0x4699 PUSH2 0x23CA JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x46C0 PUSH2 0x46BB PUSH2 0x46C5 SWAP4 PUSH2 0x46B4 DUP2 DUP6 SWAP1 PUSH2 0x502E JUMP JUMPDEST PUSH1 0x5 PUSH2 0x2C6E JUMP JUMPDEST PUSH2 0x2C86 JUMP JUMPDEST PUSH2 0x50C8 JUMP JUMPDEST POP JUMP JUMPDEST SWAP2 PUSH1 0x20 PUSH2 0x46EA SWAP3 SWAP5 SWAP4 PUSH2 0x46E3 PUSH1 0x40 DUP3 ADD SWAP7 PUSH1 0x0 DUP4 ADD SWAP1 PUSH2 0xB52 JUMP JUMPDEST ADD SWAP1 PUSH2 0xC5E JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x46F8 PUSH2 0x46FE SWAP2 PUSH2 0x332 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST SWAP1 DUP2 ISZERO PUSH2 0x4709 JUMPI MOD SWAP1 JUMP JUMPDEST PUSH2 0x2562 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH2 0x4719 PUSH2 0x1C33 JUMP JUMPDEST POP PUSH2 0x4722 PUSH2 0x1C33 JUMP JUMPDEST POP PUSH2 0x4737 PUSH2 0x4732 PUSH1 0xE DUP6 SWAP1 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x21C9 JUMP JUMPDEST PUSH2 0x474A PUSH2 0x4744 PUSH1 0x0 PUSH2 0x21D6 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST EQ PUSH2 0x4853 JUMPI PUSH2 0x476D PUSH2 0x4768 PUSH2 0x4761 PUSH1 0xF DUP5 SWAP1 PUSH2 0x2197 JUMP JUMPDEST DUP6 SWAP1 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x21C9 JUMP JUMPDEST DUP1 PUSH2 0x4781 PUSH2 0x477B PUSH1 0x0 PUSH2 0x21D6 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST EQ PUSH2 0x4836 JUMPI BLOCKHASH SWAP1 PUSH2 0x4791 DUP3 PUSH2 0x21F2 JUMP JUMPDEST PUSH2 0x47A4 PUSH2 0x479E PUSH1 0x0 PUSH2 0x21D6 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST EQ PUSH2 0x4819 JUMPI PUSH2 0x47F5 PUSH2 0x480F SWAP2 PUSH2 0x47DD PUSH2 0x4816 SWAP5 PUSH2 0x47CE PUSH2 0x47C2 PUSH2 0x2E2 JUMP JUMPDEST SWAP4 DUP5 SWAP3 PUSH1 0x20 DUP5 ADD PUSH2 0x46C8 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE SUB DUP3 PUSH2 0x65F JUMP JUMPDEST PUSH2 0x47EF PUSH2 0x47E9 DUP3 PUSH2 0x35E5 JUMP JUMPDEST SWAP2 PUSH2 0x35DF JUMP JUMPDEST KECCAK256 PUSH2 0x21F2 JUMP JUMPDEST PUSH2 0x4809 PUSH2 0x4804 PUSH1 0xE DUP8 SWAP1 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x21C9 JUMP JUMPDEST SWAP1 PUSH2 0x46EC JUMP JUMPDEST SWAP3 DUP4 PUSH2 0x4B96 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH4 0xB7B33787 PUSH1 0xE0 SHL DUP2 MSTORE DUP1 PUSH2 0x4832 PUSH1 0x4 DUP3 ADD PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH4 0x7DE832B5 PUSH1 0xE1 SHL DUP2 MSTORE DUP1 PUSH2 0x484F PUSH1 0x4 DUP3 ADD PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH4 0xB56C82B PUSH1 0xE3 SHL DUP2 MSTORE DUP1 PUSH2 0x486C PUSH1 0x4 DUP3 ADD PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH32 0x455243323938313A20496E76616C696420706172616D65746572730000000000 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x48A5 PUSH1 0x1B PUSH1 0x20 SWAP3 PUSH2 0x6D7 JUMP JUMPDEST PUSH2 0x48AE DUP2 PUSH2 0x4870 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x48C8 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x4898 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x48D2 JUMPI JUMP JUMPDEST PUSH2 0x48DA PUSH2 0x2E2 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x48F0 PUSH1 0x4 DUP3 ADD PUSH2 0x48B2 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x4970 SWAP1 PUSH2 0x4969 PUSH2 0x4975 SWAP5 SWAP4 PUSH2 0x4924 DUP6 PUSH2 0x491D PUSH2 0x4917 PUSH2 0x4912 PUSH2 0x45EA JUMP JUMPDEST PUSH2 0x48C JUMP JUMPDEST SWAP2 PUSH2 0x48C JUMP JUMPDEST GT ISZERO PUSH2 0x4223 JUMP JUMPDEST PUSH2 0x494A DUP2 PUSH2 0x4943 PUSH2 0x493D PUSH2 0x4938 PUSH1 0x0 PUSH2 0x24E2 JUMP JUMPDEST PUSH2 0x302 JUMP JUMPDEST SWAP2 PUSH2 0x302 JUMP JUMPDEST EQ ISZERO PUSH2 0x48CB JUMP JUMPDEST SWAP4 PUSH2 0x4960 PUSH2 0x4956 PUSH2 0x42D0 JUMP JUMPDEST SWAP6 PUSH1 0x0 DUP8 ADD PUSH2 0x2413 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD PUSH2 0x2459 JUMP JUMPDEST PUSH1 0x3 PUSH2 0x23CF JUMP JUMPDEST PUSH2 0x439C JUMP JUMPDEST JUMP JUMPDEST SWAP6 SWAP7 PUSH2 0x49A5 SWAP8 PUSH2 0x4998 SWAP7 SWAP6 SWAP5 PUSH2 0x4993 SWAP5 DUP10 SWAP5 SWAP1 SWAP2 SWAP3 SWAP4 SWAP5 PUSH2 0x5103 JUMP JUMPDEST PUSH2 0x43A8 JUMP JUMPDEST PUSH2 0x49A0 PUSH2 0x2BAF JUMP JUMPDEST PUSH2 0x4667 JUMP JUMPDEST JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x49BE PUSH2 0x49B9 PUSH2 0x49C3 SWAP3 PUSH2 0x332 JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x2F7 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x49F2 PUSH2 0x49ED PUSH2 0x49FC SWAP4 PUSH2 0x49E8 PUSH1 0x0 PUSH2 0x49F7 SWAP6 PUSH2 0x49E1 PUSH2 0x23CA JUMP JUMPDEST POP ADD PUSH2 0x49A7 JUMP JUMPDEST PUSH2 0x51D9 JUMP JUMPDEST PUSH2 0x21F2 JUMP JUMPDEST PUSH2 0x49AA JUMP JUMPDEST PUSH2 0x217F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x4A3A PUSH2 0x4A4F SWAP4 PUSH2 0x4A15 PUSH2 0x4A49 SWAP4 DUP6 DUP4 SWAP2 PUSH2 0x51FB JUMP JUMPDEST PUSH2 0x4A32 PUSH2 0x4A2B DUP3 PUSH2 0x4A26 PUSH1 0x0 PUSH2 0x21C9 JUMP JUMPDEST PUSH2 0x44CD JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2AF0 JUMP JUMPDEST SWAP3 PUSH1 0x1 PUSH2 0xBC9 JUMP JUMPDEST SWAP2 PUSH2 0x4A44 DUP4 PUSH2 0x21C9 JUMP JUMPDEST PUSH2 0x44CD JUMP JUMPDEST SWAP1 PUSH2 0x2AF0 JUMP JUMPDEST JUMP JUMPDEST SWAP3 PUSH2 0x4A63 SWAP2 SWAP5 SWAP3 SWAP4 SWAP1 DUP6 DUP6 SWAP2 SWAP3 PUSH2 0x5216 JUMP JUMPDEST PUSH2 0x4A6C DUP4 PUSH2 0x108C JUMP JUMPDEST SWAP2 PUSH2 0x4A77 PUSH1 0x0 PUSH2 0x21D6 JUMP JUMPDEST SWAP2 PUSH2 0x4A80 PUSH2 0x1C33 JUMP JUMPDEST JUMPDEST DUP1 PUSH2 0x4A94 PUSH2 0x4A8E DUP8 PUSH2 0x332 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST LT ISZERO PUSH2 0x4B00 JUMPI PUSH2 0x4AFB SWAP1 PUSH2 0x4AF6 PUSH2 0x4ABF PUSH2 0x4AB7 PUSH2 0x4AB2 DUP8 DUP6 SWAP1 PUSH2 0x395B JUMP JUMPDEST PUSH2 0x397B JUMP JUMPDEST SWAP7 DUP8 SWAP1 PUSH2 0x4034 JUMP JUMPDEST SWAP6 PUSH2 0x4AF0 PUSH2 0x4AE1 PUSH1 0x1 PUSH2 0x4ADB PUSH2 0x4AD6 DUP14 DUP9 SWAP1 PUSH2 0x395B JUMP JUMPDEST PUSH2 0x397B JUMP JUMPDEST SWAP1 PUSH2 0xBC9 JUMP JUMPDEST SWAP2 PUSH2 0x4AEB DUP4 PUSH2 0x21C9 JUMP JUMPDEST PUSH2 0x4034 JUMP JUMPDEST SWAP1 PUSH2 0x2AF0 JUMP JUMPDEST PUSH2 0x3988 JUMP JUMPDEST PUSH2 0x4A81 JUMP JUMPDEST POP SWAP4 POP POP PUSH2 0x4B23 SWAP2 POP PUSH2 0x4B1C SWAP1 PUSH2 0x4B17 PUSH1 0x0 PUSH2 0x21C9 JUMP JUMPDEST PUSH2 0x4034 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2AF0 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x4B3D PUSH1 0x0 PUSH2 0x4B42 SWAP3 PUSH2 0x4B36 PUSH2 0x1C33 JUMP JUMPDEST POP ADD PUSH2 0x49A7 JUMP JUMPDEST PUSH2 0x5359 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH2 0x4B50 PUSH2 0x1C5C JUMP JUMPDEST POP DUP1 MLOAD PUSH2 0x4B5D JUMPI JUMPDEST POP EQ SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 ADD SWAP2 MLOAD PUSH1 0x5 SHL DUP3 ADD SWAP1 JUMPDEST DUP3 MLOAD DUP2 GT PUSH1 0x5 SHL SWAP1 DUP2 MSTORE PUSH1 0x20 DUP4 MLOAD SWAP2 XOR MSTORE PUSH1 0x20 PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP3 ADD SWAP2 DUP2 DUP4 LT PUSH2 0x4B6B JUMPI SWAP2 POP POP CODESIZE PUSH2 0x4B58 JUMP JUMPDEST SWAP1 PUSH2 0x4BB8 PUSH2 0x4BB1 PUSH2 0x4BBD SWAP3 PUSH2 0x4BA9 PUSH2 0x1C33 JUMP JUMPDEST POP PUSH1 0x10 PUSH2 0x3688 JUMP JUMPDEST DUP4 SWAP1 PUSH2 0xBC9 JUMP JUMPDEST PUSH2 0x21C9 JUMP JUMPDEST DUP1 PUSH2 0x4BD1 PUSH2 0x4BCB PUSH1 0x0 PUSH2 0x21D6 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0x4BDE JUMPI POP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 POP PUSH2 0x4BDB JUMP JUMPDEST SWAP1 PUSH2 0x4BEE PUSH2 0x29F6 JUMP JUMPDEST POP PUSH1 0x40 MLOAD SWAP2 PUSH1 0x40 DUP4 ADD PUSH1 0x40 MSTORE PUSH1 0x1 DUP4 MSTORE PUSH1 0x20 DUP4 ADD MSTORE JUMP JUMPDEST PUSH2 0x4C0D PUSH2 0x1C5C JUMP JUMPDEST POP PUSH2 0x4C17 DUP2 PUSH2 0x5371 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x4C3A JUMPI JUMPDEST SWAP1 DUP2 ISZERO PUSH2 0x4C2A JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x4C34 SWAP2 POP PUSH2 0x5417 JUMP JUMPDEST CODESIZE PUSH2 0x4C26 JUMP JUMPDEST POP PUSH2 0x4C44 DUP2 PUSH2 0x53B1 JUMP JUMPDEST PUSH2 0x4C1E JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x4C60 PUSH2 0x4C5B PUSH2 0x4C65 SWAP3 PUSH2 0x4C49 JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x332 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x416363657373436F6E74726F6C3A206163636F756E7420000000000000000000 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x4C9C PUSH1 0x17 DUP1 SWAP3 PUSH2 0x201B JUMP JUMPDEST PUSH2 0x4CA5 DUP2 PUSH2 0x4C68 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x206973206D697373696E6720726F6C6520000000000000000000000000000000 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x4CDD PUSH1 0x11 DUP1 SWAP3 PUSH2 0x201B JUMP JUMPDEST PUSH2 0x4CE6 DUP2 PUSH2 0x4CA9 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x4D04 PUSH2 0x4D0F SWAP4 SWAP3 PUSH2 0x4CFE PUSH2 0x4D09 SWAP4 PUSH2 0x4C90 JUMP JUMPDEST SWAP1 PUSH2 0x20A9 JUMP JUMPDEST PUSH2 0x4CD1 JUMP JUMPDEST SWAP1 PUSH2 0x20A9 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x4D27 PUSH2 0x4D21 DUP4 DUP4 SWAP1 PUSH2 0x2CF0 JUMP JUMPDEST ISZERO PUSH2 0x42F JUMP JUMPDEST PUSH2 0x4D2F JUMPI POP POP JUMP JUMPDEST PUSH2 0x4DA7 SWAP2 PUSH2 0x4D85 PUSH2 0x4D5E PUSH2 0x4D4E PUSH2 0x4D48 PUSH2 0x4D8A SWAP6 PUSH2 0x5493 JUMP JUMPDEST SWAP4 PUSH2 0x21F2 JUMP JUMPDEST PUSH2 0x4D58 PUSH1 0x20 PUSH2 0x4C4C JUMP JUMPDEST SWAP1 PUSH2 0x566C JUMP JUMPDEST SWAP2 PUSH2 0x4D76 PUSH2 0x4D6A PUSH2 0x2E2 JUMP JUMPDEST SWAP4 DUP5 SWAP3 PUSH1 0x20 DUP5 ADD PUSH2 0x4CEA JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE SUB DUP3 PUSH2 0x65F JUMP JUMPDEST PUSH2 0x2132 JUMP JUMPDEST PUSH2 0x4D92 PUSH2 0x2E2 JUMP JUMPDEST SWAP2 DUP3 SWAP2 PUSH3 0x461BCD PUSH1 0xE5 SHL DUP4 MSTORE PUSH1 0x4 DUP4 ADD PUSH2 0x736 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP2 SWAP3 SWAP1 SWAP3 PUSH2 0x4DB7 PUSH2 0x4601 JUMP JUMPDEST PUSH2 0x4E93 JUMPI JUMPDEST DUP3 PUSH1 0x60 SHL DUP1 ISZERO PUSH2 0x4E85 JUMPI PUSH8 0x9A31110384E0B0C9 PUSH1 0x20 MSTORE DUP4 PUSH1 0x14 MSTORE DUP5 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP1 SLOAD SWAP1 DUP4 DUP3 ADD SWAP2 DUP3 LT PUSH2 0x4E77 JUMPI SSTORE DUP2 PUSH1 0x20 MSTORE PUSH1 0x60 SHR PUSH1 0x0 CALLER PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP4 LOG4 PUSH2 0x4E24 PUSH2 0x460F JUMP JUMPDEST PUSH2 0x4E5E JUMPI JUMPDEST PUSH2 0x4E32 DUP4 PUSH2 0x57B8 JUMP JUMPDEST PUSH2 0x4E3D JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x4E55 SWAP4 PUSH2 0x4E4B PUSH1 0x0 PUSH2 0x24E2 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 SWAP3 SWAP4 PUSH2 0x57C5 JUMP JUMPDEST CODESIZE DUP1 DUP1 DUP1 PUSH2 0x4E37 JUMP JUMPDEST PUSH2 0x4E67 DUP5 PUSH2 0x4BE5 JUMP JUMPDEST POP PUSH2 0x4E71 DUP2 PUSH2 0x4BE5 JUMP JUMPDEST POP PUSH2 0x4E29 JUMP JUMPDEST PUSH4 0x1336CEA PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0xEA553B34 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH2 0x4E9C DUP5 PUSH2 0x4BE5 JUMP JUMPDEST POP PUSH2 0x4EA6 DUP2 PUSH2 0x4BE5 JUMP JUMPDEST POP PUSH2 0x4DBC JUMP JUMPDEST SWAP1 SWAP2 PUSH2 0x4EC5 SWAP3 PUSH2 0x4EBC PUSH1 0x0 PUSH2 0x24E2 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 SWAP3 PUSH2 0x585E JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x4ED3 PUSH1 0xFF SWAP2 PUSH2 0x1716 JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST PUSH2 0x4EE6 SWAP1 PUSH2 0x42F JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x4F01 PUSH2 0x4EFC PUSH2 0x4F08 SWAP3 PUSH2 0x4EDD JUMP JUMPDEST PUSH2 0x4EE9 JUMP JUMPDEST DUP3 SLOAD PUSH2 0x4EC7 JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x4F20 PUSH2 0x4F1A DUP3 DUP5 SWAP1 PUSH2 0x2CF0 JUMP JUMPDEST ISZERO PUSH2 0x42F JUMP JUMPDEST PUSH2 0x4F29 JUMPI JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x4F4C PUSH1 0x1 PUSH2 0x4F47 PUSH1 0x0 PUSH2 0x4F3F PUSH1 0x4 DUP7 SWAP1 PUSH2 0x236F JUMP JUMPDEST ADD DUP6 SWAP1 PUSH2 0x2CB1 JUMP JUMPDEST PUSH2 0x4EEC JUMP JUMPDEST SWAP1 PUSH2 0x4F55 PUSH2 0x4691 JUMP JUMPDEST SWAP1 PUSH2 0x4F92 PUSH2 0x4F8C PUSH2 0x4F86 PUSH32 0x2F8788117E7EFF1D82E926EC794901D17C78024A50270940304540A733656F0D SWAP6 PUSH2 0x2363 JUMP JUMPDEST SWAP3 PUSH2 0x218B JUMP JUMPDEST SWAP3 PUSH2 0x218B JUMP JUMPDEST SWAP3 PUSH2 0x4F9B PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x4FA5 DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 LOG4 CODESIZE DUP1 PUSH2 0x4F25 JUMP JUMPDEST PUSH2 0x4FB8 SWAP1 PUSH2 0x1F78 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x4FCF PUSH2 0x4FCA PUSH2 0x4FD4 SWAP3 PUSH2 0x2F7 JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x332 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x4FEB PUSH2 0x4FE6 PUSH2 0x4FF0 SWAP3 PUSH2 0x332 JUMP JUMPDEST PUSH2 0x1716 JUMP JUMPDEST PUSH2 0xB0C JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x5026 PUSH2 0x5020 PUSH2 0x501B PUSH2 0x5016 PUSH1 0x0 PUSH2 0x502B SWAP7 PUSH2 0x500E PUSH2 0x1C5C JUMP JUMPDEST POP ADD SWAP5 PUSH2 0x4FAF JUMP JUMPDEST PUSH2 0x4FBB JUMP JUMPDEST PUSH2 0x4FD7 JUMP JUMPDEST SWAP2 PUSH2 0x49A7 JUMP JUMPDEST PUSH2 0x5A4E JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x5039 DUP2 DUP4 SWAP1 PUSH2 0x2CF0 JUMP JUMPDEST PUSH2 0x5042 JUMPI JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x5065 PUSH1 0x0 PUSH2 0x5060 PUSH1 0x0 PUSH2 0x5058 PUSH1 0x4 DUP7 SWAP1 PUSH2 0x236F JUMP JUMPDEST ADD DUP6 SWAP1 PUSH2 0x2CB1 JUMP JUMPDEST PUSH2 0x4EEC JUMP JUMPDEST SWAP1 PUSH2 0x506E PUSH2 0x4691 JUMP JUMPDEST SWAP1 PUSH2 0x50AB PUSH2 0x50A5 PUSH2 0x509F PUSH32 0xF6391F5C32D9C69D2A47EA670B442974B53935D1EDC7FD64EB21E047A839171B SWAP6 PUSH2 0x2363 JUMP JUMPDEST SWAP3 PUSH2 0x218B JUMP JUMPDEST SWAP3 PUSH2 0x218B JUMP JUMPDEST SWAP3 PUSH2 0x50B4 PUSH2 0x2E2 JUMP JUMPDEST DUP1 PUSH2 0x50BE DUP2 PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 LOG4 CODESIZE DUP1 PUSH2 0x503E JUMP JUMPDEST SWAP1 PUSH2 0x50FB PUSH2 0x50F5 PUSH2 0x50F0 PUSH2 0x50EB PUSH1 0x0 PUSH2 0x5100 SWAP7 PUSH2 0x50E3 PUSH2 0x1C5C JUMP JUMPDEST POP ADD SWAP5 PUSH2 0x4FAF JUMP JUMPDEST PUSH2 0x4FBB JUMP JUMPDEST PUSH2 0x4FD7 JUMP JUMPDEST SWAP2 PUSH2 0x49A7 JUMP JUMPDEST PUSH2 0x5B0E JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP2 SWAP1 SWAP5 SWAP3 PUSH2 0x5111 PUSH1 0xB PUSH2 0x2CE3 JUMP JUMPDEST PUSH2 0x5184 JUMPI PUSH2 0x5131 PUSH2 0x5138 SWAP3 PUSH2 0x512A PUSH2 0x5176 SWAP9 PUSH1 0x8 PUSH2 0x1F15 JUMP JUMPDEST PUSH1 0x9 PUSH2 0x1F15 JUMP JUMPDEST PUSH1 0xA PUSH2 0x1F15 JUMP JUMPDEST PUSH2 0x514A PUSH2 0x5143 PUSH2 0x1738 JUMP JUMPDEST DUP3 SWAP1 PUSH2 0x4667 JUMP JUMPDEST PUSH2 0x515C PUSH2 0x5155 PUSH2 0x1CA1 JUMP JUMPDEST DUP3 SWAP1 PUSH2 0x4667 JUMP JUMPDEST PUSH2 0x516E PUSH2 0x5167 PUSH2 0x1CF9 JUMP JUMPDEST DUP3 SWAP1 PUSH2 0x4667 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH2 0x5C18 JUMP JUMPDEST PUSH2 0x5182 PUSH1 0x1 PUSH1 0xB PUSH2 0x4EEC JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 PUSH4 0xF92EE8A9 PUSH1 0xE0 SHL DUP2 MSTORE DUP1 PUSH2 0x519D PUSH1 0x4 DUP3 ADD PUSH2 0x4EF JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH2 0x51B9 DUP2 PUSH2 0x51A1 JUMP JUMPDEST DUP3 LT ISZERO PUSH2 0x51D4 JUMPI PUSH2 0x51CB PUSH1 0x1 SWAP2 PUSH2 0x51A5 JUMP JUMPDEST SWAP2 MUL ADD SWAP1 PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x36FA JUMP JUMPDEST PUSH2 0x51F8 SWAP2 PUSH1 0x0 PUSH2 0x51F2 SWAP3 PUSH2 0x51EB PUSH2 0x235E JUMP JUMPDEST POP ADD PUSH2 0x51B0 JUMP JUMPDEST SWAP1 PUSH2 0xF41 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 SWAP2 PUSH2 0x5214 SWAP3 PUSH2 0x520B PUSH1 0x0 PUSH2 0x24E2 JUMP JUMPDEST SWAP3 SWAP1 SWAP2 SWAP3 PUSH2 0x5C35 JUMP JUMPDEST JUMP JUMPDEST SWAP2 SWAP3 SWAP1 SWAP3 PUSH2 0x5222 PUSH2 0x4601 JUMP JUMPDEST PUSH2 0x5354 JUMPI JUMPDEST DUP1 MLOAD DUP5 MLOAD SUB PUSH2 0x5346 JUMPI DUP3 PUSH1 0x60 SHL DUP1 ISZERO PUSH2 0x5338 JUMPI DUP1 PUSH8 0x9A31110384E0B0C9 OR PUSH1 0x20 MSTORE DUP5 MLOAD PUSH1 0x5 SHL DUP1 JUMPDEST PUSH2 0x5301 JUMPI POP PUSH1 0x0 PUSH1 0x40 MLOAD PUSH1 0x40 DUP2 MSTORE PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB DUP2 DUP9 MLOAD PUSH1 0x5 SHL PUSH1 0x20 ADD PUSH1 0x40 DUP3 ADD SWAP1 DUP2 DUP2 DUP13 PUSH1 0x4 GAS STATICCALL POP RETURNDATASIZE PUSH1 0x40 ADD PUSH1 0x20 DUP4 ADD MSTORE RETURNDATASIZE ADD DUP7 MLOAD PUSH1 0x5 SHL PUSH1 0x20 ADD DUP2 DUP2 DUP10 PUSH1 0x4 GAS STATICCALL POP RETURNDATASIZE ADD SUB SWAP4 PUSH1 0x60 SHR SWAP4 CALLER SWAP3 LOG4 PUSH2 0x52C2 PUSH2 0x460F JUMP JUMPDEST PUSH2 0x52FC JUMPI JUMPDEST PUSH2 0x52D0 DUP4 PUSH2 0x57B8 JUMP JUMPDEST PUSH2 0x52DB JUMPI JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x52F3 SWAP4 PUSH2 0x52E9 PUSH1 0x0 PUSH2 0x24E2 JUMP JUMPDEST SWAP4 SWAP1 SWAP2 SWAP3 SWAP4 PUSH2 0x5D39 JUMP JUMPDEST CODESIZE DUP1 DUP1 DUP1 PUSH2 0x52D5 JUMP JUMPDEST PUSH2 0x52C7 JUMP JUMPDEST DUP1 DUP4 ADD MLOAD SWAP1 DUP1 DUP8 ADD MLOAD PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP2 DUP3 SLOAD SWAP1 DUP2 ADD SWAP1 DUP2 LT PUSH2 0x532A JUMPI PUSH1 0x20 SWAP3 SSTORE SUB DUP1 PUSH2 0x524F JUMP JUMPDEST PUSH4 0x1336CEA PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0xEA553B34 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0x3B800A46 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH2 0x5227 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x536E SWAP2 PUSH2 0x5367 PUSH2 0x1C33 JUMP JUMPDEST POP ADD PUSH2 0x51A1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x5379 PUSH2 0x1C5C JUMP JUMPDEST POP PUSH4 0x3E85E62F PUSH1 0xE0 SHL PUSH2 0x5394 PUSH2 0x538E DUP4 PUSH2 0x3E0 JUMP JUMPDEST SWAP2 PUSH2 0x3E0 JUMP JUMPDEST EQ SWAP1 DUP2 ISZERO PUSH2 0x53A1 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x53AB SWAP2 POP PUSH2 0x5DF0 JUMP JUMPDEST CODESIZE PUSH2 0x539D JUMP JUMPDEST PUSH2 0x53B9 PUSH2 0x1C5C JUMP JUMPDEST POP PUSH2 0x53C3 DUP2 PUSH2 0x5E17 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x5408 JUMPI JUMPDEST DUP1 ISZERO PUSH2 0x53ED JUMPI JUMPDEST SWAP1 DUP2 ISZERO PUSH2 0x53DD JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x53E7 SWAP2 POP PUSH2 0x5E57 JUMP JUMPDEST CODESIZE PUSH2 0x53D9 JUMP JUMPDEST POP PUSH1 0x0 PUSH2 0x5402 PUSH2 0x53FC DUP4 PUSH2 0x3E0 JUMP JUMPDEST SWAP2 PUSH2 0x3E0 JUMP JUMPDEST EQ PUSH2 0x53D1 JUMP JUMPDEST POP PUSH2 0x5412 DUP2 PUSH2 0x5E57 JUMP JUMPDEST PUSH2 0x53CA JUMP JUMPDEST PUSH2 0x541F PUSH2 0x1C5C JUMP JUMPDEST POP PUSH2 0x5429 DUP2 PUSH2 0x5E57 JUMP JUMPDEST SWAP1 DUP2 ISZERO PUSH2 0x5435 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x543F SWAP2 POP PUSH2 0x5E97 JUMP JUMPDEST CODESIZE PUSH2 0x5431 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH2 0x5462 PUSH2 0x545D PUSH2 0x5467 SWAP3 PUSH2 0x5445 JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x5448 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x5474 PUSH1 0x14 PUSH2 0x544E JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x548B PUSH2 0x5486 PUSH2 0x5490 SWAP3 PUSH2 0x5448 JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x332 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x54B0 PUSH2 0x54AB PUSH2 0x54C6 SWAP3 PUSH2 0x54A5 PUSH2 0x2016 JUMP JUMPDEST POP PUSH2 0x4FAF JUMP JUMPDEST PUSH2 0x4FBB JUMP JUMPDEST PUSH2 0x54C0 PUSH2 0x54BB PUSH2 0x546A JUMP JUMPDEST PUSH2 0x5477 JUMP JUMPDEST SWAP1 PUSH2 0x566C JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x54E0 PUSH2 0x54DB PUSH2 0x54E5 SWAP3 PUSH2 0x54C9 JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x332 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x54FA PUSH2 0x54F5 DUP4 PUSH2 0x132E JUMP JUMPDEST PUSH2 0x78E JUMP JUMPDEST SWAP2 DUP3 MSTORE JUMP JUMPDEST CALLDATASIZE SWAP1 CALLDATACOPY JUMP JUMPDEST SWAP1 PUSH2 0x5529 PUSH2 0x5511 DUP4 PUSH2 0x54E8 JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP1 PUSH2 0x551F DUP7 SWAP4 PUSH2 0x132E JUMP JUMPDEST SWAP3 ADD SWAP2 SUB SWAP1 PUSH2 0x54FF JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x3 PUSH1 0xFC SHL SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x553D DUP3 PUSH2 0x35E5 JUMP JUMPDEST DUP2 LT ISZERO PUSH2 0x554F JUMPI PUSH1 0x1 PUSH1 0x20 SWAP2 MUL ADD ADD SWAP1 JUMP JUMPDEST PUSH2 0x36FA JUMP JUMPDEST PUSH1 0xF PUSH1 0xFB SHL SWAP1 JUMP JUMPDEST PUSH16 0x181899199A1A9B1B9C1CB0B131B232B3 PUSH1 0x81 SHL SWAP1 JUMP JUMPDEST PUSH2 0x557B PUSH2 0x555C JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x5595 PUSH2 0x5590 PUSH2 0x559A SWAP3 PUSH2 0x557E JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x332 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xF8 SHL SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x55BA PUSH2 0x55B5 PUSH2 0x55BF SWAP3 PUSH2 0x55A3 JUMP JUMPDEST PUSH2 0xBAA JUMP JUMPDEST PUSH2 0x5448 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x55E1 SWAP1 PUSH2 0x55DB PUSH2 0x55D5 PUSH2 0x55E6 SWAP5 PUSH2 0x5448 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST SWAP1 PUSH2 0x96E JUMP JUMPDEST PUSH2 0x332 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x537472696E67733A20686578206C656E67746820696E73756666696369656E74 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x561D PUSH1 0x20 DUP1 SWAP3 PUSH2 0x6D7 JUMP JUMPDEST PUSH2 0x5626 DUP2 PUSH2 0x55E9 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x5640 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x5611 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x564A JUMPI JUMP JUMPDEST PUSH2 0x5652 PUSH2 0x2E2 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x5668 PUSH1 0x4 DUP3 ADD PUSH2 0x562A JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP2 SWAP1 PUSH2 0x5676 PUSH2 0x2016 JUMP JUMPDEST POP PUSH2 0x5710 PUSH2 0x5700 PUSH2 0x56AC PUSH2 0x56A7 PUSH2 0x5697 PUSH1 0x2 PUSH2 0x5692 DUP8 SWAP2 PUSH2 0x54CC JUMP JUMPDEST PUSH2 0x252D JUMP JUMPDEST PUSH2 0x56A1 PUSH1 0x2 PUSH2 0x54CC JUMP JUMPDEST SWAP1 PUSH2 0x4034 JUMP JUMPDEST PUSH2 0x5504 JUMP JUMPDEST SWAP3 PUSH2 0x56B5 PUSH2 0x552B JUMP JUMPDEST PUSH2 0x56CE DUP6 PUSH2 0x56C8 PUSH1 0x0 SWAP4 PUSH1 0x0 BYTE SWAP4 PUSH2 0x21D6 JUMP JUMPDEST SWAP1 PUSH2 0x5533 JUMP JUMPDEST MSTORE8 PUSH2 0x56D7 PUSH2 0x5554 JUMP JUMPDEST PUSH2 0x56F0 DUP6 PUSH2 0x56EA PUSH1 0x1 SWAP4 PUSH1 0x0 BYTE SWAP4 PUSH2 0x2209 JUMP JUMPDEST SWAP1 PUSH2 0x5533 JUMP JUMPDEST MSTORE8 PUSH2 0x56FB PUSH1 0x2 PUSH2 0x54CC JUMP JUMPDEST PUSH2 0x252D JUMP JUMPDEST PUSH2 0x570A PUSH1 0x1 PUSH2 0x2209 JUMP JUMPDEST SWAP1 PUSH2 0x4034 JUMP JUMPDEST SWAP3 JUMPDEST DUP4 PUSH2 0x5726 PUSH2 0x5720 PUSH1 0x1 PUSH2 0x2209 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST GT ISZERO PUSH2 0x578D JUMPI PUSH2 0x5734 PUSH2 0x5573 JUMP JUMPDEST DUP2 PUSH2 0x573F PUSH1 0xF PUSH2 0x5581 JUMP JUMPDEST AND SWAP2 PUSH1 0x10 DUP4 LT ISZERO PUSH2 0x5788 JUMPI PUSH2 0x575B PUSH2 0x577C SWAP3 PUSH2 0x5782 SWAP5 BYTE PUSH2 0x559D JUMP JUMPDEST PUSH2 0x576B DUP6 SWAP2 DUP9 SWAP1 PUSH1 0x0 BYTE SWAP3 PUSH2 0x5533 JUMP JUMPDEST MSTORE8 PUSH2 0x5776 PUSH1 0x4 PUSH2 0x55A6 JUMP JUMPDEST SWAP1 PUSH2 0x55C2 JUMP JUMPDEST SWAP4 PUSH2 0x366B JUMP JUMPDEST SWAP3 PUSH2 0x5712 JUMP JUMPDEST PUSH2 0x36FA JUMP JUMPDEST PUSH2 0x57B5 SWAP3 SWAP4 POP PUSH2 0x57B0 SWAP1 PUSH2 0x57AA PUSH2 0x57A4 PUSH1 0x0 PUSH2 0x21D6 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST EQ PUSH2 0x5643 JUMP JUMPDEST PUSH2 0x2132 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x57C0 PUSH2 0x1C5C JUMP JUMPDEST POP EXTCODESIZE SWAP1 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 SWAP4 PUSH1 0x40 MLOAD SWAP6 DUP7 SWAP5 PUSH4 0xF23A6E61 DUP7 MSTORE CALLER DUP8 DUP8 ADD MSTORE PUSH1 0x60 SHL PUSH1 0x60 SHR PUSH1 0x40 DUP7 ADD MSTORE PUSH1 0x60 DUP6 ADD MSTORE PUSH1 0x80 DUP5 ADD MSTORE PUSH1 0xA0 DUP1 DUP5 ADD MSTORE DUP1 MLOAD DUP1 SWAP2 DUP2 DUP1 PUSH1 0xC0 DUP8 ADD MSTORE PUSH2 0x584A JUMPI JUMPDEST POP POP PUSH1 0xC4 ADD SWAP1 PUSH1 0x0 PUSH1 0x1C DUP5 ADD SWAP2 GAS CALL ISZERO PUSH2 0x583B JUMPI JUMPDEST PUSH4 0xF23A6E61 PUSH1 0xE0 SHL SWAP1 MLOAD SUB PUSH2 0x582D JUMPI JUMP JUMPDEST PUSH4 0x9C05499B PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x581C JUMPI RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST DUP2 DUP7 PUSH1 0xE0 DUP8 ADD SWAP3 ADD PUSH1 0x4 GAS STATICCALL POP DUP1 CODESIZE PUSH2 0x5807 JUMP JUMPDEST SWAP2 SWAP4 SWAP3 SWAP1 PUSH2 0x586A PUSH2 0x4601 JUMP JUMPDEST PUSH2 0x5996 JUMPI JUMPDEST DUP2 MLOAD DUP6 MLOAD SUB PUSH2 0x5988 JUMPI PUSH1 0x60 SHL SWAP2 DUP3 PUSH8 0x9A31110384E0B0C9 OR PUSH1 0x20 MSTORE DUP1 PUSH1 0x60 SHL DUP4 DUP2 EQ SWAP1 ISZERO OR ISZERO PUSH2 0x5966 JUMPI JUMPDEST POP DUP4 MLOAD PUSH1 0x5 SHL DUP1 JUMPDEST PUSH2 0x5930 JUMPI POP PUSH32 0x4A39DC06D4C0DBC64B70AF90FD698A233A518AA5D07E595D983B8C0526C8F7FB PUSH1 0x0 SWAP4 SWAP5 PUSH1 0x40 MLOAD SWAP3 DUP4 SWAP2 PUSH1 0x40 DUP4 MSTORE DUP1 MLOAD PUSH1 0x5 SHL PUSH1 0x20 ADD DUP1 SWAP2 PUSH1 0x40 DUP6 ADD SWAP3 DUP4 SWAP2 PUSH1 0x4 GAS STATICCALL POP RETURNDATASIZE PUSH1 0x40 ADD PUSH1 0x20 DUP5 ADD MSTORE RETURNDATASIZE ADD SWAP1 DUP2 DUP2 MLOAD PUSH1 0x5 SHL PUSH1 0x20 ADD DUP1 SWAP3 PUSH1 0x4 GAS STATICCALL POP RETURNDATASIZE ADD SUB SWAP3 PUSH1 0x60 SHR SWAP3 CALLER SWAP3 LOG4 PUSH2 0x591B PUSH2 0x460F JUMP JUMPDEST PUSH2 0x5922 JUMPI JUMPDEST JUMP JUMPDEST PUSH2 0x592A PUSH2 0x2249 JUMP JUMPDEST POP PUSH2 0x5920 JUMP JUMPDEST DUP1 DUP3 ADD MLOAD SWAP1 DUP1 DUP7 ADD MLOAD PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP1 SLOAD SWAP3 DUP4 DUP2 GT PUSH2 0x5958 JUMPI PUSH1 0x20 SWAP4 SUB SWAP1 SSTORE SUB DUP1 PUSH2 0x58A2 JUMP JUMPDEST PUSH4 0xF4D678B8 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x34 PUSH1 0xC KECCAK256 SLOAD ISZERO PUSH2 0x597A JUMPI CODESIZE PUSH2 0x589A JUMP JUMPDEST PUSH4 0x4B6E7F18 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH4 0x3B800A46 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH2 0x599E PUSH2 0x2249 JUMP JUMPDEST POP PUSH2 0x586F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST SLOAD SWAP1 JUMP JUMPDEST PUSH2 0x59BF DUP2 PUSH2 0x59B2 JUMP JUMPDEST DUP3 LT ISZERO PUSH2 0x59DA JUMPI PUSH2 0x59D1 PUSH1 0x1 SWAP2 PUSH2 0x59A7 JUMP JUMPDEST SWAP2 MUL ADD SWAP1 PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x36FA JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x59F5 PUSH2 0x59F0 PUSH2 0x59FD SWAP4 PUSH2 0x2363 JUMP JUMPDEST PUSH2 0x2AC4 JUMP JUMPDEST SWAP1 DUP4 SLOAD PUSH2 0x1D46 JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST SWAP1 DUP2 SLOAD SWAP2 PUSH9 0x10000000000000000 DUP4 LT ISZERO PUSH2 0x5A31 JUMPI DUP3 PUSH2 0x5A29 SWAP2 PUSH1 0x1 PUSH2 0x5A2F SWAP6 ADD DUP2 SSTORE PUSH2 0x59B6 JUMP JUMPDEST SWAP1 PUSH2 0x59DF JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x649 JUMP JUMPDEST SWAP1 PUSH2 0x5A40 SWAP1 PUSH2 0x2363 JUMP JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 JUMP JUMPDEST PUSH2 0x5A56 PUSH2 0x1C5C JUMP JUMPDEST POP PUSH2 0x5A6B PUSH2 0x5A65 DUP3 DUP5 SWAP1 PUSH2 0x5ED7 JUMP JUMPDEST ISZERO PUSH2 0x42F JUMP JUMPDEST PUSH1 0x0 EQ PUSH2 0x5AAE JUMPI PUSH2 0x5AA4 PUSH2 0x5AA9 SWAP3 PUSH2 0x5A8F PUSH2 0x5A88 PUSH1 0x0 DUP6 ADD PUSH2 0x59A4 JUMP JUMPDEST DUP3 SWAP1 PUSH2 0x5A01 JUMP JUMPDEST PUSH1 0x1 PUSH2 0x5A9D PUSH1 0x0 DUP6 ADD PUSH2 0x51A1 JUMP JUMPDEST SWAP4 ADD PUSH2 0x5A36 JUMP JUMPDEST PUSH2 0x2AF0 JUMP JUMPDEST PUSH1 0x1 SWAP1 JUMP JUMPDEST POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x31 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x5ADD SWAP2 PUSH2 0x5AD7 PUSH2 0x235E JUMP JUMPDEST SWAP2 PUSH2 0x59DF JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x5AE8 DUP2 PUSH2 0x59B2 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x5B09 JUMPI PUSH1 0x1 SWAP1 SUB SWAP1 PUSH2 0x5B06 PUSH2 0x5B00 DUP4 DUP4 PUSH2 0x59B6 JUMP JUMPDEST SWAP1 PUSH2 0x5ACB JUMP JUMPDEST SSTORE JUMP JUMPDEST PUSH2 0x5AB5 JUMP JUMPDEST PUSH2 0x5B16 PUSH2 0x1C5C JUMP JUMPDEST POP PUSH2 0x5B2D PUSH2 0x5B28 PUSH1 0x1 DUP4 ADD DUP5 SWAP1 PUSH2 0x5A36 JUMP JUMPDEST PUSH2 0x21C9 JUMP JUMPDEST SWAP1 DUP2 PUSH2 0x5B42 PUSH2 0x5B3C PUSH1 0x0 PUSH2 0x21D6 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST EQ ISZERO PUSH1 0x0 EQ PUSH2 0x5C10 JUMPI PUSH2 0x5BC2 SWAP3 PUSH1 0x1 PUSH2 0x5BBD SWAP3 DUP5 PUSH2 0x5B6B PUSH1 0x0 SWAP7 PUSH2 0x5B65 DUP6 PUSH2 0x2209 JUMP JUMPDEST SWAP1 PUSH2 0x44CD JUMP JUMPDEST PUSH2 0x5B88 PUSH2 0x5B79 DUP9 DUP6 ADD PUSH2 0x51A1 JUMP JUMPDEST PUSH2 0x5B82 DUP7 PUSH2 0x2209 JUMP JUMPDEST SWAP1 PUSH2 0x44CD JUMP JUMPDEST DUP1 PUSH2 0x5B9B PUSH2 0x5B95 DUP5 PUSH2 0x332 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST SUB PUSH2 0x5BC7 JUMPI JUMPDEST POP POP POP PUSH2 0x5BB7 PUSH2 0x5BB2 DUP7 DUP4 ADD PUSH2 0x59A4 JUMP JUMPDEST PUSH2 0x5ADF JUMP JUMPDEST ADD PUSH2 0x5A36 JUMP JUMPDEST PUSH2 0x1D91 JUMP JUMPDEST PUSH1 0x1 SWAP1 JUMP JUMPDEST PUSH2 0x5C08 SWAP3 PUSH2 0x5BFA PUSH2 0x5BE6 PUSH2 0x5BE0 PUSH2 0x5C03 SWAP5 DUP13 DUP10 ADD PUSH2 0x51B0 JUMP JUMPDEST SWAP1 PUSH2 0xF41 JUMP JUMPDEST SWAP4 PUSH2 0x5BF4 DUP6 SWAP2 DUP13 DUP10 ADD PUSH2 0x51B0 JUMP JUMPDEST SWAP1 PUSH2 0x59DF JUMP JUMPDEST SWAP2 DUP6 DUP6 ADD PUSH2 0x5A36 JUMP JUMPDEST PUSH2 0x2AF0 JUMP JUMPDEST CODESIZE DUP1 DUP1 PUSH2 0x5BA1 JUMP JUMPDEST POP POP POP PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x5C2E PUSH2 0x5C33 SWAP4 SWAP3 PUSH2 0x5C29 PUSH2 0x1F39 JUMP JUMPDEST PUSH2 0x4667 JUMP JUMPDEST PUSH2 0x5F0D JUMP JUMPDEST JUMP JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x5C41 PUSH2 0x4601 JUMP JUMPDEST PUSH2 0x5D17 JUMPI JUMPDEST PUSH1 0x60 SHL SWAP1 DUP2 PUSH8 0x9A31110384E0B0C9 OR PUSH1 0x20 MSTORE DUP2 DUP2 PUSH1 0x60 SHL EQ DUP2 PUSH1 0x60 SHL ISZERO OR ISZERO PUSH2 0x5CF5 JUMPI JUMPDEST POP DUP3 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 SWAP1 DUP2 SLOAD SWAP2 DUP3 DUP5 GT PUSH2 0x5CE7 JUMPI DUP4 PUSH1 0x0 SWAP4 SUB SWAP1 SSTORE DUP3 PUSH1 0x20 MSTORE PUSH1 0x60 SHR CALLER PUSH32 0xC3D58168C5AE7397731D063D5BBF3D657854427343F4C083240F7AACAA2D0F62 PUSH1 0x40 DUP5 LOG4 PUSH2 0x5CBB PUSH2 0x460F JUMP JUMPDEST PUSH2 0x5CC4 JUMPI JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x5CD0 PUSH2 0x5CD6 SWAP3 PUSH2 0x4BE5 JUMP JUMPDEST POP PUSH2 0x4BE5 JUMP JUMPDEST POP PUSH2 0x5CDF PUSH2 0x2249 JUMP JUMPDEST POP CODESIZE DUP1 PUSH2 0x5CC0 JUMP JUMPDEST PUSH4 0xF4D678B8 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH1 0x0 MSTORE PUSH1 0x34 PUSH1 0xC KECCAK256 SLOAD ISZERO PUSH2 0x5D09 JUMPI CODESIZE PUSH2 0x5C6A JUMP JUMPDEST PUSH4 0x4B6E7F18 PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST PUSH2 0x5D20 DUP5 PUSH2 0x4BE5 JUMP JUMPDEST POP PUSH2 0x5D2A DUP4 PUSH2 0x4BE5 JUMP JUMPDEST POP PUSH2 0x5D33 PUSH2 0x2249 JUMP JUMPDEST POP PUSH2 0x5C46 JUMP JUMPDEST SWAP2 SWAP4 PUSH1 0x20 SWAP4 PUSH1 0x40 MLOAD SWAP6 DUP7 SWAP5 PUSH4 0xBC197C81 DUP7 MSTORE CALLER DUP8 DUP8 ADD MSTORE PUSH1 0x60 SHL PUSH1 0x60 SHR PUSH1 0x40 DUP7 ADD MSTORE PUSH1 0xA0 PUSH1 0x60 DUP7 ADD MSTORE DUP1 MLOAD PUSH1 0x5 SHL DUP7 ADD DUP1 SWAP2 PUSH1 0xC0 DUP8 ADD SWAP3 DUP4 SWAP2 PUSH1 0x4 GAS STATICCALL POP RETURNDATASIZE PUSH1 0xA0 ADD SWAP1 DUP2 PUSH1 0x80 DUP8 ADD MSTORE RETURNDATASIZE ADD SWAP2 DUP3 DUP2 MLOAD PUSH1 0x5 SHL DUP9 ADD DUP1 SWAP3 PUSH1 0x4 GAS STATICCALL POP RETURNDATASIZE ADD PUSH1 0xA0 DUP6 ADD MSTORE RETURNDATASIZE ADD SWAP1 DUP2 DUP2 MLOAD DUP7 ADD DUP1 SWAP3 PUSH1 0x4 GAS STATICCALL POP PUSH1 0x1C DUP4 ADD SWAP1 RETURNDATASIZE ADD SUB SWAP1 PUSH1 0x0 PUSH1 0x1C DUP5 ADD SWAP2 GAS CALL ISZERO PUSH2 0x5DE1 JUMPI JUMPDEST PUSH4 0xBC197C81 PUSH1 0xE0 SHL SWAP1 MLOAD SUB PUSH2 0x5DD3 JUMPI JUMP JUMPDEST PUSH4 0x9C05499B PUSH1 0x0 MSTORE PUSH1 0x4 PUSH1 0x1C REVERT JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x5DC2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH2 0x5DF8 PUSH2 0x1C5C JUMP JUMPDEST POP PUSH1 0xE0 SHR PUSH4 0xE89341C DUP2 EQ SWAP1 PUSH4 0x1FFC9A7 PUSH4 0xD9B67A26 DUP3 EQ SWAP2 EQ OR OR SWAP1 JUMP JUMPDEST PUSH2 0x5E1F PUSH2 0x1C5C JUMP JUMPDEST POP DUP1 PUSH2 0x5E3A PUSH2 0x5E34 PUSH4 0x152A902D PUSH1 0xE1 SHL PUSH2 0x3E0 JUMP JUMPDEST SWAP2 PUSH2 0x3E0 JUMP JUMPDEST EQ SWAP1 DUP2 ISZERO PUSH2 0x5E47 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x5E51 SWAP2 POP PUSH2 0x5F2D JUMP JUMPDEST CODESIZE PUSH2 0x5E43 JUMP JUMPDEST PUSH2 0x5E5F PUSH2 0x1C5C JUMP JUMPDEST POP DUP1 PUSH2 0x5E7A PUSH2 0x5E74 PUSH4 0x5A05180F PUSH1 0xE0 SHL PUSH2 0x3E0 JUMP JUMPDEST SWAP2 PUSH2 0x3E0 JUMP JUMPDEST EQ SWAP1 DUP2 ISZERO PUSH2 0x5E87 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x5E91 SWAP2 POP PUSH2 0x5F53 JUMP JUMPDEST CODESIZE PUSH2 0x5E83 JUMP JUMPDEST PUSH2 0x5E9F PUSH2 0x1C5C JUMP JUMPDEST POP DUP1 PUSH2 0x5EBA PUSH2 0x5EB4 PUSH4 0x4E821D33 PUSH1 0xE1 SHL PUSH2 0x3E0 JUMP JUMPDEST SWAP2 PUSH2 0x3E0 JUMP JUMPDEST EQ SWAP1 DUP2 ISZERO PUSH2 0x5EC7 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x5ED1 SWAP2 POP PUSH2 0x53B1 JUMP JUMPDEST CODESIZE PUSH2 0x5EC3 JUMP JUMPDEST PUSH2 0x5EF5 SWAP2 PUSH1 0x1 PUSH2 0x5EF0 SWAP3 PUSH2 0x5EE9 PUSH2 0x1C5C JUMP JUMPDEST POP ADD PUSH2 0x5A36 JUMP JUMPDEST PUSH2 0x21C9 JUMP JUMPDEST PUSH2 0x5F08 PUSH2 0x5F02 PUSH1 0x0 PUSH2 0x21D6 JUMP JUMPDEST SWAP2 PUSH2 0x332 JUMP JUMPDEST EQ ISZERO SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x5F24 PUSH2 0x5F1D PUSH2 0x5F2B SWAP4 PUSH2 0x1FA0 JUMP JUMPDEST PUSH1 0x6 PUSH2 0x1FD6 JUMP JUMPDEST PUSH1 0x7 PUSH2 0x2AD0 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x5F35 PUSH2 0x1C5C JUMP JUMPDEST POP PUSH2 0x5F4F PUSH2 0x5F49 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL PUSH2 0x3E0 JUMP JUMPDEST SWAP2 PUSH2 0x3E0 JUMP JUMPDEST EQ SWAP1 JUMP JUMPDEST PUSH2 0x5F5B PUSH2 0x1C5C JUMP JUMPDEST POP DUP1 PUSH2 0x5F76 PUSH2 0x5F70 PUSH4 0x7965DB0B PUSH1 0xE0 SHL PUSH2 0x3E0 JUMP JUMPDEST SWAP2 PUSH2 0x3E0 JUMP JUMPDEST EQ SWAP1 DUP2 ISZERO PUSH2 0x5F83 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x5F8D SWAP2 POP PUSH2 0x5E17 JUMP JUMPDEST CODESIZE PUSH2 0x5F7F JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x23 0xAF SWAP10 0xD0 SLT 0xF9 0xC0 CODECOPY PUSH22 0x49FA6D414EA97A8C70379F7B83DD92C49E8264E57F39 0xAD PUSH5 0x736F6C6343 STOP ADDMOD SHL STOP CALLER PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE PUSH2 0x2F JUMPI PUSH2 0x19 PUSH2 0x14 PUSH2 0xFA JUMP JUMPDEST PUSH2 0x11B JUMP JUMPDEST PUSH2 0x21 PUSH2 0x34 JUMP JUMPDEST PUSH2 0x722 PUSH2 0x380 DUP3 CODECOPY PUSH2 0x722 SWAP1 RETURN JUMPDEST PUSH2 0x3A JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1F DUP1 NOT SWAP2 ADD AND SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH2 0x69 SWAP1 PUSH2 0x3F JUMP JUMPDEST DUP2 ADD SWAP1 DUP2 LT PUSH1 0x1 DUP1 PUSH1 0x40 SHL SUB DUP3 GT OR PUSH2 0x81 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH2 0x49 JUMP JUMPDEST SWAP1 PUSH2 0x99 PUSH2 0x92 PUSH2 0x34 JUMP JUMPDEST SWAP3 DUP4 PUSH2 0x5F JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0xB4 SWAP1 PUSH2 0xA0 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xC0 DUP2 PUSH2 0xAB JUMP JUMPDEST SUB PUSH2 0xC7 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP MLOAD SWAP1 PUSH2 0xD9 DUP3 PUSH2 0xB7 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0xF5 JUMPI PUSH2 0xF2 SWAP2 PUSH1 0x0 ADD PUSH2 0xCC JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x9B JUMP JUMPDEST PUSH2 0x118 PUSH2 0xAA2 DUP1 CODESIZE SUB DUP1 PUSH2 0x10D DUP2 PUSH2 0x86 JUMP JUMPDEST SWAP3 DUP4 CODECOPY DUP2 ADD SWAP1 PUSH2 0xDB JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x12C SWAP1 PUSH2 0x127 PUSH2 0x12E JUMP JUMPDEST PUSH2 0x26E JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x13E PUSH2 0x139 PUSH2 0x291 JUMP JUMPDEST PUSH2 0x2D6 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 PUSH32 0x6E206973206E6F74206120636F6E747261637400000000000000000000000000 SWAP2 PUSH32 0x5570677261646561626C65426561636F6E3A20696D706C656D656E746174696F PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x1A4 PUSH1 0x33 PUSH1 0x40 SWAP3 PUSH2 0x140 JUMP JUMPDEST PUSH2 0x1AD DUP2 PUSH2 0x149 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x1C7 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x197 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x1D1 JUMPI JUMP JUMPDEST PUSH2 0x1D9 PUSH2 0x34 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x1EF PUSH1 0x4 DUP3 ADD PUSH2 0x1B1 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SHL SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x20A PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB SWAP2 PUSH2 0x1F3 JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x22B PUSH2 0x226 PUSH2 0x230 SWAP3 PUSH2 0xA0 JUMP JUMPDEST PUSH2 0x214 JUMP JUMPDEST PUSH2 0xA0 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x23C SWAP1 PUSH2 0x217 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x248 SWAP1 PUSH2 0x233 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x263 PUSH2 0x25E PUSH2 0x26A SWAP3 PUSH2 0x23F JUMP JUMPDEST PUSH2 0x24B JUMP JUMPDEST DUP3 SLOAD PUSH2 0x1F9 JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x28A SWAP1 PUSH2 0x283 PUSH2 0x27E DUP3 PUSH2 0x35E JUMP JUMPDEST PUSH2 0x1CA JUMP JUMPDEST PUSH1 0x1 PUSH2 0x24E JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x299 PUSH2 0x28C JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 SHR SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x2BB PUSH2 0x2C0 SWAP2 PUSH2 0x29E JUMP JUMPDEST PUSH2 0x2A4 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2CD SWAP1 SLOAD PUSH2 0x2AF JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 ADD SWAP1 JUMP JUMPDEST PUSH2 0x2E0 PUSH1 0x0 PUSH2 0x2C3 JUMP JUMPDEST PUSH2 0x2EB DUP3 PUSH1 0x0 PUSH2 0x24E JUMP JUMPDEST SWAP1 PUSH2 0x31F PUSH2 0x319 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP4 PUSH2 0x23F JUMP JUMPDEST SWAP2 PUSH2 0x23F JUMP JUMPDEST SWAP2 PUSH2 0x328 PUSH2 0x34 JUMP JUMPDEST DUP1 PUSH2 0x332 DUP2 PUSH2 0x2D0 JUMP JUMPDEST SUB SWAP1 LOG3 JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x356 PUSH2 0x351 PUSH2 0x35B SWAP3 PUSH2 0x33F JUMP JUMPDEST PUSH2 0x214 JUMP JUMPDEST PUSH2 0x33C JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x366 PUSH2 0x337 JUMP JUMPDEST POP EXTCODESIZE PUSH2 0x37B PUSH2 0x375 PUSH1 0x0 PUSH2 0x342 JUMP JUMPDEST SWAP2 PUSH2 0x33C JUMP JUMPDEST GT SWAP1 JUMP INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x13 JUMPI JUMPDEST PUSH2 0x219 JUMP JUMPDEST PUSH2 0x1E PUSH1 0x0 CALLDATALOAD PUSH2 0x6D JUMP JUMPDEST DUP1 PUSH4 0x3659CFE6 EQ PUSH2 0x68 JUMPI DUP1 PUSH4 0x5C60DA1B EQ PUSH2 0x63 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x5E JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x59 JUMPI PUSH4 0xF2FDE38B SUB PUSH2 0xE JUMPI PUSH2 0x1E6 JUMP JUMPDEST PUSH2 0x1B1 JUMP JUMPDEST PUSH2 0x17E JUMP JUMPDEST PUSH2 0x149 JUMP JUMPDEST PUSH2 0xE3 JUMP JUMPDEST PUSH1 0xE0 SHR SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x97 SWAP1 PUSH2 0x83 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xA3 DUP2 PUSH2 0x8E JUMP JUMPDEST SUB PUSH2 0xAA JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0xBC DUP3 PUSH2 0x9A JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0xD8 JUMPI PUSH2 0xD5 SWAP2 PUSH1 0x0 ADD PUSH2 0xAF JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x7E JUMP JUMPDEST PUSH1 0x0 ADD SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x111 JUMPI PUSH2 0xFB PUSH2 0xF6 CALLDATASIZE PUSH1 0x4 PUSH2 0xBE JUMP JUMPDEST PUSH2 0x2B3 JUMP JUMPDEST PUSH2 0x103 PUSH2 0x73 JUMP JUMPDEST DUP1 PUSH2 0x10D DUP2 PUSH2 0xDD JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x79 JUMP JUMPDEST PUSH1 0x0 SWAP2 SUB SLT PUSH2 0x121 JUMPI JUMP JUMPDEST PUSH2 0x7E JUMP JUMPDEST PUSH2 0x12F SWAP1 PUSH2 0x8E JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x147 SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0x126 JUMP JUMPDEST JUMP JUMPDEST CALLVALUE PUSH2 0x179 JUMPI PUSH2 0x159 CALLDATASIZE PUSH1 0x4 PUSH2 0x116 JUMP JUMPDEST PUSH2 0x175 PUSH2 0x164 PUSH2 0x2F5 JUMP JUMPDEST PUSH2 0x16C PUSH2 0x73 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x133 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x79 JUMP JUMPDEST CALLVALUE PUSH2 0x1AC JUMPI PUSH2 0x18E CALLDATASIZE PUSH1 0x4 PUSH2 0x116 JUMP JUMPDEST PUSH2 0x196 PUSH2 0x35C JUMP JUMPDEST PUSH2 0x19E PUSH2 0x73 JUMP JUMPDEST DUP1 PUSH2 0x1A8 DUP2 PUSH2 0xDD JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x79 JUMP JUMPDEST CALLVALUE PUSH2 0x1E1 JUMPI PUSH2 0x1C1 CALLDATASIZE PUSH1 0x4 PUSH2 0x116 JUMP JUMPDEST PUSH2 0x1DD PUSH2 0x1CC PUSH2 0x366 JUMP JUMPDEST PUSH2 0x1D4 PUSH2 0x73 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x133 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x79 JUMP JUMPDEST CALLVALUE PUSH2 0x214 JUMPI PUSH2 0x1FE PUSH2 0x1F9 CALLDATASIZE PUSH1 0x4 PUSH2 0xBE JUMP JUMPDEST PUSH2 0x473 JUMP JUMPDEST PUSH2 0x206 PUSH2 0x73 JUMP JUMPDEST DUP1 PUSH2 0x210 DUP2 PUSH2 0xDD JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x79 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x22F SWAP1 PUSH2 0x22A PUSH2 0x501 JUMP JUMPDEST PUSH2 0x268 JUMP JUMPDEST JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x248 PUSH2 0x243 PUSH2 0x24D SWAP3 PUSH2 0x83 JUMP JUMPDEST PUSH2 0x231 JUMP JUMPDEST PUSH2 0x83 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x259 SWAP1 PUSH2 0x234 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x265 SWAP1 PUSH2 0x250 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x271 DUP2 PUSH2 0x61B JUMP JUMPDEST PUSH2 0x29B PUSH32 0xBC7CD75A20EE27FD9ADEBAB32041F755214DBC6BFFA90CC0225B39DA2E5C2D3B SWAP2 PUSH2 0x25C JUMP JUMPDEST SWAP1 PUSH2 0x2A4 PUSH2 0x73 JUMP JUMPDEST DUP1 PUSH2 0x2AE DUP2 PUSH2 0xDD JUMP JUMPDEST SUB SWAP1 LOG2 JUMP JUMPDEST PUSH2 0x2BC SWAP1 PUSH2 0x21E JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH1 0x0 SHR SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x2E0 PUSH2 0x2E5 SWAP2 PUSH2 0x2C3 JUMP JUMPDEST PUSH2 0x2C9 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2F2 SWAP1 SLOAD PUSH2 0x2D4 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2FD PUSH2 0x2BE JUMP JUMPDEST POP PUSH2 0x308 PUSH1 0x1 PUSH2 0x2E8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x313 PUSH2 0x501 JUMP JUMPDEST PUSH2 0x31B PUSH2 0x348 JUMP JUMPDEST JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x334 PUSH2 0x32F PUSH2 0x339 SWAP3 PUSH2 0x31D JUMP JUMPDEST PUSH2 0x231 JUMP JUMPDEST PUSH2 0x83 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x345 SWAP1 PUSH2 0x320 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x35A PUSH2 0x355 PUSH1 0x0 PUSH2 0x33C JUMP JUMPDEST PUSH2 0x639 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x364 PUSH2 0x30B JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x36E PUSH2 0x2BE JUMP JUMPDEST POP PUSH2 0x379 PUSH1 0x0 PUSH2 0x2E8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x38D SWAP1 PUSH2 0x388 PUSH2 0x501 JUMP JUMPDEST PUSH2 0x442 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x3F3 PUSH1 0x26 PUSH1 0x40 SWAP3 PUSH2 0x38F JUMP JUMPDEST PUSH2 0x3FC DUP2 PUSH2 0x398 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x416 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x3E6 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x420 JUMPI JUMP JUMPDEST PUSH2 0x428 PUSH2 0x73 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x43E PUSH1 0x4 DUP3 ADD PUSH2 0x400 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x471 SWAP1 PUSH2 0x46C DUP2 PUSH2 0x465 PUSH2 0x45F PUSH2 0x45A PUSH1 0x0 PUSH2 0x33C JUMP JUMPDEST PUSH2 0x8E JUMP JUMPDEST SWAP2 PUSH2 0x8E JUMP JUMPDEST EQ ISZERO PUSH2 0x419 JUMP JUMPDEST PUSH2 0x639 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x47C SWAP1 PUSH2 0x37C JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x4B2 PUSH1 0x20 DUP1 SWAP3 PUSH2 0x38F JUMP JUMPDEST PUSH2 0x4BB DUP2 PUSH2 0x47E JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x4D5 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x4A6 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x4DF JUMPI JUMP JUMPDEST PUSH2 0x4E7 PUSH2 0x73 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x4FD PUSH1 0x4 DUP3 ADD PUSH2 0x4BF JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x52B PUSH2 0x50C PUSH2 0x366 JUMP JUMPDEST PUSH2 0x525 PUSH2 0x51F PUSH2 0x51A PUSH2 0x69A JUMP JUMPDEST PUSH2 0x8E JUMP JUMPDEST SWAP2 PUSH2 0x8E JUMP JUMPDEST EQ PUSH2 0x4D8 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x20 PUSH32 0x6E206973206E6F74206120636F6E747261637400000000000000000000000000 SWAP2 PUSH32 0x5570677261646561626C65426561636F6E3A20696D706C656D656E746174696F PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x588 PUSH1 0x33 PUSH1 0x40 SWAP3 PUSH2 0x38F JUMP JUMPDEST PUSH2 0x591 DUP2 PUSH2 0x52D JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x5AB SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x57B JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x5B5 JUMPI JUMP JUMPDEST PUSH2 0x5BD PUSH2 0x73 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x5D3 PUSH1 0x4 DUP3 ADD PUSH2 0x595 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SHL SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x5EE PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB SWAP2 PUSH2 0x5D7 JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x610 PUSH2 0x60B PUSH2 0x617 SWAP3 PUSH2 0x25C JUMP JUMPDEST PUSH2 0x5F8 JUMP JUMPDEST DUP3 SLOAD PUSH2 0x5DD JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x637 SWAP1 PUSH2 0x630 PUSH2 0x62B DUP3 PUSH2 0x6CB JUMP JUMPDEST PUSH2 0x5AE JUMP JUMPDEST PUSH1 0x1 PUSH2 0x5FB JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x643 PUSH1 0x0 PUSH2 0x2E8 JUMP JUMPDEST PUSH2 0x64E DUP3 PUSH1 0x0 PUSH2 0x5FB JUMP JUMPDEST SWAP1 PUSH2 0x682 PUSH2 0x67C PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP4 PUSH2 0x25C JUMP JUMPDEST SWAP2 PUSH2 0x25C JUMP JUMPDEST SWAP2 PUSH2 0x68B PUSH2 0x73 JUMP JUMPDEST DUP1 PUSH2 0x695 DUP2 PUSH2 0xDD JUMP JUMPDEST SUB SWAP1 LOG3 JUMP JUMPDEST PUSH2 0x6A2 PUSH2 0x2BE JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x6C3 PUSH2 0x6BE PUSH2 0x6C8 SWAP3 PUSH2 0x31D JUMP JUMPDEST PUSH2 0x231 JUMP JUMPDEST PUSH2 0x6AC JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x6D3 PUSH2 0x6A7 JUMP JUMPDEST POP EXTCODESIZE PUSH2 0x6E8 PUSH2 0x6E2 PUSH1 0x0 PUSH2 0x6AF JUMP JUMPDEST SWAP2 PUSH2 0x6AC JUMP JUMPDEST GT SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 EXTCODEHASH 0xBF SWAP5 0xB3 0xAA XOR 0x2E PUSH18 0x20F7EE578F52EECCE106FBE2A323E7E4F151 SAR SWAP16 0x27 PUSH23 0x8EAD64736F6C634300081B003300000000000000000000 ", + "sourceMap": "341:2469:44:-:0;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;:::i;:::-;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;615:196::-;;;;:::i;:::-;702:31;;:::i;:::-;;;;;;;;341:2469;;;;;702:31;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;776:13;791:12;683:50;776:13;:::i;:::-;791:12;:::i;:::-;615:196::o;702:31::-;;:::i;:::-;;:::i;689:2159:33:-;;;:::i;:::-;:::o;912:63:4:-;955:12;;;:::i;:::-;;:::i;:::-;912:63::o;341:2469:44:-;;;;:::o;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;961:189:33:-;1056:37;;:::i;:::-;;;;;;;;341:2469:44;;;;;1056:37:33;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;1047:46;1130:12;1047:46;;;:::i;:::-;1130:12;:::i;:::-;961:189::o;1056:37::-;;:::i;:::-;;:::i;341:2469:44:-;;;:::o;640:96:14:-;693:7;;:::i;:::-;719:10;;712:17;:::o;341:2469:44:-;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;:::o;2426:187:4:-;2518:6;;;:::i;:::-;2534:17;2543:8;2534:17;;:::i;:::-;2597:8;2566:40;;;;;:::i;:::-;;;:::i;:::-;;;;:::i;:::-;;;;;:::i;:::-;;;;2426:187::o" + }, + "deployedBytecode": { + "functionDebugData": { + "abi_decode": { + "entryPoint": 315, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_decode_address": { + "entryPoint": 212, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_addresst_addresst_stringt_stringt_stringt_addresst_uint96t_addresst_bytes32": { + "entryPoint": 875, + "id": null, + "parameterSlots": 2, + "returnSlots": 9 + }, + "abi_decode_available_length_string": { + "entryPoint": 694, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_decode_bytes32": { + "entryPoint": 860, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_fromMemory": { + "entryPoint": 1482, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_decode_string": { + "entryPoint": 748, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_address": { + "entryPoint": 227, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_uint96": { + "entryPoint": 821, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_address": { + "entryPoint": 1092, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_address_address_bytes": { + "entryPoint": 3368, + "id": null, + "parameterSlots": 4, + "returnSlots": 1 + }, + "abi_encode_address_string_string_string_address_uint96_address_bytes32": { + "entryPoint": 1803, + "id": null, + "parameterSlots": 9, + "returnSlots": 1 + }, + "abi_encode_address_to_address_nonPadded_inplace": { + "entryPoint": 3098, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_bytes": { + "entryPoint": 3124, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_bytes32": { + "entryPoint": 3047, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_bytes32_to_bytes32": { + "entryPoint": 1790, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_bytes_memory_ptr": { + "entryPoint": 3319, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_contract_UpgradeableBeacon": { + "entryPoint": 468, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_contract_UpgradeableBeacon_to_address": { + "entryPoint": 455, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_packed_bytes32_address_address_bytes": { + "entryPoint": 3165, + "id": null, + "parameterSlots": 5, + "returnSlots": 1 + }, + "abi_encode_string": { + "entryPoint": 1728, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_stringliteral": { + "entryPoint": 2934, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_stringliteral_1247": { + "entryPoint": 4264, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_stringliteral_245f": { + "entryPoint": 2717, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_stringliteral_8714": { + "entryPoint": 4395, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_stringliteral_9924": { + "entryPoint": 2909, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_stringliteral_f94f": { + "entryPoint": 4158, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_stringliteral_f94f9c62541b73155a9def26a7988ac5579c2c6b698df8f608ced5572b7d72ca": { + "entryPoint": 4132, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple": { + "entryPoint": 258, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple_address": { + "entryPoint": 1105, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_stringliteral": { + "entryPoint": 4421, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple_stringliteral_1247": { + "entryPoint": 4289, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple_stringliteral_245f": { + "entryPoint": 2743, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_uint96": { + "entryPoint": 1777, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "allocate_memory": { + "entryPoint": 626, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "allocate_memory_array_string": { + "entryPoint": 1947, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "allocate_unbounded": { + "entryPoint": 147, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "array_allocation_size_string": { + "entryPoint": 647, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_dataslot_bytes": { + "entryPoint": 1937, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_length_bytes": { + "entryPoint": 1943, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_length_string": { + "entryPoint": 1678, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "array_storeLengthForEncoding_bytes": { + "entryPoint": 3310, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "array_storeLengthForEncoding_bytes_nonPadded_inplace": { + "entryPoint": 3119, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "array_storeLengthForEncoding_string": { + "entryPoint": 1682, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "cleanup_address": { + "entryPoint": 179, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_bytes32": { + "entryPoint": 836, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_from_storage_address": { + "entryPoint": 2447, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_from_storage_contract_UpgradeableBeacon": { + "entryPoint": 335, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_rational_by": { + "entryPoint": 2374, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_uint160": { + "entryPoint": 168, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_uint256": { + "entryPoint": 3219, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_uint96": { + "entryPoint": 783, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_address_payable_to_contract_ITransparentUpgradeableBeaconProxy": { + "entryPoint": 3286, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_address_to_address": { + "entryPoint": 3773, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_address_to_address_payable": { + "entryPoint": 3262, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_address_to_contract_ERC1155Pack": { + "entryPoint": 2006, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_contract_Create2_to_address": { + "entryPoint": 4080, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_contract_ERC1155Pack_to_address": { + "entryPoint": 2018, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_contract_ITransparentUpgradeableBeaconProxy_to_address": { + "entryPoint": 3298, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_contract_UpgradeableBeacon_to_address": { + "entryPoint": 443, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_by_to_address": { + "entryPoint": 2405, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_by_to_uint160": { + "entryPoint": 2377, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_rational_by_to_uint256": { + "entryPoint": 3222, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_stringliteral_c5d2_to_bytes": { + "entryPoint": 1983, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "convert_uint160_to_address": { + "entryPoint": 431, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint160_to_address_payable": { + "entryPoint": 3250, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint160_to_contract_ERC1155Pack": { + "entryPoint": 1994, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint160_to_contract_ITransparentUpgradeableBeaconProxy": { + "entryPoint": 3274, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "convert_uint160_to_uint160": { + "entryPoint": 403, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "copy_calldata_to_memory_with_cleanup": { + "entryPoint": 682, + "id": null, + "parameterSlots": 3, + "returnSlots": 0 + }, + "copy_literal_to_memory_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470": { + "entryPoint": 1970, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "copy_memory_to_memory_with_cleanup": { + "entryPoint": 1691, + "id": null, + "parameterSlots": 3, + "returnSlots": 0 + }, + "external_fun_beacon": { + "entryPoint": 490, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_deploy": { + "entryPoint": 1127, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_determineAddress": { + "entryPoint": 1294, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_owner": { + "entryPoint": 1241, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_renounceOwnership": { + "entryPoint": 1190, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_transferOwnership": { + "entryPoint": 1357, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "external_fun_upgradeBeacon": { + "entryPoint": 264, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "extract_from_storage_value_dynamict_contract_UpgradeableBeacon": { + "entryPoint": 346, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "extract_from_storage_value_offsett_address": { + "entryPoint": 2458, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "extract_from_storage_value_offsett_contract_UpgradeableBeacon": { + "entryPoint": 1438, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "finalize_allocation": { + "entryPoint": 585, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "fun__transferOwnership": { + "entryPoint": 3820, + "id": 650, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_checkOwner": { + "entryPoint": 3000, + "id": 593, + "parameterSlots": 0, + "returnSlots": 0 + }, + "fun_computeAddress": { + "entryPoint": 4657, + "id": 1772, + "parameterSlots": 3, + "returnSlots": 1 + }, + "fun_computeAddress_1758": { + "entryPoint": 4624, + "id": 1758, + "parameterSlots": 2, + "returnSlots": 1 + }, + "fun_computeProxyAddress": { + "entryPoint": 3917, + "id": 7777, + "parameterSlots": 3, + "returnSlots": 1 + }, + "fun_createProxy": { + "entryPoint": 3421, + "id": 7734, + "parameterSlots": 3, + "returnSlots": 1 + }, + "fun_deploy": { + "entryPoint": 4487, + "id": 1738, + "parameterSlots": 3, + "returnSlots": 1 + }, + "fun_deploy_9677": { + "entryPoint": 2030, + "id": 9677, + "parameterSlots": 9, + "returnSlots": 1 + }, + "fun_determineAddress": { + "entryPoint": 2513, + "id": 9725, + "parameterSlots": 9, + "returnSlots": 1 + }, + "fun_msgSender": { + "entryPoint": 4067, + "id": 1682, + "parameterSlots": 0, + "returnSlots": 1 + }, + "fun_owner": { + "entryPoint": 2491, + "id": 579, + "parameterSlots": 0, + "returnSlots": 1 + }, + "fun_renounceOwnership": { + "entryPoint": 2437, + "id": 607, + "parameterSlots": 0, + "returnSlots": 0 + }, + "fun_renounceOwnership_inner": { + "entryPoint": 2417, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "fun_transferOwnership": { + "entryPoint": 2858, + "id": 630, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_transferOwnership_inner": { + "entryPoint": 2809, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_upgradeBeacon": { + "entryPoint": 1662, + "id": 7792, + "parameterSlots": 1, + "returnSlots": 0 + }, + "fun_upgradeBeacon_inner": { + "entryPoint": 1515, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "getter_fun_beacon": { + "entryPoint": 384, + "id": 7652, + "parameterSlots": 0, + "returnSlots": 1 + }, + "identity": { + "entryPoint": 400, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "leftAlign_address": { + "entryPoint": 3086, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "leftAlign_bytes32": { + "entryPoint": 3044, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "leftAlign_uint160": { + "entryPoint": 3074, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "modifier_onlyOwner": { + "entryPoint": 1413, + "id": 570, + "parameterSlots": 1, + "returnSlots": 0 + }, + "modifier_onlyOwner_597": { + "entryPoint": 2356, + "id": 570, + "parameterSlots": 0, + "returnSlots": 0 + }, + "modifier_onlyOwner_613": { + "entryPoint": 2620, + "id": 570, + "parameterSlots": 1, + "returnSlots": 0 + }, + "panic_error_0x41": { + "entryPoint": 563, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "prepare_store_address": { + "entryPoint": 3785, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "read_from_storage_split_dynamic_contract_UpgradeableBeacon": { + "entryPoint": 370, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "read_from_storage_split_offset_address": { + "entryPoint": 2478, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "read_from_storage_split_offset_contract_UpgradeableBeacon": { + "entryPoint": 1458, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "require_helper_stringliteral": { + "entryPoint": 4314, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "require_helper_stringliteral_245f": { + "entryPoint": 2768, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "require_helper_stringliteral_8714": { + "entryPoint": 4446, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "require_helper_stringliteral_9924": { + "entryPoint": 2959, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "require_helper_stringliteral_f94f": { + "entryPoint": 4183, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "revert_error_0cc013b6b3b6beabea4e3a74a6d380f0df81852ca99887912475e1f66b2a2c20": { + "entryPoint": 1471, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_1b9f4a0a5773e33b91aa01db23bf8c55fce1411167c872835e7fa00a4f17d46d": { + "entryPoint": 543, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74": { + "entryPoint": 1408, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_987264b3b1d58a9c7f8255e93e81c77d86d6299019c33110a076957a3e06e2ae": { + "entryPoint": 548, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db": { + "entryPoint": 163, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb": { + "entryPoint": 153, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b": { + "entryPoint": 158, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_forward": { + "entryPoint": 1498, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "round_up_to_mul_of": { + "entryPoint": 553, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_left": { + "entryPoint": 3740, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_left_224": { + "entryPoint": 1476, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_left_96": { + "entryPoint": 3068, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_right_0_unsigned": { + "entryPoint": 1432, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_right_unsigned": { + "entryPoint": 141, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "shift_right_unsigned_dynamic": { + "entryPoint": 331, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "store_literal_in_memory_124767115c09b0dd37c31c42ddb030d84459c933a30879cc32c4c922ae5928f0": { + "entryPoint": 4224, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "store_literal_in_memory_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe": { + "entryPoint": 2639, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "store_literal_in_memory_87142438d464a3cd804331cca8480b31569380ef25d1f39b80404975699f0676": { + "entryPoint": 4355, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "store_literal_in_memory_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe": { + "entryPoint": 2869, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "store_literal_in_memory_f94f9c62541b73155a9def26a7988ac5579c2c6b698df8f608ced5572b7d72ca": { + "entryPoint": 4092, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "update_byte_slice_shift": { + "entryPoint": 3746, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "update_storage_value_offsett_address_to_address": { + "entryPoint": 3788, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "validator_revert_address": { + "entryPoint": 191, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "validator_revert_bytes32": { + "entryPoint": 839, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "validator_revert_uint96": { + "entryPoint": 800, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "zero_value_for_split_address": { + "entryPoint": 1673, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + } + }, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "60806040526004361015610013575b610580565b61001e60003561008d565b80631bce45831461008857806359659e901461008357806359a347bd1461007e578063715018a6146100795780638da5cb5b14610074578063cfcc59411461006f5763f2fde38b0361000e5761054d565b61050e565b6104d9565b6104a6565b610467565b6101ea565b610108565b60e01c90565b60405190565b600080fd5b600080fd5b600080fd5b60018060a01b031690565b6100bc906100a8565b90565b6100c8816100b3565b036100cf57565b600080fd5b905035906100e1826100bf565b565b906020828203126100fd576100fa916000016100d4565b90565b61009e565b60000190565b346101365761012061011b3660046100e3565b61067e565b610128610093565b8061013281610102565b0390f35b610099565b600091031261014657565b61009e565b1c90565b60018060a01b031690565b61016a90600861016f930261014b565b61014f565b90565b9061017d915461015a565b90565b61018d6001600090610172565b90565b90565b6101a76101a26101ac926100a8565b610190565b6100a8565b90565b6101b890610193565b90565b6101c4906101af565b90565b6101d0906101bb565b9052565b91906101e8906000602085019401906101c7565b565b3461021a576101fa36600461013b565b610216610205610180565b61020d610093565b918291826101d4565b0390f35b610099565b600080fd5b600080fd5b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b9061025390610229565b810190811067ffffffffffffffff82111761026d57604052565b610233565b9061028561027e610093565b9283610249565b565b67ffffffffffffffff81116102a5576102a1602091610229565b0190565b610233565b90826000939282370152565b909291926102cb6102c682610287565b610272565b938185526020850190828401116102e7576102e5926102aa565b565b610224565b9080601f8301121561030a57816020610307933591016102b6565b90565b61021f565b6bffffffffffffffffffffffff1690565b6103298161030f565b0361033057565b600080fd5b9050359061034282610320565b565b90565b61035081610344565b0361035757565b600080fd5b9050359061036982610347565b565b90916101208284031261043f5761038583600084016100d4565b9261039381602085016100d4565b92604081013567ffffffffffffffff811161043a57826103b49183016102ec565b92606082013567ffffffffffffffff811161043557836103d59184016102ec565b92608083013567ffffffffffffffff811161043057816103f69185016102ec565b926104048260a083016100d4565b9261042d6104158460c08501610335565b936104238160e086016100d4565b936101000161035c565b90565b6100a3565b6100a3565b6100a3565b61009e565b61044d906100b3565b9052565b919061046590600060208501940190610444565b565b346104a15761049d61048c61047d36600461036b565b979690969591959492946107ee565b610494610093565b91829182610451565b0390f35b610099565b346104d4576104b636600461013b565b6104be610985565b6104c6610093565b806104d081610102565b0390f35b610099565b34610509576104e936600461013b565b6105056104f46109bb565b6104fc610093565b91829182610451565b0390f35b610099565b346105485761054461053361052436600461036b565b979690969591959492946109d1565b61053b610093565b91829182610451565b0390f35b610099565b3461057b576105656105603660046100e3565b610b2a565b61056d610093565b8061057781610102565b0390f35b610099565b600080fd5b61059690610591610bb8565b6105eb565b565b60001c90565b6105aa6105af91610598565b61014f565b90565b6105bc905461059e565b90565b600080fd5b60e01b90565b60009103126105d557565b61009e565b6105e2610093565b3d6000823e3d90fd5b6105fd6105f860016105b2565b6101bb565b90633659cfe690823b15610679576106359261062a6000809461061e610093565b968795869485936105c4565b835260048301610451565b03925af1801561067457610647575b50565b6106679060003d811161066d575b61065f8183610249565b8101906105ca565b38610644565b503d610655565b6105da565b6105bf565b61068790610585565b565b600090565b5190565b60209181520190565b60005b8381106106af575050906000910152565b80602091830151818501520161069e565b6106df6106e86020936106ed936106d68161068e565b93848093610692565b9586910161069b565b610229565b0190565b6106fa9061030f565b9052565b61070790610344565b9052565b939561077461076960e0979b9a9861075b6107889761074d8a61078f9e9961073f61077e9a60006101008501940190610444565b8c60208184039101526106c0565b908a820360408c01526106c0565b9088820360608a01526106c0565b9a6080870190610444565b60a08501906106f1565b60c0830190610444565b01906106fe565b565b60200190565b5190565b906107ad6107a883610287565b610272565b918252565b6107bc600061079b565b90565b6107c76107b2565b90565b6107d390610193565b90565b6107df906107ca565b90565b6107eb906101af565b90565b61085e9098949897969397959295610804610689565b508861083c8461082d8d8a8d8d96928b908d929394610821610093565b998a9860208a0161070b565b60208201810382520382610249565b61084e61084882610797565b91610791565b20906108586107bf565b91610d5d565b9761087061086b8a6107d6565b6107e2565b94638ff83ac192969891939497863b1561092f576000986108a5968a966108b095610899610093565b9d8e9c8d9b8c9a6105c4565b8a5260048a0161070b565b03925af1801561092a576108fd575b50806108f77fe3049ee698743dac343b02bfe6b441269ca8b5f5dd610b74d96c1c02034ee566916108ee610093565b91829182610451565b0390a190565b61091d9060003d8111610923575b6109158183610249565b8101906105ca565b386108bf565b503d61090b565b6105da565b6105bf565b61093c610bb8565b610944610971565b565b90565b61095d61095861096292610946565b610190565b6100a8565b90565b61096e90610949565b90565b61098361097e6000610965565b610eec565b565b61098d610934565b565b60018060a01b031690565b6109a66109ab91610598565b61098f565b90565b6109b8905461099a565b90565b6109c3610689565b506109ce60006109ae565b90565b96610a089396610a1796610a399a939694966109eb610689565b5096989490919293946109fc610093565b998a9860208a0161070b565b60208201810382520382610249565b610a29610a2382610797565b91610791565b2090610a336107bf565b91610f4d565b90565b610a4d90610a48610bb8565b610af9565b565b60207f6464726573730000000000000000000000000000000000000000000000000000917f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201520152565b610aaa6026604092610692565b610ab381610a4f565b0190565b610acd9060208101906000818303910152610a9d565b90565b15610ad757565b610adf610093565b62461bcd60e51b815280610af560048201610ab7565b0390fd5b610b2890610b2381610b1c610b16610b116000610965565b6100b3565b916100b3565b1415610ad0565b610eec565b565b610b3390610a3c565b565b60007f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572910152565b610b6960208092610692565b610b7281610b35565b0190565b610b8c9060208101906000818303910152610b5d565b90565b15610b9657565b610b9e610093565b62461bcd60e51b815280610bb460048201610b76565b0390fd5b610be2610bc36109bb565b610bdc610bd6610bd1610fe3565b6100b3565b916100b3565b14610b8f565b565b90565b610bf3610bf891610344565b610be4565b9052565b60601b90565b610c0b90610bfc565b90565b610c1790610c02565b90565b610c26610c2b916100b3565b610c0e565b9052565b905090565b610c59610c5092602092610c4781610797565b94858093610c2f565b9384910161069b565b0190565b60148093610c81602084610c79610c8996610c909b9a98610be7565b018092610c1a565b018092610c1a565b0190610c34565b90565b90565b610caa610ca5610caf92610946565b610190565b610c93565b90565b610cbb90610193565b90565b610cc790610cb2565b90565b610cd390610193565b90565b610cdf90610cca565b90565b610ceb906101af565b90565b60209181520190565b610d16610d1f602093610d2493610d0d81610797565b93848093610cee565b9586910161069b565b610229565b0190565b610d4d610d5a949293610d4360608401956000850190610444565b6020830190610444565b6040818403910152610cf7565b90565b610ded9093929193610d6d610689565b50610dad8591610d9e610d88610d8360016105b2565b6101bb565b8690610d92610093565b95869460208601610c5d565b60208201810382520382610249565b610dbf610db982610797565b91610791565b2061148a610dcf60208201610272565b9080825261125b6020830139610de86000929192610c96565b611187565b92610e07610e02610dfd86610cbe565b610cd6565b610ce2565b63cf7a1d779190610e20610e1b60016105b2565b6101bb565b9392813b15610e97576000610e4891610e538296610e3c610093565b988997889687956105c4565b855260048501610d28565b03925af18015610e9257610e65575b50565b610e859060003d8111610e8b575b610e7d8183610249565b8101906105ca565b38610e62565b503d610e73565b6105da565b6105bf565b60001b90565b90610eb360018060a01b0391610e9c565b9181191691161790565b610ec6906101af565b90565b90565b90610ee1610edc610ee892610ebd565b610ec9565b8254610ea2565b9055565b610ef660006109ae565b610f01826000610ecc565b90610f35610f2f7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610ebd565b91610ebd565b91610f3e610093565b80610f4881610102565b0390a3565b610fe09291610f8a610f9992610f61610689565b509193610f76610f7160016105b2565b6101bb565b610f7e610093565b95869460208601610c5d565b60208201810382520382610249565b610fab610fa582610797565b91610791565b2061148a610fbb60208201610272565b9080825261125b6020830139610fd9610fd382610797565b91610791565b2090611210565b90565b610feb610689565b503390565b610ff9906101af565b90565b60007f437265617465323a20696e73756666696369656e742062616c616e6365000000910152565b611031601d602092610692565b61103a81610ffc565b0190565b6110549060208101906000818303910152611024565b90565b1561105e57565b611066610093565b62461bcd60e51b81528061107c6004820161103e565b0390fd5b60007f437265617465323a2062797465636f6465206c656e677468206973207a65726f910152565b6110b460208092610692565b6110bd81611080565b0190565b6110d790602081019060008183039101526110a8565b90565b156110e157565b6110e9610093565b62461bcd60e51b8152806110ff600482016110c1565b0390fd5b60007f437265617465323a204661696c6564206f6e206465706c6f7900000000000000910152565b6111386019602092610692565b61114181611103565b0190565b61115b906020810190600081830391015261112b565b90565b1561116557565b61116d610093565b62461bcd60e51b81528061118360048201611145565b0390fd5b919091611192610689565b506111b961119f30610ff0565b316111b26111ac84610c93565b91610c93565b1015611057565b6111df6111c583610797565b6111d86111d26000610c96565b91610c93565b14156110da565b60208251920190f59061120e826112076112016111fc6000610965565b6100b3565b916100b3565b141561115e565b565b9061122e9161121d610689565b509061122830610ff0565b91611231565b90565b90605592600b92611240610689565b50604051926040840152602083015281520160ff8153209056fe608060405234601c57600e6020565b61145e61002c823961145e90f35b6026565b60405190565b600080fdfe6080604052361561006b5761006b565b90565b60018060a01b031690565b90565b61003461002f6100399261000f565b61001d565b610012565b90565b61004590610020565b90565b61005190610012565b90565b606090565b63ffffffff60e01b1690565b60000190565b61007361017e565b61008e610088610083600061003c565b610048565b91610048565b0361046c5761009b610054565b5063ffffffff60e01b600035166100c16100bb63cf7a1d7760e01b610059565b91610059565b146100e357600063f92ee8a960e01b8152806100df60048201610065565b0390fd5b6100eb610401565b602081519101f35b600090565b90565b90565b60001b90565b61011861011361011d926100f8565b6100fe565b6100fb565b90565b6101497fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103610104565b90565b60001c90565b60018060a01b031690565b61016961016e9161014c565b610152565b90565b61017b905461015d565b90565b6101866100f3565b506101a2600061019c610197610120565b6105a2565b01610171565b90565b90565b90565b6101bf6101ba6101c4926101a5565b61001d565b6101a8565b90565b60405190565b600080fd5b600080fd5b909392938483116101f75784116101f2576001820201920390565b6101d2565b6101cd565b91565b600080fd5b600080fd5b61021290610012565b90565b61021e81610209565b0361022557565b600080fd5b9050359061023782610215565b565b600080fd5b600080fd5b601f801991011690565b634e487b7160e01b600052604160045260246000fd5b9061026d90610243565b810190811067ffffffffffffffff82111761028757604052565b61024d565b9061029f6102986101c7565b9283610263565b565b67ffffffffffffffff81116102bf576102bb602091610243565b0190565b61024d565b90826000939282370152565b909291926102e56102e0826102a1565b61028c565b93818552602085019082840111610301576102ff926102c4565b565b61023e565b9080601f8301121561032457816020610321933591016102d0565b90565b610239565b9160608383031261037657610341826000850161022a565b9261034f836020830161022a565b92604082013567ffffffffffffffff81116103715761036e9201610306565b90565b610204565b6101ff565b61038f61038a61039492610012565b61001d565b610012565b90565b6103a09061037b565b90565b6103ac90610397565b90565b67ffffffffffffffff81116103cd576103c9602091610243565b0190565b61024d565b906103e46103df836103af565b61028c565b918252565b6103f360006103d2565b90565b6103fe6103e9565b90565b610409610054565b506104126105cd565b61046161045761045161044761043f61043960003661043160046101ab565b9080926101d7565b906101fc565b810190610329565b93919290926103a3565b916103a3565b91909190916105ec565b6104696103f6565b90565b3361048661048061047b61017e565b610048565b91610048565b1460001461059d57610496610054565b5063ffffffff60e01b60003516806104bd6104b7631b2ce7f360e11b610059565b91610059565b146000146104d757506104ce610817565b5b602081519101f35b806104f16104eb63278f794360e11b610059565b91610059565b1460001461050857506105026107c1565b5b6104cf565b8061052261051c6308f2839760e41b610059565b91610059565b146000146105395750610533610723565b5b610503565b8061055361054d6303e1469160e61b610059565b91610059565b1460001461056a57506105646106bf565b5b610534565b61058361057d635c60da1b60e01b610059565b91610059565b146000146105985761059361067a565b610565565b61064a565b61064a565b90565b6105b96105b46105be9261000f565b61001d565b6101a8565b90565b156105c857565b600080fd5b6105ea346105e46105de60006105a5565b916101a8565b146105c1565b565b91906105f661087a565b61061161060b610606600061003c565b610048565b91610048565b0361062d5761062261062b936108b2565b9060009161098d565b565b600063f92ee8a960e01b81528061064660048201610065565b0390fd5b610652610aa6565b610ae7565b61066090610048565b9052565b919061067890600060208501940190610657565b565b610682610054565b5061068b6105cd565b6106ad6106bc610699610aa6565b6106a16101c7565b92839160208301610664565b60208201810382520382610263565b90565b6106c7610054565b506106d06105cd565b6106f26107016106de61017e565b6106e66101c7565b92839160208301610664565b60208201810382520382610263565b90565b9060208282031261071e5761071b9160000161022a565b90565b6101ff565b61072b610054565b506107346105cd565b61077061076b61076661075e61075860003661075060046101ab565b9080926101d7565b906101fc565b810190610704565b6103a3565b6108b2565b6107786103f6565b90565b9190916040818403126107bc57610795836000830161022a565b92602082013567ffffffffffffffff81116107b7576107b49201610306565b90565b610204565b6101ff565b6107c9610054565b5061080c6108036107fc6107f46107ee6000366107e660046101ab565b9080926101d7565b906101fc565b81019061077b565b91906103a3565b90600191610b0a565b6108146103f6565b90565b61081f610054565b506108286105cd565b61086f61085f61085a61085261084c60003661084460046101ab565b9080926101d7565b906101fc565b810190610704565b6103a3565b6108676103f6565b600091610b0a565b6108776103f6565b90565b6108826100f3565b5061088b61017e565b90565b9160206108b09294936108a960408201966000830190610657565b0190610657565b565b6108fd906108be61017e565b817f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f916108f56108ec6101c7565b9283928361088e565b0390a1610c4d565b565b61090890610397565b90565b5190565b6109189061037b565b90565b6109249061090f565b90565b61093090610397565b90565b60e01b90565b61094281610048565b0361094957565b600080fd5b9050519061095b82610939565b565b90602082820312610977576109749160000161094e565b90565b6101ff565b6109846101c7565b3d6000823e3d90fd5b9161099783610e30565b826109c27f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e916108ff565b906109cb6101c7565b806109d581610065565b0390a26109e18261090b565b6109f46109ee60006105a5565b916101a8565b11908115610a9e575b50610a07575b5050565b6020610a1d610a18610a339461091b565b610927565b635c60da1b90610a2b6101c7565b948592610933565b82528180610a4360048201610065565b03915afa908115610a9957610a6192600092610a69575b5090610f65565b503880610a03565b610a8b91925060203d8111610a92575b610a838183610263565b81019061095d565b9038610a5a565b503d610a79565b61097c565b9050386109fd565b610aae6100f3565b50610ab7610f85565b80610ad3610acd610ac8600061003c565b610048565b91610048565b03610ae45750610ae1610f99565b90565b90565b60008091368280378136915af43d6000803e600014610b05573d6000f35b3d6000fd5b91610b148361102f565b610b1d8261090b565b610b30610b2a60006105a5565b916101a8565b11908115610b54575b50610b43575b5050565b610b4c91610f65565b503880610b3f565b905038610b39565b60209181520190565b60207f6464726573730000000000000000000000000000000000000000000000000000917f455243313936373a206e65772061646d696e20697320746865207a65726f206160008201520152565b610bc06026604092610b5c565b610bc981610b65565b0190565b610be39060208101906000818303910152610bb3565b90565b15610bed57565b610bf56101c7565b62461bcd60e51b815280610c0b60048201610bcd565b0390fd5b90610c2060018060a01b03916100fe565b9181191691161790565b90565b90610c42610c3d610c49926108ff565b610c2a565b8254610c0f565b9055565b610c8f90610c7781610c70610c6a610c65600061003c565b610048565b91610048565b1415610be6565b6000610c89610c84610120565b6105a2565b01610c2d565b565b60207f7472616374000000000000000000000000000000000000000000000000000000917f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e60008201520152565b610cec6025604092610b5c565b610cf581610c91565b0190565b610d0f9060208101906000818303910152610cdf565b90565b15610d1957565b610d216101c7565b62461bcd60e51b815280610d3760048201610cf9565b0390fd5b60207f73206e6f74206120636f6e747261637400000000000000000000000000000000917f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960008201520152565b610d966030604092610b5c565b610d9f81610d3b565b0190565b610db99060208101906000818303910152610d89565b90565b15610dc357565b610dcb6101c7565b62461bcd60e51b815280610de160048201610da3565b0390fd5b90565b610dfc610df7610e0192610de5565b6100fe565b6100fb565b90565b610e2d7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50610de8565b90565b610e6e90610e45610e408261107f565b610d12565b6020610e58610e538361091b565b610927565b635c60da1b90610e666101c7565b948592610933565b82528180610e7e60048201610065565b03915afa8015610eee57610ea1610ea691610ebe94600091610ec0575b5061107f565b610dbc565b6000610eb8610eb3610e04565b6105a2565b01610c2d565b565b610ee1915060203d8111610ee7575b610ed98183610263565b81019061095d565b38610e9b565b503d610ecf565b61097c565b60207f206661696c656400000000000000000000000000000000000000000000000000917f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c60008201520152565b610f4b60276103d2565b90610f5860208301610ef3565b565b610f62610f41565b90565b90610f8291610f72610054565b5090610f7c610f5a565b916110e2565b90565b610f8d6100f3565b50610f96611160565b90565b610fa16100f3565b50610fd56020610fbf610fba610fb5611187565b61091b565b610927565b635c60da1b90610fcd6101c7565b938492610933565b82528180610fe560048201610065565b03915afa90811561102a57600091610ffc575b5090565b61101d915060203d8111611023575b6110158183610263565b81019061095d565b38610ff8565b503d61100b565b61097c565b61103881611258565b6110627fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b916108ff565b9061106b6101c7565b8061107581610065565b0390a2565b600090565b61108761107a565b503b61109c61109660006105a5565b916101a8565b1190565b906110b26110ad836102a1565b61028c565b918252565b3d6000146110d4576110c83d6110a0565b903d6000602084013e5b565b6110dc610054565b906110d2565b9091600080611112946110f3610054565b508490602081019051915af4916111086110b7565b909290919261130b565b90565b90565b61112c61112761113192611115565b6100fe565b6100fb565b90565b61115d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc611118565b90565b6111686100f3565b50611184600061117e611179611134565b6105a2565b01610171565b90565b61118f6100f3565b506111ab60006111a56111a0610e04565b6105a2565b01610171565b90565b60207f6f74206120636f6e747261637400000000000000000000000000000000000000917f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60008201520152565b611209602d604092610b5c565b611212816111ae565b0190565b61122c90602081019060008183039101526111fc565b90565b1561123657565b61123e6101c7565b62461bcd60e51b81528061125460048201611216565b0390fd5b6112859061126d6112688261107f565b61122f565b600061127f61127a611134565b6105a2565b01610c2d565b565b60007f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000910152565b6112bc601d602092610b5c565b6112c581611287565b0190565b6112df90602081019060008183039101526112af565b90565b156112e957565b6112f16101c7565b62461bcd60e51b815280611307600482016112c9565b0390fd5b919290611316610054565b5060001461135c57506113288261090b565b61133b61133560006105a5565b916101a8565b14611345575b5090565b6113516113569161107f565b6112e2565b38611341565b826113d5565b5190565b60005b83811061137a575050906000910152565b806020918301518185015201611369565b6113aa6113b36020936113b8936113a181611362565b93848093610b5c565b95869101611366565b610243565b0190565b6113d2916020820191600081840391015261138b565b90565b906113df8261090b565b6113f26113ec60006105a5565b916101a8565b116000146114035750805190602001fd5b6114249061140f6101c7565b91829162461bcd60e51b8352600483016113bc565b0390fdfea2646970667358221220fb1899e61f38faa78bfbab79b8dc2fa613357c2fce2699411f9fee80b624365564736f6c634300081b0033a2646970667358221220b00215e680d7f0fbcd2602e1f57d6dbac930c10d2445be6bf9979a142780b5f064736f6c634300081b0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT ISZERO PUSH2 0x13 JUMPI JUMPDEST PUSH2 0x580 JUMP JUMPDEST PUSH2 0x1E PUSH1 0x0 CALLDATALOAD PUSH2 0x8D JUMP JUMPDEST DUP1 PUSH4 0x1BCE4583 EQ PUSH2 0x88 JUMPI DUP1 PUSH4 0x59659E90 EQ PUSH2 0x83 JUMPI DUP1 PUSH4 0x59A347BD EQ PUSH2 0x7E JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x79 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x74 JUMPI DUP1 PUSH4 0xCFCC5941 EQ PUSH2 0x6F JUMPI PUSH4 0xF2FDE38B SUB PUSH2 0xE JUMPI PUSH2 0x54D JUMP JUMPDEST PUSH2 0x50E JUMP JUMPDEST PUSH2 0x4D9 JUMP JUMPDEST PUSH2 0x4A6 JUMP JUMPDEST PUSH2 0x467 JUMP JUMPDEST PUSH2 0x1EA JUMP JUMPDEST PUSH2 0x108 JUMP JUMPDEST PUSH1 0xE0 SHR SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0xBC SWAP1 PUSH2 0xA8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xC8 DUP2 PUSH2 0xB3 JUMP JUMPDEST SUB PUSH2 0xCF JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0xE1 DUP3 PUSH2 0xBF JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0xFD JUMPI PUSH2 0xFA SWAP2 PUSH1 0x0 ADD PUSH2 0xD4 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x9E JUMP JUMPDEST PUSH1 0x0 ADD SWAP1 JUMP JUMPDEST CALLVALUE PUSH2 0x136 JUMPI PUSH2 0x120 PUSH2 0x11B CALLDATASIZE PUSH1 0x4 PUSH2 0xE3 JUMP JUMPDEST PUSH2 0x67E JUMP JUMPDEST PUSH2 0x128 PUSH2 0x93 JUMP JUMPDEST DUP1 PUSH2 0x132 DUP2 PUSH2 0x102 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x99 JUMP JUMPDEST PUSH1 0x0 SWAP2 SUB SLT PUSH2 0x146 JUMPI JUMP JUMPDEST PUSH2 0x9E JUMP JUMPDEST SHR SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x16A SWAP1 PUSH1 0x8 PUSH2 0x16F SWAP4 MUL PUSH2 0x14B JUMP JUMPDEST PUSH2 0x14F JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x17D SWAP2 SLOAD PUSH2 0x15A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x18D PUSH1 0x1 PUSH1 0x0 SWAP1 PUSH2 0x172 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1A7 PUSH2 0x1A2 PUSH2 0x1AC SWAP3 PUSH2 0xA8 JUMP JUMPDEST PUSH2 0x190 JUMP JUMPDEST PUSH2 0xA8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1B8 SWAP1 PUSH2 0x193 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1C4 SWAP1 PUSH2 0x1AF JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1D0 SWAP1 PUSH2 0x1BB JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x1E8 SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0x1C7 JUMP JUMPDEST JUMP JUMPDEST CALLVALUE PUSH2 0x21A JUMPI PUSH2 0x1FA CALLDATASIZE PUSH1 0x4 PUSH2 0x13B JUMP JUMPDEST PUSH2 0x216 PUSH2 0x205 PUSH2 0x180 JUMP JUMPDEST PUSH2 0x20D PUSH2 0x93 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x1D4 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x99 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1F DUP1 NOT SWAP2 ADD AND SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH2 0x253 SWAP1 PUSH2 0x229 JUMP JUMPDEST DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x26D JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH2 0x233 JUMP JUMPDEST SWAP1 PUSH2 0x285 PUSH2 0x27E PUSH2 0x93 JUMP JUMPDEST SWAP3 DUP4 PUSH2 0x249 JUMP JUMPDEST JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2A5 JUMPI PUSH2 0x2A1 PUSH1 0x20 SWAP2 PUSH2 0x229 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x233 JUMP JUMPDEST SWAP1 DUP3 PUSH1 0x0 SWAP4 SWAP3 DUP3 CALLDATACOPY ADD MSTORE JUMP JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x2CB PUSH2 0x2C6 DUP3 PUSH2 0x287 JUMP JUMPDEST PUSH2 0x272 JUMP JUMPDEST SWAP4 DUP2 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP1 DUP3 DUP5 ADD GT PUSH2 0x2E7 JUMPI PUSH2 0x2E5 SWAP3 PUSH2 0x2AA JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x224 JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x30A JUMPI DUP2 PUSH1 0x20 PUSH2 0x307 SWAP4 CALLDATALOAD SWAP2 ADD PUSH2 0x2B6 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x21F JUMP JUMPDEST PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0x329 DUP2 PUSH2 0x30F JUMP JUMPDEST SUB PUSH2 0x330 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x342 DUP3 PUSH2 0x320 JUMP JUMPDEST JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x350 DUP2 PUSH2 0x344 JUMP JUMPDEST SUB PUSH2 0x357 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x369 DUP3 PUSH2 0x347 JUMP JUMPDEST JUMP JUMPDEST SWAP1 SWAP2 PUSH2 0x120 DUP3 DUP5 SUB SLT PUSH2 0x43F JUMPI PUSH2 0x385 DUP4 PUSH1 0x0 DUP5 ADD PUSH2 0xD4 JUMP JUMPDEST SWAP3 PUSH2 0x393 DUP2 PUSH1 0x20 DUP6 ADD PUSH2 0xD4 JUMP JUMPDEST SWAP3 PUSH1 0x40 DUP2 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x43A JUMPI DUP3 PUSH2 0x3B4 SWAP2 DUP4 ADD PUSH2 0x2EC JUMP JUMPDEST SWAP3 PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x435 JUMPI DUP4 PUSH2 0x3D5 SWAP2 DUP5 ADD PUSH2 0x2EC JUMP JUMPDEST SWAP3 PUSH1 0x80 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x430 JUMPI DUP2 PUSH2 0x3F6 SWAP2 DUP6 ADD PUSH2 0x2EC JUMP JUMPDEST SWAP3 PUSH2 0x404 DUP3 PUSH1 0xA0 DUP4 ADD PUSH2 0xD4 JUMP JUMPDEST SWAP3 PUSH2 0x42D PUSH2 0x415 DUP5 PUSH1 0xC0 DUP6 ADD PUSH2 0x335 JUMP JUMPDEST SWAP4 PUSH2 0x423 DUP2 PUSH1 0xE0 DUP7 ADD PUSH2 0xD4 JUMP JUMPDEST SWAP4 PUSH2 0x100 ADD PUSH2 0x35C JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xA3 JUMP JUMPDEST PUSH2 0xA3 JUMP JUMPDEST PUSH2 0xA3 JUMP JUMPDEST PUSH2 0x9E JUMP JUMPDEST PUSH2 0x44D SWAP1 PUSH2 0xB3 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x465 SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0x444 JUMP JUMPDEST JUMP JUMPDEST CALLVALUE PUSH2 0x4A1 JUMPI PUSH2 0x49D PUSH2 0x48C PUSH2 0x47D CALLDATASIZE PUSH1 0x4 PUSH2 0x36B JUMP JUMPDEST SWAP8 SWAP7 SWAP1 SWAP7 SWAP6 SWAP2 SWAP6 SWAP5 SWAP3 SWAP5 PUSH2 0x7EE JUMP JUMPDEST PUSH2 0x494 PUSH2 0x93 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x451 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x99 JUMP JUMPDEST CALLVALUE PUSH2 0x4D4 JUMPI PUSH2 0x4B6 CALLDATASIZE PUSH1 0x4 PUSH2 0x13B JUMP JUMPDEST PUSH2 0x4BE PUSH2 0x985 JUMP JUMPDEST PUSH2 0x4C6 PUSH2 0x93 JUMP JUMPDEST DUP1 PUSH2 0x4D0 DUP2 PUSH2 0x102 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x99 JUMP JUMPDEST CALLVALUE PUSH2 0x509 JUMPI PUSH2 0x4E9 CALLDATASIZE PUSH1 0x4 PUSH2 0x13B JUMP JUMPDEST PUSH2 0x505 PUSH2 0x4F4 PUSH2 0x9BB JUMP JUMPDEST PUSH2 0x4FC PUSH2 0x93 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x451 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x99 JUMP JUMPDEST CALLVALUE PUSH2 0x548 JUMPI PUSH2 0x544 PUSH2 0x533 PUSH2 0x524 CALLDATASIZE PUSH1 0x4 PUSH2 0x36B JUMP JUMPDEST SWAP8 SWAP7 SWAP1 SWAP7 SWAP6 SWAP2 SWAP6 SWAP5 SWAP3 SWAP5 PUSH2 0x9D1 JUMP JUMPDEST PUSH2 0x53B PUSH2 0x93 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x451 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x99 JUMP JUMPDEST CALLVALUE PUSH2 0x57B JUMPI PUSH2 0x565 PUSH2 0x560 CALLDATASIZE PUSH1 0x4 PUSH2 0xE3 JUMP JUMPDEST PUSH2 0xB2A JUMP JUMPDEST PUSH2 0x56D PUSH2 0x93 JUMP JUMPDEST DUP1 PUSH2 0x577 DUP2 PUSH2 0x102 JUMP JUMPDEST SUB SWAP1 RETURN JUMPDEST PUSH2 0x99 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x596 SWAP1 PUSH2 0x591 PUSH2 0xBB8 JUMP JUMPDEST PUSH2 0x5EB JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 SHR SWAP1 JUMP JUMPDEST PUSH2 0x5AA PUSH2 0x5AF SWAP2 PUSH2 0x598 JUMP JUMPDEST PUSH2 0x14F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x5BC SWAP1 SLOAD PUSH2 0x59E JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0xE0 SHL SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP2 SUB SLT PUSH2 0x5D5 JUMPI JUMP JUMPDEST PUSH2 0x9E JUMP JUMPDEST PUSH2 0x5E2 PUSH2 0x93 JUMP JUMPDEST RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST PUSH2 0x5FD PUSH2 0x5F8 PUSH1 0x1 PUSH2 0x5B2 JUMP JUMPDEST PUSH2 0x1BB JUMP JUMPDEST SWAP1 PUSH4 0x3659CFE6 SWAP1 DUP3 EXTCODESIZE ISZERO PUSH2 0x679 JUMPI PUSH2 0x635 SWAP3 PUSH2 0x62A PUSH1 0x0 DUP1 SWAP5 PUSH2 0x61E PUSH2 0x93 JUMP JUMPDEST SWAP7 DUP8 SWAP6 DUP7 SWAP5 DUP6 SWAP4 PUSH2 0x5C4 JUMP JUMPDEST DUP4 MSTORE PUSH1 0x4 DUP4 ADD PUSH2 0x451 JUMP JUMPDEST SUB SWAP3 GAS CALL DUP1 ISZERO PUSH2 0x674 JUMPI PUSH2 0x647 JUMPI JUMPDEST POP JUMP JUMPDEST PUSH2 0x667 SWAP1 PUSH1 0x0 RETURNDATASIZE DUP2 GT PUSH2 0x66D JUMPI JUMPDEST PUSH2 0x65F DUP2 DUP4 PUSH2 0x249 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x5CA JUMP JUMPDEST CODESIZE PUSH2 0x644 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x655 JUMP JUMPDEST PUSH2 0x5DA JUMP JUMPDEST PUSH2 0x5BF JUMP JUMPDEST PUSH2 0x687 SWAP1 PUSH2 0x585 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x6AF JUMPI POP POP SWAP1 PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP1 PUSH1 0x20 SWAP2 DUP4 ADD MLOAD DUP2 DUP6 ADD MSTORE ADD PUSH2 0x69E JUMP JUMPDEST PUSH2 0x6DF PUSH2 0x6E8 PUSH1 0x20 SWAP4 PUSH2 0x6ED SWAP4 PUSH2 0x6D6 DUP2 PUSH2 0x68E JUMP JUMPDEST SWAP4 DUP5 DUP1 SWAP4 PUSH2 0x692 JUMP JUMPDEST SWAP6 DUP7 SWAP2 ADD PUSH2 0x69B JUMP JUMPDEST PUSH2 0x229 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x6FA SWAP1 PUSH2 0x30F JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST PUSH2 0x707 SWAP1 PUSH2 0x344 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP4 SWAP6 PUSH2 0x774 PUSH2 0x769 PUSH1 0xE0 SWAP8 SWAP12 SWAP11 SWAP9 PUSH2 0x75B PUSH2 0x788 SWAP8 PUSH2 0x74D DUP11 PUSH2 0x78F SWAP15 SWAP10 PUSH2 0x73F PUSH2 0x77E SWAP11 PUSH1 0x0 PUSH2 0x100 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0x444 JUMP JUMPDEST DUP13 PUSH1 0x20 DUP2 DUP5 SUB SWAP2 ADD MSTORE PUSH2 0x6C0 JUMP JUMPDEST SWAP1 DUP11 DUP3 SUB PUSH1 0x40 DUP13 ADD MSTORE PUSH2 0x6C0 JUMP JUMPDEST SWAP1 DUP9 DUP3 SUB PUSH1 0x60 DUP11 ADD MSTORE PUSH2 0x6C0 JUMP JUMPDEST SWAP11 PUSH1 0x80 DUP8 ADD SWAP1 PUSH2 0x444 JUMP JUMPDEST PUSH1 0xA0 DUP6 ADD SWAP1 PUSH2 0x6F1 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD SWAP1 PUSH2 0x444 JUMP JUMPDEST ADD SWAP1 PUSH2 0x6FE JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x7AD PUSH2 0x7A8 DUP4 PUSH2 0x287 JUMP JUMPDEST PUSH2 0x272 JUMP JUMPDEST SWAP2 DUP3 MSTORE JUMP JUMPDEST PUSH2 0x7BC PUSH1 0x0 PUSH2 0x79B JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x7C7 PUSH2 0x7B2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x7D3 SWAP1 PUSH2 0x193 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x7DF SWAP1 PUSH2 0x7CA JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x7EB SWAP1 PUSH2 0x1AF JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x85E SWAP1 SWAP9 SWAP5 SWAP9 SWAP8 SWAP7 SWAP4 SWAP8 SWAP6 SWAP3 SWAP6 PUSH2 0x804 PUSH2 0x689 JUMP JUMPDEST POP DUP9 PUSH2 0x83C DUP5 PUSH2 0x82D DUP14 DUP11 DUP14 DUP14 SWAP7 SWAP3 DUP12 SWAP1 DUP14 SWAP3 SWAP4 SWAP5 PUSH2 0x821 PUSH2 0x93 JUMP JUMPDEST SWAP10 DUP11 SWAP9 PUSH1 0x20 DUP11 ADD PUSH2 0x70B JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE SUB DUP3 PUSH2 0x249 JUMP JUMPDEST PUSH2 0x84E PUSH2 0x848 DUP3 PUSH2 0x797 JUMP JUMPDEST SWAP2 PUSH2 0x791 JUMP JUMPDEST KECCAK256 SWAP1 PUSH2 0x858 PUSH2 0x7BF JUMP JUMPDEST SWAP2 PUSH2 0xD5D JUMP JUMPDEST SWAP8 PUSH2 0x870 PUSH2 0x86B DUP11 PUSH2 0x7D6 JUMP JUMPDEST PUSH2 0x7E2 JUMP JUMPDEST SWAP5 PUSH4 0x8FF83AC1 SWAP3 SWAP7 SWAP9 SWAP2 SWAP4 SWAP5 SWAP8 DUP7 EXTCODESIZE ISZERO PUSH2 0x92F JUMPI PUSH1 0x0 SWAP9 PUSH2 0x8A5 SWAP7 DUP11 SWAP7 PUSH2 0x8B0 SWAP6 PUSH2 0x899 PUSH2 0x93 JUMP JUMPDEST SWAP14 DUP15 SWAP13 DUP14 SWAP12 DUP13 SWAP11 PUSH2 0x5C4 JUMP JUMPDEST DUP11 MSTORE PUSH1 0x4 DUP11 ADD PUSH2 0x70B JUMP JUMPDEST SUB SWAP3 GAS CALL DUP1 ISZERO PUSH2 0x92A JUMPI PUSH2 0x8FD JUMPI JUMPDEST POP DUP1 PUSH2 0x8F7 PUSH32 0xE3049EE698743DAC343B02BFE6B441269CA8B5F5DD610B74D96C1C02034EE566 SWAP2 PUSH2 0x8EE PUSH2 0x93 JUMP JUMPDEST SWAP2 DUP3 SWAP2 DUP3 PUSH2 0x451 JUMP JUMPDEST SUB SWAP1 LOG1 SWAP1 JUMP JUMPDEST PUSH2 0x91D SWAP1 PUSH1 0x0 RETURNDATASIZE DUP2 GT PUSH2 0x923 JUMPI JUMPDEST PUSH2 0x915 DUP2 DUP4 PUSH2 0x249 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x5CA JUMP JUMPDEST CODESIZE PUSH2 0x8BF JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x90B JUMP JUMPDEST PUSH2 0x5DA JUMP JUMPDEST PUSH2 0x5BF JUMP JUMPDEST PUSH2 0x93C PUSH2 0xBB8 JUMP JUMPDEST PUSH2 0x944 PUSH2 0x971 JUMP JUMPDEST JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x95D PUSH2 0x958 PUSH2 0x962 SWAP3 PUSH2 0x946 JUMP JUMPDEST PUSH2 0x190 JUMP JUMPDEST PUSH2 0xA8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x96E SWAP1 PUSH2 0x949 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x983 PUSH2 0x97E PUSH1 0x0 PUSH2 0x965 JUMP JUMPDEST PUSH2 0xEEC JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x98D PUSH2 0x934 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x9A6 PUSH2 0x9AB SWAP2 PUSH2 0x598 JUMP JUMPDEST PUSH2 0x98F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x9B8 SWAP1 SLOAD PUSH2 0x99A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x9C3 PUSH2 0x689 JUMP JUMPDEST POP PUSH2 0x9CE PUSH1 0x0 PUSH2 0x9AE JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP7 PUSH2 0xA08 SWAP4 SWAP7 PUSH2 0xA17 SWAP7 PUSH2 0xA39 SWAP11 SWAP4 SWAP7 SWAP5 SWAP7 PUSH2 0x9EB PUSH2 0x689 JUMP JUMPDEST POP SWAP7 SWAP9 SWAP5 SWAP1 SWAP2 SWAP3 SWAP4 SWAP5 PUSH2 0x9FC PUSH2 0x93 JUMP JUMPDEST SWAP10 DUP11 SWAP9 PUSH1 0x20 DUP11 ADD PUSH2 0x70B JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE SUB DUP3 PUSH2 0x249 JUMP JUMPDEST PUSH2 0xA29 PUSH2 0xA23 DUP3 PUSH2 0x797 JUMP JUMPDEST SWAP2 PUSH2 0x791 JUMP JUMPDEST KECCAK256 SWAP1 PUSH2 0xA33 PUSH2 0x7BF JUMP JUMPDEST SWAP2 PUSH2 0xF4D JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xA4D SWAP1 PUSH2 0xA48 PUSH2 0xBB8 JUMP JUMPDEST PUSH2 0xAF9 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x20 PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xAAA PUSH1 0x26 PUSH1 0x40 SWAP3 PUSH2 0x692 JUMP JUMPDEST PUSH2 0xAB3 DUP2 PUSH2 0xA4F JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0xACD SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0xA9D JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0xAD7 JUMPI JUMP JUMPDEST PUSH2 0xADF PUSH2 0x93 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0xAF5 PUSH1 0x4 DUP3 ADD PUSH2 0xAB7 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0xB28 SWAP1 PUSH2 0xB23 DUP2 PUSH2 0xB1C PUSH2 0xB16 PUSH2 0xB11 PUSH1 0x0 PUSH2 0x965 JUMP JUMPDEST PUSH2 0xB3 JUMP JUMPDEST SWAP2 PUSH2 0xB3 JUMP JUMPDEST EQ ISZERO PUSH2 0xAD0 JUMP JUMPDEST PUSH2 0xEEC JUMP JUMPDEST JUMP JUMPDEST PUSH2 0xB33 SWAP1 PUSH2 0xA3C JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0xB69 PUSH1 0x20 DUP1 SWAP3 PUSH2 0x692 JUMP JUMPDEST PUSH2 0xB72 DUP2 PUSH2 0xB35 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0xB8C SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0xB5D JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0xB96 JUMPI JUMP JUMPDEST PUSH2 0xB9E PUSH2 0x93 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0xBB4 PUSH1 0x4 DUP3 ADD PUSH2 0xB76 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0xBE2 PUSH2 0xBC3 PUSH2 0x9BB JUMP JUMPDEST PUSH2 0xBDC PUSH2 0xBD6 PUSH2 0xBD1 PUSH2 0xFE3 JUMP JUMPDEST PUSH2 0xB3 JUMP JUMPDEST SWAP2 PUSH2 0xB3 JUMP JUMPDEST EQ PUSH2 0xB8F JUMP JUMPDEST JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xBF3 PUSH2 0xBF8 SWAP2 PUSH2 0x344 JUMP JUMPDEST PUSH2 0xBE4 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x60 SHL SWAP1 JUMP JUMPDEST PUSH2 0xC0B SWAP1 PUSH2 0xBFC JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xC17 SWAP1 PUSH2 0xC02 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xC26 PUSH2 0xC2B SWAP2 PUSH2 0xB3 JUMP JUMPDEST PUSH2 0xC0E JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0xC59 PUSH2 0xC50 SWAP3 PUSH1 0x20 SWAP3 PUSH2 0xC47 DUP2 PUSH2 0x797 JUMP JUMPDEST SWAP5 DUP6 DUP1 SWAP4 PUSH2 0xC2F JUMP JUMPDEST SWAP4 DUP5 SWAP2 ADD PUSH2 0x69B JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH1 0x14 DUP1 SWAP4 PUSH2 0xC81 PUSH1 0x20 DUP5 PUSH2 0xC79 PUSH2 0xC89 SWAP7 PUSH2 0xC90 SWAP12 SWAP11 SWAP9 PUSH2 0xBE7 JUMP JUMPDEST ADD DUP1 SWAP3 PUSH2 0xC1A JUMP JUMPDEST ADD DUP1 SWAP3 PUSH2 0xC1A JUMP JUMPDEST ADD SWAP1 PUSH2 0xC34 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xCAA PUSH2 0xCA5 PUSH2 0xCAF SWAP3 PUSH2 0x946 JUMP JUMPDEST PUSH2 0x190 JUMP JUMPDEST PUSH2 0xC93 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xCBB SWAP1 PUSH2 0x193 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xCC7 SWAP1 PUSH2 0xCB2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xCD3 SWAP1 PUSH2 0x193 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xCDF SWAP1 PUSH2 0xCCA JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xCEB SWAP1 PUSH2 0x1AF JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH2 0xD16 PUSH2 0xD1F PUSH1 0x20 SWAP4 PUSH2 0xD24 SWAP4 PUSH2 0xD0D DUP2 PUSH2 0x797 JUMP JUMPDEST SWAP4 DUP5 DUP1 SWAP4 PUSH2 0xCEE JUMP JUMPDEST SWAP6 DUP7 SWAP2 ADD PUSH2 0x69B JUMP JUMPDEST PUSH2 0x229 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0xD4D PUSH2 0xD5A SWAP5 SWAP3 SWAP4 PUSH2 0xD43 PUSH1 0x60 DUP5 ADD SWAP6 PUSH1 0x0 DUP6 ADD SWAP1 PUSH2 0x444 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD SWAP1 PUSH2 0x444 JUMP JUMPDEST PUSH1 0x40 DUP2 DUP5 SUB SWAP2 ADD MSTORE PUSH2 0xCF7 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xDED SWAP1 SWAP4 SWAP3 SWAP2 SWAP4 PUSH2 0xD6D PUSH2 0x689 JUMP JUMPDEST POP PUSH2 0xDAD DUP6 SWAP2 PUSH2 0xD9E PUSH2 0xD88 PUSH2 0xD83 PUSH1 0x1 PUSH2 0x5B2 JUMP JUMPDEST PUSH2 0x1BB JUMP JUMPDEST DUP7 SWAP1 PUSH2 0xD92 PUSH2 0x93 JUMP JUMPDEST SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 ADD PUSH2 0xC5D JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE SUB DUP3 PUSH2 0x249 JUMP JUMPDEST PUSH2 0xDBF PUSH2 0xDB9 DUP3 PUSH2 0x797 JUMP JUMPDEST SWAP2 PUSH2 0x791 JUMP JUMPDEST KECCAK256 PUSH2 0x148A PUSH2 0xDCF PUSH1 0x20 DUP3 ADD PUSH2 0x272 JUMP JUMPDEST SWAP1 DUP1 DUP3 MSTORE PUSH2 0x125B PUSH1 0x20 DUP4 ADD CODECOPY PUSH2 0xDE8 PUSH1 0x0 SWAP3 SWAP2 SWAP3 PUSH2 0xC96 JUMP JUMPDEST PUSH2 0x1187 JUMP JUMPDEST SWAP3 PUSH2 0xE07 PUSH2 0xE02 PUSH2 0xDFD DUP7 PUSH2 0xCBE JUMP JUMPDEST PUSH2 0xCD6 JUMP JUMPDEST PUSH2 0xCE2 JUMP JUMPDEST PUSH4 0xCF7A1D77 SWAP2 SWAP1 PUSH2 0xE20 PUSH2 0xE1B PUSH1 0x1 PUSH2 0x5B2 JUMP JUMPDEST PUSH2 0x1BB JUMP JUMPDEST SWAP4 SWAP3 DUP2 EXTCODESIZE ISZERO PUSH2 0xE97 JUMPI PUSH1 0x0 PUSH2 0xE48 SWAP2 PUSH2 0xE53 DUP3 SWAP7 PUSH2 0xE3C PUSH2 0x93 JUMP JUMPDEST SWAP9 DUP10 SWAP8 DUP9 SWAP7 DUP8 SWAP6 PUSH2 0x5C4 JUMP JUMPDEST DUP6 MSTORE PUSH1 0x4 DUP6 ADD PUSH2 0xD28 JUMP JUMPDEST SUB SWAP3 GAS CALL DUP1 ISZERO PUSH2 0xE92 JUMPI PUSH2 0xE65 JUMPI JUMPDEST POP JUMP JUMPDEST PUSH2 0xE85 SWAP1 PUSH1 0x0 RETURNDATASIZE DUP2 GT PUSH2 0xE8B JUMPI JUMPDEST PUSH2 0xE7D DUP2 DUP4 PUSH2 0x249 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x5CA JUMP JUMPDEST CODESIZE PUSH2 0xE62 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xE73 JUMP JUMPDEST PUSH2 0x5DA JUMP JUMPDEST PUSH2 0x5BF JUMP JUMPDEST PUSH1 0x0 SHL SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0xEB3 PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB SWAP2 PUSH2 0xE9C JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST PUSH2 0xEC6 SWAP1 PUSH2 0x1AF JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0xEE1 PUSH2 0xEDC PUSH2 0xEE8 SWAP3 PUSH2 0xEBD JUMP JUMPDEST PUSH2 0xEC9 JUMP JUMPDEST DUP3 SLOAD PUSH2 0xEA2 JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH2 0xEF6 PUSH1 0x0 PUSH2 0x9AE JUMP JUMPDEST PUSH2 0xF01 DUP3 PUSH1 0x0 PUSH2 0xECC JUMP JUMPDEST SWAP1 PUSH2 0xF35 PUSH2 0xF2F PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP4 PUSH2 0xEBD JUMP JUMPDEST SWAP2 PUSH2 0xEBD JUMP JUMPDEST SWAP2 PUSH2 0xF3E PUSH2 0x93 JUMP JUMPDEST DUP1 PUSH2 0xF48 DUP2 PUSH2 0x102 JUMP JUMPDEST SUB SWAP1 LOG3 JUMP JUMPDEST PUSH2 0xFE0 SWAP3 SWAP2 PUSH2 0xF8A PUSH2 0xF99 SWAP3 PUSH2 0xF61 PUSH2 0x689 JUMP JUMPDEST POP SWAP2 SWAP4 PUSH2 0xF76 PUSH2 0xF71 PUSH1 0x1 PUSH2 0x5B2 JUMP JUMPDEST PUSH2 0x1BB JUMP JUMPDEST PUSH2 0xF7E PUSH2 0x93 JUMP JUMPDEST SWAP6 DUP7 SWAP5 PUSH1 0x20 DUP7 ADD PUSH2 0xC5D JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE SUB DUP3 PUSH2 0x249 JUMP JUMPDEST PUSH2 0xFAB PUSH2 0xFA5 DUP3 PUSH2 0x797 JUMP JUMPDEST SWAP2 PUSH2 0x791 JUMP JUMPDEST KECCAK256 PUSH2 0x148A PUSH2 0xFBB PUSH1 0x20 DUP3 ADD PUSH2 0x272 JUMP JUMPDEST SWAP1 DUP1 DUP3 MSTORE PUSH2 0x125B PUSH1 0x20 DUP4 ADD CODECOPY PUSH2 0xFD9 PUSH2 0xFD3 DUP3 PUSH2 0x797 JUMP JUMPDEST SWAP2 PUSH2 0x791 JUMP JUMPDEST KECCAK256 SWAP1 PUSH2 0x1210 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xFEB PUSH2 0x689 JUMP JUMPDEST POP CALLER SWAP1 JUMP JUMPDEST PUSH2 0xFF9 SWAP1 PUSH2 0x1AF JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x437265617465323A20696E73756666696369656E742062616C616E6365000000 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x1031 PUSH1 0x1D PUSH1 0x20 SWAP3 PUSH2 0x692 JUMP JUMPDEST PUSH2 0x103A DUP2 PUSH2 0xFFC JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x1054 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x1024 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x105E JUMPI JUMP JUMPDEST PUSH2 0x1066 PUSH2 0x93 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x107C PUSH1 0x4 DUP3 ADD PUSH2 0x103E JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH32 0x437265617465323A2062797465636F6465206C656E677468206973207A65726F SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x10B4 PUSH1 0x20 DUP1 SWAP3 PUSH2 0x692 JUMP JUMPDEST PUSH2 0x10BD DUP2 PUSH2 0x1080 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x10D7 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x10A8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x10E1 JUMPI JUMP JUMPDEST PUSH2 0x10E9 PUSH2 0x93 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x10FF PUSH1 0x4 DUP3 ADD PUSH2 0x10C1 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH32 0x437265617465323A204661696C6564206F6E206465706C6F7900000000000000 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x1138 PUSH1 0x19 PUSH1 0x20 SWAP3 PUSH2 0x692 JUMP JUMPDEST PUSH2 0x1141 DUP2 PUSH2 0x1103 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x115B SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x112B JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x1165 JUMPI JUMP JUMPDEST PUSH2 0x116D PUSH2 0x93 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x1183 PUSH1 0x4 DUP3 ADD PUSH2 0x1145 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP2 SWAP1 SWAP2 PUSH2 0x1192 PUSH2 0x689 JUMP JUMPDEST POP PUSH2 0x11B9 PUSH2 0x119F ADDRESS PUSH2 0xFF0 JUMP JUMPDEST BALANCE PUSH2 0x11B2 PUSH2 0x11AC DUP5 PUSH2 0xC93 JUMP JUMPDEST SWAP2 PUSH2 0xC93 JUMP JUMPDEST LT ISZERO PUSH2 0x1057 JUMP JUMPDEST PUSH2 0x11DF PUSH2 0x11C5 DUP4 PUSH2 0x797 JUMP JUMPDEST PUSH2 0x11D8 PUSH2 0x11D2 PUSH1 0x0 PUSH2 0xC96 JUMP JUMPDEST SWAP2 PUSH2 0xC93 JUMP JUMPDEST EQ ISZERO PUSH2 0x10DA JUMP JUMPDEST PUSH1 0x20 DUP3 MLOAD SWAP3 ADD SWAP1 CREATE2 SWAP1 PUSH2 0x120E DUP3 PUSH2 0x1207 PUSH2 0x1201 PUSH2 0x11FC PUSH1 0x0 PUSH2 0x965 JUMP JUMPDEST PUSH2 0xB3 JUMP JUMPDEST SWAP2 PUSH2 0xB3 JUMP JUMPDEST EQ ISZERO PUSH2 0x115E JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH2 0x122E SWAP2 PUSH2 0x121D PUSH2 0x689 JUMP JUMPDEST POP SWAP1 PUSH2 0x1228 ADDRESS PUSH2 0xFF0 JUMP JUMPDEST SWAP2 PUSH2 0x1231 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x55 SWAP3 PUSH1 0xB SWAP3 PUSH2 0x1240 PUSH2 0x689 JUMP JUMPDEST POP PUSH1 0x40 MLOAD SWAP3 PUSH1 0x40 DUP5 ADD MSTORE PUSH1 0x20 DUP4 ADD MSTORE DUP2 MSTORE ADD PUSH1 0xFF DUP2 MSTORE8 KECCAK256 SWAP1 JUMP INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE PUSH1 0x1C JUMPI PUSH1 0xE PUSH1 0x20 JUMP JUMPDEST PUSH2 0x145E PUSH2 0x2C DUP3 CODECOPY PUSH2 0x145E SWAP1 RETURN JUMPDEST PUSH1 0x26 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLDATASIZE ISZERO PUSH2 0x6B JUMPI PUSH2 0x6B JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x34 PUSH2 0x2F PUSH2 0x39 SWAP3 PUSH2 0xF JUMP JUMPDEST PUSH2 0x1D JUMP JUMPDEST PUSH2 0x12 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x45 SWAP1 PUSH2 0x20 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x51 SWAP1 PUSH2 0x12 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x60 SWAP1 JUMP JUMPDEST PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL AND SWAP1 JUMP JUMPDEST PUSH1 0x0 ADD SWAP1 JUMP JUMPDEST PUSH2 0x73 PUSH2 0x17E JUMP JUMPDEST PUSH2 0x8E PUSH2 0x88 PUSH2 0x83 PUSH1 0x0 PUSH2 0x3C JUMP JUMPDEST PUSH2 0x48 JUMP JUMPDEST SWAP2 PUSH2 0x48 JUMP JUMPDEST SUB PUSH2 0x46C JUMPI PUSH2 0x9B PUSH2 0x54 JUMP JUMPDEST POP PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL PUSH1 0x0 CALLDATALOAD AND PUSH2 0xC1 PUSH2 0xBB PUSH4 0xCF7A1D77 PUSH1 0xE0 SHL PUSH2 0x59 JUMP JUMPDEST SWAP2 PUSH2 0x59 JUMP JUMPDEST EQ PUSH2 0xE3 JUMPI PUSH1 0x0 PUSH4 0xF92EE8A9 PUSH1 0xE0 SHL DUP2 MSTORE DUP1 PUSH2 0xDF PUSH1 0x4 DUP3 ADD PUSH2 0x65 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0xEB PUSH2 0x401 JUMP JUMPDEST PUSH1 0x20 DUP2 MLOAD SWAP2 ADD RETURN JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SHL SWAP1 JUMP JUMPDEST PUSH2 0x118 PUSH2 0x113 PUSH2 0x11D SWAP3 PUSH2 0xF8 JUMP JUMPDEST PUSH2 0xFE JUMP JUMPDEST PUSH2 0xFB JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x149 PUSH32 0xB53127684A568B3173AE13B9F8A6016E243E63B6E8EE1178D6A717850B5D6103 PUSH2 0x104 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SHR SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x169 PUSH2 0x16E SWAP2 PUSH2 0x14C JUMP JUMPDEST PUSH2 0x152 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x17B SWAP1 SLOAD PUSH2 0x15D JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x186 PUSH2 0xF3 JUMP JUMPDEST POP PUSH2 0x1A2 PUSH1 0x0 PUSH2 0x19C PUSH2 0x197 PUSH2 0x120 JUMP JUMPDEST PUSH2 0x5A2 JUMP JUMPDEST ADD PUSH2 0x171 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1BF PUSH2 0x1BA PUSH2 0x1C4 SWAP3 PUSH2 0x1A5 JUMP JUMPDEST PUSH2 0x1D JUMP JUMPDEST PUSH2 0x1A8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP4 SWAP3 SWAP4 DUP5 DUP4 GT PUSH2 0x1F7 JUMPI DUP5 GT PUSH2 0x1F2 JUMPI PUSH1 0x1 DUP3 MUL ADD SWAP3 SUB SWAP1 JUMP JUMPDEST PUSH2 0x1D2 JUMP JUMPDEST PUSH2 0x1CD JUMP JUMPDEST SWAP2 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x212 SWAP1 PUSH2 0x12 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x21E DUP2 PUSH2 0x209 JUMP JUMPDEST SUB PUSH2 0x225 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP CALLDATALOAD SWAP1 PUSH2 0x237 DUP3 PUSH2 0x215 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1F DUP1 NOT SWAP2 ADD AND SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH2 0x26D SWAP1 PUSH2 0x243 JUMP JUMPDEST DUP2 ADD SWAP1 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR PUSH2 0x287 JUMPI PUSH1 0x40 MSTORE JUMP JUMPDEST PUSH2 0x24D JUMP JUMPDEST SWAP1 PUSH2 0x29F PUSH2 0x298 PUSH2 0x1C7 JUMP JUMPDEST SWAP3 DUP4 PUSH2 0x263 JUMP JUMPDEST JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x2BF JUMPI PUSH2 0x2BB PUSH1 0x20 SWAP2 PUSH2 0x243 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x24D JUMP JUMPDEST SWAP1 DUP3 PUSH1 0x0 SWAP4 SWAP3 DUP3 CALLDATACOPY ADD MSTORE JUMP JUMPDEST SWAP1 SWAP3 SWAP2 SWAP3 PUSH2 0x2E5 PUSH2 0x2E0 DUP3 PUSH2 0x2A1 JUMP JUMPDEST PUSH2 0x28C JUMP JUMPDEST SWAP4 DUP2 DUP6 MSTORE PUSH1 0x20 DUP6 ADD SWAP1 DUP3 DUP5 ADD GT PUSH2 0x301 JUMPI PUSH2 0x2FF SWAP3 PUSH2 0x2C4 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x23E JUMP JUMPDEST SWAP1 DUP1 PUSH1 0x1F DUP4 ADD SLT ISZERO PUSH2 0x324 JUMPI DUP2 PUSH1 0x20 PUSH2 0x321 SWAP4 CALLDATALOAD SWAP2 ADD PUSH2 0x2D0 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x239 JUMP JUMPDEST SWAP2 PUSH1 0x60 DUP4 DUP4 SUB SLT PUSH2 0x376 JUMPI PUSH2 0x341 DUP3 PUSH1 0x0 DUP6 ADD PUSH2 0x22A JUMP JUMPDEST SWAP3 PUSH2 0x34F DUP4 PUSH1 0x20 DUP4 ADD PUSH2 0x22A JUMP JUMPDEST SWAP3 PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x371 JUMPI PUSH2 0x36E SWAP3 ADD PUSH2 0x306 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x204 JUMP JUMPDEST PUSH2 0x1FF JUMP JUMPDEST PUSH2 0x38F PUSH2 0x38A PUSH2 0x394 SWAP3 PUSH2 0x12 JUMP JUMPDEST PUSH2 0x1D JUMP JUMPDEST PUSH2 0x12 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3A0 SWAP1 PUSH2 0x37B JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3AC SWAP1 PUSH2 0x397 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3CD JUMPI PUSH2 0x3C9 PUSH1 0x20 SWAP2 PUSH2 0x243 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x24D JUMP JUMPDEST SWAP1 PUSH2 0x3E4 PUSH2 0x3DF DUP4 PUSH2 0x3AF JUMP JUMPDEST PUSH2 0x28C JUMP JUMPDEST SWAP2 DUP3 MSTORE JUMP JUMPDEST PUSH2 0x3F3 PUSH1 0x0 PUSH2 0x3D2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x3FE PUSH2 0x3E9 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x409 PUSH2 0x54 JUMP JUMPDEST POP PUSH2 0x412 PUSH2 0x5CD JUMP JUMPDEST PUSH2 0x461 PUSH2 0x457 PUSH2 0x451 PUSH2 0x447 PUSH2 0x43F PUSH2 0x439 PUSH1 0x0 CALLDATASIZE PUSH2 0x431 PUSH1 0x4 PUSH2 0x1AB JUMP JUMPDEST SWAP1 DUP1 SWAP3 PUSH2 0x1D7 JUMP JUMPDEST SWAP1 PUSH2 0x1FC JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x329 JUMP JUMPDEST SWAP4 SWAP2 SWAP3 SWAP1 SWAP3 PUSH2 0x3A3 JUMP JUMPDEST SWAP2 PUSH2 0x3A3 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 SWAP1 SWAP2 PUSH2 0x5EC JUMP JUMPDEST PUSH2 0x469 PUSH2 0x3F6 JUMP JUMPDEST SWAP1 JUMP JUMPDEST CALLER PUSH2 0x486 PUSH2 0x480 PUSH2 0x47B PUSH2 0x17E JUMP JUMPDEST PUSH2 0x48 JUMP JUMPDEST SWAP2 PUSH2 0x48 JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0x59D JUMPI PUSH2 0x496 PUSH2 0x54 JUMP JUMPDEST POP PUSH4 0xFFFFFFFF PUSH1 0xE0 SHL PUSH1 0x0 CALLDATALOAD AND DUP1 PUSH2 0x4BD PUSH2 0x4B7 PUSH4 0x1B2CE7F3 PUSH1 0xE1 SHL PUSH2 0x59 JUMP JUMPDEST SWAP2 PUSH2 0x59 JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0x4D7 JUMPI POP PUSH2 0x4CE PUSH2 0x817 JUMP JUMPDEST JUMPDEST PUSH1 0x20 DUP2 MLOAD SWAP2 ADD RETURN JUMPDEST DUP1 PUSH2 0x4F1 PUSH2 0x4EB PUSH4 0x278F7943 PUSH1 0xE1 SHL PUSH2 0x59 JUMP JUMPDEST SWAP2 PUSH2 0x59 JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0x508 JUMPI POP PUSH2 0x502 PUSH2 0x7C1 JUMP JUMPDEST JUMPDEST PUSH2 0x4CF JUMP JUMPDEST DUP1 PUSH2 0x522 PUSH2 0x51C PUSH4 0x8F28397 PUSH1 0xE4 SHL PUSH2 0x59 JUMP JUMPDEST SWAP2 PUSH2 0x59 JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0x539 JUMPI POP PUSH2 0x533 PUSH2 0x723 JUMP JUMPDEST JUMPDEST PUSH2 0x503 JUMP JUMPDEST DUP1 PUSH2 0x553 PUSH2 0x54D PUSH4 0x3E14691 PUSH1 0xE6 SHL PUSH2 0x59 JUMP JUMPDEST SWAP2 PUSH2 0x59 JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0x56A JUMPI POP PUSH2 0x564 PUSH2 0x6BF JUMP JUMPDEST JUMPDEST PUSH2 0x534 JUMP JUMPDEST PUSH2 0x583 PUSH2 0x57D PUSH4 0x5C60DA1B PUSH1 0xE0 SHL PUSH2 0x59 JUMP JUMPDEST SWAP2 PUSH2 0x59 JUMP JUMPDEST EQ PUSH1 0x0 EQ PUSH2 0x598 JUMPI PUSH2 0x593 PUSH2 0x67A JUMP JUMPDEST PUSH2 0x565 JUMP JUMPDEST PUSH2 0x64A JUMP JUMPDEST PUSH2 0x64A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x5B9 PUSH2 0x5B4 PUSH2 0x5BE SWAP3 PUSH2 0xF JUMP JUMPDEST PUSH2 0x1D JUMP JUMPDEST PUSH2 0x1A8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x5C8 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5EA CALLVALUE PUSH2 0x5E4 PUSH2 0x5DE PUSH1 0x0 PUSH2 0x5A5 JUMP JUMPDEST SWAP2 PUSH2 0x1A8 JUMP JUMPDEST EQ PUSH2 0x5C1 JUMP JUMPDEST JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x5F6 PUSH2 0x87A JUMP JUMPDEST PUSH2 0x611 PUSH2 0x60B PUSH2 0x606 PUSH1 0x0 PUSH2 0x3C JUMP JUMPDEST PUSH2 0x48 JUMP JUMPDEST SWAP2 PUSH2 0x48 JUMP JUMPDEST SUB PUSH2 0x62D JUMPI PUSH2 0x622 PUSH2 0x62B SWAP4 PUSH2 0x8B2 JUMP JUMPDEST SWAP1 PUSH1 0x0 SWAP2 PUSH2 0x98D JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 PUSH4 0xF92EE8A9 PUSH1 0xE0 SHL DUP2 MSTORE DUP1 PUSH2 0x646 PUSH1 0x4 DUP3 ADD PUSH2 0x65 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x652 PUSH2 0xAA6 JUMP JUMPDEST PUSH2 0xAE7 JUMP JUMPDEST PUSH2 0x660 SWAP1 PUSH2 0x48 JUMP JUMPDEST SWAP1 MSTORE JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x678 SWAP1 PUSH1 0x0 PUSH1 0x20 DUP6 ADD SWAP5 ADD SWAP1 PUSH2 0x657 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x682 PUSH2 0x54 JUMP JUMPDEST POP PUSH2 0x68B PUSH2 0x5CD JUMP JUMPDEST PUSH2 0x6AD PUSH2 0x6BC PUSH2 0x699 PUSH2 0xAA6 JUMP JUMPDEST PUSH2 0x6A1 PUSH2 0x1C7 JUMP JUMPDEST SWAP3 DUP4 SWAP2 PUSH1 0x20 DUP4 ADD PUSH2 0x664 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE SUB DUP3 PUSH2 0x263 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x6C7 PUSH2 0x54 JUMP JUMPDEST POP PUSH2 0x6D0 PUSH2 0x5CD JUMP JUMPDEST PUSH2 0x6F2 PUSH2 0x701 PUSH2 0x6DE PUSH2 0x17E JUMP JUMPDEST PUSH2 0x6E6 PUSH2 0x1C7 JUMP JUMPDEST SWAP3 DUP4 SWAP2 PUSH1 0x20 DUP4 ADD PUSH2 0x664 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD DUP2 SUB DUP3 MSTORE SUB DUP3 PUSH2 0x263 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x71E JUMPI PUSH2 0x71B SWAP2 PUSH1 0x0 ADD PUSH2 0x22A JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1FF JUMP JUMPDEST PUSH2 0x72B PUSH2 0x54 JUMP JUMPDEST POP PUSH2 0x734 PUSH2 0x5CD JUMP JUMPDEST PUSH2 0x770 PUSH2 0x76B PUSH2 0x766 PUSH2 0x75E PUSH2 0x758 PUSH1 0x0 CALLDATASIZE PUSH2 0x750 PUSH1 0x4 PUSH2 0x1AB JUMP JUMPDEST SWAP1 DUP1 SWAP3 PUSH2 0x1D7 JUMP JUMPDEST SWAP1 PUSH2 0x1FC JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x704 JUMP JUMPDEST PUSH2 0x3A3 JUMP JUMPDEST PUSH2 0x8B2 JUMP JUMPDEST PUSH2 0x778 PUSH2 0x3F6 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 PUSH1 0x40 DUP2 DUP5 SUB SLT PUSH2 0x7BC JUMPI PUSH2 0x795 DUP4 PUSH1 0x0 DUP4 ADD PUSH2 0x22A JUMP JUMPDEST SWAP3 PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x7B7 JUMPI PUSH2 0x7B4 SWAP3 ADD PUSH2 0x306 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x204 JUMP JUMPDEST PUSH2 0x1FF JUMP JUMPDEST PUSH2 0x7C9 PUSH2 0x54 JUMP JUMPDEST POP PUSH2 0x80C PUSH2 0x803 PUSH2 0x7FC PUSH2 0x7F4 PUSH2 0x7EE PUSH1 0x0 CALLDATASIZE PUSH2 0x7E6 PUSH1 0x4 PUSH2 0x1AB JUMP JUMPDEST SWAP1 DUP1 SWAP3 PUSH2 0x1D7 JUMP JUMPDEST SWAP1 PUSH2 0x1FC JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x77B JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x3A3 JUMP JUMPDEST SWAP1 PUSH1 0x1 SWAP2 PUSH2 0xB0A JUMP JUMPDEST PUSH2 0x814 PUSH2 0x3F6 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x81F PUSH2 0x54 JUMP JUMPDEST POP PUSH2 0x828 PUSH2 0x5CD JUMP JUMPDEST PUSH2 0x86F PUSH2 0x85F PUSH2 0x85A PUSH2 0x852 PUSH2 0x84C PUSH1 0x0 CALLDATASIZE PUSH2 0x844 PUSH1 0x4 PUSH2 0x1AB JUMP JUMPDEST SWAP1 DUP1 SWAP3 PUSH2 0x1D7 JUMP JUMPDEST SWAP1 PUSH2 0x1FC JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x704 JUMP JUMPDEST PUSH2 0x3A3 JUMP JUMPDEST PUSH2 0x867 PUSH2 0x3F6 JUMP JUMPDEST PUSH1 0x0 SWAP2 PUSH2 0xB0A JUMP JUMPDEST PUSH2 0x877 PUSH2 0x3F6 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x882 PUSH2 0xF3 JUMP JUMPDEST POP PUSH2 0x88B PUSH2 0x17E JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP2 PUSH1 0x20 PUSH2 0x8B0 SWAP3 SWAP5 SWAP4 PUSH2 0x8A9 PUSH1 0x40 DUP3 ADD SWAP7 PUSH1 0x0 DUP4 ADD SWAP1 PUSH2 0x657 JUMP JUMPDEST ADD SWAP1 PUSH2 0x657 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x8FD SWAP1 PUSH2 0x8BE PUSH2 0x17E JUMP JUMPDEST DUP2 PUSH32 0x7E644D79422F17C01E4894B5F4F588D331EBFA28653D42AE832DC59E38C9798F SWAP2 PUSH2 0x8F5 PUSH2 0x8EC PUSH2 0x1C7 JUMP JUMPDEST SWAP3 DUP4 SWAP3 DUP4 PUSH2 0x88E JUMP JUMPDEST SUB SWAP1 LOG1 PUSH2 0xC4D JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x908 SWAP1 PUSH2 0x397 JUMP JUMPDEST SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH2 0x918 SWAP1 PUSH2 0x37B JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x924 SWAP1 PUSH2 0x90F JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x930 SWAP1 PUSH2 0x397 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xE0 SHL SWAP1 JUMP JUMPDEST PUSH2 0x942 DUP2 PUSH2 0x48 JUMP JUMPDEST SUB PUSH2 0x949 JUMPI JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 POP MLOAD SWAP1 PUSH2 0x95B DUP3 PUSH2 0x939 JUMP JUMPDEST JUMP JUMPDEST SWAP1 PUSH1 0x20 DUP3 DUP3 SUB SLT PUSH2 0x977 JUMPI PUSH2 0x974 SWAP2 PUSH1 0x0 ADD PUSH2 0x94E JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1FF JUMP JUMPDEST PUSH2 0x984 PUSH2 0x1C7 JUMP JUMPDEST RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE SWAP1 REVERT JUMPDEST SWAP2 PUSH2 0x997 DUP4 PUSH2 0xE30 JUMP JUMPDEST DUP3 PUSH2 0x9C2 PUSH32 0x1CF3B03A6CF19FA2BABA4DF148E9DCABEDEA7F8A5C07840E207E5C089BE95D3E SWAP2 PUSH2 0x8FF JUMP JUMPDEST SWAP1 PUSH2 0x9CB PUSH2 0x1C7 JUMP JUMPDEST DUP1 PUSH2 0x9D5 DUP2 PUSH2 0x65 JUMP JUMPDEST SUB SWAP1 LOG2 PUSH2 0x9E1 DUP3 PUSH2 0x90B JUMP JUMPDEST PUSH2 0x9F4 PUSH2 0x9EE PUSH1 0x0 PUSH2 0x5A5 JUMP JUMPDEST SWAP2 PUSH2 0x1A8 JUMP JUMPDEST GT SWAP1 DUP2 ISZERO PUSH2 0xA9E JUMPI JUMPDEST POP PUSH2 0xA07 JUMPI JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x20 PUSH2 0xA1D PUSH2 0xA18 PUSH2 0xA33 SWAP5 PUSH2 0x91B JUMP JUMPDEST PUSH2 0x927 JUMP JUMPDEST PUSH4 0x5C60DA1B SWAP1 PUSH2 0xA2B PUSH2 0x1C7 JUMP JUMPDEST SWAP5 DUP6 SWAP3 PUSH2 0x933 JUMP JUMPDEST DUP3 MSTORE DUP2 DUP1 PUSH2 0xA43 PUSH1 0x4 DUP3 ADD PUSH2 0x65 JUMP JUMPDEST SUB SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0xA99 JUMPI PUSH2 0xA61 SWAP3 PUSH1 0x0 SWAP3 PUSH2 0xA69 JUMPI JUMPDEST POP SWAP1 PUSH2 0xF65 JUMP JUMPDEST POP CODESIZE DUP1 PUSH2 0xA03 JUMP JUMPDEST PUSH2 0xA8B SWAP2 SWAP3 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xA92 JUMPI JUMPDEST PUSH2 0xA83 DUP2 DUP4 PUSH2 0x263 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x95D JUMP JUMPDEST SWAP1 CODESIZE PUSH2 0xA5A JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xA79 JUMP JUMPDEST PUSH2 0x97C JUMP JUMPDEST SWAP1 POP CODESIZE PUSH2 0x9FD JUMP JUMPDEST PUSH2 0xAAE PUSH2 0xF3 JUMP JUMPDEST POP PUSH2 0xAB7 PUSH2 0xF85 JUMP JUMPDEST DUP1 PUSH2 0xAD3 PUSH2 0xACD PUSH2 0xAC8 PUSH1 0x0 PUSH2 0x3C JUMP JUMPDEST PUSH2 0x48 JUMP JUMPDEST SWAP2 PUSH2 0x48 JUMP JUMPDEST SUB PUSH2 0xAE4 JUMPI POP PUSH2 0xAE1 PUSH2 0xF99 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP2 CALLDATASIZE DUP3 DUP1 CALLDATACOPY DUP2 CALLDATASIZE SWAP2 GAS DELEGATECALL RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY PUSH1 0x0 EQ PUSH2 0xB05 JUMPI RETURNDATASIZE PUSH1 0x0 RETURN JUMPDEST RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST SWAP2 PUSH2 0xB14 DUP4 PUSH2 0x102F JUMP JUMPDEST PUSH2 0xB1D DUP3 PUSH2 0x90B JUMP JUMPDEST PUSH2 0xB30 PUSH2 0xB2A PUSH1 0x0 PUSH2 0x5A5 JUMP JUMPDEST SWAP2 PUSH2 0x1A8 JUMP JUMPDEST GT SWAP1 DUP2 ISZERO PUSH2 0xB54 JUMPI JUMPDEST POP PUSH2 0xB43 JUMPI JUMPDEST POP POP JUMP JUMPDEST PUSH2 0xB4C SWAP2 PUSH2 0xF65 JUMP JUMPDEST POP CODESIZE DUP1 PUSH2 0xB3F JUMP JUMPDEST SWAP1 POP CODESIZE PUSH2 0xB39 JUMP JUMPDEST PUSH1 0x20 SWAP2 DUP2 MSTORE ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0x455243313936373A206E65772061646D696E20697320746865207A65726F2061 PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xBC0 PUSH1 0x26 PUSH1 0x40 SWAP3 PUSH2 0xB5C JUMP JUMPDEST PUSH2 0xBC9 DUP2 PUSH2 0xB65 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0xBE3 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0xBB3 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0xBED JUMPI JUMP JUMPDEST PUSH2 0xBF5 PUSH2 0x1C7 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0xC0B PUSH1 0x4 DUP3 ADD PUSH2 0xBCD JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP1 PUSH2 0xC20 PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB SWAP2 PUSH2 0xFE JUMP JUMPDEST SWAP2 DUP2 NOT AND SWAP2 AND OR SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0xC42 PUSH2 0xC3D PUSH2 0xC49 SWAP3 PUSH2 0x8FF JUMP JUMPDEST PUSH2 0xC2A JUMP JUMPDEST DUP3 SLOAD PUSH2 0xC0F JUMP JUMPDEST SWAP1 SSTORE JUMP JUMPDEST PUSH2 0xC8F SWAP1 PUSH2 0xC77 DUP2 PUSH2 0xC70 PUSH2 0xC6A PUSH2 0xC65 PUSH1 0x0 PUSH2 0x3C JUMP JUMPDEST PUSH2 0x48 JUMP JUMPDEST SWAP2 PUSH2 0x48 JUMP JUMPDEST EQ ISZERO PUSH2 0xBE6 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC89 PUSH2 0xC84 PUSH2 0x120 JUMP JUMPDEST PUSH2 0x5A2 JUMP JUMPDEST ADD PUSH2 0xC2D JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x20 PUSH32 0x7472616374000000000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0x455243313936373A206E657720626561636F6E206973206E6F74206120636F6E PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xCEC PUSH1 0x25 PUSH1 0x40 SWAP3 PUSH2 0xB5C JUMP JUMPDEST PUSH2 0xCF5 DUP2 PUSH2 0xC91 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0xD0F SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0xCDF JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0xD19 JUMPI JUMP JUMPDEST PUSH2 0xD21 PUSH2 0x1C7 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0xD37 PUSH1 0x4 DUP3 ADD PUSH2 0xCF9 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH1 0x20 PUSH32 0x73206E6F74206120636F6E747261637400000000000000000000000000000000 SWAP2 PUSH32 0x455243313936373A20626561636F6E20696D706C656D656E746174696F6E2069 PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xD96 PUSH1 0x30 PUSH1 0x40 SWAP3 PUSH2 0xB5C JUMP JUMPDEST PUSH2 0xD9F DUP2 PUSH2 0xD3B JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0xDB9 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0xD89 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0xDC3 JUMPI JUMP JUMPDEST PUSH2 0xDCB PUSH2 0x1C7 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0xDE1 PUSH1 0x4 DUP3 ADD PUSH2 0xDA3 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xDFC PUSH2 0xDF7 PUSH2 0xE01 SWAP3 PUSH2 0xDE5 JUMP JUMPDEST PUSH2 0xFE JUMP JUMPDEST PUSH2 0xFB JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xE2D PUSH32 0xA3F0AD74E5423AEBFD80D3EF4346578335A9A72AEAEE59FF6CB3582B35133D50 PUSH2 0xDE8 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xE6E SWAP1 PUSH2 0xE45 PUSH2 0xE40 DUP3 PUSH2 0x107F JUMP JUMPDEST PUSH2 0xD12 JUMP JUMPDEST PUSH1 0x20 PUSH2 0xE58 PUSH2 0xE53 DUP4 PUSH2 0x91B JUMP JUMPDEST PUSH2 0x927 JUMP JUMPDEST PUSH4 0x5C60DA1B SWAP1 PUSH2 0xE66 PUSH2 0x1C7 JUMP JUMPDEST SWAP5 DUP6 SWAP3 PUSH2 0x933 JUMP JUMPDEST DUP3 MSTORE DUP2 DUP1 PUSH2 0xE7E PUSH1 0x4 DUP3 ADD PUSH2 0x65 JUMP JUMPDEST SUB SWAP2 GAS STATICCALL DUP1 ISZERO PUSH2 0xEEE JUMPI PUSH2 0xEA1 PUSH2 0xEA6 SWAP2 PUSH2 0xEBE SWAP5 PUSH1 0x0 SWAP2 PUSH2 0xEC0 JUMPI JUMPDEST POP PUSH2 0x107F JUMP JUMPDEST PUSH2 0xDBC JUMP JUMPDEST PUSH1 0x0 PUSH2 0xEB8 PUSH2 0xEB3 PUSH2 0xE04 JUMP JUMPDEST PUSH2 0x5A2 JUMP JUMPDEST ADD PUSH2 0xC2D JUMP JUMPDEST JUMP JUMPDEST PUSH2 0xEE1 SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0xEE7 JUMPI JUMPDEST PUSH2 0xED9 DUP2 DUP4 PUSH2 0x263 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x95D JUMP JUMPDEST CODESIZE PUSH2 0xE9B JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0xECF JUMP JUMPDEST PUSH2 0x97C JUMP JUMPDEST PUSH1 0x20 PUSH32 0x206661696C656400000000000000000000000000000000000000000000000000 SWAP2 PUSH32 0x416464726573733A206C6F772D6C6576656C2064656C65676174652063616C6C PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0xF4B PUSH1 0x27 PUSH2 0x3D2 JUMP JUMPDEST SWAP1 PUSH2 0xF58 PUSH1 0x20 DUP4 ADD PUSH2 0xEF3 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0xF62 PUSH2 0xF41 JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0xF82 SWAP2 PUSH2 0xF72 PUSH2 0x54 JUMP JUMPDEST POP SWAP1 PUSH2 0xF7C PUSH2 0xF5A JUMP JUMPDEST SWAP2 PUSH2 0x10E2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xF8D PUSH2 0xF3 JUMP JUMPDEST POP PUSH2 0xF96 PUSH2 0x1160 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xFA1 PUSH2 0xF3 JUMP JUMPDEST POP PUSH2 0xFD5 PUSH1 0x20 PUSH2 0xFBF PUSH2 0xFBA PUSH2 0xFB5 PUSH2 0x1187 JUMP JUMPDEST PUSH2 0x91B JUMP JUMPDEST PUSH2 0x927 JUMP JUMPDEST PUSH4 0x5C60DA1B SWAP1 PUSH2 0xFCD PUSH2 0x1C7 JUMP JUMPDEST SWAP4 DUP5 SWAP3 PUSH2 0x933 JUMP JUMPDEST DUP3 MSTORE DUP2 DUP1 PUSH2 0xFE5 PUSH1 0x4 DUP3 ADD PUSH2 0x65 JUMP JUMPDEST SUB SWAP2 GAS STATICCALL SWAP1 DUP2 ISZERO PUSH2 0x102A JUMPI PUSH1 0x0 SWAP2 PUSH2 0xFFC JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x101D SWAP2 POP PUSH1 0x20 RETURNDATASIZE DUP2 GT PUSH2 0x1023 JUMPI JUMPDEST PUSH2 0x1015 DUP2 DUP4 PUSH2 0x263 JUMP JUMPDEST DUP2 ADD SWAP1 PUSH2 0x95D JUMP JUMPDEST CODESIZE PUSH2 0xFF8 JUMP JUMPDEST POP RETURNDATASIZE PUSH2 0x100B JUMP JUMPDEST PUSH2 0x97C JUMP JUMPDEST PUSH2 0x1038 DUP2 PUSH2 0x1258 JUMP JUMPDEST PUSH2 0x1062 PUSH32 0xBC7CD75A20EE27FD9ADEBAB32041F755214DBC6BFFA90CC0225B39DA2E5C2D3B SWAP2 PUSH2 0x8FF JUMP JUMPDEST SWAP1 PUSH2 0x106B PUSH2 0x1C7 JUMP JUMPDEST DUP1 PUSH2 0x1075 DUP2 PUSH2 0x65 JUMP JUMPDEST SUB SWAP1 LOG2 JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH2 0x1087 PUSH2 0x107A JUMP JUMPDEST POP EXTCODESIZE PUSH2 0x109C PUSH2 0x1096 PUSH1 0x0 PUSH2 0x5A5 JUMP JUMPDEST SWAP2 PUSH2 0x1A8 JUMP JUMPDEST GT SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x10B2 PUSH2 0x10AD DUP4 PUSH2 0x2A1 JUMP JUMPDEST PUSH2 0x28C JUMP JUMPDEST SWAP2 DUP3 MSTORE JUMP JUMPDEST RETURNDATASIZE PUSH1 0x0 EQ PUSH2 0x10D4 JUMPI PUSH2 0x10C8 RETURNDATASIZE PUSH2 0x10A0 JUMP JUMPDEST SWAP1 RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY JUMPDEST JUMP JUMPDEST PUSH2 0x10DC PUSH2 0x54 JUMP JUMPDEST SWAP1 PUSH2 0x10D2 JUMP JUMPDEST SWAP1 SWAP2 PUSH1 0x0 DUP1 PUSH2 0x1112 SWAP5 PUSH2 0x10F3 PUSH2 0x54 JUMP JUMPDEST POP DUP5 SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 MLOAD SWAP2 GAS DELEGATECALL SWAP2 PUSH2 0x1108 PUSH2 0x10B7 JUMP JUMPDEST SWAP1 SWAP3 SWAP1 SWAP2 SWAP3 PUSH2 0x130B JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x112C PUSH2 0x1127 PUSH2 0x1131 SWAP3 PUSH2 0x1115 JUMP JUMPDEST PUSH2 0xFE JUMP JUMPDEST PUSH2 0xFB JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x115D PUSH32 0x360894A13BA1A3210667C828492DB98DCA3E2076CC3735A920A3CA505D382BBC PUSH2 0x1118 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1168 PUSH2 0xF3 JUMP JUMPDEST POP PUSH2 0x1184 PUSH1 0x0 PUSH2 0x117E PUSH2 0x1179 PUSH2 0x1134 JUMP JUMPDEST PUSH2 0x5A2 JUMP JUMPDEST ADD PUSH2 0x171 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x118F PUSH2 0xF3 JUMP JUMPDEST POP PUSH2 0x11AB PUSH1 0x0 PUSH2 0x11A5 PUSH2 0x11A0 PUSH2 0xE04 JUMP JUMPDEST PUSH2 0x5A2 JUMP JUMPDEST ADD PUSH2 0x171 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x20 PUSH32 0x6F74206120636F6E747261637400000000000000000000000000000000000000 SWAP2 PUSH32 0x455243313936373A206E657720696D706C656D656E746174696F6E206973206E PUSH1 0x0 DUP3 ADD MSTORE ADD MSTORE JUMP JUMPDEST PUSH2 0x1209 PUSH1 0x2D PUSH1 0x40 SWAP3 PUSH2 0xB5C JUMP JUMPDEST PUSH2 0x1212 DUP2 PUSH2 0x11AE JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x122C SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x11FC JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x1236 JUMPI JUMP JUMPDEST PUSH2 0x123E PUSH2 0x1C7 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x1254 PUSH1 0x4 DUP3 ADD PUSH2 0x1216 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST PUSH2 0x1285 SWAP1 PUSH2 0x126D PUSH2 0x1268 DUP3 PUSH2 0x107F JUMP JUMPDEST PUSH2 0x122F JUMP JUMPDEST PUSH1 0x0 PUSH2 0x127F PUSH2 0x127A PUSH2 0x1134 JUMP JUMPDEST PUSH2 0x5A2 JUMP JUMPDEST ADD PUSH2 0xC2D JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH2 0x12BC PUSH1 0x1D PUSH1 0x20 SWAP3 PUSH2 0xB5C JUMP JUMPDEST PUSH2 0x12C5 DUP2 PUSH2 0x1287 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x12DF SWAP1 PUSH1 0x20 DUP2 ADD SWAP1 PUSH1 0x0 DUP2 DUP4 SUB SWAP2 ADD MSTORE PUSH2 0x12AF JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO PUSH2 0x12E9 JUMPI JUMP JUMPDEST PUSH2 0x12F1 PUSH2 0x1C7 JUMP JUMPDEST PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE DUP1 PUSH2 0x1307 PUSH1 0x4 DUP3 ADD PUSH2 0x12C9 JUMP JUMPDEST SUB SWAP1 REVERT JUMPDEST SWAP2 SWAP3 SWAP1 PUSH2 0x1316 PUSH2 0x54 JUMP JUMPDEST POP PUSH1 0x0 EQ PUSH2 0x135C JUMPI POP PUSH2 0x1328 DUP3 PUSH2 0x90B JUMP JUMPDEST PUSH2 0x133B PUSH2 0x1335 PUSH1 0x0 PUSH2 0x5A5 JUMP JUMPDEST SWAP2 PUSH2 0x1A8 JUMP JUMPDEST EQ PUSH2 0x1345 JUMPI JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x1351 PUSH2 0x1356 SWAP2 PUSH2 0x107F JUMP JUMPDEST PUSH2 0x12E2 JUMP JUMPDEST CODESIZE PUSH2 0x1341 JUMP JUMPDEST DUP3 PUSH2 0x13D5 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT PUSH2 0x137A JUMPI POP POP SWAP1 PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST DUP1 PUSH1 0x20 SWAP2 DUP4 ADD MLOAD DUP2 DUP6 ADD MSTORE ADD PUSH2 0x1369 JUMP JUMPDEST PUSH2 0x13AA PUSH2 0x13B3 PUSH1 0x20 SWAP4 PUSH2 0x13B8 SWAP4 PUSH2 0x13A1 DUP2 PUSH2 0x1362 JUMP JUMPDEST SWAP4 DUP5 DUP1 SWAP4 PUSH2 0xB5C JUMP JUMPDEST SWAP6 DUP7 SWAP2 ADD PUSH2 0x1366 JUMP JUMPDEST PUSH2 0x243 JUMP JUMPDEST ADD SWAP1 JUMP JUMPDEST PUSH2 0x13D2 SWAP2 PUSH1 0x20 DUP3 ADD SWAP2 PUSH1 0x0 DUP2 DUP5 SUB SWAP2 ADD MSTORE PUSH2 0x138B JUMP JUMPDEST SWAP1 JUMP JUMPDEST SWAP1 PUSH2 0x13DF DUP3 PUSH2 0x90B JUMP JUMPDEST PUSH2 0x13F2 PUSH2 0x13EC PUSH1 0x0 PUSH2 0x5A5 JUMP JUMPDEST SWAP2 PUSH2 0x1A8 JUMP JUMPDEST GT PUSH1 0x0 EQ PUSH2 0x1403 JUMPI POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD REVERT JUMPDEST PUSH2 0x1424 SWAP1 PUSH2 0x140F PUSH2 0x1C7 JUMP JUMPDEST SWAP2 DUP3 SWAP2 PUSH3 0x461BCD PUSH1 0xE5 SHL DUP4 MSTORE PUSH1 0x4 DUP4 ADD PUSH2 0x13BC JUMP JUMPDEST SUB SWAP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xFB XOR SWAP10 0xE6 0x1F CODESIZE STATICCALL 0xA7 DUP12 0xFB 0xAB PUSH26 0xB8DC2FA613357C2FCE2699411F9FEE80B624365564736F6C6343 STOP ADDMOD SHL STOP CALLER LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB0 MUL ISZERO 0xE6 DUP1 0xD7 CREATE 0xFB 0xCD 0x26 MUL 0xE1 CREATE2 PUSH30 0x6DBAC930C10D2445BE6BF9979A142780B5F064736F6C634300081B003300 ", + "sourceMap": "341:2469:44:-:0;;;;;;;;;-1:-1:-1;341:2469:44;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;:::o;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;:::o;:::-;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;:::o;:::-;;:::i;:::-;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::o;746:31:33:-;;;;;;:::i;:::-;;:::o;341:2469:44:-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;:::i;:::-;;;;:::i;:::-;:::o;:::-;;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;:::o;:::-;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;:::o;:::-;;:::o;:::-;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;1063:62:4;1117:1;1063:62;;;:::i;:::-;1117:1;:::i;:::-;1063:62::o;341:2469:44:-;;;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;:::o;:::-;;:::i;:::-;;;:::i;:::-;;;;;;;;2718:127:33;2806:16;:6;;;:::i;:::-;:16;:::i;:::-;;;2823:14;2806:32;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;2718:127;;:::o;2806:32::-;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;:::i;2718:127::-;;;;:::i;:::-;:::o;341:2469:44:-;;;:::o;:::-;;;:::o;:::-;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::i;:::-;;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;:::i;:::-;:::o;:::-;;;;:::o;:::-;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;866:1106::-;1587:34;866:1106;;;;;;;;;;;1212:17;;:::i;:::-;1307:10;;1279:276;1307:10;1279:276;1335:4;;;;1357:7;1382:11;1411:15;1444:19;;1481:21;1520;1279:276;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;1256:309;;;;:::i;:::-;;;:::i;:::-;;1606:10;1587:34;;:::i;:::-;;;:::i;:::-;1643:9;1631:33;:22;1643:9;1631:22;:::i;:::-;:33;:::i;:::-;;;1678:10;1702:4;1720:7;1741:11;1766:15;1795:19;1828:21;1631:263;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;866:1106;1929:9;;1909:30;;;;;:::i;:::-;;;;;;:::i;:::-;;;;1949:16;:::o;1631:263::-;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;:::i;1063:62:4:-;;;:::i;:::-;1117:1;;:::i;:::-;1063:62::o;341:2469:44:-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;1824:101:4:-;1907:10;;1915:1;1907:10;:::i;:::-;;:::i;:::-;1824:101::o;:::-;;;:::i;:::-;:::o;341:2469:44:-;;;;;;;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;1201:85:4:-;1247:7;;:::i;:::-;1273:6;;;;:::i;:::-;1266:13;:::o;2027:780:44:-;;2455:276;2027:780;;2455:276;2027:780;2758:42;2027:780;;;;;2388:17;;:::i;:::-;2483:10;2511:4;2533:7;2558:11;2587:15;2620:19;2657:21;2696;2455:276;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;2432:309;;;;:::i;:::-;;;:::i;:::-;;2785:10;2758:42;;:::i;:::-;;;:::i;:::-;2751:49;:::o;1063:62:4:-;1117:1;1063:62;;;:::i;:::-;1117:1;:::i;:::-;1063:62::o;341:2469:44:-;;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;2074:198:4;2256:8;2074:198;2154:73;2162:8;:22;;2174:10;2182:1;2174:10;:::i;:::-;2162:22;:::i;:::-;;;:::i;:::-;;;2154:73;:::i;:::-;2256:8;:::i;:::-;2074:198::o;:::-;;;;:::i;:::-;:::o;341:2469:44:-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;1359:130:4;1414:68;1422:7;;:::i;:::-;:23;;1433:12;;:::i;:::-;1422:23;:::i;:::-;;;:::i;:::-;;1414:68;:::i;:::-;1359:130::o;341:2469:44:-;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;;:::o;:::-;;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;;:::o;:::-;;;;:::o;:::-;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;:::i;:::-;;;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;;;;:::o;:::-;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;:::o;1424:523:33:-;1786:39;1424:523;;;;;1550:20;;:::i;:::-;1630:5;1613:60;1637:11;1658:6;1613:60;1650:15;1658:6;;;:::i;:::-;1650:15;:::i;:::-;1667:5;1613:60;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;1603:71;;;;:::i;:::-;;;:::i;:::-;;1708:52;;;;;;:::i;:::-;;;;;;;;;;1786:39;1801:1;1804:10;1816:8;1786:39;;:::i;:::-;;:::i;:::-;1878:12;1835:68;:57;1870:21;1878:12;1870:21;:::i;:::-;1835:57;:::i;:::-;:68;:::i;:::-;;1904:11;1925:6;1917:15;1925:6;;;:::i;:::-;1917:15;:::i;:::-;1934:5;1835:105;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;1424:523;;:::o;1835:105::-;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;:::i;341:2469:44:-;;;;:::o;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;2426:187:4:-;2518:6;;;:::i;:::-;2534:17;2543:8;2534:17;;:::i;:::-;2597:8;2566:40;;;;;:::i;:::-;;;:::i;:::-;;;;:::i;:::-;;;;;:::i;:::-;;;;2426:187::o;2174:419:33:-;2538:48;2174:419;;2363:60;;2174:419;2313:7;;:::i;:::-;2380:5;2387:11;2408:6;2400:15;2408:6;;;:::i;:::-;2400:15;:::i;:::-;2363:60;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;2353:71;;;;:::i;:::-;;;:::i;:::-;;2467:52;;;;;;:::i;:::-;;;;;;;;;;2457:63;;;;:::i;:::-;;;:::i;:::-;;2538:48;;:::i;:::-;2531:55;:::o;640:96:14:-;693:7;;:::i;:::-;719:10;;712:17;:::o;341:2469:44:-;;;;:::i;:::-;;:::o;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;1081:484:15;;;;1168:12;;:::i;:::-;1208:4;1192:73;1200:13;1208:4;1200:13;:::i;:::-;:21;:31;;1225:6;1200:31;:::i;:::-;;;:::i;:::-;;;1192:73;:::i;:::-;1275:65;1283:15;:8;:15;:::i;:::-;:20;;1302:1;1283:20;:::i;:::-;;;:::i;:::-;;;1275:65;:::i;:::-;1393:100;;;;;;;1510:4;1502:56;1510:4;:18;;1518:10;1526:1;1518:10;:::i;:::-;1510:18;:::i;:::-;;;:::i;:::-;;;1502:56;:::i;:::-;1081:484::o;1769:165::-;;1878:49;1769:165;1852:7;;:::i;:::-;1893:4;1899:12;1913:13;1921:4;1913:13;:::i;:::-;1878:49;;:::i;:::-;1871:56;:::o;2177:1772::-;;2345:1598;2177:1772;2345:1598;2177:1772;2278:12;;:::i;:::-;2345:1598;;;;;;;;;;;;;;;;;;;2177:1772;:::o" + }, + "methodIdentifiers": { + "beacon()": "59659e90", + "deploy(address,address,string,string,string,address,uint96,address,bytes32)": "59a347bd", + "determineAddress(address,address,string,string,string,address,uint96,address,bytes32)": "cfcc5941", + "owner()": "8da5cb5b", + "renounceOwnership()": "715018a6", + "transferOwnership(address)": "f2fde38b", + "upgradeBeacon(address)": "1bce4583" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"factoryOwner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"holderFallback\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"proxyAddr\",\"type\":\"address\"}],\"name\":\"ERC1155PackDeployed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"beacon\",\"outputs\":[{\"internalType\":\"contract UpgradeableBeacon\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proxyOwner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenOwner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"baseURI\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"contractURI\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"royaltyReceiver\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"royaltyFeeNumerator\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"implicitModeValidator\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"implicitModeProjectId\",\"type\":\"bytes32\"}],\"name\":\"deploy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"proxyAddr\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proxyOwner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenOwner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"baseURI\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"contractURI\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"royaltyReceiver\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"royaltyFeeNumerator\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"implicitModeValidator\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"implicitModeProjectId\",\"type\":\"bytes32\"}],\"name\":\"determineAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"proxyAddr\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"upgradeBeacon\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"ERC1155PackDeployed(address)\":{\"params\":{\"proxyAddr\":\"The address of the deployed proxy.\"}}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"factoryOwner\":\"The owner of the ERC-1155 Pack Factory\",\"holderFallback\":\"The address of the ERC1155Holder fallback\"}},\"deploy(address,address,string,string,string,address,uint96,address,bytes32)\":{\"params\":{\"baseURI\":\"The base URI of the ERC-1155 Pack proxy\",\"contractURI\":\"The contract URI of the ERC-1155 Pack proxy\",\"implicitModeProjectId\":\"The implicit mode project id\",\"implicitModeValidator\":\"The implicit mode validator address\",\"name\":\"The name of the ERC-1155 Pack proxy\",\"proxyOwner\":\"The owner of the ERC-1155 Pack proxy\",\"royaltyFeeNumerator\":\"The royalty fee numerator in basis points (e.g. 15% would be 1500)\",\"royaltyReceiver\":\"Address of who should be sent the royalty payment\",\"tokenOwner\":\"The owner of the ERC-1155 Pack implementation\"},\"returns\":{\"proxyAddr\":\"The address of the ERC-1155 Pack Proxy\"}},\"determineAddress(address,address,string,string,string,address,uint96,address,bytes32)\":{\"params\":{\"baseURI\":\"The base URI of the ERC-1155 Pack proxy\",\"contractURI\":\"The contract URI of the ERC-1155 Pack proxy\",\"implicitModeProjectId\":\"The implicit mode project id\",\"implicitModeValidator\":\"The implicit mode validator address\",\"name\":\"The name of the ERC-1155 Pack proxy\",\"proxyOwner\":\"The owner of the ERC-1155 Pack proxy\",\"royaltyFeeNumerator\":\"The royalty fee numerator in basis points (e.g. 15% would be 1500)\",\"royaltyReceiver\":\"Address of who should be sent the royalty payment\",\"tokenOwner\":\"The owner of the ERC-1155 Pack implementation\"},\"returns\":{\"proxyAddr\":\"The address of the ERC-1155 Pack Proxy\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"upgradeBeacon(address)\":{\"params\":{\"implementation\":\"The new beacon implementation.\"}}},\"version\":1},\"userdoc\":{\"events\":{\"ERC1155PackDeployed(address)\":{\"notice\":\"Event emitted when a new ERC-1155 Pack proxy contract is deployed.\"}},\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Creates an ERC-1155 Pack Factory.\"},\"deploy(address,address,string,string,string,address,uint96,address,bytes32)\":{\"notice\":\"Creates an ERC-1155 Pack proxy.\"},\"determineAddress(address,address,string,string,string,address,uint96,address,bytes32)\":{\"notice\":\"Computes the address of a proxy instance.\"},\"upgradeBeacon(address)\":{\"notice\":\"Upgrades the beacon implementation.\"}},\"notice\":\"Deployer of ERC-1155 Pack proxies.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/tokens/ERC1155/presets/pack/ERC1155PackFactory.sol\":\"ERC1155PackFactory\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Strings.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```solidity\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```solidity\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}\\n * to enforce additional security measures for this role.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n * Overriding this function changes the behavior of the {onlyRole} modifier.\\n *\\n * Format of the revert message is described in {_checkRole}.\\n *\\n * _Available since v4.6._\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n Strings.toHexString(account),\\n \\\" is missing role \\\",\\n Strings.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * May emit a {RoleGranted} event.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n}\\n\",\"keccak256\":\"0x0dd6e52cb394d7f5abe5dca2d4908a6be40417914720932de757de34a99ab87f\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/access/AccessControlEnumerable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControlEnumerable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControlEnumerable.sol\\\";\\nimport \\\"./AccessControl.sol\\\";\\nimport \\\"../utils/structs/EnumerableSet.sol\\\";\\n\\n/**\\n * @dev Extension of {AccessControl} that allows enumerating the members of each role.\\n */\\nabstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl {\\n using EnumerableSet for EnumerableSet.AddressSet;\\n\\n mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers;\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns one of the accounts that have `role`. `index` must be a\\n * value between 0 and {getRoleMemberCount}, non-inclusive.\\n *\\n * Role bearers are not sorted in any particular way, and their ordering may\\n * change at any point.\\n *\\n * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure\\n * you perform all queries on the same block. See the following\\n * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]\\n * for more information.\\n */\\n function getRoleMember(bytes32 role, uint256 index) public view virtual override returns (address) {\\n return _roleMembers[role].at(index);\\n }\\n\\n /**\\n * @dev Returns the number of accounts that have `role`. Can be used\\n * together with {getRoleMember} to enumerate all bearers of a role.\\n */\\n function getRoleMemberCount(bytes32 role) public view virtual override returns (uint256) {\\n return _roleMembers[role].length();\\n }\\n\\n /**\\n * @dev Overload {_grantRole} to track enumerable memberships\\n */\\n function _grantRole(bytes32 role, address account) internal virtual override {\\n super._grantRole(role, account);\\n _roleMembers[role].add(account);\\n }\\n\\n /**\\n * @dev Overload {_revokeRole} to track enumerable memberships\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual override {\\n super._revokeRole(role, account);\\n _roleMembers[role].remove(account);\\n }\\n}\\n\",\"keccak256\":\"0x13f5e15f2a0650c0b6aaee2ef19e89eaf4870d6e79662d572a393334c1397247\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/access/IAccessControlEnumerable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControlEnumerable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\n\\n/**\\n * @dev External interface of AccessControlEnumerable declared to support ERC165 detection.\\n */\\ninterface IAccessControlEnumerable is IAccessControl {\\n /**\\n * @dev Returns one of the accounts that have `role`. `index` must be a\\n * value between 0 and {getRoleMemberCount}, non-inclusive.\\n *\\n * Role bearers are not sorted in any particular way, and their ordering may\\n * change at any point.\\n *\\n * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure\\n * you perform all queries on the same block. See the following\\n * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]\\n * for more information.\\n */\\n function getRoleMember(bytes32 role, uint256 index) external view returns (address);\\n\\n /**\\n * @dev Returns the number of accounts that have `role`. Can be used\\n * together with {getRoleMember} to enumerate all bearers of a role.\\n */\\n function getRoleMemberCount(bytes32 role) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0xba4459ab871dfa300f5212c6c30178b63898c03533a1ede28436f11546626676\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby disabling any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/interfaces/IERC1967.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\\n *\\n * _Available since v4.8.3._\\n */\\ninterface IERC1967 {\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Emitted when the beacon is changed.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n}\\n\",\"keccak256\":\"0x3cbef5ebc24b415252e2f8c0c9254555d30d9f085603b4b80d9b5ed20ab87e90\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/interfaces/IERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC2981.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Interface for the NFT Royalty Standard.\\n *\\n * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal\\n * support for royalty payments across all NFT marketplaces and ecosystem participants.\\n *\\n * _Available since v4.5._\\n */\\ninterface IERC2981 is IERC165 {\\n /**\\n * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of\\n * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.\\n */\\n function royaltyInfo(\\n uint256 tokenId,\\n uint256 salePrice\\n ) external view returns (address receiver, uint256 royaltyAmount);\\n}\\n\",\"keccak256\":\"0x3976825a61df20457730b79ad0ac9c8908e3c7978ed9bf090c67137c91256b5c\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/IERC1967.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract ERC1967Upgrade is IERC1967 {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n Address.isContract(IBeacon(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x3b21ae06bf5957f73fa16754b0669c77b7abd8ba6c072d35c3281d446fdb86c2\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n /**\\n * @dev Delegates the current call to `implementation`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _delegate(address implementation) internal virtual {\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n /**\\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback function\\n * and {_fallback} should delegate.\\n */\\n function _implementation() internal view virtual returns (address);\\n\\n /**\\n * @dev Delegates the current call to the address returned by `_implementation()`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _fallback() internal virtual {\\n _beforeFallback();\\n _delegate(_implementation());\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n * function in the contract matches the call data.\\n */\\n fallback() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n * is empty.\\n */\\n receive() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n * call, or as part of the Solidity `fallback` or `receive` functions.\\n *\\n * If overridden should call `super._beforeFallback()`.\\n */\\n function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xc130fe33f1b2132158531a87734153293f6d07bc263ff4ac90e85da9c82c0e27\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/proxy/beacon/UpgradeableBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/UpgradeableBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IBeacon.sol\\\";\\nimport \\\"../../access/Ownable.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\n\\n/**\\n * @dev This contract is used in conjunction with one or more instances of {BeaconProxy} to determine their\\n * implementation contract, which is where they will delegate all function calls.\\n *\\n * An owner is able to change the implementation the beacon points to, thus upgrading the proxies that use this beacon.\\n */\\ncontract UpgradeableBeacon is IBeacon, Ownable {\\n address private _implementation;\\n\\n /**\\n * @dev Emitted when the implementation returned by the beacon is changed.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Sets the address of the initial implementation, and the deployer account as the owner who can upgrade the\\n * beacon.\\n */\\n constructor(address implementation_) {\\n _setImplementation(implementation_);\\n }\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function implementation() public view virtual override returns (address) {\\n return _implementation;\\n }\\n\\n /**\\n * @dev Upgrades the beacon to a new implementation.\\n *\\n * Emits an {Upgraded} event.\\n *\\n * Requirements:\\n *\\n * - msg.sender must be the owner of the contract.\\n * - `newImplementation` must be a contract.\\n */\\n function upgradeTo(address newImplementation) public virtual onlyOwner {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Sets the implementation contract address for this beacon\\n *\\n * Requirements:\\n *\\n * - `newImplementation` must be a contract.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"UpgradeableBeacon: implementation is not a contract\\\");\\n _implementation = newImplementation;\\n }\\n}\\n\",\"keccak256\":\"0x6ec71aef5659f3f74011169948d2fcda8c6599be5bb38f986380a8737f96cc0f\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/token/common/ERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/common/ERC2981.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/IERC2981.sol\\\";\\nimport \\\"../../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.\\n *\\n * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for\\n * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.\\n *\\n * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the\\n * fee is specified in basis points by default.\\n *\\n * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See\\n * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to\\n * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.\\n *\\n * _Available since v4.5._\\n */\\nabstract contract ERC2981 is IERC2981, ERC165 {\\n struct RoyaltyInfo {\\n address receiver;\\n uint96 royaltyFraction;\\n }\\n\\n RoyaltyInfo private _defaultRoyaltyInfo;\\n mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\\n return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @inheritdoc IERC2981\\n */\\n function royaltyInfo(uint256 tokenId, uint256 salePrice) public view virtual override returns (address, uint256) {\\n RoyaltyInfo memory royalty = _tokenRoyaltyInfo[tokenId];\\n\\n if (royalty.receiver == address(0)) {\\n royalty = _defaultRoyaltyInfo;\\n }\\n\\n uint256 royaltyAmount = (salePrice * royalty.royaltyFraction) / _feeDenominator();\\n\\n return (royalty.receiver, royaltyAmount);\\n }\\n\\n /**\\n * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a\\n * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an\\n * override.\\n */\\n function _feeDenominator() internal pure virtual returns (uint96) {\\n return 10000;\\n }\\n\\n /**\\n * @dev Sets the royalty information that all ids in this contract will default to.\\n *\\n * Requirements:\\n *\\n * - `receiver` cannot be the zero address.\\n * - `feeNumerator` cannot be greater than the fee denominator.\\n */\\n function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {\\n require(feeNumerator <= _feeDenominator(), \\\"ERC2981: royalty fee will exceed salePrice\\\");\\n require(receiver != address(0), \\\"ERC2981: invalid receiver\\\");\\n\\n _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);\\n }\\n\\n /**\\n * @dev Removes default royalty information.\\n */\\n function _deleteDefaultRoyalty() internal virtual {\\n delete _defaultRoyaltyInfo;\\n }\\n\\n /**\\n * @dev Sets the royalty information for a specific token id, overriding the global default.\\n *\\n * Requirements:\\n *\\n * - `receiver` cannot be the zero address.\\n * - `feeNumerator` cannot be greater than the fee denominator.\\n */\\n function _setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal virtual {\\n require(feeNumerator <= _feeDenominator(), \\\"ERC2981: royalty fee will exceed salePrice\\\");\\n require(receiver != address(0), \\\"ERC2981: Invalid parameters\\\");\\n\\n _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);\\n }\\n\\n /**\\n * @dev Resets royalty information for the token id back to the global default.\\n */\\n function _resetTokenRoyalty(uint256 tokenId) internal virtual {\\n delete _tokenRoyaltyInfo[tokenId];\\n }\\n}\\n\",\"keccak256\":\"0x990a4133f88b07f92724903f42bb25cdaeca0cf255fb48df26568c40e7c919c6\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n *\\n * Furthermore, `isContract` will also return true if the target contract within\\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\\n * which only has an effect at the end of a transaction.\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Create2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Create2.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\\n * `CREATE2` can be used to compute in advance the address where a smart\\n * contract will be deployed, which allows for interesting new mechanisms known\\n * as 'counterfactual interactions'.\\n *\\n * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\\n * information.\\n */\\nlibrary Create2 {\\n /**\\n * @dev Deploys a contract using `CREATE2`. The address where the contract\\n * will be deployed can be known in advance via {computeAddress}.\\n *\\n * The bytecode for a contract can be obtained from Solidity with\\n * `type(contractName).creationCode`.\\n *\\n * Requirements:\\n *\\n * - `bytecode` must not be empty.\\n * - `salt` must have not been used for `bytecode` already.\\n * - the factory must have a balance of at least `amount`.\\n * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.\\n */\\n function deploy(uint256 amount, bytes32 salt, bytes memory bytecode) internal returns (address addr) {\\n require(address(this).balance >= amount, \\\"Create2: insufficient balance\\\");\\n require(bytecode.length != 0, \\\"Create2: bytecode length is zero\\\");\\n /// @solidity memory-safe-assembly\\n assembly {\\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\\n }\\n require(addr != address(0), \\\"Create2: Failed on deploy\\\");\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\\n * `bytecodeHash` or `salt` will result in a new destination address.\\n */\\n function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {\\n return computeAddress(salt, bytecodeHash, address(this));\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\\n * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.\\n */\\n function computeAddress(bytes32 salt, bytes32 bytecodeHash, address deployer) internal pure returns (address addr) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let ptr := mload(0x40) // Get free memory pointer\\n\\n // | | \\u2193 ptr ... \\u2193 ptr + 0x0B (start) ... \\u2193 ptr + 0x20 ... \\u2193 ptr + 0x40 ... |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | bytecodeHash | CCCCCCCCCCCCC...CC |\\n // | salt | BBBBBBBBBBBBB...BB |\\n // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |\\n // | 0xFF | FF |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |\\n // | keccak(start, 85) | \\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191 |\\n\\n mstore(add(ptr, 0x40), bytecodeHash)\\n mstore(add(ptr, 0x20), salt)\\n mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes\\n let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff\\n mstore8(start, 0xff)\\n addr := keccak256(start, 85)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x6e00f269073ffc4350e56b7e8153c9092d5f70bfba423299990514183101ef89\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol)\\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```solidity\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._\\n * _Available since v4.9 for `string`, `bytes`._\\n */\\nlibrary StorageSlot {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n struct StringSlot {\\n string value;\\n }\\n\\n struct BytesSlot {\\n bytes value;\\n }\\n\\n /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n */\\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n */\\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n */\\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `StringSlot` with member `value` located at `slot`.\\n */\\n function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\\n */\\n function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := store.slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BytesSlot` with member `value` located at `slot`.\\n */\\n function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\\n */\\n function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n r.slot := store.slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf09e68aa0dc6722a25bc46490e8d48ed864466d17313b8a0b254c36b54e49899\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\nimport \\\"./math/SignedMath.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\\n */\\n function toString(int256 value) internal pure returns (string memory) {\\n return string(abi.encodePacked(value < 0 ? \\\"-\\\" : \\\"\\\", toString(SignedMath.abs(value))));\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n\\n /**\\n * @dev Returns true if the two strings are equal.\\n */\\n function equal(string memory a, string memory b) internal pure returns (bool) {\\n return keccak256(bytes(a)) == keccak256(bytes(b));\\n }\\n}\\n\",\"keccak256\":\"0x3088eb2868e8d13d89d16670b5f8612c4ab9ff8956272837d8e90106c59c14a0\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\\n // The surrounding unchecked block does not change this fact.\\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1, \\\"Math: mulDiv overflow\\\");\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10 ** 64) {\\n value /= 10 ** 64;\\n result += 64;\\n }\\n if (value >= 10 ** 32) {\\n value /= 10 ** 32;\\n result += 32;\\n }\\n if (value >= 10 ** 16) {\\n value /= 10 ** 16;\\n result += 16;\\n }\\n if (value >= 10 ** 8) {\\n value /= 10 ** 8;\\n result += 8;\\n }\\n if (value >= 10 ** 4) {\\n value /= 10 ** 4;\\n result += 4;\\n }\\n if (value >= 10 ** 2) {\\n value /= 10 ** 2;\\n result += 2;\\n }\\n if (value >= 10 ** 1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard signed math utilities missing in the Solidity language.\\n */\\nlibrary SignedMath {\\n /**\\n * @dev Returns the largest of two signed numbers.\\n */\\n function max(int256 a, int256 b) internal pure returns (int256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two signed numbers.\\n */\\n function min(int256 a, int256 b) internal pure returns (int256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two signed numbers without overflow.\\n * The result is rounded towards zero.\\n */\\n function average(int256 a, int256 b) internal pure returns (int256) {\\n // Formula from the book \\\"Hacker's Delight\\\"\\n int256 x = (a & b) + ((a ^ b) >> 1);\\n return x + (int256(uint256(x) >> 255) & (a ^ b));\\n }\\n\\n /**\\n * @dev Returns the absolute unsigned value of a signed value.\\n */\\n function abs(int256 n) internal pure returns (uint256) {\\n unchecked {\\n // must be unchecked in order to support `n = type(int256).min`\\n return uint256(n >= 0 ? n : -n);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/EnumerableSet.sol)\\n// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for managing\\n * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive\\n * types.\\n *\\n * Sets have the following properties:\\n *\\n * - Elements are added, removed, and checked for existence in constant time\\n * (O(1)).\\n * - Elements are enumerated in O(n). No guarantees are made on the ordering.\\n *\\n * ```solidity\\n * contract Example {\\n * // Add the library methods\\n * using EnumerableSet for EnumerableSet.AddressSet;\\n *\\n * // Declare a set state variable\\n * EnumerableSet.AddressSet private mySet;\\n * }\\n * ```\\n *\\n * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)\\n * and `uint256` (`UintSet`) are supported.\\n *\\n * [WARNING]\\n * ====\\n * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure\\n * unusable.\\n * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.\\n *\\n * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an\\n * array of EnumerableSet.\\n * ====\\n */\\nlibrary EnumerableSet {\\n // To implement this library for multiple types with as little code\\n // repetition as possible, we write it in terms of a generic Set type with\\n // bytes32 values.\\n // The Set implementation uses private functions, and user-facing\\n // implementations (such as AddressSet) are just wrappers around the\\n // underlying Set.\\n // This means that we can only create new EnumerableSets for types that fit\\n // in bytes32.\\n\\n struct Set {\\n // Storage of set values\\n bytes32[] _values;\\n // Position of the value in the `values` array, plus 1 because index 0\\n // means a value is not in the set.\\n mapping(bytes32 => uint256) _indexes;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function _add(Set storage set, bytes32 value) private returns (bool) {\\n if (!_contains(set, value)) {\\n set._values.push(value);\\n // The value is stored at length-1, but we add 1 to all indexes\\n // and use 0 as a sentinel value\\n set._indexes[value] = set._values.length;\\n return true;\\n } else {\\n return false;\\n }\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function _remove(Set storage set, bytes32 value) private returns (bool) {\\n // We read and store the value's index to prevent multiple reads from the same storage slot\\n uint256 valueIndex = set._indexes[value];\\n\\n if (valueIndex != 0) {\\n // Equivalent to contains(set, value)\\n // To delete an element from the _values array in O(1), we swap the element to delete with the last one in\\n // the array, and then remove the last element (sometimes called as 'swap and pop').\\n // This modifies the order of the array, as noted in {at}.\\n\\n uint256 toDeleteIndex = valueIndex - 1;\\n uint256 lastIndex = set._values.length - 1;\\n\\n if (lastIndex != toDeleteIndex) {\\n bytes32 lastValue = set._values[lastIndex];\\n\\n // Move the last value to the index where the value to delete is\\n set._values[toDeleteIndex] = lastValue;\\n // Update the index for the moved value\\n set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex\\n }\\n\\n // Delete the slot where the moved value was stored\\n set._values.pop();\\n\\n // Delete the index for the deleted slot\\n delete set._indexes[value];\\n\\n return true;\\n } else {\\n return false;\\n }\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function _contains(Set storage set, bytes32 value) private view returns (bool) {\\n return set._indexes[value] != 0;\\n }\\n\\n /**\\n * @dev Returns the number of values on the set. O(1).\\n */\\n function _length(Set storage set) private view returns (uint256) {\\n return set._values.length;\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function _at(Set storage set, uint256 index) private view returns (bytes32) {\\n return set._values[index];\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function _values(Set storage set) private view returns (bytes32[] memory) {\\n return set._values;\\n }\\n\\n // Bytes32Set\\n\\n struct Bytes32Set {\\n Set _inner;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {\\n return _add(set._inner, value);\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {\\n return _remove(set._inner, value);\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {\\n return _contains(set._inner, value);\\n }\\n\\n /**\\n * @dev Returns the number of values in the set. O(1).\\n */\\n function length(Bytes32Set storage set) internal view returns (uint256) {\\n return _length(set._inner);\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {\\n return _at(set._inner, index);\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {\\n bytes32[] memory store = _values(set._inner);\\n bytes32[] memory result;\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := store\\n }\\n\\n return result;\\n }\\n\\n // AddressSet\\n\\n struct AddressSet {\\n Set _inner;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function add(AddressSet storage set, address value) internal returns (bool) {\\n return _add(set._inner, bytes32(uint256(uint160(value))));\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function remove(AddressSet storage set, address value) internal returns (bool) {\\n return _remove(set._inner, bytes32(uint256(uint160(value))));\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function contains(AddressSet storage set, address value) internal view returns (bool) {\\n return _contains(set._inner, bytes32(uint256(uint160(value))));\\n }\\n\\n /**\\n * @dev Returns the number of values in the set. O(1).\\n */\\n function length(AddressSet storage set) internal view returns (uint256) {\\n return _length(set._inner);\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function at(AddressSet storage set, uint256 index) internal view returns (address) {\\n return address(uint160(uint256(_at(set._inner, index))));\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function values(AddressSet storage set) internal view returns (address[] memory) {\\n bytes32[] memory store = _values(set._inner);\\n address[] memory result;\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := store\\n }\\n\\n return result;\\n }\\n\\n // UintSet\\n\\n struct UintSet {\\n Set _inner;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function add(UintSet storage set, uint256 value) internal returns (bool) {\\n return _add(set._inner, bytes32(value));\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function remove(UintSet storage set, uint256 value) internal returns (bool) {\\n return _remove(set._inner, bytes32(value));\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function contains(UintSet storage set, uint256 value) internal view returns (bool) {\\n return _contains(set._inner, bytes32(value));\\n }\\n\\n /**\\n * @dev Returns the number of values in the set. O(1).\\n */\\n function length(UintSet storage set) internal view returns (uint256) {\\n return _length(set._inner);\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function at(UintSet storage set, uint256 index) internal view returns (uint256) {\\n return uint256(_at(set._inner, index));\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function values(UintSet storage set) internal view returns (uint256[] memory) {\\n bytes32[] memory store = _values(set._inner);\\n uint256[] memory result;\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := store\\n }\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0x9f4357008a8f7d8c8bf5d48902e789637538d8c016be5766610901b4bba81514\",\"license\":\"MIT\"},\"lib/signals-implicit-mode/lib/sequence-v3/src/extensions/sessions/implicit/Attestation.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.27;\\n\\nimport { LibBytes } from \\\"../../../utils/LibBytes.sol\\\";\\nimport { ACCEPT_IMPLICIT_REQUEST_MAGIC_PREFIX } from \\\"./ISignalsImplicitMode.sol\\\";\\n\\nusing LibBytes for bytes;\\n\\n/// @notice Attestation for a specific session\\n/// @param approvedSigner Address of the approved signer\\n/// @param identityType Identity type\\n/// @param issuerHash Hash of the issuer\\n/// @param audienceHash Hash of the audience\\n/// @param applicationData Unspecified application data\\n/// @param authData Auth data\\nstruct Attestation {\\n address approvedSigner;\\n bytes4 identityType;\\n bytes32 issuerHash;\\n bytes32 audienceHash;\\n bytes applicationData;\\n AuthData authData;\\n}\\n\\n/// @notice Auth data for an attestation\\n/// @param redirectUrl Authorization redirect URL\\n/// @param issuedAt Timestamp of the attestation issuance\\nstruct AuthData {\\n string redirectUrl;\\n uint64 issuedAt;\\n}\\n\\n/// @title LibAttestation\\n/// @author Michael Standen\\n/// @notice Library for attestation management\\nlibrary LibAttestation {\\n\\n /// @notice Hashes an attestation\\n function toHash(\\n Attestation memory attestation\\n ) internal pure returns (bytes32) {\\n return keccak256(toPacked(attestation));\\n }\\n\\n /// @notice Decodes an attestation from a packed bytes array\\n /// @param encoded The packed bytes array\\n /// @param pointer The pointer to the start of the attestation\\n /// @return attestation The decoded attestation\\n /// @return newPointer The new pointer to the end of the attestation\\n function fromPacked(\\n bytes calldata encoded,\\n uint256 pointer\\n ) internal pure returns (Attestation memory attestation, uint256 newPointer) {\\n newPointer = pointer;\\n (attestation.approvedSigner, newPointer) = encoded.readAddress(newPointer);\\n (attestation.identityType, newPointer) = encoded.readBytes4(newPointer);\\n (attestation.issuerHash, newPointer) = encoded.readBytes32(newPointer);\\n (attestation.audienceHash, newPointer) = encoded.readBytes32(newPointer);\\n // Application data (arbitrary bytes)\\n uint256 dataSize;\\n (dataSize, newPointer) = encoded.readUint24(newPointer);\\n attestation.applicationData = encoded[newPointer:newPointer + dataSize];\\n newPointer += dataSize;\\n // Auth data\\n (attestation.authData, newPointer) = fromPackedAuthData(encoded, newPointer);\\n return (attestation, newPointer);\\n }\\n\\n /// @notice Decodes the auth data from a packed bytes\\n /// @param encoded The packed bytes containing the auth data\\n /// @param pointer The pointer to the start of the auth data within the encoded data\\n /// @return authData The decoded auth data\\n /// @return newPointer The pointer to the end of the auth data within the encoded data\\n function fromPackedAuthData(\\n bytes calldata encoded,\\n uint256 pointer\\n ) internal pure returns (AuthData memory authData, uint256 newPointer) {\\n uint24 redirectUrlLength;\\n (redirectUrlLength, pointer) = encoded.readUint24(pointer);\\n authData.redirectUrl = string(encoded[pointer:pointer + redirectUrlLength]);\\n pointer += redirectUrlLength;\\n (authData.issuedAt, pointer) = encoded.readUint64(pointer);\\n return (authData, pointer);\\n }\\n\\n /// @notice Encodes an attestation into a packed bytes array\\n /// @param attestation The attestation to encode\\n /// @return encoded The packed bytes array\\n function toPacked(\\n Attestation memory attestation\\n ) internal pure returns (bytes memory encoded) {\\n return abi.encodePacked(\\n attestation.approvedSigner,\\n attestation.identityType,\\n attestation.issuerHash,\\n attestation.audienceHash,\\n uint24(attestation.applicationData.length),\\n attestation.applicationData,\\n toPackAuthData(attestation.authData)\\n );\\n }\\n\\n /// @notice Encodes the auth data into a packed bytes array\\n /// @param authData The auth data to encode\\n /// @return encoded The packed bytes array\\n function toPackAuthData(\\n AuthData memory authData\\n ) internal pure returns (bytes memory encoded) {\\n return abi.encodePacked(uint24(bytes(authData.redirectUrl).length), bytes(authData.redirectUrl), authData.issuedAt);\\n }\\n\\n /// @notice Generates the implicit request magic return value\\n /// @param attestation The attestation\\n /// @param wallet The wallet\\n /// @return magic The expected implicit request magic\\n function generateImplicitRequestMagic(Attestation memory attestation, address wallet) internal pure returns (bytes32) {\\n return keccak256(\\n abi.encodePacked(ACCEPT_IMPLICIT_REQUEST_MAGIC_PREFIX, wallet, attestation.audienceHash, attestation.issuerHash)\\n );\\n }\\n\\n}\\n\",\"keccak256\":\"0xcaa44022b5eb4bc7ab487b3b1a0125da67e2e891cee983ef6cdb6814f045efc8\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/lib/sequence-v3/src/extensions/sessions/implicit/ISignalsImplicitMode.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.27;\\n\\nimport { Payload } from \\\"../../../modules/Payload.sol\\\";\\nimport { Attestation } from \\\"./Attestation.sol\\\";\\n\\n/// @dev Magic prefix for the implicit request\\nbytes32 constant ACCEPT_IMPLICIT_REQUEST_MAGIC_PREFIX = keccak256(abi.encodePacked(\\\"acceptImplicitRequest\\\"));\\n\\n/// @title ISignalsImplicitMode\\n/// @author Agustin Aguilar, Michael Standen\\n/// @notice Interface for the contracts that support implicit mode validation\\ninterface ISignalsImplicitMode {\\n\\n /// @notice Determines if an implicit request is valid\\n /// @param wallet The wallet's address\\n /// @param attestation The attestation data\\n /// @param call The call to validate\\n /// @return magic The hash of the implicit request if valid\\n function acceptImplicitRequest(\\n address wallet,\\n Attestation calldata attestation,\\n Payload.Call calldata call\\n ) external view returns (bytes32 magic);\\n\\n}\\n\",\"keccak256\":\"0x6cb48f50c49bcb3c7071306fe9fac6c102bc9eabf73d9909e19ab3b9a835d0a8\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/lib/sequence-v3/src/modules/Payload.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.27;\\n\\nimport { LibBytes } from \\\"../utils/LibBytes.sol\\\";\\n\\nusing LibBytes for bytes;\\n\\n/// @title Payload\\n/// @author Agustin Aguilar, Michael Standen, William Hua\\n/// @notice Library for encoding and decoding payloads\\nlibrary Payload {\\n\\n /// @notice Error thrown when the kind is invalid\\n error InvalidKind(uint8 kind);\\n\\n /// @dev keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\")\\n bytes32 private constant EIP712_DOMAIN_TYPEHASH = 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f;\\n\\n /// @dev keccak256(\\\"Sequence Wallet\\\")\\n bytes32 private constant EIP712_DOMAIN_NAME_SEQUENCE =\\n 0x4aa45ca7ad825ceb1bf35643f0a58c295239df563b1b565c2485f96477c56318;\\n\\n /// @dev keccak256(\\\"3\\\")\\n bytes32 private constant EIP712_DOMAIN_VERSION_SEQUENCE =\\n 0x2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de;\\n\\n function domainSeparator(bool _noChainId, address _wallet) internal view returns (bytes32 _domainSeparator) {\\n return keccak256(\\n abi.encode(\\n EIP712_DOMAIN_TYPEHASH,\\n EIP712_DOMAIN_NAME_SEQUENCE,\\n EIP712_DOMAIN_VERSION_SEQUENCE,\\n _noChainId ? uint256(0) : uint256(block.chainid),\\n _wallet\\n )\\n );\\n }\\n\\n /// @dev keccak256(\\\"Call(address to,uint256 value,bytes data,uint256 gasLimit,bool delegateCall,bool onlyFallback,uint256 behaviorOnError)\\\")\\n bytes32 private constant CALL_TYPEHASH = 0x0603985259a953da1f65a522f589c17bd1d0117ec1d3abb7c0788aef251ef437;\\n\\n /// @dev keccak256(\\\"Calls(Call[] calls,uint256 space,uint256 nonce,address[] wallets)Call(address to,uint256 value,bytes data,uint256 gasLimit,bool delegateCall,bool onlyFallback,uint256 behaviorOnError)\\\")\\n bytes32 private constant CALLS_TYPEHASH = 0x11e1e4079a79a66e4ade50033cfe2678cdd5341d2dfe5ef9513edb1a0be147a2;\\n\\n /// @dev keccak256(\\\"Message(bytes message,address[] wallets)\\\")\\n bytes32 private constant MESSAGE_TYPEHASH = 0xe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d466;\\n\\n /// @dev keccak256(\\\"ConfigUpdate(bytes32 imageHash,address[] wallets)\\\")\\n bytes32 private constant CONFIG_UPDATE_TYPEHASH = 0x11fdeb7e8373a1aa96bfac8d0ea91526b2c5d15e5cee20e0543e780258f3e8e4;\\n\\n /// @notice Kind of transaction\\n uint8 public constant KIND_TRANSACTIONS = 0x00;\\n /// @notice Kind of digest\\n uint8 public constant KIND_MESSAGE = 0x01;\\n /// @notice Kind of config update\\n uint8 public constant KIND_CONFIG_UPDATE = 0x02;\\n /// @notice Kind of message\\n uint8 public constant KIND_DIGEST = 0x03;\\n\\n /// @notice Behavior on error: ignore error\\n uint8 public constant BEHAVIOR_IGNORE_ERROR = 0x00;\\n /// @notice Behavior on error: revert on error\\n uint8 public constant BEHAVIOR_REVERT_ON_ERROR = 0x01;\\n /// @notice Behavior on error: abort on error\\n uint8 public constant BEHAVIOR_ABORT_ON_ERROR = 0x02;\\n\\n /// @notice Payload call information\\n /// @param to Address of the target contract\\n /// @param value Value to send with the call\\n /// @param data Data to send with the call\\n /// @param gasLimit Gas limit for the call\\n /// @param delegateCall If the call is a delegate call\\n /// @param onlyFallback If the call should only be executed in an error scenario\\n /// @param behaviorOnError Behavior on error\\n struct Call {\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 gasLimit;\\n bool delegateCall;\\n bool onlyFallback;\\n uint256 behaviorOnError;\\n }\\n\\n /// @notice Decoded payload\\n /// @param kind Kind of payload\\n /// @param noChainId If the chain ID should be omitted\\n /// @param calls Array of calls (transaction kind)\\n /// @param space Nonce space for the calls (transaction kind)\\n /// @param nonce Nonce value for the calls (transaction kind)\\n /// @param message Message to validate (message kind)\\n /// @param imageHash Image hash to update to (config update kind)\\n /// @param digest Digest to validate (digest kind)\\n /// @param parentWallets Parent wallets\\n struct Decoded {\\n uint8 kind;\\n bool noChainId;\\n // Transaction kind\\n Call[] calls;\\n uint256 space;\\n uint256 nonce;\\n // Message kind\\n // TODO: Maybe native 721 ?\\n bytes message;\\n // Config update kind\\n bytes32 imageHash;\\n // Digest kind for 1271\\n bytes32 digest;\\n // Parent wallets\\n address[] parentWallets;\\n }\\n\\n function fromMessage(\\n bytes memory message\\n ) internal pure returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_MESSAGE;\\n _decoded.message = message;\\n }\\n\\n function fromConfigUpdate(\\n bytes32 imageHash\\n ) internal pure returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_CONFIG_UPDATE;\\n _decoded.imageHash = imageHash;\\n }\\n\\n function fromDigest(\\n bytes32 digest\\n ) internal pure returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_DIGEST;\\n _decoded.digest = digest;\\n }\\n\\n function fromPackedCalls(\\n bytes calldata packed\\n ) internal view returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_TRANSACTIONS;\\n\\n // Read the global flag\\n (uint256 globalFlag, uint256 pointer) = packed.readFirstUint8();\\n\\n // First bit determines if space is zero or not\\n if (globalFlag & 0x01 == 0x01) {\\n _decoded.space = 0;\\n } else {\\n (_decoded.space, pointer) = packed.readUint160(pointer);\\n }\\n\\n // Next 3 bits determine the size of the nonce\\n uint256 nonceSize = (globalFlag >> 1) & 0x07;\\n\\n if (nonceSize > 0) {\\n // Read the nonce\\n (_decoded.nonce, pointer) = packed.readUintX(pointer, nonceSize);\\n }\\n\\n uint256 numCalls;\\n\\n // Bit 5 determines if the batch contains a single call\\n if (globalFlag & 0x10 == 0x10) {\\n numCalls = 1;\\n } else {\\n // Bit 6 determines if the number of calls uses 1 byte or 2 bytes\\n if (globalFlag & 0x20 == 0x20) {\\n (numCalls, pointer) = packed.readUint16(pointer);\\n } else {\\n (numCalls, pointer) = packed.readUint8(pointer);\\n }\\n }\\n\\n // Read the calls\\n _decoded.calls = new Call[](numCalls);\\n\\n for (uint256 i = 0; i < numCalls; i++) {\\n uint8 flags;\\n (flags, pointer) = packed.readUint8(pointer);\\n\\n // First bit determines if this is a call to self\\n // or a call to another address\\n if (flags & 0x01 == 0x01) {\\n // Call to self\\n _decoded.calls[i].to = address(this);\\n } else {\\n // Call to another address\\n (_decoded.calls[i].to, pointer) = packed.readAddress(pointer);\\n }\\n\\n // Second bit determines if the call has value or not\\n if (flags & 0x02 == 0x02) {\\n (_decoded.calls[i].value, pointer) = packed.readUint256(pointer);\\n }\\n\\n // Third bit determines if the call has data or not\\n if (flags & 0x04 == 0x04) {\\n // 3 bytes determine the size of the calldata\\n uint256 calldataSize;\\n (calldataSize, pointer) = packed.readUint24(pointer);\\n _decoded.calls[i].data = packed[pointer:pointer + calldataSize];\\n pointer += calldataSize;\\n }\\n\\n // Fourth bit determines if the call has a gas limit or not\\n if (flags & 0x08 == 0x08) {\\n (_decoded.calls[i].gasLimit, pointer) = packed.readUint256(pointer);\\n }\\n\\n // Fifth bit determines if the call is a delegate call or not\\n _decoded.calls[i].delegateCall = (flags & 0x10 == 0x10);\\n\\n // Sixth bit determines if the call is fallback only\\n _decoded.calls[i].onlyFallback = (flags & 0x20 == 0x20);\\n\\n // Last 2 bits are directly mapped to the behavior on error\\n _decoded.calls[i].behaviorOnError = (flags & 0xC0) >> 6;\\n }\\n }\\n\\n function hashCall(\\n Call memory c\\n ) internal pure returns (bytes32) {\\n return keccak256(\\n abi.encode(\\n CALL_TYPEHASH, c.to, c.value, keccak256(c.data), c.gasLimit, c.delegateCall, c.onlyFallback, c.behaviorOnError\\n )\\n );\\n }\\n\\n function hashCalls(\\n Call[] memory calls\\n ) internal pure returns (bytes32) {\\n // In EIP712, an array is often hashed as the keccak256 of the concatenated\\n // hashes of each item. So we hash each Call, pack them, and hash again.\\n bytes32[] memory callHashes = new bytes32[](calls.length);\\n for (uint256 i = 0; i < calls.length; i++) {\\n callHashes[i] = hashCall(calls[i]);\\n }\\n return keccak256(abi.encodePacked(callHashes));\\n }\\n\\n function toEIP712(\\n Decoded memory _decoded\\n ) internal pure returns (bytes32) {\\n bytes32 walletsHash = keccak256(abi.encodePacked(_decoded.parentWallets));\\n\\n if (_decoded.kind == KIND_TRANSACTIONS) {\\n bytes32 callsHash = hashCalls(_decoded.calls);\\n // The top-level struct for Calls might be something like:\\n // Calls(bytes32 callsHash,uint256 space,uint256 nonce,bytes32 walletsHash)\\n return keccak256(abi.encode(CALLS_TYPEHASH, callsHash, _decoded.space, _decoded.nonce, walletsHash));\\n } else if (_decoded.kind == KIND_MESSAGE) {\\n // If you define your top-level as: Message(bytes32 messageHash,bytes32 walletsHash)\\n return keccak256(abi.encode(MESSAGE_TYPEHASH, keccak256(_decoded.message), walletsHash));\\n } else if (_decoded.kind == KIND_CONFIG_UPDATE) {\\n // Top-level: ConfigUpdate(bytes32 imageHash,bytes32 walletsHash)\\n return keccak256(abi.encode(CONFIG_UPDATE_TYPEHASH, _decoded.imageHash, walletsHash));\\n } else if (_decoded.kind == KIND_DIGEST) {\\n // Top-level: Use MESSAGE_TYPEHASH but assume the digest is already the hashed message\\n return keccak256(abi.encode(MESSAGE_TYPEHASH, _decoded.digest, walletsHash));\\n } else {\\n // Unknown kind\\n revert InvalidKind(_decoded.kind);\\n }\\n }\\n\\n function hash(\\n Decoded memory _decoded\\n ) internal view returns (bytes32) {\\n bytes32 domain = domainSeparator(_decoded.noChainId, address(this));\\n bytes32 structHash = toEIP712(_decoded);\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domain, structHash));\\n }\\n\\n function hashFor(Decoded memory _decoded, address _wallet) internal view returns (bytes32) {\\n bytes32 domain = domainSeparator(_decoded.noChainId, _wallet);\\n bytes32 structHash = toEIP712(_decoded);\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domain, structHash));\\n }\\n\\n}\\n\",\"keccak256\":\"0x25066fa78d12d0d73d463b97b37528291f3d4d60ca642247441538b83d6597d6\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/lib/sequence-v3/src/utils/LibBytes.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.18;\\n\\n/// @title Library for reading data from bytes arrays\\n/// @author Agustin Aguilar (aa@horizon.io), Michael Standen (mstan@horizon.io)\\n/// @notice This library contains functions for reading data from bytes arrays.\\n/// @dev These functions do not check if the input index is within the bounds of the data array.\\n/// @dev Reading out of bounds may return dirty values.\\nlibrary LibBytes {\\n\\n function readFirstUint8(\\n bytes calldata _data\\n ) internal pure returns (uint8 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(_data.offset)\\n a := shr(248, word)\\n newPointer := 1\\n }\\n }\\n\\n function readUint8(bytes calldata _data, uint256 _index) internal pure returns (uint8 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(248, word)\\n newPointer := add(_index, 1)\\n }\\n }\\n\\n function readUint16(bytes calldata _data, uint256 _index) internal pure returns (uint16 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(240, word)\\n newPointer := add(_index, 2)\\n }\\n }\\n\\n function readUint24(bytes calldata _data, uint256 _index) internal pure returns (uint24 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(232, word)\\n newPointer := add(_index, 3)\\n }\\n }\\n\\n function readUint64(bytes calldata _data, uint256 _index) internal pure returns (uint64 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(192, word)\\n newPointer := add(_index, 8)\\n }\\n }\\n\\n function readUint160(bytes calldata _data, uint256 _index) internal pure returns (uint160 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(96, word)\\n newPointer := add(_index, 20)\\n }\\n }\\n\\n function readUint256(bytes calldata _data, uint256 _index) internal pure returns (uint256 a, uint256 newPointer) {\\n assembly {\\n a := calldataload(add(_index, _data.offset))\\n newPointer := add(_index, 32)\\n }\\n }\\n\\n function readUintX(\\n bytes calldata _data,\\n uint256 _index,\\n uint256 _length\\n ) internal pure returns (uint256 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n let shift := sub(256, mul(_length, 8))\\n a := and(shr(shift, word), sub(shl(mul(8, _length), 1), 1))\\n newPointer := add(_index, _length)\\n }\\n }\\n\\n function readBytes4(bytes calldata _data, uint256 _pointer) internal pure returns (bytes4 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_pointer, _data.offset))\\n a := and(word, 0xffffffff00000000000000000000000000000000000000000000000000000000)\\n newPointer := add(_pointer, 4)\\n }\\n }\\n\\n function readBytes32(bytes calldata _data, uint256 _pointer) internal pure returns (bytes32 a, uint256 newPointer) {\\n assembly {\\n a := calldataload(add(_pointer, _data.offset))\\n newPointer := add(_pointer, 32)\\n }\\n }\\n\\n function readAddress(bytes calldata _data, uint256 _index) internal pure returns (address a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := and(shr(96, word), 0xffffffffffffffffffffffffffffffffffffffff)\\n newPointer := add(_index, 20)\\n }\\n }\\n\\n /// @dev ERC-2098 Compact Signature\\n function readRSVCompact(\\n bytes calldata _data,\\n uint256 _index\\n ) internal pure returns (bytes32 r, bytes32 s, uint8 v, uint256 newPointer) {\\n uint256 yParityAndS;\\n assembly {\\n r := calldataload(add(_index, _data.offset))\\n yParityAndS := calldataload(add(_index, add(_data.offset, 32)))\\n newPointer := add(_index, 64)\\n }\\n uint256 yParity = uint256(yParityAndS >> 255);\\n s = bytes32(uint256(yParityAndS) & ((1 << 255) - 1));\\n v = uint8(yParity) + 27;\\n }\\n\\n}\\n\",\"keccak256\":\"0x4fe0b4786b2157e12384b90ae9daa1009b74b2547a8a24b800a8b998278c874b\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/src/helper/SignalsImplicitMode.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.13;\\n\\nimport { IImplicitProjectValidation } from \\\"../registry/IImplicitProjectValidation.sol\\\";\\n\\nimport { ERC165, IERC165 } from \\\"openzeppelin-contracts/contracts/utils/introspection/ERC165.sol\\\";\\nimport { Attestation } from \\\"sequence-v3/src/extensions/sessions/implicit/Attestation.sol\\\";\\nimport { ISignalsImplicitMode } from \\\"sequence-v3/src/extensions/sessions/implicit/ISignalsImplicitMode.sol\\\";\\nimport { Payload } from \\\"sequence-v3/src/modules/Payload.sol\\\";\\n\\n/// @title SignalsImplicitMode\\n/// @author Michael Standen\\n/// @notice Base contract for implicit mode validation by project\\nabstract contract SignalsImplicitMode is ISignalsImplicitMode, ERC165 {\\n\\n IImplicitProjectValidation internal _validator;\\n bytes32 internal _projectId;\\n\\n /// @notice Initialize implicit mode validation\\n /// @param validator The IImplicitProjectValidation address\\n /// @param projectId The project id\\n function _initializeSignalsImplicitMode(address validator, bytes32 projectId) internal {\\n _validator = IImplicitProjectValidation(validator);\\n _projectId = projectId;\\n }\\n\\n /// @inheritdoc ISignalsImplicitMode\\n function acceptImplicitRequest(\\n address wallet,\\n Attestation calldata attestation,\\n Payload.Call calldata call\\n ) external view returns (bytes32) {\\n _validateImplicitRequest(wallet, attestation, call);\\n return _validator.validateAttestation(wallet, attestation, _projectId);\\n }\\n\\n /// @notice Validates an implicit request\\n /// @dev Optional hook for additional validation of the implicit requests\\n /// @param wallet The wallet's address\\n /// @param attestation The attestation data\\n /// @param call The call to validate\\n function _validateImplicitRequest(\\n address wallet,\\n Attestation calldata attestation,\\n Payload.Call calldata call\\n ) internal view virtual { }\\n\\n /// @inheritdoc IERC165\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view virtual override returns (bool) {\\n return interfaceId == type(ISignalsImplicitMode).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n}\\n\",\"keccak256\":\"0xd9107be2460f7f7ec4bdfefc3d10c79aa92b9285e1b12a75cb2a8d17b150a2ec\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/src/registry/IImplicitProjectValidation.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.13;\\n\\nimport { Attestation } from \\\"sequence-v3/src/extensions/sessions/implicit/Attestation.sol\\\";\\n\\n/// @title IImplicitProjectValidation\\n/// @author Michael Standen\\n/// @notice Interface for contracts supporting validation of implicit sessions for projects\\ninterface IImplicitProjectValidation {\\n\\n /// @notice Invalid redirect url error\\n error InvalidRedirectUrl();\\n\\n /// @notice Check if a project has a code\\n /// @param wallet The wallet address\\n /// @param attestation The attestation\\n /// @param projectId The project id\\n /// @return magic The attestation magic bytes for the wallet address\\n function validateAttestation(\\n address wallet,\\n Attestation calldata attestation,\\n bytes32 projectId\\n ) external view returns (bytes32);\\n\\n}\\n\",\"keccak256\":\"0x1e8c305e011aa13d774e0ff3cfd9286af3d8174c4e33ba5ef8f724ea2dd6e5b2\",\"license\":\"Apache-2.0\"},\"lib/solady/src/tokens/ERC1155.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\n/// @notice Simple ERC1155 implementation.\\n/// @author Solady (https://github.com/vectorized/solady/blob/main/src/tokens/ERC1155.sol)\\n/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC1155.sol)\\n/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC1155/ERC1155.sol)\\n///\\n/// @dev Note:\\n/// - The ERC1155 standard allows for self-approvals.\\n/// For performance, this implementation WILL NOT revert for such actions.\\n/// Please add any checks with overrides if desired.\\n/// - The transfer functions use the identity precompile (0x4)\\n/// to copy memory internally.\\n///\\n/// If you are overriding:\\n/// - Make sure all variables written to storage are properly cleaned\\n// (e.g. the bool value for `isApprovedForAll` MUST be either 1 or 0 under the hood).\\n/// - Check that the overridden function is actually used in the function you want to\\n/// change the behavior of. Much of the code has been manually inlined for performance.\\nabstract contract ERC1155 {\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* CUSTOM ERRORS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev The lengths of the input arrays are not the same.\\n error ArrayLengthsMismatch();\\n\\n /// @dev Cannot mint or transfer to the zero address.\\n error TransferToZeroAddress();\\n\\n /// @dev The recipient's balance has overflowed.\\n error AccountBalanceOverflow();\\n\\n /// @dev Insufficient balance.\\n error InsufficientBalance();\\n\\n /// @dev Only the token owner or an approved account can manage the tokens.\\n error NotOwnerNorApproved();\\n\\n /// @dev Cannot safely transfer to a contract that does not implement\\n /// the ERC1155Receiver interface.\\n error TransferToNonERC1155ReceiverImplementer();\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* EVENTS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Emitted when `amount` of token `id` is transferred\\n /// from `from` to `to` by `operator`.\\n event TransferSingle(\\n address indexed operator,\\n address indexed from,\\n address indexed to,\\n uint256 id,\\n uint256 amount\\n );\\n\\n /// @dev Emitted when `amounts` of token `ids` are transferred\\n /// from `from` to `to` by `operator`.\\n event TransferBatch(\\n address indexed operator,\\n address indexed from,\\n address indexed to,\\n uint256[] ids,\\n uint256[] amounts\\n );\\n\\n /// @dev Emitted when `owner` enables or disables `operator` to manage all of their tokens.\\n event ApprovalForAll(address indexed owner, address indexed operator, bool isApproved);\\n\\n /// @dev Emitted when the Uniform Resource Identifier (URI) for token `id`\\n /// is updated to `value`. This event is not used in the base contract.\\n /// You may need to emit this event depending on your URI logic.\\n ///\\n /// See: https://eips.ethereum.org/EIPS/eip-1155#metadata\\n event URI(string value, uint256 indexed id);\\n\\n /// @dev `keccak256(bytes(\\\"TransferSingle(address,address,address,uint256,uint256)\\\"))`.\\n uint256 private constant _TRANSFER_SINGLE_EVENT_SIGNATURE =\\n 0xc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62;\\n\\n /// @dev `keccak256(bytes(\\\"TransferBatch(address,address,address,uint256[],uint256[])\\\"))`.\\n uint256 private constant _TRANSFER_BATCH_EVENT_SIGNATURE =\\n 0x4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb;\\n\\n /// @dev `keccak256(bytes(\\\"ApprovalForAll(address,address,bool)\\\"))`.\\n uint256 private constant _APPROVAL_FOR_ALL_EVENT_SIGNATURE =\\n 0x17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31;\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* STORAGE */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev The `ownerSlotSeed` of a given owner is given by.\\n /// ```\\n /// let ownerSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, owner))\\n /// ```\\n ///\\n /// The balance slot of `owner` is given by.\\n /// ```\\n /// mstore(0x20, ownerSlotSeed)\\n /// mstore(0x00, id)\\n /// let balanceSlot := keccak256(0x00, 0x40)\\n /// ```\\n ///\\n /// The operator approval slot of `owner` is given by.\\n /// ```\\n /// mstore(0x20, ownerSlotSeed)\\n /// mstore(0x00, operator)\\n /// let operatorApprovalSlot := keccak256(0x0c, 0x34)\\n /// ```\\n uint256 private constant _ERC1155_MASTER_SLOT_SEED = 0x9a31110384e0b0c9;\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* ERC1155 METADATA */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns the URI for token `id`.\\n ///\\n /// You can either return the same templated URI for all token IDs,\\n /// (e.g. \\\"https://example.com/api/{id}.json\\\"),\\n /// or return a unique URI for each `id`.\\n ///\\n /// See: https://eips.ethereum.org/EIPS/eip-1155#metadata\\n function uri(uint256 id) public view virtual returns (string memory);\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* ERC1155 */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns the amount of `id` owned by `owner`.\\n function balanceOf(address owner, uint256 id) public view virtual returns (uint256 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x20, _ERC1155_MASTER_SLOT_SEED)\\n mstore(0x14, owner)\\n mstore(0x00, id)\\n result := sload(keccak256(0x00, 0x40))\\n }\\n }\\n\\n /// @dev Returns whether `operator` is approved to manage the tokens of `owner`.\\n function isApprovedForAll(address owner, address operator)\\n public\\n view\\n virtual\\n returns (bool result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x20, _ERC1155_MASTER_SLOT_SEED)\\n mstore(0x14, owner)\\n mstore(0x00, operator)\\n result := sload(keccak256(0x0c, 0x34))\\n }\\n }\\n\\n /// @dev Sets whether `operator` is approved to manage the tokens of the caller.\\n ///\\n /// Emits a {ApprovalForAll} event.\\n function setApprovalForAll(address operator, bool isApproved) public virtual {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Convert to 0 or 1.\\n isApproved := iszero(iszero(isApproved))\\n // Update the `isApproved` for (`msg.sender`, `operator`).\\n mstore(0x20, _ERC1155_MASTER_SLOT_SEED)\\n mstore(0x14, caller())\\n mstore(0x00, operator)\\n sstore(keccak256(0x0c, 0x34), isApproved)\\n // Emit the {ApprovalForAll} event.\\n mstore(0x00, isApproved)\\n // forgefmt: disable-next-line\\n log3(0x00, 0x20, _APPROVAL_FOR_ALL_EVENT_SIGNATURE, caller(), shr(96, shl(96, operator)))\\n }\\n }\\n\\n /// @dev Transfers `amount` of `id` from `from` to `to`.\\n ///\\n /// Requirements:\\n /// - `to` cannot be the zero address.\\n /// - `from` must have at least `amount` of `id`.\\n /// - If the caller is not `from`,\\n /// it must be approved to manage the tokens of `from`.\\n /// - If `to` refers to a smart contract, it must implement\\n /// {ERC1155-onERC1155Received}, which is called upon a batch transfer.\\n ///\\n /// Emits a {TransferSingle} event.\\n function safeTransferFrom(\\n address from,\\n address to,\\n uint256 id,\\n uint256 amount,\\n bytes calldata data\\n ) public virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(from, to, _single(id), _single(amount), data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n let fromSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, from))\\n let toSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, to))\\n mstore(0x20, fromSlotSeed)\\n // Clear the upper 96 bits.\\n from := shr(96, fromSlotSeed)\\n to := shr(96, toSlotSeed)\\n // Revert if `to` is the zero address.\\n if iszero(to) {\\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\\n revert(0x1c, 0x04)\\n }\\n // If the caller is not `from`, do the authorization check.\\n if iszero(eq(caller(), from)) {\\n mstore(0x00, caller())\\n if iszero(sload(keccak256(0x0c, 0x34))) {\\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n // Subtract and store the updated balance of `from`.\\n {\\n mstore(0x00, id)\\n let fromBalanceSlot := keccak256(0x00, 0x40)\\n let fromBalance := sload(fromBalanceSlot)\\n if gt(amount, fromBalance) {\\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(fromBalanceSlot, sub(fromBalance, amount))\\n }\\n // Increase and store the updated balance of `to`.\\n {\\n mstore(0x20, toSlotSeed)\\n let toBalanceSlot := keccak256(0x00, 0x40)\\n let toBalanceBefore := sload(toBalanceSlot)\\n let toBalanceAfter := add(toBalanceBefore, amount)\\n if lt(toBalanceAfter, toBalanceBefore) {\\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(toBalanceSlot, toBalanceAfter)\\n }\\n // Emit a {TransferSingle} event.\\n mstore(0x20, amount)\\n log4(0x00, 0x40, _TRANSFER_SINGLE_EVENT_SIGNATURE, caller(), from, to)\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(from, to, _single(id), _single(amount), data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Do the {onERC1155Received} check if `to` is a smart contract.\\n if extcodesize(to) {\\n // Prepare the calldata.\\n let m := mload(0x40)\\n // `onERC1155Received(address,address,uint256,uint256,bytes)`.\\n mstore(m, 0xf23a6e61)\\n mstore(add(m, 0x20), caller())\\n mstore(add(m, 0x40), from)\\n mstore(add(m, 0x60), id)\\n mstore(add(m, 0x80), amount)\\n mstore(add(m, 0xa0), 0xa0)\\n mstore(add(m, 0xc0), data.length)\\n calldatacopy(add(m, 0xe0), data.offset, data.length)\\n // Revert if the call reverts.\\n if iszero(call(gas(), to, 0, add(m, 0x1c), add(0xc4, data.length), m, 0x20)) {\\n if returndatasize() {\\n // Bubble up the revert if the call reverts.\\n returndatacopy(m, 0x00, returndatasize())\\n revert(m, returndatasize())\\n }\\n }\\n // Load the returndata and compare it with the function selector.\\n if iszero(eq(mload(m), shl(224, 0xf23a6e61))) {\\n mstore(0x00, 0x9c05499b) // `TransferToNonERC1155ReceiverImplementer()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n }\\n }\\n\\n /// @dev Transfers `amounts` of `ids` from `from` to `to`.\\n ///\\n /// Requirements:\\n /// - `to` cannot be the zero address.\\n /// - `from` must have at least `amount` of `id`.\\n /// - `ids` and `amounts` must have the same length.\\n /// - If the caller is not `from`,\\n /// it must be approved to manage the tokens of `from`.\\n /// - If `to` refers to a smart contract, it must implement\\n /// {ERC1155-onERC1155BatchReceived}, which is called upon a batch transfer.\\n ///\\n /// Emits a {TransferBatch} event.\\n function safeBatchTransferFrom(\\n address from,\\n address to,\\n uint256[] calldata ids,\\n uint256[] calldata amounts,\\n bytes calldata data\\n ) public virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(from, to, ids, amounts, data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n if iszero(eq(ids.length, amounts.length)) {\\n mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.\\n revert(0x1c, 0x04)\\n }\\n let fromSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, from))\\n let toSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, shl(96, to))\\n mstore(0x20, fromSlotSeed)\\n // Clear the upper 96 bits.\\n from := shr(96, fromSlotSeed)\\n to := shr(96, toSlotSeed)\\n // Revert if `to` is the zero address.\\n if iszero(to) {\\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\\n revert(0x1c, 0x04)\\n }\\n // If the caller is not `from`, do the authorization check.\\n if iszero(eq(caller(), from)) {\\n mstore(0x00, caller())\\n if iszero(sload(keccak256(0x0c, 0x34))) {\\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n // Loop through all the `ids` and update the balances.\\n {\\n for { let i := shl(5, ids.length) } i {} {\\n i := sub(i, 0x20)\\n let amount := calldataload(add(amounts.offset, i))\\n // Subtract and store the updated balance of `from`.\\n {\\n mstore(0x20, fromSlotSeed)\\n mstore(0x00, calldataload(add(ids.offset, i)))\\n let fromBalanceSlot := keccak256(0x00, 0x40)\\n let fromBalance := sload(fromBalanceSlot)\\n if gt(amount, fromBalance) {\\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(fromBalanceSlot, sub(fromBalance, amount))\\n }\\n // Increase and store the updated balance of `to`.\\n {\\n mstore(0x20, toSlotSeed)\\n let toBalanceSlot := keccak256(0x00, 0x40)\\n let toBalanceBefore := sload(toBalanceSlot)\\n let toBalanceAfter := add(toBalanceBefore, amount)\\n if lt(toBalanceAfter, toBalanceBefore) {\\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(toBalanceSlot, toBalanceAfter)\\n }\\n }\\n }\\n // Emit a {TransferBatch} event.\\n {\\n let m := mload(0x40)\\n // Copy the `ids`.\\n mstore(m, 0x40)\\n let n := shl(5, ids.length)\\n mstore(add(m, 0x40), ids.length)\\n calldatacopy(add(m, 0x60), ids.offset, n)\\n // Copy the `amounts`.\\n mstore(add(m, 0x20), add(0x60, n))\\n let o := add(add(m, n), 0x60)\\n mstore(o, ids.length)\\n calldatacopy(add(o, 0x20), amounts.offset, n)\\n // Do the emit.\\n log4(m, add(add(n, n), 0x80), _TRANSFER_BATCH_EVENT_SIGNATURE, caller(), from, to)\\n }\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransferCalldata(from, to, ids, amounts, data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Do the {onERC1155BatchReceived} check if `to` is a smart contract.\\n if extcodesize(to) {\\n mstore(0x00, to) // Cache `to` to prevent stack too deep.\\n let m := mload(0x40)\\n // Prepare the calldata.\\n // `onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)`.\\n mstore(m, 0xbc197c81)\\n mstore(add(m, 0x20), caller())\\n mstore(add(m, 0x40), from)\\n // Copy the `ids`.\\n mstore(add(m, 0x60), 0xa0)\\n let n := shl(5, ids.length)\\n mstore(add(m, 0xc0), ids.length)\\n calldatacopy(add(m, 0xe0), ids.offset, n)\\n // Copy the `amounts`.\\n mstore(add(m, 0x80), add(0xc0, n))\\n let o := add(add(m, n), 0xe0)\\n mstore(o, ids.length)\\n calldatacopy(add(o, 0x20), amounts.offset, n)\\n // Copy the `data`.\\n mstore(add(m, 0xa0), add(add(0xe0, n), n))\\n o := add(add(o, n), 0x20)\\n mstore(o, data.length)\\n calldatacopy(add(o, 0x20), data.offset, data.length)\\n let nAll := add(0x104, add(data.length, add(n, n)))\\n // Revert if the call reverts.\\n if iszero(call(gas(), mload(0x00), 0, add(mload(0x40), 0x1c), nAll, m, 0x20)) {\\n if returndatasize() {\\n // Bubble up the revert if the call reverts.\\n returndatacopy(m, 0x00, returndatasize())\\n revert(m, returndatasize())\\n }\\n }\\n // Load the returndata and compare it with the function selector.\\n if iszero(eq(mload(m), shl(224, 0xbc197c81))) {\\n mstore(0x00, 0x9c05499b) // `TransferToNonERC1155ReceiverImplementer()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n }\\n }\\n\\n /// @dev Returns the amounts of `ids` for `owners.\\n ///\\n /// Requirements:\\n /// - `owners` and `ids` must have the same length.\\n function balanceOfBatch(address[] calldata owners, uint256[] calldata ids)\\n public\\n view\\n virtual\\n returns (uint256[] memory balances)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n if iszero(eq(ids.length, owners.length)) {\\n mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.\\n revert(0x1c, 0x04)\\n }\\n balances := mload(0x40)\\n mstore(balances, ids.length)\\n let o := add(balances, 0x20)\\n let i := shl(5, ids.length)\\n mstore(0x40, add(i, o))\\n // Loop through all the `ids` and load the balances.\\n for {} i {} {\\n i := sub(i, 0x20)\\n let owner := calldataload(add(owners.offset, i))\\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, shl(96, owner)))\\n mstore(0x00, calldataload(add(ids.offset, i)))\\n mstore(add(o, i), sload(keccak256(0x00, 0x40)))\\n }\\n }\\n }\\n\\n /// @dev Returns true if this contract implements the interface defined by `interfaceId`.\\n /// See: https://eips.ethereum.org/EIPS/eip-165\\n /// This function call must use less than 30000 gas.\\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let s := shr(224, interfaceId)\\n // ERC165: 0x01ffc9a7, ERC1155: 0xd9b67a26, ERC1155MetadataURI: 0x0e89341c.\\n result := or(or(eq(s, 0x01ffc9a7), eq(s, 0xd9b67a26)), eq(s, 0x0e89341c))\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* INTERNAL MINT FUNCTIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Mints `amount` of `id` to `to`.\\n ///\\n /// Requirements:\\n /// - `to` cannot be the zero address.\\n /// - If `to` refers to a smart contract, it must implement\\n /// {ERC1155-onERC1155Received}, which is called upon a batch transfer.\\n ///\\n /// Emits a {TransferSingle} event.\\n function _mint(address to, uint256 id, uint256 amount, bytes memory data) internal virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(address(0), to, _single(id), _single(amount), data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n let to_ := shl(96, to)\\n // Revert if `to` is the zero address.\\n if iszero(to_) {\\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\\n revert(0x1c, 0x04)\\n }\\n // Increase and store the updated balance of `to`.\\n {\\n mstore(0x20, _ERC1155_MASTER_SLOT_SEED)\\n mstore(0x14, to)\\n mstore(0x00, id)\\n let toBalanceSlot := keccak256(0x00, 0x40)\\n let toBalanceBefore := sload(toBalanceSlot)\\n let toBalanceAfter := add(toBalanceBefore, amount)\\n if lt(toBalanceAfter, toBalanceBefore) {\\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(toBalanceSlot, toBalanceAfter)\\n }\\n // Emit a {TransferSingle} event.\\n mstore(0x20, amount)\\n log4(0x00, 0x40, _TRANSFER_SINGLE_EVENT_SIGNATURE, caller(), 0, shr(96, to_))\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(address(0), to, _single(id), _single(amount), data);\\n }\\n if (_hasCode(to)) _checkOnERC1155Received(address(0), to, id, amount, data);\\n }\\n\\n /// @dev Mints `amounts` of `ids` to `to`.\\n ///\\n /// Requirements:\\n /// - `to` cannot be the zero address.\\n /// - `ids` and `amounts` must have the same length.\\n /// - If `to` refers to a smart contract, it must implement\\n /// {ERC1155-onERC1155BatchReceived}, which is called upon a batch transfer.\\n ///\\n /// Emits a {TransferBatch} event.\\n function _batchMint(\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) internal virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(address(0), to, ids, amounts, data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n if iszero(eq(mload(ids), mload(amounts))) {\\n mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.\\n revert(0x1c, 0x04)\\n }\\n let to_ := shl(96, to)\\n // Revert if `to` is the zero address.\\n if iszero(to_) {\\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\\n revert(0x1c, 0x04)\\n }\\n // Loop through all the `ids` and update the balances.\\n {\\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, to_))\\n for { let i := shl(5, mload(ids)) } i { i := sub(i, 0x20) } {\\n let amount := mload(add(amounts, i))\\n // Increase and store the updated balance of `to`.\\n {\\n mstore(0x00, mload(add(ids, i)))\\n let toBalanceSlot := keccak256(0x00, 0x40)\\n let toBalanceBefore := sload(toBalanceSlot)\\n let toBalanceAfter := add(toBalanceBefore, amount)\\n if lt(toBalanceAfter, toBalanceBefore) {\\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(toBalanceSlot, toBalanceAfter)\\n }\\n }\\n }\\n // Emit a {TransferBatch} event.\\n {\\n let m := mload(0x40)\\n // Copy the `ids`.\\n mstore(m, 0x40)\\n let n := add(0x20, shl(5, mload(ids)))\\n let o := add(m, 0x40)\\n pop(staticcall(gas(), 4, ids, n, o, n))\\n // Copy the `amounts`.\\n mstore(add(m, 0x20), add(0x40, returndatasize()))\\n o := add(o, returndatasize())\\n n := add(0x20, shl(5, mload(amounts)))\\n pop(staticcall(gas(), 4, amounts, n, o, n))\\n n := sub(add(o, returndatasize()), m)\\n // Do the emit.\\n log4(m, n, _TRANSFER_BATCH_EVENT_SIGNATURE, caller(), 0, shr(96, to_))\\n }\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(address(0), to, ids, amounts, data);\\n }\\n if (_hasCode(to)) _checkOnERC1155BatchReceived(address(0), to, ids, amounts, data);\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* INTERNAL BURN FUNCTIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Equivalent to `_burn(address(0), from, id, amount)`.\\n function _burn(address from, uint256 id, uint256 amount) internal virtual {\\n _burn(address(0), from, id, amount);\\n }\\n\\n /// @dev Destroys `amount` of `id` from `from`.\\n ///\\n /// Requirements:\\n /// - `from` must have at least `amount` of `id`.\\n /// - If `by` is not the zero address, it must be either `from`,\\n /// or approved to manage the tokens of `from`.\\n ///\\n /// Emits a {TransferSingle} event.\\n function _burn(address by, address from, uint256 id, uint256 amount) internal virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(from, address(0), _single(id), _single(amount), \\\"\\\");\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n let from_ := shl(96, from)\\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, from_))\\n // If `by` is not the zero address, and not equal to `from`,\\n // check if it is approved to manage all the tokens of `from`.\\n if iszero(or(iszero(shl(96, by)), eq(shl(96, by), from_))) {\\n mstore(0x00, by)\\n if iszero(sload(keccak256(0x0c, 0x34))) {\\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n // Decrease and store the updated balance of `from`.\\n {\\n mstore(0x00, id)\\n let fromBalanceSlot := keccak256(0x00, 0x40)\\n let fromBalance := sload(fromBalanceSlot)\\n if gt(amount, fromBalance) {\\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(fromBalanceSlot, sub(fromBalance, amount))\\n }\\n // Emit a {TransferSingle} event.\\n mstore(0x20, amount)\\n log4(0x00, 0x40, _TRANSFER_SINGLE_EVENT_SIGNATURE, caller(), shr(96, from_), 0)\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(from, address(0), _single(id), _single(amount), \\\"\\\");\\n }\\n }\\n\\n /// @dev Equivalent to `_batchBurn(address(0), from, ids, amounts)`.\\n function _batchBurn(address from, uint256[] memory ids, uint256[] memory amounts)\\n internal\\n virtual\\n {\\n _batchBurn(address(0), from, ids, amounts);\\n }\\n\\n /// @dev Destroys `amounts` of `ids` from `from`.\\n ///\\n /// Requirements:\\n /// - `ids` and `amounts` must have the same length.\\n /// - `from` must have at least `amounts` of `ids`.\\n /// - If `by` is not the zero address, it must be either `from`,\\n /// or approved to manage the tokens of `from`.\\n ///\\n /// Emits a {TransferBatch} event.\\n function _batchBurn(address by, address from, uint256[] memory ids, uint256[] memory amounts)\\n internal\\n virtual\\n {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(from, address(0), ids, amounts, \\\"\\\");\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n if iszero(eq(mload(ids), mload(amounts))) {\\n mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.\\n revert(0x1c, 0x04)\\n }\\n let from_ := shl(96, from)\\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, from_))\\n // If `by` is not the zero address, and not equal to `from`,\\n // check if it is approved to manage all the tokens of `from`.\\n let by_ := shl(96, by)\\n if iszero(or(iszero(by_), eq(by_, from_))) {\\n mstore(0x00, by)\\n if iszero(sload(keccak256(0x0c, 0x34))) {\\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n // Loop through all the `ids` and update the balances.\\n {\\n for { let i := shl(5, mload(ids)) } i { i := sub(i, 0x20) } {\\n let amount := mload(add(amounts, i))\\n // Decrease and store the updated balance of `from`.\\n {\\n mstore(0x00, mload(add(ids, i)))\\n let fromBalanceSlot := keccak256(0x00, 0x40)\\n let fromBalance := sload(fromBalanceSlot)\\n if gt(amount, fromBalance) {\\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(fromBalanceSlot, sub(fromBalance, amount))\\n }\\n }\\n }\\n // Emit a {TransferBatch} event.\\n {\\n let m := mload(0x40)\\n // Copy the `ids`.\\n mstore(m, 0x40)\\n let n := add(0x20, shl(5, mload(ids)))\\n let o := add(m, 0x40)\\n pop(staticcall(gas(), 4, ids, n, o, n))\\n // Copy the `amounts`.\\n mstore(add(m, 0x20), add(0x40, returndatasize()))\\n o := add(o, returndatasize())\\n n := add(0x20, shl(5, mload(amounts)))\\n pop(staticcall(gas(), 4, amounts, n, o, n))\\n n := sub(add(o, returndatasize()), m)\\n // Do the emit.\\n log4(m, n, _TRANSFER_BATCH_EVENT_SIGNATURE, caller(), shr(96, from_), 0)\\n }\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(from, address(0), ids, amounts, \\\"\\\");\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* INTERNAL APPROVAL FUNCTIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Approve or remove the `operator` as an operator for `by`,\\n /// without authorization checks.\\n ///\\n /// Emits a {ApprovalForAll} event.\\n function _setApprovalForAll(address by, address operator, bool isApproved) internal virtual {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Convert to 0 or 1.\\n isApproved := iszero(iszero(isApproved))\\n // Update the `isApproved` for (`by`, `operator`).\\n mstore(0x20, _ERC1155_MASTER_SLOT_SEED)\\n mstore(0x14, by)\\n mstore(0x00, operator)\\n sstore(keccak256(0x0c, 0x34), isApproved)\\n // Emit the {ApprovalForAll} event.\\n mstore(0x00, isApproved)\\n let m := shr(96, not(0))\\n log3(0x00, 0x20, _APPROVAL_FOR_ALL_EVENT_SIGNATURE, and(m, by), and(m, operator))\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* INTERNAL TRANSFER FUNCTIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Equivalent to `_safeTransfer(address(0), from, to, id, amount, data)`.\\n function _safeTransfer(address from, address to, uint256 id, uint256 amount, bytes memory data)\\n internal\\n virtual\\n {\\n _safeTransfer(address(0), from, to, id, amount, data);\\n }\\n\\n /// @dev Transfers `amount` of `id` from `from` to `to`.\\n ///\\n /// Requirements:\\n /// - `to` cannot be the zero address.\\n /// - `from` must have at least `amount` of `id`.\\n /// - If `by` is not the zero address, it must be either `from`,\\n /// or approved to manage the tokens of `from`.\\n /// - If `to` refers to a smart contract, it must implement\\n /// {ERC1155-onERC1155Received}, which is called upon a batch transfer.\\n ///\\n /// Emits a {TransferSingle} event.\\n function _safeTransfer(\\n address by,\\n address from,\\n address to,\\n uint256 id,\\n uint256 amount,\\n bytes memory data\\n ) internal virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(from, to, _single(id), _single(amount), data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n let from_ := shl(96, from)\\n let to_ := shl(96, to)\\n // Revert if `to` is the zero address.\\n if iszero(to_) {\\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\\n revert(0x1c, 0x04)\\n }\\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, from_))\\n // If `by` is not the zero address, and not equal to `from`,\\n // check if it is approved to manage all the tokens of `from`.\\n let by_ := shl(96, by)\\n if iszero(or(iszero(by_), eq(by_, from_))) {\\n mstore(0x00, by)\\n if iszero(sload(keccak256(0x0c, 0x34))) {\\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n // Subtract and store the updated balance of `from`.\\n {\\n mstore(0x00, id)\\n let fromBalanceSlot := keccak256(0x00, 0x40)\\n let fromBalance := sload(fromBalanceSlot)\\n if gt(amount, fromBalance) {\\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(fromBalanceSlot, sub(fromBalance, amount))\\n }\\n // Increase and store the updated balance of `to`.\\n {\\n mstore(0x20, or(_ERC1155_MASTER_SLOT_SEED, to_))\\n let toBalanceSlot := keccak256(0x00, 0x40)\\n let toBalanceBefore := sload(toBalanceSlot)\\n let toBalanceAfter := add(toBalanceBefore, amount)\\n if lt(toBalanceAfter, toBalanceBefore) {\\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(toBalanceSlot, toBalanceAfter)\\n }\\n // Emit a {TransferSingle} event.\\n mstore(0x20, amount)\\n // forgefmt: disable-next-line\\n log4(0x00, 0x40, _TRANSFER_SINGLE_EVENT_SIGNATURE, caller(), shr(96, from_), shr(96, to_))\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(from, to, _single(id), _single(amount), data);\\n }\\n if (_hasCode(to)) _checkOnERC1155Received(from, to, id, amount, data);\\n }\\n\\n /// @dev Equivalent to `_safeBatchTransfer(address(0), from, to, ids, amounts, data)`.\\n function _safeBatchTransfer(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) internal virtual {\\n _safeBatchTransfer(address(0), from, to, ids, amounts, data);\\n }\\n\\n /// @dev Transfers `amounts` of `ids` from `from` to `to`.\\n ///\\n /// Requirements:\\n /// - `to` cannot be the zero address.\\n /// - `ids` and `amounts` must have the same length.\\n /// - `from` must have at least `amounts` of `ids`.\\n /// - If `by` is not the zero address, it must be either `from`,\\n /// or approved to manage the tokens of `from`.\\n /// - If `to` refers to a smart contract, it must implement\\n /// {ERC1155-onERC1155BatchReceived}, which is called upon a batch transfer.\\n ///\\n /// Emits a {TransferBatch} event.\\n function _safeBatchTransfer(\\n address by,\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) internal virtual {\\n if (_useBeforeTokenTransfer()) {\\n _beforeTokenTransfer(from, to, ids, amounts, data);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n if iszero(eq(mload(ids), mload(amounts))) {\\n mstore(0x00, 0x3b800a46) // `ArrayLengthsMismatch()`.\\n revert(0x1c, 0x04)\\n }\\n let from_ := shl(96, from)\\n let to_ := shl(96, to)\\n // Revert if `to` is the zero address.\\n if iszero(to_) {\\n mstore(0x00, 0xea553b34) // `TransferToZeroAddress()`.\\n revert(0x1c, 0x04)\\n }\\n let fromSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, from_)\\n let toSlotSeed := or(_ERC1155_MASTER_SLOT_SEED, to_)\\n mstore(0x20, fromSlotSeed)\\n // If `by` is not the zero address, and not equal to `from`,\\n // check if it is approved to manage all the tokens of `from`.\\n let by_ := shl(96, by)\\n if iszero(or(iszero(by_), eq(by_, from_))) {\\n mstore(0x00, by)\\n if iszero(sload(keccak256(0x0c, 0x34))) {\\n mstore(0x00, 0x4b6e7f18) // `NotOwnerNorApproved()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n // Loop through all the `ids` and update the balances.\\n {\\n for { let i := shl(5, mload(ids)) } i { i := sub(i, 0x20) } {\\n let amount := mload(add(amounts, i))\\n // Subtract and store the updated balance of `from`.\\n {\\n mstore(0x20, fromSlotSeed)\\n mstore(0x00, mload(add(ids, i)))\\n let fromBalanceSlot := keccak256(0x00, 0x40)\\n let fromBalance := sload(fromBalanceSlot)\\n if gt(amount, fromBalance) {\\n mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(fromBalanceSlot, sub(fromBalance, amount))\\n }\\n // Increase and store the updated balance of `to`.\\n {\\n mstore(0x20, toSlotSeed)\\n let toBalanceSlot := keccak256(0x00, 0x40)\\n let toBalanceBefore := sload(toBalanceSlot)\\n let toBalanceAfter := add(toBalanceBefore, amount)\\n if lt(toBalanceAfter, toBalanceBefore) {\\n mstore(0x00, 0x01336cea) // `AccountBalanceOverflow()`.\\n revert(0x1c, 0x04)\\n }\\n sstore(toBalanceSlot, toBalanceAfter)\\n }\\n }\\n }\\n // Emit a {TransferBatch} event.\\n {\\n let m := mload(0x40)\\n // Copy the `ids`.\\n mstore(m, 0x40)\\n let n := add(0x20, shl(5, mload(ids)))\\n let o := add(m, 0x40)\\n pop(staticcall(gas(), 4, ids, n, o, n))\\n // Copy the `amounts`.\\n mstore(add(m, 0x20), add(0x40, returndatasize()))\\n o := add(o, returndatasize())\\n n := add(0x20, shl(5, mload(amounts)))\\n pop(staticcall(gas(), 4, amounts, n, o, n))\\n n := sub(add(o, returndatasize()), m)\\n // Do the emit.\\n log4(m, n, _TRANSFER_BATCH_EVENT_SIGNATURE, caller(), shr(96, from_), shr(96, to_))\\n }\\n }\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(from, to, ids, amounts, data);\\n }\\n if (_hasCode(to)) _checkOnERC1155BatchReceived(from, to, ids, amounts, data);\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* HOOKS FOR OVERRIDING */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Override this function to return true if `_beforeTokenTransfer` is used.\\n /// This is to help the compiler avoid producing dead bytecode.\\n function _useBeforeTokenTransfer() internal view virtual returns (bool) {\\n return false;\\n }\\n\\n /// @dev Hook that is called before any token transfer.\\n /// This includes minting and burning, as well as batched variants.\\n ///\\n /// The same hook is called on both single and batched variants.\\n /// For single transfers, the length of the `id` and `amount` arrays are 1.\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) internal virtual {}\\n\\n /// @dev Override this function to return true if `_afterTokenTransfer` is used.\\n /// This is to help the compiler avoid producing dead bytecode.\\n function _useAfterTokenTransfer() internal view virtual returns (bool) {\\n return false;\\n }\\n\\n /// @dev Hook that is called after any token transfer.\\n /// This includes minting and burning, as well as batched variants.\\n ///\\n /// The same hook is called on both single and batched variants.\\n /// For single transfers, the length of the `id` and `amount` arrays are 1.\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) internal virtual {}\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* PRIVATE HELPERS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Helper for calling the `_afterTokenTransfer` hook.\\n /// This is to help the compiler avoid producing dead bytecode.\\n function _afterTokenTransferCalldata(\\n address from,\\n address to,\\n uint256[] calldata ids,\\n uint256[] calldata amounts,\\n bytes calldata data\\n ) private {\\n if (_useAfterTokenTransfer()) {\\n _afterTokenTransfer(from, to, ids, amounts, data);\\n }\\n }\\n\\n /// @dev Returns if `a` has bytecode of non-zero length.\\n function _hasCode(address a) private view returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := extcodesize(a) // Can handle dirty upper bits.\\n }\\n }\\n\\n /// @dev Perform a call to invoke {IERC1155Receiver-onERC1155Received} on `to`.\\n /// Reverts if the target does not support the function correctly.\\n function _checkOnERC1155Received(\\n address from,\\n address to,\\n uint256 id,\\n uint256 amount,\\n bytes memory data\\n ) private {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Prepare the calldata.\\n let m := mload(0x40)\\n // `onERC1155Received(address,address,uint256,uint256,bytes)`.\\n mstore(m, 0xf23a6e61)\\n mstore(add(m, 0x20), caller())\\n mstore(add(m, 0x40), shr(96, shl(96, from)))\\n mstore(add(m, 0x60), id)\\n mstore(add(m, 0x80), amount)\\n mstore(add(m, 0xa0), 0xa0)\\n let n := mload(data)\\n mstore(add(m, 0xc0), n)\\n if n { pop(staticcall(gas(), 4, add(data, 0x20), n, add(m, 0xe0), n)) }\\n // Revert if the call reverts.\\n if iszero(call(gas(), to, 0, add(m, 0x1c), add(0xc4, n), m, 0x20)) {\\n if returndatasize() {\\n // Bubble up the revert if the call reverts.\\n returndatacopy(m, 0x00, returndatasize())\\n revert(m, returndatasize())\\n }\\n }\\n // Load the returndata and compare it with the function selector.\\n if iszero(eq(mload(m), shl(224, 0xf23a6e61))) {\\n mstore(0x00, 0x9c05499b) // `TransferToNonERC1155ReceiverImplementer()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n }\\n\\n /// @dev Perform a call to invoke {IERC1155Receiver-onERC1155BatchReceived} on `to`.\\n /// Reverts if the target does not support the function correctly.\\n function _checkOnERC1155BatchReceived(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) private {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Prepare the calldata.\\n let m := mload(0x40)\\n // `onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)`.\\n mstore(m, 0xbc197c81)\\n mstore(add(m, 0x20), caller())\\n mstore(add(m, 0x40), shr(96, shl(96, from)))\\n // Copy the `ids`.\\n mstore(add(m, 0x60), 0xa0)\\n let n := add(0x20, shl(5, mload(ids)))\\n let o := add(m, 0xc0)\\n pop(staticcall(gas(), 4, ids, n, o, n))\\n // Copy the `amounts`.\\n let s := add(0xa0, returndatasize())\\n mstore(add(m, 0x80), s)\\n o := add(o, returndatasize())\\n n := add(0x20, shl(5, mload(amounts)))\\n pop(staticcall(gas(), 4, amounts, n, o, n))\\n // Copy the `data`.\\n mstore(add(m, 0xa0), add(s, returndatasize()))\\n o := add(o, returndatasize())\\n n := add(0x20, mload(data))\\n pop(staticcall(gas(), 4, data, n, o, n))\\n n := sub(add(o, returndatasize()), add(m, 0x1c))\\n // Revert if the call reverts.\\n if iszero(call(gas(), to, 0, add(m, 0x1c), n, m, 0x20)) {\\n if returndatasize() {\\n // Bubble up the revert if the call reverts.\\n returndatacopy(m, 0x00, returndatasize())\\n revert(m, returndatasize())\\n }\\n }\\n // Load the returndata and compare it with the function selector.\\n if iszero(eq(mload(m), shl(224, 0xbc197c81))) {\\n mstore(0x00, 0x9c05499b) // `TransferToNonERC1155ReceiverImplementer()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n }\\n\\n /// @dev Returns `x` in an array with a single element.\\n function _single(uint256 x) private pure returns (uint256[] memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n mstore(0x40, add(result, 0x40))\\n mstore(result, 1)\\n mstore(add(result, 0x20), x)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x306249cc3611727ffa9e15ec816282a60fd9629e5ea03ab1c780d638d1537c68\",\"license\":\"MIT\"},\"lib/solady/src/utils/LibBytes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\n/// @notice Library for byte related operations.\\n/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibBytes.sol)\\nlibrary LibBytes {\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* STRUCTS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Goated bytes storage struct that totally MOGs, no cap, fr.\\n /// Uses less gas and bytecode than Solidity's native bytes storage. It's meta af.\\n /// Packs length with the first 31 bytes if <255 bytes, so it\\u2019s mad tight.\\n struct BytesStorage {\\n bytes32 _spacer;\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* CONSTANTS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev The constant returned when the `search` is not found in the bytes.\\n uint256 internal constant NOT_FOUND = type(uint256).max;\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* BYTE STORAGE OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Sets the value of the bytes storage `$` to `s`.\\n function set(BytesStorage storage $, bytes memory s) internal {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := mload(s)\\n let packed := or(0xff, shl(8, n))\\n for { let i := 0 } 1 {} {\\n if iszero(gt(n, 0xfe)) {\\n i := 0x1f\\n packed := or(n, shl(8, mload(add(s, i))))\\n if iszero(gt(n, i)) { break }\\n }\\n let o := add(s, 0x20)\\n mstore(0x00, $.slot)\\n for { let p := keccak256(0x00, 0x20) } 1 {} {\\n sstore(add(p, shr(5, i)), mload(add(o, i)))\\n i := add(i, 0x20)\\n if iszero(lt(i, n)) { break }\\n }\\n break\\n }\\n sstore($.slot, packed)\\n }\\n }\\n\\n /// @dev Sets the value of the bytes storage `$` to `s`.\\n function setCalldata(BytesStorage storage $, bytes calldata s) internal {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let packed := or(0xff, shl(8, s.length))\\n for { let i := 0 } 1 {} {\\n if iszero(gt(s.length, 0xfe)) {\\n i := 0x1f\\n packed := or(s.length, shl(8, shr(8, calldataload(s.offset))))\\n if iszero(gt(s.length, i)) { break }\\n }\\n mstore(0x00, $.slot)\\n for { let p := keccak256(0x00, 0x20) } 1 {} {\\n sstore(add(p, shr(5, i)), calldataload(add(s.offset, i)))\\n i := add(i, 0x20)\\n if iszero(lt(i, s.length)) { break }\\n }\\n break\\n }\\n sstore($.slot, packed)\\n }\\n }\\n\\n /// @dev Sets the value of the bytes storage `$` to the empty bytes.\\n function clear(BytesStorage storage $) internal {\\n delete $._spacer;\\n }\\n\\n /// @dev Returns whether the value stored is `$` is the empty bytes \\\"\\\".\\n function isEmpty(BytesStorage storage $) internal view returns (bool) {\\n return uint256($._spacer) & 0xff == uint256(0);\\n }\\n\\n /// @dev Returns the length of the value stored in `$`.\\n function length(BytesStorage storage $) internal view returns (uint256 result) {\\n result = uint256($._spacer);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := and(0xff, result)\\n result := or(mul(shr(8, result), eq(0xff, n)), mul(n, iszero(eq(0xff, n))))\\n }\\n }\\n\\n /// @dev Returns the value stored in `$`.\\n function get(BytesStorage storage $) internal view returns (bytes memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n let o := add(result, 0x20)\\n let packed := sload($.slot)\\n let n := shr(8, packed)\\n for { let i := 0 } 1 {} {\\n if iszero(eq(or(packed, 0xff), packed)) {\\n mstore(o, packed)\\n n := and(0xff, packed)\\n i := 0x1f\\n if iszero(gt(n, i)) { break }\\n }\\n mstore(0x00, $.slot)\\n for { let p := keccak256(0x00, 0x20) } 1 {} {\\n mstore(add(o, i), sload(add(p, shr(5, i))))\\n i := add(i, 0x20)\\n if iszero(lt(i, n)) { break }\\n }\\n break\\n }\\n mstore(result, n) // Store the length of the memory.\\n mstore(add(o, n), 0) // Zeroize the slot after the bytes.\\n mstore(0x40, add(add(o, n), 0x20)) // Allocate memory.\\n }\\n }\\n\\n /// @dev Returns the uint8 at index `i`. If out-of-bounds, returns 0.\\n function uint8At(BytesStorage storage $, uint256 i) internal view returns (uint8 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n for { let packed := sload($.slot) } 1 {} {\\n if iszero(eq(or(packed, 0xff), packed)) {\\n if iszero(gt(i, 0x1e)) {\\n result := byte(i, packed)\\n break\\n }\\n if iszero(gt(i, and(0xff, packed))) {\\n mstore(0x00, $.slot)\\n let j := sub(i, 0x1f)\\n result := byte(and(j, 0x1f), sload(add(keccak256(0x00, 0x20), shr(5, j))))\\n }\\n break\\n }\\n if iszero(gt(i, shr(8, packed))) {\\n mstore(0x00, $.slot)\\n result := byte(and(i, 0x1f), sload(add(keccak256(0x00, 0x20), shr(5, i))))\\n }\\n break\\n }\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* BYTES OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns `subject` all occurrences of `needle` replaced with `replacement`.\\n function replace(bytes memory subject, bytes memory needle, bytes memory replacement)\\n internal\\n pure\\n returns (bytes memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n let needleLen := mload(needle)\\n let replacementLen := mload(replacement)\\n let d := sub(result, subject) // Memory difference.\\n let i := add(subject, 0x20) // Subject bytes pointer.\\n mstore(0x00, add(i, mload(subject))) // End of subject.\\n if iszero(gt(needleLen, mload(subject))) {\\n let subjectSearchEnd := add(sub(mload(0x00), needleLen), 1)\\n let h := 0 // The hash of `needle`.\\n if iszero(lt(needleLen, 0x20)) { h := keccak256(add(needle, 0x20), needleLen) }\\n let s := mload(add(needle, 0x20))\\n for { let m := shl(3, sub(0x20, and(needleLen, 0x1f))) } 1 {} {\\n let t := mload(i)\\n // Whether the first `needleLen % 32` bytes of `subject` and `needle` matches.\\n if iszero(shr(m, xor(t, s))) {\\n if h {\\n if iszero(eq(keccak256(i, needleLen), h)) {\\n mstore(add(i, d), t)\\n i := add(i, 1)\\n if iszero(lt(i, subjectSearchEnd)) { break }\\n continue\\n }\\n }\\n // Copy the `replacement` one word at a time.\\n for { let j := 0 } 1 {} {\\n mstore(add(add(i, d), j), mload(add(add(replacement, 0x20), j)))\\n j := add(j, 0x20)\\n if iszero(lt(j, replacementLen)) { break }\\n }\\n d := sub(add(d, replacementLen), needleLen)\\n if needleLen {\\n i := add(i, needleLen)\\n if iszero(lt(i, subjectSearchEnd)) { break }\\n continue\\n }\\n }\\n mstore(add(i, d), t)\\n i := add(i, 1)\\n if iszero(lt(i, subjectSearchEnd)) { break }\\n }\\n }\\n let end := mload(0x00)\\n let n := add(sub(d, add(result, 0x20)), end)\\n // Copy the rest of the bytes one word at a time.\\n for {} lt(i, end) { i := add(i, 0x20) } { mstore(add(i, d), mload(i)) }\\n let o := add(i, d)\\n mstore(o, 0) // Zeroize the slot after the bytes.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from left to right, starting from `from`.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function indexOf(bytes memory subject, bytes memory needle, uint256 from)\\n internal\\n pure\\n returns (uint256 result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := not(0) // Initialize to `NOT_FOUND`.\\n for { let subjectLen := mload(subject) } 1 {} {\\n if iszero(mload(needle)) {\\n result := from\\n if iszero(gt(from, subjectLen)) { break }\\n result := subjectLen\\n break\\n }\\n let needleLen := mload(needle)\\n let subjectStart := add(subject, 0x20)\\n\\n subject := add(subjectStart, from)\\n let end := add(sub(add(subjectStart, subjectLen), needleLen), 1)\\n let m := shl(3, sub(0x20, and(needleLen, 0x1f)))\\n let s := mload(add(needle, 0x20))\\n\\n if iszero(and(lt(subject, end), lt(from, subjectLen))) { break }\\n\\n if iszero(lt(needleLen, 0x20)) {\\n for { let h := keccak256(add(needle, 0x20), needleLen) } 1 {} {\\n if iszero(shr(m, xor(mload(subject), s))) {\\n if eq(keccak256(subject, needleLen), h) {\\n result := sub(subject, subjectStart)\\n break\\n }\\n }\\n subject := add(subject, 1)\\n if iszero(lt(subject, end)) { break }\\n }\\n break\\n }\\n for {} 1 {} {\\n if iszero(shr(m, xor(mload(subject), s))) {\\n result := sub(subject, subjectStart)\\n break\\n }\\n subject := add(subject, 1)\\n if iszero(lt(subject, end)) { break }\\n }\\n break\\n }\\n }\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from left to right.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function indexOf(bytes memory subject, bytes memory needle) internal pure returns (uint256) {\\n return indexOf(subject, needle, 0);\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from right to left, starting from `from`.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function lastIndexOf(bytes memory subject, bytes memory needle, uint256 from)\\n internal\\n pure\\n returns (uint256 result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n for {} 1 {} {\\n result := not(0) // Initialize to `NOT_FOUND`.\\n let needleLen := mload(needle)\\n if gt(needleLen, mload(subject)) { break }\\n let w := result\\n\\n let fromMax := sub(mload(subject), needleLen)\\n if iszero(gt(fromMax, from)) { from := fromMax }\\n\\n let end := add(add(subject, 0x20), w)\\n subject := add(add(subject, 0x20), from)\\n if iszero(gt(subject, end)) { break }\\n // As this function is not too often used,\\n // we shall simply use keccak256 for smaller bytecode size.\\n for { let h := keccak256(add(needle, 0x20), needleLen) } 1 {} {\\n if eq(keccak256(subject, needleLen), h) {\\n result := sub(subject, add(end, 1))\\n break\\n }\\n subject := add(subject, w) // `sub(subject, 1)`.\\n if iszero(gt(subject, end)) { break }\\n }\\n break\\n }\\n }\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from right to left.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function lastIndexOf(bytes memory subject, bytes memory needle)\\n internal\\n pure\\n returns (uint256)\\n {\\n return lastIndexOf(subject, needle, type(uint256).max);\\n }\\n\\n /// @dev Returns true if `needle` is found in `subject`, false otherwise.\\n function contains(bytes memory subject, bytes memory needle) internal pure returns (bool) {\\n return indexOf(subject, needle) != NOT_FOUND;\\n }\\n\\n /// @dev Returns whether `subject` starts with `needle`.\\n function startsWith(bytes memory subject, bytes memory needle)\\n internal\\n pure\\n returns (bool result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := mload(needle)\\n // Just using keccak256 directly is actually cheaper.\\n let t := eq(keccak256(add(subject, 0x20), n), keccak256(add(needle, 0x20), n))\\n result := lt(gt(n, mload(subject)), t)\\n }\\n }\\n\\n /// @dev Returns whether `subject` ends with `needle`.\\n function endsWith(bytes memory subject, bytes memory needle)\\n internal\\n pure\\n returns (bool result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := mload(needle)\\n let notInRange := gt(n, mload(subject))\\n // `subject + 0x20 + max(subject.length - needle.length, 0)`.\\n let t := add(add(subject, 0x20), mul(iszero(notInRange), sub(mload(subject), n)))\\n // Just using keccak256 directly is actually cheaper.\\n result := gt(eq(keccak256(t, n), keccak256(add(needle, 0x20), n)), notInRange)\\n }\\n }\\n\\n /// @dev Returns `subject` repeated `times`.\\n function repeat(bytes memory subject, uint256 times)\\n internal\\n pure\\n returns (bytes memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let l := mload(subject) // Subject length.\\n if iszero(or(iszero(times), iszero(l))) {\\n result := mload(0x40)\\n subject := add(subject, 0x20)\\n let o := add(result, 0x20)\\n for {} 1 {} {\\n // Copy the `subject` one word at a time.\\n for { let j := 0 } 1 {} {\\n mstore(add(o, j), mload(add(subject, j)))\\n j := add(j, 0x20)\\n if iszero(lt(j, l)) { break }\\n }\\n o := add(o, l)\\n times := sub(times, 1)\\n if iszero(times) { break }\\n }\\n mstore(o, 0) // Zeroize the slot after the bytes.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n mstore(result, sub(o, add(result, 0x20))) // Store the length.\\n }\\n }\\n }\\n\\n /// @dev Returns a copy of `subject` sliced from `start` to `end` (exclusive).\\n /// `start` and `end` are byte offsets.\\n function slice(bytes memory subject, uint256 start, uint256 end)\\n internal\\n pure\\n returns (bytes memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let l := mload(subject) // Subject length.\\n if iszero(gt(l, end)) { end := l }\\n if iszero(gt(l, start)) { start := l }\\n if lt(start, end) {\\n result := mload(0x40)\\n let n := sub(end, start)\\n let i := add(subject, start)\\n let w := not(0x1f)\\n // Copy the `subject` one word at a time, backwards.\\n for { let j := and(add(n, 0x1f), w) } 1 {} {\\n mstore(add(result, j), mload(add(i, j)))\\n j := add(j, w) // `sub(j, 0x20)`.\\n if iszero(j) { break }\\n }\\n let o := add(add(result, 0x20), n)\\n mstore(o, 0) // Zeroize the slot after the bytes.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n mstore(result, n) // Store the length.\\n }\\n }\\n }\\n\\n /// @dev Returns a copy of `subject` sliced from `start` to the end of the bytes.\\n /// `start` is a byte offset.\\n function slice(bytes memory subject, uint256 start)\\n internal\\n pure\\n returns (bytes memory result)\\n {\\n result = slice(subject, start, type(uint256).max);\\n }\\n\\n /// @dev Returns a copy of `subject` sliced from `start` to `end` (exclusive).\\n /// `start` and `end` are byte offsets. Faster than Solidity's native slicing.\\n function sliceCalldata(bytes calldata subject, uint256 start, uint256 end)\\n internal\\n pure\\n returns (bytes calldata result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n end := xor(end, mul(xor(end, subject.length), lt(subject.length, end)))\\n start := xor(start, mul(xor(start, subject.length), lt(subject.length, start)))\\n result.offset := add(subject.offset, start)\\n result.length := mul(lt(start, end), sub(end, start))\\n }\\n }\\n\\n /// @dev Returns a copy of `subject` sliced from `start` to the end of the bytes.\\n /// `start` is a byte offset. Faster than Solidity's native slicing.\\n function sliceCalldata(bytes calldata subject, uint256 start)\\n internal\\n pure\\n returns (bytes calldata result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n start := xor(start, mul(xor(start, subject.length), lt(subject.length, start)))\\n result.offset := add(subject.offset, start)\\n result.length := mul(lt(start, subject.length), sub(subject.length, start))\\n }\\n }\\n\\n /// @dev Reduces the size of `subject` to `n`.\\n /// If `n` is greater than the size of `subject`, this will be a no-op.\\n function truncate(bytes memory subject, uint256 n)\\n internal\\n pure\\n returns (bytes memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := subject\\n mstore(mul(lt(n, mload(result)), result), n)\\n }\\n }\\n\\n /// @dev Returns a copy of `subject`, with the length reduced to `n`.\\n /// If `n` is greater than the size of `subject`, this will be a no-op.\\n function truncatedCalldata(bytes calldata subject, uint256 n)\\n internal\\n pure\\n returns (bytes calldata result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result.offset := subject.offset\\n result.length := xor(n, mul(xor(n, subject.length), lt(subject.length, n)))\\n }\\n }\\n\\n /// @dev Returns all the indices of `needle` in `subject`.\\n /// The indices are byte offsets.\\n function indicesOf(bytes memory subject, bytes memory needle)\\n internal\\n pure\\n returns (uint256[] memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let searchLen := mload(needle)\\n if iszero(gt(searchLen, mload(subject))) {\\n result := mload(0x40)\\n let i := add(subject, 0x20)\\n let o := add(result, 0x20)\\n let subjectSearchEnd := add(sub(add(i, mload(subject)), searchLen), 1)\\n let h := 0 // The hash of `needle`.\\n if iszero(lt(searchLen, 0x20)) { h := keccak256(add(needle, 0x20), searchLen) }\\n let s := mload(add(needle, 0x20))\\n for { let m := shl(3, sub(0x20, and(searchLen, 0x1f))) } 1 {} {\\n let t := mload(i)\\n // Whether the first `searchLen % 32` bytes of `subject` and `needle` matches.\\n if iszero(shr(m, xor(t, s))) {\\n if h {\\n if iszero(eq(keccak256(i, searchLen), h)) {\\n i := add(i, 1)\\n if iszero(lt(i, subjectSearchEnd)) { break }\\n continue\\n }\\n }\\n mstore(o, sub(i, add(subject, 0x20))) // Append to `result`.\\n o := add(o, 0x20)\\n i := add(i, searchLen) // Advance `i` by `searchLen`.\\n if searchLen {\\n if iszero(lt(i, subjectSearchEnd)) { break }\\n continue\\n }\\n }\\n i := add(i, 1)\\n if iszero(lt(i, subjectSearchEnd)) { break }\\n }\\n mstore(result, shr(5, sub(o, add(result, 0x20)))) // Store the length of `result`.\\n // Allocate memory for result.\\n // We allocate one more word, so this array can be recycled for {split}.\\n mstore(0x40, add(o, 0x20))\\n }\\n }\\n }\\n\\n /// @dev Returns an arrays of bytess based on the `delimiter` inside of the `subject` bytes.\\n function split(bytes memory subject, bytes memory delimiter)\\n internal\\n pure\\n returns (bytes[] memory result)\\n {\\n uint256[] memory indices = indicesOf(subject, delimiter);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let w := not(0x1f)\\n let indexPtr := add(indices, 0x20)\\n let indicesEnd := add(indexPtr, shl(5, add(mload(indices), 1)))\\n mstore(add(indicesEnd, w), mload(subject))\\n mstore(indices, add(mload(indices), 1))\\n for { let prevIndex := 0 } 1 {} {\\n let index := mload(indexPtr)\\n mstore(indexPtr, 0x60)\\n if iszero(eq(index, prevIndex)) {\\n let element := mload(0x40)\\n let l := sub(index, prevIndex)\\n mstore(element, l) // Store the length of the element.\\n // Copy the `subject` one word at a time, backwards.\\n for { let o := and(add(l, 0x1f), w) } 1 {} {\\n mstore(add(element, o), mload(add(add(subject, prevIndex), o)))\\n o := add(o, w) // `sub(o, 0x20)`.\\n if iszero(o) { break }\\n }\\n mstore(add(add(element, 0x20), l), 0) // Zeroize the slot after the bytes.\\n // Allocate memory for the length and the bytes, rounded up to a multiple of 32.\\n mstore(0x40, add(element, and(add(l, 0x3f), w)))\\n mstore(indexPtr, element) // Store the `element` into the array.\\n }\\n prevIndex := add(index, mload(delimiter))\\n indexPtr := add(indexPtr, 0x20)\\n if iszero(lt(indexPtr, indicesEnd)) { break }\\n }\\n result := indices\\n if iszero(mload(delimiter)) {\\n result := add(indices, 0x20)\\n mstore(result, sub(mload(indices), 2))\\n }\\n }\\n }\\n\\n /// @dev Returns a concatenated bytes of `a` and `b`.\\n /// Cheaper than `bytes.concat()` and does not de-align the free memory pointer.\\n function concat(bytes memory a, bytes memory b) internal pure returns (bytes memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n let w := not(0x1f)\\n let aLen := mload(a)\\n // Copy `a` one word at a time, backwards.\\n for { let o := and(add(aLen, 0x20), w) } 1 {} {\\n mstore(add(result, o), mload(add(a, o)))\\n o := add(o, w) // `sub(o, 0x20)`.\\n if iszero(o) { break }\\n }\\n let bLen := mload(b)\\n let output := add(result, aLen)\\n // Copy `b` one word at a time, backwards.\\n for { let o := and(add(bLen, 0x20), w) } 1 {} {\\n mstore(add(output, o), mload(add(b, o)))\\n o := add(o, w) // `sub(o, 0x20)`.\\n if iszero(o) { break }\\n }\\n let totalLen := add(aLen, bLen)\\n let last := add(add(result, 0x20), totalLen)\\n mstore(last, 0) // Zeroize the slot after the bytes.\\n mstore(result, totalLen) // Store the length.\\n mstore(0x40, add(last, 0x20)) // Allocate memory.\\n }\\n }\\n\\n /// @dev Returns whether `a` equals `b`.\\n function eq(bytes memory a, bytes memory b) internal pure returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := eq(keccak256(add(a, 0x20), mload(a)), keccak256(add(b, 0x20), mload(b)))\\n }\\n }\\n\\n /// @dev Returns whether `a` equals `b`, where `b` is a null-terminated small bytes.\\n function eqs(bytes memory a, bytes32 b) internal pure returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // These should be evaluated on compile time, as far as possible.\\n let m := not(shl(7, div(not(iszero(b)), 255))) // `0x7f7f ...`.\\n let x := not(or(m, or(b, add(m, and(b, m)))))\\n let r := shl(7, iszero(iszero(shr(128, x))))\\n r := or(r, shl(6, iszero(iszero(shr(64, shr(r, x))))))\\n r := or(r, shl(5, lt(0xffffffff, shr(r, x))))\\n r := or(r, shl(4, lt(0xffff, shr(r, x))))\\n r := or(r, shl(3, lt(0xff, shr(r, x))))\\n // forgefmt: disable-next-item\\n result := gt(eq(mload(a), add(iszero(x), xor(31, shr(3, r)))),\\n xor(shr(add(8, r), b), shr(add(8, r), mload(add(a, 0x20)))))\\n }\\n }\\n\\n /// @dev Returns 0 if `a == b`, -1 if `a < b`, +1 if `a > b`.\\n /// If `a` == b[:a.length]`, and `a.length < b.length`, returns -1.\\n function cmp(bytes memory a, bytes memory b) internal pure returns (int256 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let aLen := mload(a)\\n let bLen := mload(b)\\n let n := and(xor(aLen, mul(xor(aLen, bLen), lt(bLen, aLen))), not(0x1f))\\n if n {\\n for { let i := 0x20 } 1 {} {\\n let x := mload(add(a, i))\\n let y := mload(add(b, i))\\n if iszero(or(xor(x, y), eq(i, n))) {\\n i := add(i, 0x20)\\n continue\\n }\\n result := sub(gt(x, y), lt(x, y))\\n break\\n }\\n }\\n // forgefmt: disable-next-item\\n if iszero(result) {\\n let l := 0x201f1e1d1c1b1a191817161514131211100f0e0d0c0b0a090807060504030201\\n let x := and(mload(add(add(a, 0x20), n)), shl(shl(3, byte(sub(aLen, n), l)), not(0)))\\n let y := and(mload(add(add(b, 0x20), n)), shl(shl(3, byte(sub(bLen, n), l)), not(0)))\\n result := sub(gt(x, y), lt(x, y))\\n if iszero(result) { result := sub(gt(aLen, bLen), lt(aLen, bLen)) }\\n }\\n }\\n }\\n\\n /// @dev Directly returns `a` without copying.\\n function directReturn(bytes memory a) internal pure {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Assumes that the bytes does not start from the scratch space.\\n let retStart := sub(a, 0x20)\\n let retUnpaddedSize := add(mload(a), 0x40)\\n // Right pad with zeroes. Just in case the bytes is produced\\n // by a method that doesn't zero right pad.\\n mstore(add(retStart, retUnpaddedSize), 0)\\n mstore(retStart, 0x20) // Store the return offset.\\n // End the transaction, returning the bytes.\\n return(retStart, and(not(0x1f), add(0x1f, retUnpaddedSize)))\\n }\\n }\\n\\n /// @dev Directly returns `a` with minimal copying.\\n function directReturn(bytes[] memory a) internal pure {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := mload(a) // `a.length`.\\n let o := add(a, 0x20) // Start of elements in `a`.\\n let u := a // Highest memory slot.\\n let w := not(0x1f)\\n for { let i := 0 } iszero(eq(i, n)) { i := add(i, 1) } {\\n let c := add(o, shl(5, i)) // Location of pointer to `a[i]`.\\n let s := mload(c) // `a[i]`.\\n let l := mload(s) // `a[i].length`.\\n let r := and(l, 0x1f) // `a[i].length % 32`.\\n let z := add(0x20, and(l, w)) // Offset of last word in `a[i]` from `s`.\\n // If `s` comes before `o`, or `s` is not zero right padded.\\n if iszero(lt(lt(s, o), or(iszero(r), iszero(shl(shl(3, r), mload(add(s, z))))))) {\\n let m := mload(0x40)\\n mstore(m, l) // Copy `a[i].length`.\\n for {} 1 {} {\\n mstore(add(m, z), mload(add(s, z))) // Copy `a[i]`, backwards.\\n z := add(z, w) // `sub(z, 0x20)`.\\n if iszero(z) { break }\\n }\\n let e := add(add(m, 0x20), l)\\n mstore(e, 0) // Zeroize the slot after the copied bytes.\\n mstore(0x40, add(e, 0x20)) // Allocate memory.\\n s := m\\n }\\n mstore(c, sub(s, o)) // Convert to calldata offset.\\n let t := add(l, add(s, 0x20))\\n if iszero(lt(t, u)) { u := t }\\n }\\n let retStart := add(a, w) // Assumes `a` doesn't start from scratch space.\\n mstore(retStart, 0x20) // Store the return offset.\\n return(retStart, add(0x40, sub(u, retStart))) // End the transaction.\\n }\\n }\\n\\n /// @dev Returns the word at `offset`, without any bounds checks.\\n function load(bytes memory a, uint256 offset) internal pure returns (bytes32 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(add(add(a, 0x20), offset))\\n }\\n }\\n\\n /// @dev Returns the word at `offset`, without any bounds checks.\\n function loadCalldata(bytes calldata a, uint256 offset)\\n internal\\n pure\\n returns (bytes32 result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := calldataload(add(a.offset, offset))\\n }\\n }\\n\\n /// @dev Returns a slice representing a static struct in the calldata. Performs bounds checks.\\n function staticStructInCalldata(bytes calldata a, uint256 offset)\\n internal\\n pure\\n returns (bytes calldata result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let l := sub(a.length, 0x20)\\n result.offset := add(a.offset, offset)\\n result.length := sub(a.length, offset)\\n if or(shr(64, or(l, a.offset)), gt(offset, l)) { revert(l, 0x00) }\\n }\\n }\\n\\n /// @dev Returns a slice representing a dynamic struct in the calldata. Performs bounds checks.\\n function dynamicStructInCalldata(bytes calldata a, uint256 offset)\\n internal\\n pure\\n returns (bytes calldata result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let l := sub(a.length, 0x20)\\n let s := calldataload(add(a.offset, offset)) // Relative offset of `result` from `a.offset`.\\n result.offset := add(a.offset, s)\\n result.length := sub(a.length, s)\\n if or(shr(64, or(s, or(l, a.offset))), gt(offset, l)) { revert(l, 0x00) }\\n }\\n }\\n\\n /// @dev Returns bytes in calldata. Performs bounds checks.\\n function bytesInCalldata(bytes calldata a, uint256 offset)\\n internal\\n pure\\n returns (bytes calldata result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let l := sub(a.length, 0x20)\\n let s := calldataload(add(a.offset, offset)) // Relative offset of `result` from `a.offset`.\\n result.offset := add(add(a.offset, s), 0x20)\\n result.length := calldataload(add(a.offset, s))\\n // forgefmt: disable-next-item\\n if or(shr(64, or(result.length, or(s, or(l, a.offset)))),\\n or(gt(add(s, result.length), l), gt(offset, l))) { revert(l, 0x00) }\\n }\\n }\\n\\n /// @dev Returns empty calldata bytes. For silencing the compiler.\\n function emptyCalldata() internal pure returns (bytes calldata result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result.length := 0\\n }\\n }\\n}\\n\",\"keccak256\":\"0x320c3c933df51e8fd6f1fc96de721c8cc6f1be1d4c586c11f1c472a23b86eba5\",\"license\":\"MIT\"},\"lib/solady/src/utils/LibString.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport {LibBytes} from \\\"./LibBytes.sol\\\";\\n\\n/// @notice Library for converting numbers into strings and other string operations.\\n/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibString.sol)\\n/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/LibString.sol)\\n///\\n/// @dev Note:\\n/// For performance and bytecode compactness, most of the string operations are restricted to\\n/// byte strings (7-bit ASCII), except where otherwise specified.\\n/// Usage of byte string operations on charsets with runes spanning two or more bytes\\n/// can lead to undefined behavior.\\nlibrary LibString {\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* STRUCTS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Goated string storage struct that totally MOGs, no cap, fr.\\n /// Uses less gas and bytecode than Solidity's native string storage. It's meta af.\\n /// Packs length with the first 31 bytes if <255 bytes, so it\\u2019s mad tight.\\n struct StringStorage {\\n bytes32 _spacer;\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* CUSTOM ERRORS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev The length of the output is too small to contain all the hex digits.\\n error HexLengthInsufficient();\\n\\n /// @dev The length of the string is more than 32 bytes.\\n error TooBigForSmallString();\\n\\n /// @dev The input string must be a 7-bit ASCII.\\n error StringNot7BitASCII();\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* CONSTANTS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev The constant returned when the `search` is not found in the string.\\n uint256 internal constant NOT_FOUND = type(uint256).max;\\n\\n /// @dev Lookup for '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'.\\n uint128 internal constant ALPHANUMERIC_7_BIT_ASCII = 0x7fffffe07fffffe03ff000000000000;\\n\\n /// @dev Lookup for 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'.\\n uint128 internal constant LETTERS_7_BIT_ASCII = 0x7fffffe07fffffe0000000000000000;\\n\\n /// @dev Lookup for 'abcdefghijklmnopqrstuvwxyz'.\\n uint128 internal constant LOWERCASE_7_BIT_ASCII = 0x7fffffe000000000000000000000000;\\n\\n /// @dev Lookup for 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.\\n uint128 internal constant UPPERCASE_7_BIT_ASCII = 0x7fffffe0000000000000000;\\n\\n /// @dev Lookup for '0123456789'.\\n uint128 internal constant DIGITS_7_BIT_ASCII = 0x3ff000000000000;\\n\\n /// @dev Lookup for '0123456789abcdefABCDEF'.\\n uint128 internal constant HEXDIGITS_7_BIT_ASCII = 0x7e0000007e03ff000000000000;\\n\\n /// @dev Lookup for '01234567'.\\n uint128 internal constant OCTDIGITS_7_BIT_ASCII = 0xff000000000000;\\n\\n /// @dev Lookup for '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!\\\"#$%&\\\\'()*+,-./:;<=>?@[\\\\\\\\]^_`{|}~ \\\\t\\\\n\\\\r\\\\x0b\\\\x0c'.\\n uint128 internal constant PRINTABLE_7_BIT_ASCII = 0x7fffffffffffffffffffffff00003e00;\\n\\n /// @dev Lookup for '!\\\"#$%&\\\\'()*+,-./:;<=>?@[\\\\\\\\]^_`{|}~'.\\n uint128 internal constant PUNCTUATION_7_BIT_ASCII = 0x78000001f8000001fc00fffe00000000;\\n\\n /// @dev Lookup for ' \\\\t\\\\n\\\\r\\\\x0b\\\\x0c'.\\n uint128 internal constant WHITESPACE_7_BIT_ASCII = 0x100003e00;\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* STRING STORAGE OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Sets the value of the string storage `$` to `s`.\\n function set(StringStorage storage $, string memory s) internal {\\n LibBytes.set(bytesStorage($), bytes(s));\\n }\\n\\n /// @dev Sets the value of the string storage `$` to `s`.\\n function setCalldata(StringStorage storage $, string calldata s) internal {\\n LibBytes.setCalldata(bytesStorage($), bytes(s));\\n }\\n\\n /// @dev Sets the value of the string storage `$` to the empty string.\\n function clear(StringStorage storage $) internal {\\n delete $._spacer;\\n }\\n\\n /// @dev Returns whether the value stored is `$` is the empty string \\\"\\\".\\n function isEmpty(StringStorage storage $) internal view returns (bool) {\\n return uint256($._spacer) & 0xff == uint256(0);\\n }\\n\\n /// @dev Returns the length of the value stored in `$`.\\n function length(StringStorage storage $) internal view returns (uint256) {\\n return LibBytes.length(bytesStorage($));\\n }\\n\\n /// @dev Returns the value stored in `$`.\\n function get(StringStorage storage $) internal view returns (string memory) {\\n return string(LibBytes.get(bytesStorage($)));\\n }\\n\\n /// @dev Returns the uint8 at index `i`. If out-of-bounds, returns 0.\\n function uint8At(StringStorage storage $, uint256 i) internal view returns (uint8) {\\n return LibBytes.uint8At(bytesStorage($), i);\\n }\\n\\n /// @dev Helper to cast `$` to a `BytesStorage`.\\n function bytesStorage(StringStorage storage $)\\n internal\\n pure\\n returns (LibBytes.BytesStorage storage casted)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n casted.slot := $.slot\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* DECIMAL OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns the base 10 decimal representation of `value`.\\n function toString(uint256 value) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // The maximum value of a uint256 contains 78 digits (1 byte per digit), but\\n // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.\\n // We will need 1 word for the trailing zeros padding, 1 word for the length,\\n // and 3 words for a maximum of 78 digits.\\n result := add(mload(0x40), 0x80)\\n mstore(0x40, add(result, 0x20)) // Allocate memory.\\n mstore(result, 0) // Zeroize the slot after the string.\\n\\n let end := result // Cache the end of the memory to calculate the length later.\\n let w := not(0) // Tsk.\\n // We write the string from rightmost digit to leftmost digit.\\n // The following is essentially a do-while loop that also handles the zero case.\\n for { let temp := value } 1 {} {\\n result := add(result, w) // `sub(result, 1)`.\\n // Store the character to the pointer.\\n // The ASCII index of the '0' character is 48.\\n mstore8(result, add(48, mod(temp, 10)))\\n temp := div(temp, 10) // Keep dividing `temp` until zero.\\n if iszero(temp) { break }\\n }\\n let n := sub(end, result)\\n result := sub(result, 0x20) // Move the pointer 32 bytes back to make room for the length.\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the base 10 decimal representation of `value`.\\n function toString(int256 value) internal pure returns (string memory result) {\\n if (value >= 0) return toString(uint256(value));\\n unchecked {\\n result = toString(~uint256(value) + 1);\\n }\\n /// @solidity memory-safe-assembly\\n assembly {\\n // We still have some spare memory space on the left,\\n // as we have allocated 3 words (96 bytes) for up to 78 digits.\\n let n := mload(result) // Load the string length.\\n mstore(result, 0x2d) // Store the '-' character.\\n result := sub(result, 1) // Move back the string pointer by a byte.\\n mstore(result, add(n, 1)) // Update the string length.\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* HEXADECIMAL OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns the hexadecimal representation of `value`,\\n /// left-padded to an input length of `byteCount` bytes.\\n /// The output is prefixed with \\\"0x\\\" encoded using 2 hexadecimal digits per byte,\\n /// giving a total length of `byteCount * 2 + 2` bytes.\\n /// Reverts if `byteCount` is too small for the output to contain all the digits.\\n function toHexString(uint256 value, uint256 byteCount)\\n internal\\n pure\\n returns (string memory result)\\n {\\n result = toHexStringNoPrefix(value, byteCount);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := add(mload(result), 2) // Compute the length.\\n mstore(result, 0x3078) // Store the \\\"0x\\\" prefix.\\n result := sub(result, 2) // Move the pointer.\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`,\\n /// left-padded to an input length of `byteCount` bytes.\\n /// The output is not prefixed with \\\"0x\\\" and is encoded using 2 hexadecimal digits per byte,\\n /// giving a total length of `byteCount * 2` bytes.\\n /// Reverts if `byteCount` is too small for the output to contain all the digits.\\n function toHexStringNoPrefix(uint256 value, uint256 byteCount)\\n internal\\n pure\\n returns (string memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // We need 0x20 bytes for the trailing zeros padding, `byteCount * 2` bytes\\n // for the digits, 0x02 bytes for the prefix, and 0x20 bytes for the length.\\n // We add 0x20 to the total and round down to a multiple of 0x20.\\n // (0x20 + 0x20 + 0x02 + 0x20) = 0x62.\\n result := add(mload(0x40), and(add(shl(1, byteCount), 0x42), not(0x1f)))\\n mstore(0x40, add(result, 0x20)) // Allocate memory.\\n mstore(result, 0) // Zeroize the slot after the string.\\n\\n let end := result // Cache the end to calculate the length later.\\n // Store \\\"0123456789abcdef\\\" in scratch space.\\n mstore(0x0f, 0x30313233343536373839616263646566)\\n\\n let start := sub(result, add(byteCount, byteCount))\\n let w := not(1) // Tsk.\\n let temp := value\\n // We write the string from rightmost digit to leftmost digit.\\n // The following is essentially a do-while loop that also handles the zero case.\\n for {} 1 {} {\\n result := add(result, w) // `sub(result, 2)`.\\n mstore8(add(result, 1), mload(and(temp, 15)))\\n mstore8(result, mload(and(shr(4, temp), 15)))\\n temp := shr(8, temp)\\n if iszero(xor(result, start)) { break }\\n }\\n if temp {\\n mstore(0x00, 0x2194895a) // `HexLengthInsufficient()`.\\n revert(0x1c, 0x04)\\n }\\n let n := sub(end, result)\\n result := sub(result, 0x20)\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`.\\n /// The output is prefixed with \\\"0x\\\" and encoded using 2 hexadecimal digits per byte.\\n /// As address are 20 bytes long, the output will left-padded to have\\n /// a length of `20 * 2 + 2` bytes.\\n function toHexString(uint256 value) internal pure returns (string memory result) {\\n result = toHexStringNoPrefix(value);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := add(mload(result), 2) // Compute the length.\\n mstore(result, 0x3078) // Store the \\\"0x\\\" prefix.\\n result := sub(result, 2) // Move the pointer.\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`.\\n /// The output is prefixed with \\\"0x\\\".\\n /// The output excludes leading \\\"0\\\" from the `toHexString` output.\\n /// `0x00: \\\"0x0\\\", 0x01: \\\"0x1\\\", 0x12: \\\"0x12\\\", 0x123: \\\"0x123\\\"`.\\n function toMinimalHexString(uint256 value) internal pure returns (string memory result) {\\n result = toHexStringNoPrefix(value);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let o := eq(byte(0, mload(add(result, 0x20))), 0x30) // Whether leading zero is present.\\n let n := add(mload(result), 2) // Compute the length.\\n mstore(add(result, o), 0x3078) // Store the \\\"0x\\\" prefix, accounting for leading zero.\\n result := sub(add(result, o), 2) // Move the pointer, accounting for leading zero.\\n mstore(result, sub(n, o)) // Store the length, accounting for leading zero.\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`.\\n /// The output excludes leading \\\"0\\\" from the `toHexStringNoPrefix` output.\\n /// `0x00: \\\"0\\\", 0x01: \\\"1\\\", 0x12: \\\"12\\\", 0x123: \\\"123\\\"`.\\n function toMinimalHexStringNoPrefix(uint256 value)\\n internal\\n pure\\n returns (string memory result)\\n {\\n result = toHexStringNoPrefix(value);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let o := eq(byte(0, mload(add(result, 0x20))), 0x30) // Whether leading zero is present.\\n let n := mload(result) // Get the length.\\n result := add(result, o) // Move the pointer, accounting for leading zero.\\n mstore(result, sub(n, o)) // Store the length, accounting for leading zero.\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`.\\n /// The output is encoded using 2 hexadecimal digits per byte.\\n /// As address are 20 bytes long, the output will left-padded to have\\n /// a length of `20 * 2` bytes.\\n function toHexStringNoPrefix(uint256 value) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // We need 0x20 bytes for the trailing zeros padding, 0x20 bytes for the length,\\n // 0x02 bytes for the prefix, and 0x40 bytes for the digits.\\n // The next multiple of 0x20 above (0x20 + 0x20 + 0x02 + 0x40) is 0xa0.\\n result := add(mload(0x40), 0x80)\\n mstore(0x40, add(result, 0x20)) // Allocate memory.\\n mstore(result, 0) // Zeroize the slot after the string.\\n\\n let end := result // Cache the end to calculate the length later.\\n mstore(0x0f, 0x30313233343536373839616263646566) // Store the \\\"0123456789abcdef\\\" lookup.\\n\\n let w := not(1) // Tsk.\\n // We write the string from rightmost digit to leftmost digit.\\n // The following is essentially a do-while loop that also handles the zero case.\\n for { let temp := value } 1 {} {\\n result := add(result, w) // `sub(result, 2)`.\\n mstore8(add(result, 1), mload(and(temp, 15)))\\n mstore8(result, mload(and(shr(4, temp), 15)))\\n temp := shr(8, temp)\\n if iszero(temp) { break }\\n }\\n let n := sub(end, result)\\n result := sub(result, 0x20)\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`.\\n /// The output is prefixed with \\\"0x\\\", encoded using 2 hexadecimal digits per byte,\\n /// and the alphabets are capitalized conditionally according to\\n /// https://eips.ethereum.org/EIPS/eip-55\\n function toHexStringChecksummed(address value) internal pure returns (string memory result) {\\n result = toHexString(value);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let mask := shl(6, div(not(0), 255)) // `0b010000000100000000 ...`\\n let o := add(result, 0x22)\\n let hashed := and(keccak256(o, 40), mul(34, mask)) // `0b10001000 ... `\\n let t := shl(240, 136) // `0b10001000 << 240`\\n for { let i := 0 } 1 {} {\\n mstore(add(i, i), mul(t, byte(i, hashed)))\\n i := add(i, 1)\\n if eq(i, 20) { break }\\n }\\n mstore(o, xor(mload(o), shr(1, and(mload(0x00), and(mload(o), mask)))))\\n o := add(o, 0x20)\\n mstore(o, xor(mload(o), shr(1, and(mload(0x20), and(mload(o), mask)))))\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`.\\n /// The output is prefixed with \\\"0x\\\" and encoded using 2 hexadecimal digits per byte.\\n function toHexString(address value) internal pure returns (string memory result) {\\n result = toHexStringNoPrefix(value);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := add(mload(result), 2) // Compute the length.\\n mstore(result, 0x3078) // Store the \\\"0x\\\" prefix.\\n result := sub(result, 2) // Move the pointer.\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the hexadecimal representation of `value`.\\n /// The output is encoded using 2 hexadecimal digits per byte.\\n function toHexStringNoPrefix(address value) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n // Allocate memory.\\n // We need 0x20 bytes for the trailing zeros padding, 0x20 bytes for the length,\\n // 0x02 bytes for the prefix, and 0x28 bytes for the digits.\\n // The next multiple of 0x20 above (0x20 + 0x20 + 0x02 + 0x28) is 0x80.\\n mstore(0x40, add(result, 0x80))\\n mstore(0x0f, 0x30313233343536373839616263646566) // Store the \\\"0123456789abcdef\\\" lookup.\\n\\n result := add(result, 2)\\n mstore(result, 40) // Store the length.\\n let o := add(result, 0x20)\\n mstore(add(o, 40), 0) // Zeroize the slot after the string.\\n value := shl(96, value)\\n // We write the string from rightmost digit to leftmost digit.\\n // The following is essentially a do-while loop that also handles the zero case.\\n for { let i := 0 } 1 {} {\\n let p := add(o, add(i, i))\\n let temp := byte(i, value)\\n mstore8(add(p, 1), mload(and(temp, 15)))\\n mstore8(p, mload(shr(4, temp)))\\n i := add(i, 1)\\n if eq(i, 20) { break }\\n }\\n }\\n }\\n\\n /// @dev Returns the hex encoded string from the raw bytes.\\n /// The output is encoded using 2 hexadecimal digits per byte.\\n function toHexString(bytes memory raw) internal pure returns (string memory result) {\\n result = toHexStringNoPrefix(raw);\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := add(mload(result), 2) // Compute the length.\\n mstore(result, 0x3078) // Store the \\\"0x\\\" prefix.\\n result := sub(result, 2) // Move the pointer.\\n mstore(result, n) // Store the length.\\n }\\n }\\n\\n /// @dev Returns the hex encoded string from the raw bytes.\\n /// The output is encoded using 2 hexadecimal digits per byte.\\n function toHexStringNoPrefix(bytes memory raw) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := mload(raw)\\n result := add(mload(0x40), 2) // Skip 2 bytes for the optional prefix.\\n mstore(result, add(n, n)) // Store the length of the output.\\n\\n mstore(0x0f, 0x30313233343536373839616263646566) // Store the \\\"0123456789abcdef\\\" lookup.\\n let o := add(result, 0x20)\\n let end := add(raw, n)\\n for {} iszero(eq(raw, end)) {} {\\n raw := add(raw, 1)\\n mstore8(add(o, 1), mload(and(mload(raw), 15)))\\n mstore8(o, mload(and(shr(4, mload(raw)), 15)))\\n o := add(o, 2)\\n }\\n mstore(o, 0) // Zeroize the slot after the string.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* RUNE STRING OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns the number of UTF characters in the string.\\n function runeCount(string memory s) internal pure returns (uint256 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n if mload(s) {\\n mstore(0x00, div(not(0), 255))\\n mstore(0x20, 0x0202020202020202020202020202020202020202020202020303030304040506)\\n let o := add(s, 0x20)\\n let end := add(o, mload(s))\\n for { result := 1 } 1 { result := add(result, 1) } {\\n o := add(o, byte(0, mload(shr(250, mload(o)))))\\n if iszero(lt(o, end)) { break }\\n }\\n }\\n }\\n }\\n\\n /// @dev Returns if this string is a 7-bit ASCII string.\\n /// (i.e. all characters codes are in [0..127])\\n function is7BitASCII(string memory s) internal pure returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := 1\\n let mask := shl(7, div(not(0), 255))\\n let n := mload(s)\\n if n {\\n let o := add(s, 0x20)\\n let end := add(o, n)\\n let last := mload(end)\\n mstore(end, 0)\\n for {} 1 {} {\\n if and(mask, mload(o)) {\\n result := 0\\n break\\n }\\n o := add(o, 0x20)\\n if iszero(lt(o, end)) { break }\\n }\\n mstore(end, last)\\n }\\n }\\n }\\n\\n /// @dev Returns if this string is a 7-bit ASCII string,\\n /// AND all characters are in the `allowed` lookup.\\n /// Note: If `s` is empty, returns true regardless of `allowed`.\\n function is7BitASCII(string memory s, uint128 allowed) internal pure returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := 1\\n if mload(s) {\\n let allowed_ := shr(128, shl(128, allowed))\\n let o := add(s, 0x20)\\n for { let end := add(o, mload(s)) } 1 {} {\\n result := and(result, shr(byte(0, mload(o)), allowed_))\\n o := add(o, 1)\\n if iszero(and(result, lt(o, end))) { break }\\n }\\n }\\n }\\n }\\n\\n /// @dev Converts the bytes in the 7-bit ASCII string `s` to\\n /// an allowed lookup for use in `is7BitASCII(s, allowed)`.\\n /// To save runtime gas, you can cache the result in an immutable variable.\\n function to7BitASCIIAllowedLookup(string memory s) internal pure returns (uint128 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n if mload(s) {\\n let o := add(s, 0x20)\\n for { let end := add(o, mload(s)) } 1 {} {\\n result := or(result, shl(byte(0, mload(o)), 1))\\n o := add(o, 1)\\n if iszero(lt(o, end)) { break }\\n }\\n if shr(128, result) {\\n mstore(0x00, 0xc9807e0d) // `StringNot7BitASCII()`.\\n revert(0x1c, 0x04)\\n }\\n }\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* BYTE STRING OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n // For performance and bytecode compactness, byte string operations are restricted\\n // to 7-bit ASCII strings. All offsets are byte offsets, not UTF character offsets.\\n // Usage of byte string operations on charsets with runes spanning two or more bytes\\n // can lead to undefined behavior.\\n\\n /// @dev Returns `subject` all occurrences of `needle` replaced with `replacement`.\\n function replace(string memory subject, string memory needle, string memory replacement)\\n internal\\n pure\\n returns (string memory)\\n {\\n return string(LibBytes.replace(bytes(subject), bytes(needle), bytes(replacement)));\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from left to right, starting from `from`.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function indexOf(string memory subject, string memory needle, uint256 from)\\n internal\\n pure\\n returns (uint256)\\n {\\n return LibBytes.indexOf(bytes(subject), bytes(needle), from);\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from left to right.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function indexOf(string memory subject, string memory needle) internal pure returns (uint256) {\\n return LibBytes.indexOf(bytes(subject), bytes(needle), 0);\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from right to left, starting from `from`.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function lastIndexOf(string memory subject, string memory needle, uint256 from)\\n internal\\n pure\\n returns (uint256)\\n {\\n return LibBytes.lastIndexOf(bytes(subject), bytes(needle), from);\\n }\\n\\n /// @dev Returns the byte index of the first location of `needle` in `subject`,\\n /// needleing from right to left.\\n /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found.\\n function lastIndexOf(string memory subject, string memory needle)\\n internal\\n pure\\n returns (uint256)\\n {\\n return LibBytes.lastIndexOf(bytes(subject), bytes(needle), type(uint256).max);\\n }\\n\\n /// @dev Returns true if `needle` is found in `subject`, false otherwise.\\n function contains(string memory subject, string memory needle) internal pure returns (bool) {\\n return LibBytes.contains(bytes(subject), bytes(needle));\\n }\\n\\n /// @dev Returns whether `subject` starts with `needle`.\\n function startsWith(string memory subject, string memory needle) internal pure returns (bool) {\\n return LibBytes.startsWith(bytes(subject), bytes(needle));\\n }\\n\\n /// @dev Returns whether `subject` ends with `needle`.\\n function endsWith(string memory subject, string memory needle) internal pure returns (bool) {\\n return LibBytes.endsWith(bytes(subject), bytes(needle));\\n }\\n\\n /// @dev Returns `subject` repeated `times`.\\n function repeat(string memory subject, uint256 times) internal pure returns (string memory) {\\n return string(LibBytes.repeat(bytes(subject), times));\\n }\\n\\n /// @dev Returns a copy of `subject` sliced from `start` to `end` (exclusive).\\n /// `start` and `end` are byte offsets.\\n function slice(string memory subject, uint256 start, uint256 end)\\n internal\\n pure\\n returns (string memory)\\n {\\n return string(LibBytes.slice(bytes(subject), start, end));\\n }\\n\\n /// @dev Returns a copy of `subject` sliced from `start` to the end of the string.\\n /// `start` is a byte offset.\\n function slice(string memory subject, uint256 start) internal pure returns (string memory) {\\n return string(LibBytes.slice(bytes(subject), start, type(uint256).max));\\n }\\n\\n /// @dev Returns all the indices of `needle` in `subject`.\\n /// The indices are byte offsets.\\n function indicesOf(string memory subject, string memory needle)\\n internal\\n pure\\n returns (uint256[] memory)\\n {\\n return LibBytes.indicesOf(bytes(subject), bytes(needle));\\n }\\n\\n /// @dev Returns an arrays of strings based on the `delimiter` inside of the `subject` string.\\n function split(string memory subject, string memory delimiter)\\n internal\\n pure\\n returns (string[] memory result)\\n {\\n bytes[] memory a = LibBytes.split(bytes(subject), bytes(delimiter));\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := a\\n }\\n }\\n\\n /// @dev Returns a concatenated string of `a` and `b`.\\n /// Cheaper than `string.concat()` and does not de-align the free memory pointer.\\n function concat(string memory a, string memory b) internal pure returns (string memory) {\\n return string(LibBytes.concat(bytes(a), bytes(b)));\\n }\\n\\n /// @dev Returns a copy of the string in either lowercase or UPPERCASE.\\n /// WARNING! This function is only compatible with 7-bit ASCII strings.\\n function toCase(string memory subject, bool toUpper)\\n internal\\n pure\\n returns (string memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let n := mload(subject)\\n if n {\\n result := mload(0x40)\\n let o := add(result, 0x20)\\n let d := sub(subject, result)\\n let flags := shl(add(70, shl(5, toUpper)), 0x3ffffff)\\n for { let end := add(o, n) } 1 {} {\\n let b := byte(0, mload(add(d, o)))\\n mstore8(o, xor(and(shr(b, flags), 0x20), b))\\n o := add(o, 1)\\n if eq(o, end) { break }\\n }\\n mstore(result, n) // Store the length.\\n mstore(o, 0) // Zeroize the slot after the string.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n }\\n }\\n }\\n\\n /// @dev Returns a string from a small bytes32 string.\\n /// `s` must be null-terminated, or behavior will be undefined.\\n function fromSmallString(bytes32 s) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n let n := 0\\n for {} byte(n, s) { n := add(n, 1) } {} // Scan for '\\\\0'.\\n mstore(result, n) // Store the length.\\n let o := add(result, 0x20)\\n mstore(o, s) // Store the bytes of the string.\\n mstore(add(o, n), 0) // Zeroize the slot after the string.\\n mstore(0x40, add(result, 0x40)) // Allocate memory.\\n }\\n }\\n\\n /// @dev Returns the small string, with all bytes after the first null byte zeroized.\\n function normalizeSmallString(bytes32 s) internal pure returns (bytes32 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n for {} byte(result, s) { result := add(result, 1) } {} // Scan for '\\\\0'.\\n mstore(0x00, s)\\n mstore(result, 0x00)\\n result := mload(0x00)\\n }\\n }\\n\\n /// @dev Returns the string as a normalized null-terminated small string.\\n function toSmallString(string memory s) internal pure returns (bytes32 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(s)\\n if iszero(lt(result, 33)) {\\n mstore(0x00, 0xec92f9a3) // `TooBigForSmallString()`.\\n revert(0x1c, 0x04)\\n }\\n result := shl(shl(3, sub(32, result)), mload(add(s, result)))\\n }\\n }\\n\\n /// @dev Returns a lowercased copy of the string.\\n /// WARNING! This function is only compatible with 7-bit ASCII strings.\\n function lower(string memory subject) internal pure returns (string memory result) {\\n result = toCase(subject, false);\\n }\\n\\n /// @dev Returns an UPPERCASED copy of the string.\\n /// WARNING! This function is only compatible with 7-bit ASCII strings.\\n function upper(string memory subject) internal pure returns (string memory result) {\\n result = toCase(subject, true);\\n }\\n\\n /// @dev Escapes the string to be used within HTML tags.\\n function escapeHTML(string memory s) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n let end := add(s, mload(s))\\n let o := add(result, 0x20)\\n // Store the bytes of the packed offsets and strides into the scratch space.\\n // `packed = (stride << 5) | offset`. Max offset is 20. Max stride is 6.\\n mstore(0x1f, 0x900094)\\n mstore(0x08, 0xc0000000a6ab)\\n // Store \\\""&'<>\\\" into the scratch space.\\n mstore(0x00, shl(64, 0x2671756f743b26616d703b262333393b266c743b2667743b))\\n for {} iszero(eq(s, end)) {} {\\n s := add(s, 1)\\n let c := and(mload(s), 0xff)\\n // Not in `[\\\"\\\\\\\"\\\",\\\"'\\\",\\\"&\\\",\\\"<\\\",\\\">\\\"]`.\\n if iszero(and(shl(c, 1), 0x500000c400000000)) {\\n mstore8(o, c)\\n o := add(o, 1)\\n continue\\n }\\n let t := shr(248, mload(c))\\n mstore(o, mload(and(t, 0x1f)))\\n o := add(o, shr(5, t))\\n }\\n mstore(o, 0) // Zeroize the slot after the string.\\n mstore(result, sub(o, add(result, 0x20))) // Store the length.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n }\\n }\\n\\n /// @dev Escapes the string to be used within double-quotes in a JSON.\\n /// If `addDoubleQuotes` is true, the result will be enclosed in double-quotes.\\n function escapeJSON(string memory s, bool addDoubleQuotes)\\n internal\\n pure\\n returns (string memory result)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n let o := add(result, 0x20)\\n if addDoubleQuotes {\\n mstore8(o, 34)\\n o := add(1, o)\\n }\\n // Store \\\"\\\\\\\\u0000\\\" in scratch space.\\n // Store \\\"0123456789abcdef\\\" in scratch space.\\n // Also, store `{0x08:\\\"b\\\", 0x09:\\\"t\\\", 0x0a:\\\"n\\\", 0x0c:\\\"f\\\", 0x0d:\\\"r\\\"}`.\\n // into the scratch space.\\n mstore(0x15, 0x5c75303030303031323334353637383961626364656662746e006672)\\n // Bitmask for detecting `[\\\"\\\\\\\"\\\",\\\"\\\\\\\\\\\"]`.\\n let e := or(shl(0x22, 1), shl(0x5c, 1))\\n for { let end := add(s, mload(s)) } iszero(eq(s, end)) {} {\\n s := add(s, 1)\\n let c := and(mload(s), 0xff)\\n if iszero(lt(c, 0x20)) {\\n if iszero(and(shl(c, 1), e)) {\\n // Not in `[\\\"\\\\\\\"\\\",\\\"\\\\\\\\\\\"]`.\\n mstore8(o, c)\\n o := add(o, 1)\\n continue\\n }\\n mstore8(o, 0x5c) // \\\"\\\\\\\\\\\".\\n mstore8(add(o, 1), c)\\n o := add(o, 2)\\n continue\\n }\\n if iszero(and(shl(c, 1), 0x3700)) {\\n // Not in `[\\\"\\\\b\\\",\\\"\\\\t\\\",\\\"\\\\n\\\",\\\"\\\\f\\\",\\\"\\\\d\\\"]`.\\n mstore8(0x1d, mload(shr(4, c))) // Hex value.\\n mstore8(0x1e, mload(and(c, 15))) // Hex value.\\n mstore(o, mload(0x19)) // \\\"\\\\\\\\u00XX\\\".\\n o := add(o, 6)\\n continue\\n }\\n mstore8(o, 0x5c) // \\\"\\\\\\\\\\\".\\n mstore8(add(o, 1), mload(add(c, 8)))\\n o := add(o, 2)\\n }\\n if addDoubleQuotes {\\n mstore8(o, 34)\\n o := add(1, o)\\n }\\n mstore(o, 0) // Zeroize the slot after the string.\\n mstore(result, sub(o, add(result, 0x20))) // Store the length.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n }\\n }\\n\\n /// @dev Escapes the string to be used within double-quotes in a JSON.\\n function escapeJSON(string memory s) internal pure returns (string memory result) {\\n result = escapeJSON(s, false);\\n }\\n\\n /// @dev Encodes `s` so that it can be safely used in a URI,\\n /// just like `encodeURIComponent` in JavaScript.\\n /// See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent\\n /// See: https://datatracker.ietf.org/doc/html/rfc2396\\n /// See: https://datatracker.ietf.org/doc/html/rfc3986\\n function encodeURIComponent(string memory s) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40)\\n // Store \\\"0123456789ABCDEF\\\" in scratch space.\\n // Uppercased to be consistent with JavaScript's implementation.\\n mstore(0x0f, 0x30313233343536373839414243444546)\\n let o := add(result, 0x20)\\n for { let end := add(s, mload(s)) } iszero(eq(s, end)) {} {\\n s := add(s, 1)\\n let c := and(mload(s), 0xff)\\n // If not in `[0-9A-Z-a-z-_.!~*'()]`.\\n if iszero(and(1, shr(c, 0x47fffffe87fffffe03ff678200000000))) {\\n mstore8(o, 0x25) // '%'.\\n mstore8(add(o, 1), mload(and(shr(4, c), 15)))\\n mstore8(add(o, 2), mload(and(c, 15)))\\n o := add(o, 3)\\n continue\\n }\\n mstore8(o, c)\\n o := add(o, 1)\\n }\\n mstore(result, sub(o, add(result, 0x20))) // Store the length.\\n mstore(o, 0) // Zeroize the slot after the string.\\n mstore(0x40, add(o, 0x20)) // Allocate memory.\\n }\\n }\\n\\n /// @dev Returns whether `a` equals `b`.\\n function eq(string memory a, string memory b) internal pure returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := eq(keccak256(add(a, 0x20), mload(a)), keccak256(add(b, 0x20), mload(b)))\\n }\\n }\\n\\n /// @dev Returns whether `a` equals `b`, where `b` is a null-terminated small string.\\n function eqs(string memory a, bytes32 b) internal pure returns (bool result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // These should be evaluated on compile time, as far as possible.\\n let m := not(shl(7, div(not(iszero(b)), 255))) // `0x7f7f ...`.\\n let x := not(or(m, or(b, add(m, and(b, m)))))\\n let r := shl(7, iszero(iszero(shr(128, x))))\\n r := or(r, shl(6, iszero(iszero(shr(64, shr(r, x))))))\\n r := or(r, shl(5, lt(0xffffffff, shr(r, x))))\\n r := or(r, shl(4, lt(0xffff, shr(r, x))))\\n r := or(r, shl(3, lt(0xff, shr(r, x))))\\n // forgefmt: disable-next-item\\n result := gt(eq(mload(a), add(iszero(x), xor(31, shr(3, r)))),\\n xor(shr(add(8, r), b), shr(add(8, r), mload(add(a, 0x20)))))\\n }\\n }\\n\\n /// @dev Returns 0 if `a == b`, -1 if `a < b`, +1 if `a > b`.\\n /// If `a` == b[:a.length]`, and `a.length < b.length`, returns -1.\\n function cmp(string memory a, string memory b) internal pure returns (int256) {\\n return LibBytes.cmp(bytes(a), bytes(b));\\n }\\n\\n /// @dev Packs a single string with its length into a single word.\\n /// Returns `bytes32(0)` if the length is zero or greater than 31.\\n function packOne(string memory a) internal pure returns (bytes32 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // We don't need to zero right pad the string,\\n // since this is our own custom non-standard packing scheme.\\n result :=\\n mul(\\n // Load the length and the bytes.\\n mload(add(a, 0x1f)),\\n // `length != 0 && length < 32`. Abuses underflow.\\n // Assumes that the length is valid and within the block gas limit.\\n lt(sub(mload(a), 1), 0x1f)\\n )\\n }\\n }\\n\\n /// @dev Unpacks a string packed using {packOne}.\\n /// Returns the empty string if `packed` is `bytes32(0)`.\\n /// If `packed` is not an output of {packOne}, the output behavior is undefined.\\n function unpackOne(bytes32 packed) internal pure returns (string memory result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := mload(0x40) // Grab the free memory pointer.\\n mstore(0x40, add(result, 0x40)) // Allocate 2 words (1 for the length, 1 for the bytes).\\n mstore(result, 0) // Zeroize the length slot.\\n mstore(add(result, 0x1f), packed) // Store the length and bytes.\\n mstore(add(add(result, 0x20), mload(result)), 0) // Right pad with zeroes.\\n }\\n }\\n\\n /// @dev Packs two strings with their lengths into a single word.\\n /// Returns `bytes32(0)` if combined length is zero or greater than 30.\\n function packTwo(string memory a, string memory b) internal pure returns (bytes32 result) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let aLen := mload(a)\\n // We don't need to zero right pad the strings,\\n // since this is our own custom non-standard packing scheme.\\n result :=\\n mul(\\n or( // Load the length and the bytes of `a` and `b`.\\n shl(shl(3, sub(0x1f, aLen)), mload(add(a, aLen))), mload(sub(add(b, 0x1e), aLen))),\\n // `totalLen != 0 && totalLen < 31`. Abuses underflow.\\n // Assumes that the lengths are valid and within the block gas limit.\\n lt(sub(add(aLen, mload(b)), 1), 0x1e)\\n )\\n }\\n }\\n\\n /// @dev Unpacks strings packed using {packTwo}.\\n /// Returns the empty strings if `packed` is `bytes32(0)`.\\n /// If `packed` is not an output of {packTwo}, the output behavior is undefined.\\n function unpackTwo(bytes32 packed)\\n internal\\n pure\\n returns (string memory resultA, string memory resultB)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n resultA := mload(0x40) // Grab the free memory pointer.\\n resultB := add(resultA, 0x40)\\n // Allocate 2 words for each string (1 for the length, 1 for the byte). Total 4 words.\\n mstore(0x40, add(resultB, 0x40))\\n // Zeroize the length slots.\\n mstore(resultA, 0)\\n mstore(resultB, 0)\\n // Store the lengths and bytes.\\n mstore(add(resultA, 0x1f), packed)\\n mstore(add(resultB, 0x1f), mload(add(add(resultA, 0x20), mload(resultA))))\\n // Right pad with zeroes.\\n mstore(add(add(resultA, 0x20), mload(resultA)), 0)\\n mstore(add(add(resultB, 0x20), mload(resultB)), 0)\\n }\\n }\\n\\n /// @dev Directly returns `a` without copying.\\n function directReturn(string memory a) internal pure {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Assumes that the string does not start from the scratch space.\\n let retStart := sub(a, 0x20)\\n let retUnpaddedSize := add(mload(a), 0x40)\\n // Right pad with zeroes. Just in case the string is produced\\n // by a method that doesn't zero right pad.\\n mstore(add(retStart, retUnpaddedSize), 0)\\n mstore(retStart, 0x20) // Store the return offset.\\n // End the transaction, returning the string.\\n return(retStart, and(not(0x1f), add(0x1f, retUnpaddedSize)))\\n }\\n }\\n}\\n\",\"keccak256\":\"0x8a6b219f6ccda90c08e2debae62618d78d6f0cef086eb6c9503793d7f12815dd\",\"license\":\"MIT\"},\"lib/solady/src/utils/MerkleProofLib.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\n/// @notice Gas optimized verification of proof of inclusion for a leaf in a Merkle tree.\\n/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/MerkleProofLib.sol)\\n/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/MerkleProofLib.sol)\\n/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/MerkleProof.sol)\\nlibrary MerkleProofLib {\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* MERKLE PROOF VERIFICATION OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns whether `leaf` exists in the Merkle tree with `root`, given `proof`.\\n function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf)\\n internal\\n pure\\n returns (bool isValid)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n if mload(proof) {\\n // Initialize `offset` to the offset of `proof` elements in memory.\\n let offset := add(proof, 0x20)\\n // Left shift by 5 is equivalent to multiplying by 0x20.\\n let end := add(offset, shl(5, mload(proof)))\\n // Iterate over proof elements to compute root hash.\\n for {} 1 {} {\\n // Slot of `leaf` in scratch space.\\n // If the condition is true: 0x20, otherwise: 0x00.\\n let scratch := shl(5, gt(leaf, mload(offset)))\\n // Store elements to hash contiguously in scratch space.\\n // Scratch space is 64 bytes (0x00 - 0x3f) and both elements are 32 bytes.\\n mstore(scratch, leaf)\\n mstore(xor(scratch, 0x20), mload(offset))\\n // Reuse `leaf` to store the hash to reduce stack operations.\\n leaf := keccak256(0x00, 0x40)\\n offset := add(offset, 0x20)\\n if iszero(lt(offset, end)) { break }\\n }\\n }\\n isValid := eq(leaf, root)\\n }\\n }\\n\\n /// @dev Returns whether `leaf` exists in the Merkle tree with `root`, given `proof`.\\n function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf)\\n internal\\n pure\\n returns (bool isValid)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n if proof.length {\\n // Left shift by 5 is equivalent to multiplying by 0x20.\\n let end := add(proof.offset, shl(5, proof.length))\\n // Initialize `offset` to the offset of `proof` in the calldata.\\n let offset := proof.offset\\n // Iterate over proof elements to compute root hash.\\n for {} 1 {} {\\n // Slot of `leaf` in scratch space.\\n // If the condition is true: 0x20, otherwise: 0x00.\\n let scratch := shl(5, gt(leaf, calldataload(offset)))\\n // Store elements to hash contiguously in scratch space.\\n // Scratch space is 64 bytes (0x00 - 0x3f) and both elements are 32 bytes.\\n mstore(scratch, leaf)\\n mstore(xor(scratch, 0x20), calldataload(offset))\\n // Reuse `leaf` to store the hash to reduce stack operations.\\n leaf := keccak256(0x00, 0x40)\\n offset := add(offset, 0x20)\\n if iszero(lt(offset, end)) { break }\\n }\\n }\\n isValid := eq(leaf, root)\\n }\\n }\\n\\n /// @dev Returns whether all `leaves` exist in the Merkle tree with `root`,\\n /// given `proof` and `flags`.\\n ///\\n /// Note:\\n /// - Breaking the invariant `flags.length == (leaves.length - 1) + proof.length`\\n /// will always return false.\\n /// - The sum of the lengths of `proof` and `leaves` must never overflow.\\n /// - Any non-zero word in the `flags` array is treated as true.\\n /// - The memory offset of `proof` must be non-zero\\n /// (i.e. `proof` is not pointing to the scratch space).\\n function verifyMultiProof(\\n bytes32[] memory proof,\\n bytes32 root,\\n bytes32[] memory leaves,\\n bool[] memory flags\\n ) internal pure returns (bool isValid) {\\n // Rebuilds the root by consuming and producing values on a queue.\\n // The queue starts with the `leaves` array, and goes into a `hashes` array.\\n // After the process, the last element on the queue is verified\\n // to be equal to the `root`.\\n //\\n // The `flags` array denotes whether the sibling\\n // should be popped from the queue (`flag == true`), or\\n // should be popped from the `proof` (`flag == false`).\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Cache the lengths of the arrays.\\n let leavesLength := mload(leaves)\\n let proofLength := mload(proof)\\n let flagsLength := mload(flags)\\n\\n // Advance the pointers of the arrays to point to the data.\\n leaves := add(0x20, leaves)\\n proof := add(0x20, proof)\\n flags := add(0x20, flags)\\n\\n // If the number of flags is correct.\\n for {} eq(add(leavesLength, proofLength), add(flagsLength, 1)) {} {\\n // For the case where `proof.length + leaves.length == 1`.\\n if iszero(flagsLength) {\\n // `isValid = (proof.length == 1 ? proof[0] : leaves[0]) == root`.\\n isValid := eq(mload(xor(leaves, mul(xor(proof, leaves), proofLength))), root)\\n break\\n }\\n\\n // The required final proof offset if `flagsLength` is not zero, otherwise zero.\\n let proofEnd := add(proof, shl(5, proofLength))\\n // We can use the free memory space for the queue.\\n // We don't need to allocate, since the queue is temporary.\\n let hashesFront := mload(0x40)\\n // Copy the leaves into the hashes.\\n // Sometimes, a little memory expansion costs less than branching.\\n // Should cost less, even with a high free memory offset of 0x7d00.\\n leavesLength := shl(5, leavesLength)\\n for { let i := 0 } iszero(eq(i, leavesLength)) { i := add(i, 0x20) } {\\n mstore(add(hashesFront, i), mload(add(leaves, i)))\\n }\\n // Compute the back of the hashes.\\n let hashesBack := add(hashesFront, leavesLength)\\n // This is the end of the memory for the queue.\\n // We recycle `flagsLength` to save on stack variables (sometimes save gas).\\n flagsLength := add(hashesBack, shl(5, flagsLength))\\n\\n for {} 1 {} {\\n // Pop from `hashes`.\\n let a := mload(hashesFront)\\n // Pop from `hashes`.\\n let b := mload(add(hashesFront, 0x20))\\n hashesFront := add(hashesFront, 0x40)\\n\\n // If the flag is false, load the next proof,\\n // else, pops from the queue.\\n if iszero(mload(flags)) {\\n // Loads the next proof.\\n b := mload(proof)\\n proof := add(proof, 0x20)\\n // Unpop from `hashes`.\\n hashesFront := sub(hashesFront, 0x20)\\n }\\n\\n // Advance to the next flag.\\n flags := add(flags, 0x20)\\n\\n // Slot of `a` in scratch space.\\n // If the condition is true: 0x20, otherwise: 0x00.\\n let scratch := shl(5, gt(a, b))\\n // Hash the scratch space and push the result onto the queue.\\n mstore(scratch, a)\\n mstore(xor(scratch, 0x20), b)\\n mstore(hashesBack, keccak256(0x00, 0x40))\\n hashesBack := add(hashesBack, 0x20)\\n if iszero(lt(hashesBack, flagsLength)) { break }\\n }\\n isValid :=\\n and(\\n // Checks if the last value in the queue is same as the root.\\n eq(mload(sub(hashesBack, 0x20)), root),\\n // And whether all the proofs are used, if required.\\n eq(proofEnd, proof)\\n )\\n break\\n }\\n }\\n }\\n\\n /// @dev Returns whether all `leaves` exist in the Merkle tree with `root`,\\n /// given `proof` and `flags`.\\n ///\\n /// Note:\\n /// - Breaking the invariant `flags.length == (leaves.length - 1) + proof.length`\\n /// will always return false.\\n /// - Any non-zero word in the `flags` array is treated as true.\\n /// - The calldata offset of `proof` must be non-zero\\n /// (i.e. `proof` is from a regular Solidity function with a 4-byte selector).\\n function verifyMultiProofCalldata(\\n bytes32[] calldata proof,\\n bytes32 root,\\n bytes32[] calldata leaves,\\n bool[] calldata flags\\n ) internal pure returns (bool isValid) {\\n // Rebuilds the root by consuming and producing values on a queue.\\n // The queue starts with the `leaves` array, and goes into a `hashes` array.\\n // After the process, the last element on the queue is verified\\n // to be equal to the `root`.\\n //\\n // The `flags` array denotes whether the sibling\\n // should be popped from the queue (`flag == true`), or\\n // should be popped from the `proof` (`flag == false`).\\n /// @solidity memory-safe-assembly\\n assembly {\\n // If the number of flags is correct.\\n for {} eq(add(leaves.length, proof.length), add(flags.length, 1)) {} {\\n // For the case where `proof.length + leaves.length == 1`.\\n if iszero(flags.length) {\\n // `isValid = (proof.length == 1 ? proof[0] : leaves[0]) == root`.\\n // forgefmt: disable-next-item\\n isValid := eq(\\n calldataload(\\n xor(leaves.offset, mul(xor(proof.offset, leaves.offset), proof.length))\\n ),\\n root\\n )\\n break\\n }\\n\\n // The required final proof offset if `flagsLength` is not zero, otherwise zero.\\n let proofEnd := add(proof.offset, shl(5, proof.length))\\n // We can use the free memory space for the queue.\\n // We don't need to allocate, since the queue is temporary.\\n let hashesFront := mload(0x40)\\n // Copy the leaves into the hashes.\\n // Sometimes, a little memory expansion costs less than branching.\\n // Should cost less, even with a high free memory offset of 0x7d00.\\n calldatacopy(hashesFront, leaves.offset, shl(5, leaves.length))\\n // Compute the back of the hashes.\\n let hashesBack := add(hashesFront, shl(5, leaves.length))\\n // This is the end of the memory for the queue.\\n // We recycle `flagsLength` to save on stack variables (sometimes save gas).\\n flags.length := add(hashesBack, shl(5, flags.length))\\n\\n // We don't need to make a copy of `proof.offset` or `flags.offset`,\\n // as they are pass-by-value (this trick may not always save gas).\\n\\n for {} 1 {} {\\n // Pop from `hashes`.\\n let a := mload(hashesFront)\\n // Pop from `hashes`.\\n let b := mload(add(hashesFront, 0x20))\\n hashesFront := add(hashesFront, 0x40)\\n\\n // If the flag is false, load the next proof,\\n // else, pops from the queue.\\n if iszero(calldataload(flags.offset)) {\\n // Loads the next proof.\\n b := calldataload(proof.offset)\\n proof.offset := add(proof.offset, 0x20)\\n // Unpop from `hashes`.\\n hashesFront := sub(hashesFront, 0x20)\\n }\\n\\n // Advance to the next flag offset.\\n flags.offset := add(flags.offset, 0x20)\\n\\n // Slot of `a` in scratch space.\\n // If the condition is true: 0x20, otherwise: 0x00.\\n let scratch := shl(5, gt(a, b))\\n // Hash the scratch space and push the result onto the queue.\\n mstore(scratch, a)\\n mstore(xor(scratch, 0x20), b)\\n mstore(hashesBack, keccak256(0x00, 0x40))\\n hashesBack := add(hashesBack, 0x20)\\n if iszero(lt(hashesBack, flags.length)) { break }\\n }\\n isValid :=\\n and(\\n // Checks if the last value in the queue is same as the root.\\n eq(mload(sub(hashesBack, 0x20)), root),\\n // And whether all the proofs are used, if required.\\n eq(proofEnd, proof.offset)\\n )\\n break\\n }\\n }\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* EMPTY CALLDATA HELPERS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns an empty calldata bytes32 array.\\n function emptyProof() internal pure returns (bytes32[] calldata proof) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n proof.length := 0\\n }\\n }\\n\\n /// @dev Returns an empty calldata bytes32 array.\\n function emptyLeaves() internal pure returns (bytes32[] calldata leaves) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n leaves.length := 0\\n }\\n }\\n\\n /// @dev Returns an empty calldata bool array.\\n function emptyFlags() internal pure returns (bool[] calldata flags) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n flags.length := 0\\n }\\n }\\n}\\n\",\"keccak256\":\"0x36e0da7695b2a2316db2ee41192cddb9327394920e38ee3fadea2308d796fbd2\",\"license\":\"MIT\"},\"src/proxies/SequenceProxyFactory.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\nimport {\\n ITransparentUpgradeableBeaconProxy,\\n TransparentUpgradeableBeaconProxy\\n} from \\\"./TransparentUpgradeableBeaconProxy.sol\\\";\\n\\nimport { Ownable } from \\\"openzeppelin-contracts/contracts/access/Ownable.sol\\\";\\nimport { UpgradeableBeacon } from \\\"openzeppelin-contracts/contracts/proxy/beacon/UpgradeableBeacon.sol\\\";\\nimport { Create2 } from \\\"openzeppelin-contracts/contracts/utils/Create2.sol\\\";\\n\\n/**\\n * An proxy factory that deploys upgradeable beacon proxies.\\n * @dev The factory owner is able to upgrade the beacon implementation.\\n * @dev Proxy deployers are able to override the beacon reference with their own.\\n */\\nabstract contract SequenceProxyFactory is Ownable {\\n\\n UpgradeableBeacon public beacon;\\n\\n /**\\n * Initialize a Sequence Proxy Factory.\\n * @param implementation The initial beacon implementation.\\n * @param factoryOwner The owner of the factory.\\n */\\n function _initialize(address implementation, address factoryOwner) internal {\\n beacon = new UpgradeableBeacon(implementation);\\n Ownable._transferOwnership(factoryOwner);\\n }\\n\\n /**\\n * Deploys and initializes a new proxy instance.\\n * @param _salt The deployment salt.\\n * @param _proxyOwner The owner of the proxy.\\n * @param _data The initialization data.\\n * @return proxyAddress The address of the deployed proxy.\\n */\\n function _createProxy(\\n bytes32 _salt,\\n address _proxyOwner,\\n bytes memory _data\\n ) internal returns (address proxyAddress) {\\n bytes32 saltedHash = keccak256(abi.encodePacked(_salt, _proxyOwner, address(beacon), _data));\\n bytes memory bytecode = type(TransparentUpgradeableBeaconProxy).creationCode;\\n\\n proxyAddress = Create2.deploy(0, saltedHash, bytecode);\\n ITransparentUpgradeableBeaconProxy(payable(proxyAddress)).initialize(_proxyOwner, address(beacon), _data);\\n }\\n\\n /**\\n * Computes the address of a proxy instance.\\n * @param _salt The deployment salt.\\n * @param _proxyOwner The owner of the proxy.\\n * @return proxy The expected address of the deployed proxy.\\n */\\n function _computeProxyAddress(\\n bytes32 _salt,\\n address _proxyOwner,\\n bytes memory _data\\n ) internal view returns (address) {\\n bytes32 saltedHash = keccak256(abi.encodePacked(_salt, _proxyOwner, address(beacon), _data));\\n bytes32 bytecodeHash = keccak256(type(TransparentUpgradeableBeaconProxy).creationCode);\\n\\n return Create2.computeAddress(saltedHash, bytecodeHash);\\n }\\n\\n /**\\n * Upgrades the beacon implementation.\\n * @param implementation The new beacon implementation.\\n */\\n function upgradeBeacon(\\n address implementation\\n ) public onlyOwner {\\n beacon.upgradeTo(implementation);\\n }\\n\\n}\\n\",\"keccak256\":\"0x1cfe45a8e44b7a1b8f11631da9bdd1420fe040e2322ca725d644fbb26813de73\",\"license\":\"Apache-2.0\"},\"src/proxies/TransparentUpgradeableBeaconProxy.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\nimport { BeaconProxy, Proxy } from \\\"./openzeppelin/BeaconProxy.sol\\\";\\nimport { ERC1967Proxy, TransparentUpgradeableProxy } from \\\"./openzeppelin/TransparentUpgradeableProxy.sol\\\";\\n\\ninterface ITransparentUpgradeableBeaconProxy {\\n\\n function initialize(address admin, address beacon, bytes memory data) external;\\n\\n}\\n\\nerror InvalidInitialization();\\n\\n/**\\n * @dev As the underlying proxy implementation (TransparentUpgradeableProxy) allows the admin to call the implementation,\\n * care must be taken to avoid proxy selector collisions. Implementation selectors must not conflict with the proxy selectors.\\n * See https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector clashing].\\n * The proxy selectors are:\\n * - 0xcf7a1d77: initialize\\n * - 0x3659cfe6: upgradeTo (from TransparentUpgradeableProxy)\\n * - 0x4f1ef286: upgradeToAndCall (from TransparentUpgradeableProxy)\\n * - 0x8f283970: changeAdmin (from TransparentUpgradeableProxy)\\n * - 0xf851a440: admin (from TransparentUpgradeableProxy)\\n * - 0x5c60da1b: implementation (from TransparentUpgradeableProxy)\\n */\\ncontract TransparentUpgradeableBeaconProxy is TransparentUpgradeableProxy, BeaconProxy {\\n\\n /**\\n * Decode the initialization data from the msg.data and call the initialize function.\\n */\\n function _dispatchInitialize() private returns (bytes memory) {\\n _requireZeroValue();\\n\\n (address admin, address beacon, bytes memory data) = abi.decode(msg.data[4:], (address, address, bytes));\\n initialize(admin, beacon, data);\\n\\n return \\\"\\\";\\n }\\n\\n function initialize(address admin, address beacon, bytes memory data) internal {\\n if (_admin() != address(0)) {\\n // Redundant call. This function can only be called when the admin is not set.\\n revert InvalidInitialization();\\n }\\n _changeAdmin(admin);\\n _upgradeBeaconToAndCall(beacon, data, false);\\n }\\n\\n /**\\n * @dev If the admin is not set, the fallback function is used to initialize the proxy.\\n * @dev If the admin is set, the fallback function is used to delegatecall the implementation.\\n */\\n function _fallback() internal override(TransparentUpgradeableProxy, Proxy) {\\n if (_getAdmin() == address(0)) {\\n bytes memory ret;\\n bytes4 selector = msg.sig;\\n if (selector == ITransparentUpgradeableBeaconProxy.initialize.selector) {\\n ret = _dispatchInitialize();\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n return(add(ret, 0x20), mload(ret))\\n }\\n }\\n // When the admin is not set, the fallback function is used to initialize the proxy.\\n revert InvalidInitialization();\\n }\\n TransparentUpgradeableProxy._fallback();\\n }\\n\\n /**\\n * Returns the current implementation address.\\n * @dev This is the implementation address set by the admin, or the beacon implementation.\\n */\\n function _implementation() internal view override(ERC1967Proxy, BeaconProxy) returns (address) {\\n address implementation = ERC1967Proxy._implementation();\\n if (implementation != address(0)) {\\n return implementation;\\n }\\n return BeaconProxy._implementation();\\n }\\n\\n}\\n\",\"keccak256\":\"0xf7c7834545a955cedbe5228c3583f72fb332337dd0b4ebcd5fdb0b6504c5a8cb\",\"license\":\"Apache-2.0\"},\"src/proxies/openzeppelin/BeaconProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (proxy/beacon/BeaconProxy.sol)\\n\\n// Note: This implementation is an exact copy with the constructor removed, and pragma and imports updated.\\n\\npragma solidity ^0.8.19;\\n\\nimport \\\"openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Upgrade.sol\\\";\\nimport \\\"openzeppelin-contracts/contracts/proxy/Proxy.sol\\\";\\nimport \\\"openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol\\\";\\n\\n/**\\n * @dev This contract implements a proxy that gets the implementation address for each call from an {UpgradeableBeacon}.\\n *\\n * The beacon address is stored in storage slot `uint256(keccak256('eip1967.proxy.beacon')) - 1`, so that it doesn't\\n * conflict with the storage layout of the implementation behind the proxy.\\n *\\n * _Available since v3.4._\\n */\\ncontract BeaconProxy is Proxy, ERC1967Upgrade {\\n\\n /**\\n * @dev Returns the current beacon address.\\n */\\n function _beacon() internal view virtual returns (address) {\\n return _getBeacon();\\n }\\n\\n /**\\n * @dev Returns the current implementation address of the associated beacon.\\n */\\n function _implementation() internal view virtual override returns (address) {\\n return IBeacon(_getBeacon()).implementation();\\n }\\n\\n /**\\n * @dev Changes the proxy to use a new beacon. Deprecated: see {_upgradeBeaconToAndCall}.\\n *\\n * If `data` is nonempty, it's used as data in a delegate call to the implementation returned by the beacon.\\n *\\n * Requirements:\\n *\\n * - `beacon` must be a contract.\\n * - The implementation returned by `beacon` must be a contract.\\n */\\n function _setBeacon(address beacon, bytes memory data) internal virtual {\\n _upgradeBeaconToAndCall(beacon, data, false);\\n }\\n\\n}\\n\",\"keccak256\":\"0x2aa58701eaf7336890fae8a17f5769adf764beac64f3c5873199cd56abd66d0d\",\"license\":\"MIT\"},\"src/proxies/openzeppelin/ERC1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (proxy/ERC1967/ERC1967Proxy.sol)\\n\\n// Note: This implementation is an exact copy with the constructor removed, and pragma and imports updated.\\n\\npragma solidity ^0.8.19;\\n\\nimport \\\"openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Upgrade.sol\\\";\\nimport \\\"openzeppelin-contracts/contracts/proxy/Proxy.sol\\\";\\n\\n/**\\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\\n * implementation address that can be changed. This address is stored in storage in the location specified by\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\\n * implementation behind the proxy.\\n */\\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _implementation() internal view virtual override returns (address impl) {\\n return ERC1967Upgrade._getImplementation();\\n }\\n\\n}\\n\",\"keccak256\":\"0x87a69f59211b7b73c737e399211fd71d9b549b7d416e05c85b8ab605f64b3b00\",\"license\":\"MIT\"},\"src/proxies/openzeppelin/TransparentUpgradeableProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/transparent/TransparentUpgradeableProxy.sol)\\n\\n/// @notice This implementation is a copy of OpenZeppelin's with the following changes:\\n/// - Pragma updated\\n/// - Imports updated\\n/// - Constructor removed\\n/// - Allows admin to call implementation\\n\\npragma solidity ^0.8.19;\\n\\nimport \\\"./ERC1967Proxy.sol\\\";\\n\\n/**\\n * @dev Interface for {TransparentUpgradeableProxy}. In order to implement transparency, {TransparentUpgradeableProxy}\\n * does not implement this interface directly, and some of its functions are implemented by an internal dispatch\\n * mechanism. The compiler is unaware that these functions are implemented by {TransparentUpgradeableProxy} and will not\\n * include them in the ABI so this interface must be used to interact with it.\\n */\\ninterface ITransparentUpgradeableProxy is IERC1967 {\\n\\n function admin() external view returns (address);\\n\\n function implementation() external view returns (address);\\n\\n function changeAdmin(\\n address\\n ) external;\\n\\n function upgradeTo(\\n address\\n ) external;\\n\\n function upgradeToAndCall(address, bytes memory) external payable;\\n\\n}\\n\\n/**\\n * @dev This contract implements a proxy that is upgradeable by an admin.\\n *\\n * Unlike the original OpenZeppelin implementation, this contract does not prevent the admin from calling the implementation.\\n * This potentially exposes the admin to a proxy selector attack. See\\n * https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector clashing].\\n * When using this contract, you must ensure that the implementation function selectors do not clash with the proxy selectors.\\n * The proxy selectors are:\\n * - 0x3659cfe6: upgradeTo\\n * - 0x4f1ef286: upgradeToAndCall\\n * - 0x8f283970: changeAdmin\\n * - 0xf851a440: admin\\n * - 0x5c60da1b: implementation\\n *\\n * NOTE: The real interface of this proxy is that defined in `ITransparentUpgradeableProxy`. This contract does not\\n * inherit from that interface, and instead the admin functions are implicitly implemented using a custom dispatch\\n * mechanism in `_fallback`. Consequently, the compiler will not produce an ABI for this contract. This is necessary to\\n * fully implement transparency without decoding reverts caused by selector clashes between the proxy and the\\n * implementation.\\n *\\n * WARNING: It is not recommended to extend this contract to add additional external functions. If you do so, the compiler\\n * will not check that there are no selector conflicts, due to the note above. A selector clash between any new function\\n * and the functions declared in {ITransparentUpgradeableProxy} will be resolved in favor of the new one. This could\\n * render the admin operations inaccessible, which could prevent upgradeability. Transparency may also be compromised.\\n */\\ncontract TransparentUpgradeableProxy is ERC1967Proxy {\\n\\n /**\\n * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.\\n *\\n * CAUTION: This modifier is deprecated, as it could cause issues if the modified function has arguments, and the\\n * implementation provides a function with the same selector.\\n */\\n modifier ifAdmin() {\\n if (msg.sender == _getAdmin()) {\\n _;\\n } else {\\n _fallback();\\n }\\n }\\n\\n /**\\n * @dev If caller is the admin process the call internally, otherwise transparently fallback to the proxy behavior\\n */\\n function _fallback() internal virtual override {\\n if (msg.sender == _getAdmin()) {\\n bytes memory ret;\\n bytes4 selector = msg.sig;\\n if (selector == ITransparentUpgradeableProxy.upgradeTo.selector) {\\n ret = _dispatchUpgradeTo();\\n } else if (selector == ITransparentUpgradeableProxy.upgradeToAndCall.selector) {\\n ret = _dispatchUpgradeToAndCall();\\n } else if (selector == ITransparentUpgradeableProxy.changeAdmin.selector) {\\n ret = _dispatchChangeAdmin();\\n } else if (selector == ITransparentUpgradeableProxy.admin.selector) {\\n ret = _dispatchAdmin();\\n } else if (selector == ITransparentUpgradeableProxy.implementation.selector) {\\n ret = _dispatchImplementation();\\n } else {\\n // Call implementation\\n return super._fallback();\\n }\\n assembly {\\n return(add(ret, 0x20), mload(ret))\\n }\\n } else {\\n super._fallback();\\n }\\n }\\n\\n /**\\n * @dev Returns the current admin.\\n *\\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\\n */\\n function _dispatchAdmin() private returns (bytes memory) {\\n _requireZeroValue();\\n\\n address admin = _getAdmin();\\n return abi.encode(admin);\\n }\\n\\n /**\\n * @dev Returns the current implementation.\\n *\\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\\n * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\\n */\\n function _dispatchImplementation() private returns (bytes memory) {\\n _requireZeroValue();\\n\\n address implementation = _implementation();\\n return abi.encode(implementation);\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _dispatchChangeAdmin() private returns (bytes memory) {\\n _requireZeroValue();\\n\\n address newAdmin = abi.decode(msg.data[4:], (address));\\n _changeAdmin(newAdmin);\\n\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy.\\n */\\n function _dispatchUpgradeTo() private returns (bytes memory) {\\n _requireZeroValue();\\n\\n address newImplementation = abi.decode(msg.data[4:], (address));\\n _upgradeToAndCall(newImplementation, bytes(\\\"\\\"), false);\\n\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified\\n * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the\\n * proxied contract.\\n */\\n function _dispatchUpgradeToAndCall() private returns (bytes memory) {\\n (address newImplementation, bytes memory data) = abi.decode(msg.data[4:], (address, bytes));\\n _upgradeToAndCall(newImplementation, data, true);\\n\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev Returns the current admin.\\n *\\n * CAUTION: This function is deprecated. Use {ERC1967Upgrade-_getAdmin} instead.\\n */\\n function _admin() internal view virtual returns (address) {\\n return _getAdmin();\\n }\\n\\n /**\\n * @dev To keep this contract fully transparent, all `ifAdmin` functions must be payable. This helper is here to\\n * emulate some proxy functions being non-payable while still allowing value to pass through.\\n */\\n function _requireZeroValue() internal {\\n require(msg.value == 0);\\n }\\n\\n}\\n\",\"keccak256\":\"0x4615fce1ce5dccba23058d4d4567a4a4cd01ba0c434960fa0b94bf9d44f14e99\",\"license\":\"MIT\"},\"src/tokens/ERC1155/ERC1155BaseToken.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\nimport { ERC2981Controlled } from \\\"../common/ERC2981Controlled.sol\\\";\\nimport { SignalsImplicitModeControlled } from \\\"../common/SignalsImplicitModeControlled.sol\\\";\\nimport { ERC1155, ERC1155Supply } from \\\"./extensions/supply/ERC1155Supply.sol\\\";\\n\\nimport { LibString } from \\\"solady/utils/LibString.sol\\\";\\n\\nerror InvalidInitialization();\\n\\n/**\\n * A standard base implementation of ERC-1155 for use in Sequence library contracts.\\n */\\nabstract contract ERC1155BaseToken is ERC1155Supply, ERC2981Controlled, SignalsImplicitModeControlled {\\n\\n bytes32 internal constant METADATA_ADMIN_ROLE = keccak256(\\\"METADATA_ADMIN_ROLE\\\");\\n\\n string public name;\\n string public baseURI;\\n string public contractURI;\\n\\n bool private _initialized;\\n\\n /**\\n * Initialize the contract.\\n * @param owner Owner address.\\n * @param tokenName Token name.\\n * @param tokenBaseURI Base URI for token metadata.\\n * @param tokenContractURI Contract URI for token metadata.\\n * @param implicitModeValidator Implicit session validator address.\\n * @param implicitModeProjectId Implicit session project id.\\n * @dev This should be called immediately after deployment.\\n */\\n function _initialize(\\n address owner,\\n string memory tokenName,\\n string memory tokenBaseURI,\\n string memory tokenContractURI,\\n address implicitModeValidator,\\n bytes32 implicitModeProjectId\\n ) internal {\\n if (_initialized) {\\n revert InvalidInitialization();\\n }\\n\\n name = tokenName;\\n baseURI = tokenBaseURI;\\n contractURI = tokenContractURI;\\n\\n _grantRole(DEFAULT_ADMIN_ROLE, owner);\\n _grantRole(ROYALTY_ADMIN_ROLE, owner);\\n _grantRole(METADATA_ADMIN_ROLE, owner);\\n\\n _initializeImplicitMode(owner, implicitModeValidator, implicitModeProjectId);\\n\\n _initialized = true;\\n }\\n\\n //\\n // Metadata\\n //\\n\\n /// @inheritdoc ERC1155\\n function uri(\\n uint256 _id\\n ) public view virtual override returns (string memory) {\\n return string(abi.encodePacked(baseURI, LibString.toString(_id), \\\".json\\\"));\\n }\\n\\n /**\\n * Update the base URI of token's URI.\\n * @param tokenBaseURI New base URI of token's URI\\n */\\n function setBaseMetadataURI(\\n string memory tokenBaseURI\\n ) external onlyRole(METADATA_ADMIN_ROLE) {\\n baseURI = tokenBaseURI;\\n }\\n\\n /**\\n * Update the name of the contract.\\n * @param tokenName New contract name\\n */\\n function setContractName(\\n string memory tokenName\\n ) external onlyRole(METADATA_ADMIN_ROLE) {\\n name = tokenName;\\n }\\n\\n /**\\n * Update the contract URI of token's URI.\\n * @param tokenContractURI New contract URI of token's URI\\n * @notice Refer to https://docs.opensea.io/docs/contract-level-metadata\\n */\\n function setContractURI(\\n string memory tokenContractURI\\n ) external onlyRole(METADATA_ADMIN_ROLE) {\\n contractURI = tokenContractURI;\\n }\\n\\n //\\n // Burn\\n //\\n\\n /**\\n * Allows the owner of the token to burn their tokens.\\n * @param tokenId Id of token to burn\\n * @param amount Amount of tokens to burn\\n */\\n function burn(uint256 tokenId, uint256 amount) public virtual {\\n _burn(msg.sender, tokenId, amount);\\n }\\n\\n /**\\n * Burn tokens of given token id for each (tokenIds[i], amounts[i]) pair.\\n * @param tokenIds Array of token ids to burn\\n * @param amounts Array of the amount to be burned\\n */\\n function batchBurn(uint256[] memory tokenIds, uint256[] memory amounts) public virtual {\\n super._batchBurn(msg.sender, tokenIds, amounts);\\n }\\n\\n //\\n // Views\\n //\\n\\n /**\\n * Check interface support.\\n * @param interfaceId Interface id\\n * @return True if supported\\n */\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view virtual override(ERC1155Supply, ERC2981Controlled, SignalsImplicitModeControlled) returns (bool) {\\n return ERC1155Supply.supportsInterface(interfaceId) || ERC2981Controlled.supportsInterface(interfaceId)\\n || SignalsImplicitModeControlled.supportsInterface(interfaceId);\\n }\\n\\n}\\n\",\"keccak256\":\"0x81e8abb54378967f6c8ebb4222d2c9a5c93e730535532fa6fe56de5ef1c56c56\",\"license\":\"Apache-2.0\"},\"src/tokens/ERC1155/extensions/supply/ERC1155Supply.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\nimport { IERC1155Supply, IERC1155SupplyFunctions } from \\\"./IERC1155Supply.sol\\\";\\n\\nimport { ERC1155 } from \\\"solady/tokens/ERC1155.sol\\\";\\n\\n/**\\n * An ERC-1155 extension that tracks token supply.\\n */\\nabstract contract ERC1155Supply is ERC1155, IERC1155Supply {\\n\\n // Current supply\\n uint256 public totalSupply;\\n mapping(uint256 => uint256) public tokenSupply;\\n\\n /**\\n * Mint _amount of tokens of a given id\\n * @param _to The address to mint tokens to\\n * @param _id Token id to mint\\n * @param _amount The amount to be minted\\n * @param _data Data to pass if receiver is contract\\n */\\n function _mint(address _to, uint256 _id, uint256 _amount, bytes memory _data) internal virtual override {\\n super._mint(_to, _id, _amount, _data);\\n\\n totalSupply += _amount;\\n tokenSupply[_id] += _amount;\\n }\\n\\n /**\\n * Mint tokens for each ids in _ids\\n * @param _to The address to mint tokens to\\n * @param _ids Array of ids to mint\\n * @param _amounts Array of amount of tokens to mint per id\\n * @param _data Data to pass if receiver is contract\\n */\\n function _batchMint(\\n address _to,\\n uint256[] memory _ids,\\n uint256[] memory _amounts,\\n bytes memory _data\\n ) internal virtual override {\\n super._batchMint(_to, _ids, _amounts, _data);\\n\\n uint256 nMint = _ids.length;\\n uint256 totalAmount = 0;\\n for (uint256 i; i < nMint;) {\\n uint256 amount = _amounts[i];\\n totalAmount += amount;\\n tokenSupply[_ids[i]] += amount;\\n unchecked {\\n // Already checked in super._batchMint\\n ++i;\\n }\\n }\\n totalSupply += totalAmount;\\n }\\n\\n /**\\n * Burn _amount of tokens of a given token id\\n * @param _from The address to burn tokens from\\n * @param _id Token id to burn\\n * @param _amount The amount to be burned\\n */\\n function _burn(address _from, uint256 _id, uint256 _amount) internal virtual override {\\n super._burn(_from, _id, _amount);\\n\\n totalSupply -= _amount;\\n tokenSupply[_id] -= _amount;\\n }\\n\\n /**\\n * Burn tokens of given token id for each (_ids[i], _amounts[i]) pair\\n * @param _from The address to burn tokens from\\n * @param _ids Array of token ids to burn\\n * @param _amounts Array of the amount to be burned\\n */\\n function _batchBurn(address _from, uint256[] memory _ids, uint256[] memory _amounts) internal virtual override {\\n super._batchBurn(_from, _ids, _amounts);\\n\\n uint256 nBurn = _ids.length;\\n uint256 totalAmount = 0;\\n for (uint256 i; i < nBurn;) {\\n uint256 amount = _amounts[i];\\n tokenSupply[_ids[i]] -= amount;\\n totalAmount += amount;\\n unchecked {\\n // Already checked in super._batchBurn\\n ++i;\\n }\\n }\\n totalSupply -= totalAmount;\\n }\\n\\n //\\n // Views\\n //\\n\\n /**\\n * Check interface support.\\n * @param interfaceId Interface id\\n * @return True if supported\\n */\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view virtual override(ERC1155) returns (bool) {\\n return type(IERC1155SupplyFunctions).interfaceId == interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n}\\n\",\"keccak256\":\"0xc2cf8d5479a9cafcc2e92e3c8e9f4afce7fa2416cc811acbb766cf45db3692f0\",\"license\":\"Apache-2.0\"},\"src/tokens/ERC1155/extensions/supply/IERC1155Supply.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\ninterface IERC1155SupplyFunctions {\\n\\n /**\\n * Returns the total supply of ERC1155 tokens.\\n */\\n function totalSupply() external returns (uint256);\\n\\n /**\\n * Returns the total supply of a given ERC1155 token.\\n * @param tokenId The ERC1155 token id.\\n */\\n function tokenSupply(\\n uint256 tokenId\\n ) external returns (uint256);\\n\\n}\\n\\ninterface IERC1155SupplySignals {\\n\\n /**\\n * Invalid array input length.\\n */\\n error InvalidArrayLength();\\n\\n}\\n\\ninterface IERC1155Supply is IERC1155SupplySignals { }\\n\",\"keccak256\":\"0x135a8948daebd1229d6bada5ada73f2b3496c9bd9f8cfc78d7a68a0f117e55b5\",\"license\":\"Apache-2.0\"},\"src/tokens/ERC1155/presets/items/ERC1155Items.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\nimport { ERC1155BaseToken, ERC2981Controlled } from \\\"../../ERC1155BaseToken.sol\\\";\\nimport { IERC1155Items, IERC1155ItemsFunctions } from \\\"./IERC1155Items.sol\\\";\\n\\n/**\\n * An implementation of ERC-1155 capable of minting when role provided.\\n */\\ncontract ERC1155Items is ERC1155BaseToken, IERC1155Items {\\n\\n bytes32 internal constant MINTER_ROLE = keccak256(\\\"MINTER_ROLE\\\");\\n\\n /**\\n * Initialize the contract.\\n * @param owner Owner address\\n * @param tokenName Token name\\n * @param tokenBaseURI Base URI for token metadata\\n * @param tokenContractURI Contract URI for token metadata\\n * @param royaltyReceiver Address of who should be sent the royalty payment\\n * @param royaltyFeeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\\n * @param implicitModeValidator The implicit mode validator address\\n * @param implicitModeProjectId The implicit mode project id\\n * @dev This should be called immediately after deployment.\\n */\\n function initialize(\\n address owner,\\n string memory tokenName,\\n string memory tokenBaseURI,\\n string memory tokenContractURI,\\n address royaltyReceiver,\\n uint96 royaltyFeeNumerator,\\n address implicitModeValidator,\\n bytes32 implicitModeProjectId\\n ) public virtual {\\n ERC1155BaseToken._initialize(\\n owner, tokenName, tokenBaseURI, tokenContractURI, implicitModeValidator, implicitModeProjectId\\n );\\n _setDefaultRoyalty(royaltyReceiver, royaltyFeeNumerator);\\n\\n _grantRole(MINTER_ROLE, owner);\\n }\\n\\n //\\n // Minting\\n //\\n\\n /**\\n * Mint tokens.\\n * @param to Address to mint tokens to.\\n * @param tokenId Token ID to mint.\\n * @param amount Amount of tokens to mint.\\n * @param data Data to pass if receiver is contract.\\n */\\n function mint(address to, uint256 tokenId, uint256 amount, bytes memory data) external onlyRole(MINTER_ROLE) {\\n _mint(to, tokenId, amount, data);\\n }\\n\\n /**\\n * Mint tokens.\\n * @param to Address to mint tokens to.\\n * @param tokenIds Token IDs to mint.\\n * @param amounts Amounts of tokens to mint.\\n * @param data Data to pass if receiver is contract.\\n */\\n function batchMint(\\n address to,\\n uint256[] memory tokenIds,\\n uint256[] memory amounts,\\n bytes memory data\\n ) external onlyRole(MINTER_ROLE) {\\n _batchMint(to, tokenIds, amounts, data);\\n }\\n\\n //\\n // Views\\n //\\n\\n /**\\n * Check interface support.\\n * @param interfaceId Interface id\\n * @return True if supported\\n */\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view virtual override(ERC1155BaseToken) returns (bool) {\\n return type(IERC1155ItemsFunctions).interfaceId == interfaceId\\n || ERC1155BaseToken.supportsInterface(interfaceId) || super.supportsInterface(interfaceId);\\n }\\n\\n}\\n\",\"keccak256\":\"0x2791ebaef4b852f357f199574cbb7a923c997e28d79bc5a03929f9f8eb9dec8c\",\"license\":\"Apache-2.0\"},\"src/tokens/ERC1155/presets/items/IERC1155Items.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\ninterface IERC1155ItemsFunctions {\\n\\n /**\\n * Mint tokens.\\n * @param to Address to mint tokens to.\\n * @param tokenId Token ID to mint.\\n * @param amount Amount of tokens to mint.\\n * @param data Data to pass if receiver is contract.\\n */\\n function mint(address to, uint256 tokenId, uint256 amount, bytes memory data) external;\\n\\n /**\\n * Mint tokens.\\n * @param to Address to mint tokens to.\\n * @param tokenIds Token IDs to mint.\\n * @param amounts Amounts of tokens to mint.\\n * @param data Data to pass if receiver is contract.\\n */\\n function batchMint(address to, uint256[] memory tokenIds, uint256[] memory amounts, bytes memory data) external;\\n\\n}\\n\\ninterface IERC1155ItemsSignals {\\n\\n /**\\n * Invalid initialization error.\\n */\\n error InvalidInitialization();\\n\\n}\\n\\ninterface IERC1155Items is IERC1155ItemsFunctions, IERC1155ItemsSignals { }\\n\",\"keccak256\":\"0x4b05643201f0416f2beab08c2679e2a166a2e9b7f91021b9758fc9802f2c49ce\",\"license\":\"Apache-2.0\"},\"src/tokens/ERC1155/presets/pack/ERC1155Pack.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\nimport { IERC721ItemsFunctions } from \\\"../../../ERC721/presets/items/IERC721Items.sol\\\";\\nimport { ERC1155Items } from \\\"../items/ERC1155Items.sol\\\";\\nimport { IERC1155ItemsFunctions } from \\\"../items/IERC1155Items.sol\\\";\\nimport { IERC1155Pack } from \\\"./IERC1155Pack.sol\\\";\\n\\nimport { MerkleProofLib } from \\\"solady/utils/MerkleProofLib.sol\\\";\\n\\ncontract ERC1155Pack is ERC1155Items, IERC1155Pack {\\n\\n bytes32 internal constant PACK_ADMIN_ROLE = keccak256(\\\"PACK_ADMIN_ROLE\\\");\\n\\n address public immutable erc1155Holder;\\n\\n mapping(uint256 => bytes32) public merkleRoot;\\n mapping(uint256 => uint256) public supply;\\n mapping(uint256 => uint256) public remainingSupply;\\n\\n mapping(address => mapping(uint256 => uint256)) internal _commitments;\\n mapping(uint256 => mapping(uint256 => uint256)) internal _availableIndices;\\n\\n constructor(\\n address _erc1155Holder\\n ) {\\n erc1155Holder = _erc1155Holder;\\n }\\n\\n /// @inheritdoc ERC1155Items\\n function initialize(\\n address owner,\\n string memory tokenName,\\n string memory tokenBaseURI,\\n string memory tokenContractURI,\\n address royaltyReceiver,\\n uint96 royaltyFeeNumerator,\\n address implicitModeValidator,\\n bytes32 implicitModeProjectId\\n ) public virtual override {\\n _grantRole(PACK_ADMIN_ROLE, owner);\\n super.initialize(\\n owner,\\n tokenName,\\n tokenBaseURI,\\n tokenContractURI,\\n royaltyReceiver,\\n royaltyFeeNumerator,\\n implicitModeValidator,\\n implicitModeProjectId\\n );\\n }\\n\\n /// @inheritdoc IERC1155Pack\\n function setPacksContent(bytes32 _merkleRoot, uint256 _supply, uint256 packId) external onlyRole(PACK_ADMIN_ROLE) {\\n merkleRoot[packId] = _merkleRoot;\\n supply[packId] = _supply;\\n remainingSupply[packId] = _supply;\\n }\\n\\n /// @inheritdoc IERC1155Pack\\n function commit(\\n uint256 packId\\n ) external {\\n if (_commitments[msg.sender][packId] != 0) {\\n revert PendingReveal();\\n }\\n _burn(msg.sender, packId, 1);\\n _commitments[msg.sender][packId] = block.number + 1;\\n\\n emit Commit(msg.sender, packId);\\n }\\n\\n /// @inheritdoc IERC1155Pack\\n function reveal(\\n address user,\\n PackContent calldata packContent,\\n bytes32[] calldata proof,\\n uint256 packId\\n ) external {\\n (uint256 randomIndex, uint256 revealIdx) = _getRevealIdx(user, packId);\\n\\n bytes32 leaf = keccak256(abi.encode(revealIdx, packContent));\\n if (!MerkleProofLib.verify(proof, merkleRoot[packId], leaf)) {\\n revert InvalidProof();\\n }\\n\\n delete _commitments[user][packId];\\n remainingSupply[packId]--;\\n\\n // Point this index to the last index's value\\n _availableIndices[packId][randomIndex] = _getIndexOrDefault(remainingSupply[packId], packId);\\n\\n for (uint256 i; i < packContent.tokenAddresses.length;) {\\n address tokenAddr = packContent.tokenAddresses[i];\\n uint256[] memory tokenIds = packContent.tokenIds[i];\\n if (packContent.isERC721[i]) {\\n for (uint256 j; j < tokenIds.length;) {\\n IERC721ItemsFunctions(tokenAddr).mint(user, tokenIds[j]);\\n unchecked {\\n ++j;\\n }\\n }\\n } else {\\n // Send via the holder fallback if available\\n address to = user;\\n if (erc1155Holder != address(0) && msg.sender != user) {\\n to = erc1155Holder;\\n }\\n bytes memory packedData = abi.encode(user);\\n IERC1155ItemsFunctions(tokenAddr).batchMint(to, tokenIds, packContent.amounts[i], packedData);\\n }\\n unchecked {\\n ++i;\\n }\\n }\\n\\n emit Reveal(user, packId);\\n }\\n\\n /// @inheritdoc IERC1155Pack\\n function refundPack(address user, uint256 packId) external {\\n uint256 commitment = _commitments[user][packId];\\n if (commitment == 0) {\\n revert NoCommit();\\n }\\n if (uint256(blockhash(commitment)) != 0 || block.number <= commitment) {\\n revert PendingReveal();\\n }\\n delete _commitments[user][packId];\\n _mint(user, packId, 1, \\\"\\\");\\n }\\n\\n /// @inheritdoc IERC1155Pack\\n function getRevealIdx(address user, uint256 packId) public view returns (uint256 revealIdx) {\\n (, revealIdx) = _getRevealIdx(user, packId);\\n return revealIdx;\\n }\\n\\n function _getRevealIdx(address user, uint256 packId) internal view returns (uint256 randomIdx, uint256 revealIdx) {\\n if (remainingSupply[packId] == 0) {\\n revert AllPacksOpened();\\n }\\n\\n uint256 commitment = _commitments[user][packId];\\n if (commitment == 0) {\\n revert NoCommit();\\n }\\n bytes32 blockHash = blockhash(commitment);\\n if (uint256(blockHash) == 0) {\\n revert InvalidCommit();\\n }\\n\\n randomIdx = uint256(keccak256(abi.encode(blockHash, user))) % remainingSupply[packId];\\n revealIdx = _getIndexOrDefault(randomIdx, packId);\\n return (randomIdx, revealIdx);\\n }\\n\\n function _getIndexOrDefault(uint256 index, uint256 packId) internal view returns (uint256) {\\n uint256 value = _availableIndices[packId][index];\\n return value == 0 ? index : value;\\n }\\n\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view override returns (bool) {\\n return interfaceId == type(IERC1155Pack).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n}\\n\",\"keccak256\":\"0x0162450a09db2c5bb4292540e7fe5e779f3a1227a4d02b38b3e4195d7f7ebb33\",\"license\":\"Apache-2.0\"},\"src/tokens/ERC1155/presets/pack/ERC1155PackFactory.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\nimport { SequenceProxyFactory } from \\\"../../../../proxies/SequenceProxyFactory.sol\\\";\\nimport { ERC1155Pack } from \\\"./ERC1155Pack.sol\\\";\\nimport { IERC1155PackFactory, IERC1155PackFactoryFunctions } from \\\"./IERC1155PackFactory.sol\\\";\\n\\n/**\\n * Deployer of ERC-1155 Pack proxies.\\n */\\ncontract ERC1155PackFactory is IERC1155PackFactory, SequenceProxyFactory {\\n\\n /**\\n * Creates an ERC-1155 Pack Factory.\\n * @param factoryOwner The owner of the ERC-1155 Pack Factory\\n * @param holderFallback The address of the ERC1155Holder fallback\\n */\\n constructor(address factoryOwner, address holderFallback) {\\n ERC1155Pack impl = new ERC1155Pack(holderFallback);\\n SequenceProxyFactory._initialize(address(impl), factoryOwner);\\n }\\n\\n /// @inheritdoc IERC1155PackFactoryFunctions\\n function deploy(\\n address proxyOwner,\\n address tokenOwner,\\n string memory name,\\n string memory baseURI,\\n string memory contractURI,\\n address royaltyReceiver,\\n uint96 royaltyFeeNumerator,\\n address implicitModeValidator,\\n bytes32 implicitModeProjectId\\n ) external override returns (address proxyAddr) {\\n bytes32 salt = keccak256(\\n abi.encode(\\n tokenOwner,\\n name,\\n baseURI,\\n contractURI,\\n royaltyReceiver,\\n royaltyFeeNumerator,\\n implicitModeValidator,\\n implicitModeProjectId\\n )\\n );\\n proxyAddr = _createProxy(salt, proxyOwner, \\\"\\\");\\n ERC1155Pack(proxyAddr).initialize(\\n tokenOwner,\\n name,\\n baseURI,\\n contractURI,\\n royaltyReceiver,\\n royaltyFeeNumerator,\\n implicitModeValidator,\\n implicitModeProjectId\\n );\\n emit ERC1155PackDeployed(proxyAddr);\\n return proxyAddr;\\n }\\n\\n /// @inheritdoc IERC1155PackFactoryFunctions\\n function determineAddress(\\n address proxyOwner,\\n address tokenOwner,\\n string memory name,\\n string memory baseURI,\\n string memory contractURI,\\n address royaltyReceiver,\\n uint96 royaltyFeeNumerator,\\n address implicitModeValidator,\\n bytes32 implicitModeProjectId\\n ) external view override returns (address proxyAddr) {\\n bytes32 salt = keccak256(\\n abi.encode(\\n tokenOwner,\\n name,\\n baseURI,\\n contractURI,\\n royaltyReceiver,\\n royaltyFeeNumerator,\\n implicitModeValidator,\\n implicitModeProjectId\\n )\\n );\\n return _computeProxyAddress(salt, proxyOwner, \\\"\\\");\\n }\\n\\n}\\n\",\"keccak256\":\"0xd937cfa299cda6f0685e759aa731c42d62d61b497a5fc786031ce3c1612acfd4\",\"license\":\"Apache-2.0\"},\"src/tokens/ERC1155/presets/pack/IERC1155Pack.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\ninterface IERC1155Pack {\\n\\n struct PackContent {\\n address[] tokenAddresses;\\n bool[] isERC721;\\n uint256[][] tokenIds;\\n uint256[][] amounts;\\n }\\n\\n /**\\n * Commit expired or never made.\\n */\\n error InvalidCommit();\\n\\n /**\\n * Reveal is pending.\\n */\\n error PendingReveal();\\n\\n /**\\n * Commit never made.\\n */\\n error NoCommit();\\n\\n /**\\n * Invalid proof.\\n */\\n error InvalidProof();\\n\\n /**\\n * All packs opened.\\n */\\n error AllPacksOpened();\\n\\n /// @notice Emitted when a user make a commitment\\n event Commit(address indexed user, uint256 packId);\\n\\n /// @notice Emitted when a reveal is successful\\n event Reveal(address user, uint256 packId);\\n\\n /**\\n * Set all possible pack contents.\\n * @param _merkleRoot merkle root built from all possible pack contents.\\n * @param _supply total amount of packs.\\n * @param packId tokenId of pack.\\n * @dev Updating these values before all the packs have been opened may lead to undesirable behavior.\\n */\\n function setPacksContent(bytes32 _merkleRoot, uint256 _supply, uint256 packId) external;\\n\\n /**\\n * Get random reveal index.\\n * @param user address of reward recipient.\\n * @param packId tokenId of pack.\\n */\\n function getRevealIdx(address user, uint256 packId) external view returns (uint256);\\n\\n /**\\n * Commit to reveal pack content.\\n * @param packId tokenId of pack.\\n * @notice this function burns user's pack.\\n */\\n function commit(\\n uint256 packId\\n ) external;\\n\\n /**\\n * Reveal pack content.\\n * @param user address of reward recipient.\\n * @param packContent reward selected with random index.\\n * @param proof Pack contents merkle proof.\\n * @param packId tokenId of pack.\\n */\\n function reveal(\\n address user,\\n PackContent calldata packContent,\\n bytes32[] calldata proof,\\n uint256 packId\\n ) external;\\n\\n /**\\n * Ask for pack refund after commit expiration.\\n * @param user address of pack owner.\\n * @param packId tokenId of pack.\\n * @notice this function mints a pack for the user when his commit is expired.\\n */\\n function refundPack(address user, uint256 packId) external;\\n\\n}\\n\",\"keccak256\":\"0x75d783b098a2fc433b06126023ad9bae5a1d11138c3c9bd39c66b16b1d014c88\",\"license\":\"Apache-2.0\"},\"src/tokens/ERC1155/presets/pack/IERC1155PackFactory.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\ninterface IERC1155PackFactoryFunctions {\\n\\n /**\\n * Creates an ERC-1155 Pack proxy.\\n * @param proxyOwner The owner of the ERC-1155 Pack proxy\\n * @param tokenOwner The owner of the ERC-1155 Pack implementation\\n * @param name The name of the ERC-1155 Pack proxy\\n * @param baseURI The base URI of the ERC-1155 Pack proxy\\n * @param contractURI The contract URI of the ERC-1155 Pack proxy\\n * @param royaltyReceiver Address of who should be sent the royalty payment\\n * @param royaltyFeeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\\n * @param implicitModeValidator The implicit mode validator address\\n * @param implicitModeProjectId The implicit mode project id\\n * @return proxyAddr The address of the ERC-1155 Pack Proxy\\n */\\n function deploy(\\n address proxyOwner,\\n address tokenOwner,\\n string memory name,\\n string memory baseURI,\\n string memory contractURI,\\n address royaltyReceiver,\\n uint96 royaltyFeeNumerator,\\n address implicitModeValidator,\\n bytes32 implicitModeProjectId\\n ) external returns (address proxyAddr);\\n\\n /**\\n * Computes the address of a proxy instance.\\n * @param proxyOwner The owner of the ERC-1155 Pack proxy\\n * @param tokenOwner The owner of the ERC-1155 Pack implementation\\n * @param name The name of the ERC-1155 Pack proxy\\n * @param baseURI The base URI of the ERC-1155 Pack proxy\\n * @param contractURI The contract URI of the ERC-1155 Pack proxy\\n * @param royaltyReceiver Address of who should be sent the royalty payment\\n * @param royaltyFeeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\\n * @param implicitModeValidator The implicit mode validator address\\n * @param implicitModeProjectId The implicit mode project id\\n * @return proxyAddr The address of the ERC-1155 Pack Proxy\\n */\\n function determineAddress(\\n address proxyOwner,\\n address tokenOwner,\\n string memory name,\\n string memory baseURI,\\n string memory contractURI,\\n address royaltyReceiver,\\n uint96 royaltyFeeNumerator,\\n address implicitModeValidator,\\n bytes32 implicitModeProjectId\\n ) external returns (address proxyAddr);\\n\\n}\\n\\ninterface IERC1155PackFactorySignals {\\n\\n /**\\n * Event emitted when a new ERC-1155 Pack proxy contract is deployed.\\n * @param proxyAddr The address of the deployed proxy.\\n */\\n event ERC1155PackDeployed(address proxyAddr);\\n\\n}\\n\\ninterface IERC1155PackFactory is IERC1155PackFactoryFunctions, IERC1155PackFactorySignals { }\\n\",\"keccak256\":\"0x9574e4c8bbdebdbcc7dfe8f2313b9ef845f45a924e0e5d109e79b47a2be9beeb\",\"license\":\"Apache-2.0\"},\"src/tokens/ERC721/presets/items/IERC721Items.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\ninterface IERC721ItemsFunctions {\\n\\n /**\\n * Mint tokens.\\n * @param to Address to mint tokens to.\\n * @param tokenId Token id to mint.\\n */\\n function mint(address to, uint256 tokenId) external;\\n\\n /**\\n * Mint a sequential token.\\n * @param to Address to mint token to.\\n * @param amount Amount of tokens to mint.\\n */\\n function mintSequential(address to, uint256 amount) external;\\n\\n /**\\n * Get the total supply of tokens.\\n * @return totalSupply The total supply of tokens.\\n */\\n function totalSupply() external view returns (uint256 totalSupply);\\n\\n}\\n\\ninterface IERC721ItemsSignals {\\n\\n /**\\n * Invalid initialization error.\\n */\\n error InvalidInitialization();\\n\\n}\\n\\ninterface IERC721Items is IERC721ItemsFunctions, IERC721ItemsSignals { }\\n\",\"keccak256\":\"0x3170e3d97e03d070d03c50cbe5a77ea84209bb8e2bcff3bd8fc55b88cc7f2ba1\",\"license\":\"Apache-2.0\"},\"src/tokens/common/ERC2981Controlled.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\nimport { IERC2981Controlled } from \\\"./IERC2981Controlled.sol\\\";\\n\\nimport { AccessControlEnumerable } from \\\"openzeppelin-contracts/contracts/access/AccessControlEnumerable.sol\\\";\\nimport { ERC2981 } from \\\"openzeppelin-contracts/contracts/token/common/ERC2981.sol\\\";\\n\\n/**\\n * An implementation of ERC-2981 that allows updates by roles.\\n */\\nabstract contract ERC2981Controlled is ERC2981, AccessControlEnumerable, IERC2981Controlled {\\n\\n bytes32 internal constant ROYALTY_ADMIN_ROLE = keccak256(\\\"ROYALTY_ADMIN_ROLE\\\");\\n\\n //\\n // Royalty\\n //\\n\\n /**\\n * Sets the royalty information that all ids in this contract will default to.\\n * @param receiver Address of who should be sent the royalty payment\\n * @param feeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\\n */\\n function setDefaultRoyalty(address receiver, uint96 feeNumerator) external onlyRole(ROYALTY_ADMIN_ROLE) {\\n _setDefaultRoyalty(receiver, feeNumerator);\\n }\\n\\n /**\\n * Sets the royalty information that a given token id in this contract will use.\\n * @param tokenId The token id to set the royalty information for\\n * @param receiver Address of who should be sent the royalty payment\\n * @param feeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\\n * @notice This overrides the default royalty information for this token id\\n */\\n function setTokenRoyalty(\\n uint256 tokenId,\\n address receiver,\\n uint96 feeNumerator\\n ) external onlyRole(ROYALTY_ADMIN_ROLE) {\\n _setTokenRoyalty(tokenId, receiver, feeNumerator);\\n }\\n\\n //\\n // Views\\n //\\n\\n /**\\n * Check interface support.\\n * @param interfaceId Interface id\\n * @return True if supported\\n */\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view virtual override(ERC2981, AccessControlEnumerable) returns (bool) {\\n return ERC2981.supportsInterface(interfaceId) || AccessControlEnumerable.supportsInterface(interfaceId)\\n || type(IERC2981Controlled).interfaceId == interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n}\\n\",\"keccak256\":\"0xf02124d449f7dc76b4b1a26d9b1728d42facfc5f84771e73352e2b0c4b6c566b\",\"license\":\"Apache-2.0\"},\"src/tokens/common/IERC2981Controlled.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\ninterface IERC2981ControlledFunctions {\\n\\n /**\\n * Sets the royalty information that all ids in this contract will default to.\\n * @param receiver Address of who should be sent the royalty payment\\n * @param feeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\\n */\\n function setDefaultRoyalty(address receiver, uint96 feeNumerator) external;\\n\\n /**\\n * Sets the royalty information that a given token id in this contract will use.\\n * @param tokenId The token id to set the royalty information for\\n * @param receiver Address of who should be sent the royalty payment\\n * @param feeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\\n * @notice This overrides the default royalty information for this token id\\n */\\n function setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) external;\\n\\n}\\n\\ninterface IERC2981Controlled is IERC2981ControlledFunctions { }\\n\",\"keccak256\":\"0x65d66b30719fb4161fc4ef666794f8dcb7660528bdff9bf126b12999fac79ee0\",\"license\":\"Apache-2.0\"},\"src/tokens/common/SignalsImplicitModeControlled.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\nimport { AccessControlEnumerable } from \\\"openzeppelin-contracts/contracts/access/AccessControlEnumerable.sol\\\";\\nimport {\\n IERC165,\\n IImplicitProjectValidation,\\n SignalsImplicitMode\\n} from \\\"signals-implicit-mode/src/helper/SignalsImplicitMode.sol\\\";\\n\\n/**\\n * An abstract contract that allows implicit session access for a given project.\\n */\\nabstract contract SignalsImplicitModeControlled is AccessControlEnumerable, SignalsImplicitMode {\\n\\n bytes32 internal constant _IMPLICIT_MODE_ADMIN_ROLE = keccak256(\\\"IMPLICIT_MODE_ADMIN_ROLE\\\");\\n\\n function _initializeImplicitMode(address owner, address validator, bytes32 projectId) internal {\\n _grantRole(_IMPLICIT_MODE_ADMIN_ROLE, owner);\\n _initializeSignalsImplicitMode(validator, projectId);\\n }\\n\\n /**\\n * Updates the validator for implicit mode validation.\\n * @param validator The validator address.\\n * @notice Only callable by an address with the project admin role.\\n */\\n function setImplicitModeValidator(\\n address validator\\n ) external onlyRole(_IMPLICIT_MODE_ADMIN_ROLE) {\\n _validator = IImplicitProjectValidation(validator);\\n }\\n\\n /**\\n * Updates the settings for implicit mode validation.\\n * @param projectId The project id.\\n * @notice Only callable by an address with the project admin role.\\n */\\n function setImplicitModeProjectId(\\n bytes32 projectId\\n ) external onlyRole(_IMPLICIT_MODE_ADMIN_ROLE) {\\n _projectId = projectId;\\n }\\n\\n /// @inheritdoc IERC165\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view virtual override(AccessControlEnumerable, SignalsImplicitMode) returns (bool) {\\n return\\n AccessControlEnumerable.supportsInterface(interfaceId) || SignalsImplicitMode.supportsInterface(interfaceId);\\n }\\n\\n}\\n\",\"keccak256\":\"0xb1a20575f188af254f90ec7df7f70415610ba5f41f7966ce383b50063220b860\",\"license\":\"Apache-2.0\"}},\"version\":1}", + "userdoc": { + "events": { + "ERC1155PackDeployed(address)": { + "notice": "Event emitted when a new ERC-1155 Pack proxy contract is deployed." + } + }, + "kind": "user", + "methods": { + "constructor": { + "notice": "Creates an ERC-1155 Pack Factory." + }, + "deploy(address,address,string,string,string,address,uint96,address,bytes32)": { + "notice": "Creates an ERC-1155 Pack proxy." + }, + "determineAddress(address,address,string,string,string,address,uint96,address,bytes32)": { + "notice": "Computes the address of a proxy instance." + }, + "upgradeBeacon(address)": { + "notice": "Upgrades the beacon implementation." + } + }, + "notice": "Deployer of ERC-1155 Pack proxies.", + "version": 1 + } + } + }, + "src/tokens/ERC1155/presets/pack/IERC1155Pack.sol": { + "IERC1155Pack": { + "abi": [ + { + "inputs": [], + "name": "AllPacksOpened", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidCommit", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidProof", + "type": "error" + }, + { + "inputs": [], + "name": "NoCommit", + "type": "error" + }, + { + "inputs": [], + "name": "PendingReveal", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "packId", + "type": "uint256" + } + ], + "name": "Commit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "packId", + "type": "uint256" + } + ], + "name": "Reveal", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "packId", + "type": "uint256" + } + ], + "name": "commit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "uint256", + "name": "packId", + "type": "uint256" + } + ], + "name": "getRevealIdx", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "uint256", + "name": "packId", + "type": "uint256" + } + ], + "name": "refundPack", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "components": [ + { + "internalType": "address[]", + "name": "tokenAddresses", + "type": "address[]" + }, + { + "internalType": "bool[]", + "name": "isERC721", + "type": "bool[]" + }, + { + "internalType": "uint256[][]", + "name": "tokenIds", + "type": "uint256[][]" + }, + { + "internalType": "uint256[][]", + "name": "amounts", + "type": "uint256[][]" + } + ], + "internalType": "struct IERC1155Pack.PackContent", + "name": "packContent", + "type": "tuple" + }, + { + "internalType": "bytes32[]", + "name": "proof", + "type": "bytes32[]" + }, + { + "internalType": "uint256", + "name": "packId", + "type": "uint256" + } + ], + "name": "reveal", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_merkleRoot", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_supply", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "packId", + "type": "uint256" + } + ], + "name": "setPacksContent", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "commit(uint256)": { + "params": { + "packId": "tokenId of pack." + } + }, + "getRevealIdx(address,uint256)": { + "params": { + "packId": "tokenId of pack.", + "user": "address of reward recipient." + } + }, + "refundPack(address,uint256)": { + "params": { + "packId": "tokenId of pack.", + "user": "address of pack owner." + } + }, + "reveal(address,(address[],bool[],uint256[][],uint256[][]),bytes32[],uint256)": { + "params": { + "packContent": "reward selected with random index.", + "packId": "tokenId of pack.", + "proof": "Pack contents merkle proof.", + "user": "address of reward recipient." + } + }, + "setPacksContent(bytes32,uint256,uint256)": { + "details": "Updating these values before all the packs have been opened may lead to undesirable behavior.", + "params": { + "_merkleRoot": "merkle root built from all possible pack contents.", + "_supply": "total amount of packs.", + "packId": "tokenId of pack." + } + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "commit(uint256)": "f4f98ad5", + "getRevealIdx(address,uint256)": "5377ab8f", + "refundPack(address,uint256)": "167a59f7", + "reveal(address,(address[],bool[],uint256[][],uint256[][]),bytes32[],uint256)": "d67b333b", + "setPacksContent(bytes32,uint256,uint256)": "50336a03" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"AllPacksOpened\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidCommit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoCommit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PendingReveal\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"packId\",\"type\":\"uint256\"}],\"name\":\"Commit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"packId\",\"type\":\"uint256\"}],\"name\":\"Reveal\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"packId\",\"type\":\"uint256\"}],\"name\":\"commit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"packId\",\"type\":\"uint256\"}],\"name\":\"getRevealIdx\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"packId\",\"type\":\"uint256\"}],\"name\":\"refundPack\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address[]\",\"name\":\"tokenAddresses\",\"type\":\"address[]\"},{\"internalType\":\"bool[]\",\"name\":\"isERC721\",\"type\":\"bool[]\"},{\"internalType\":\"uint256[][]\",\"name\":\"tokenIds\",\"type\":\"uint256[][]\"},{\"internalType\":\"uint256[][]\",\"name\":\"amounts\",\"type\":\"uint256[][]\"}],\"internalType\":\"struct IERC1155Pack.PackContent\",\"name\":\"packContent\",\"type\":\"tuple\"},{\"internalType\":\"bytes32[]\",\"name\":\"proof\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"packId\",\"type\":\"uint256\"}],\"name\":\"reveal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_merkleRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_supply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"packId\",\"type\":\"uint256\"}],\"name\":\"setPacksContent\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"commit(uint256)\":{\"params\":{\"packId\":\"tokenId of pack.\"}},\"getRevealIdx(address,uint256)\":{\"params\":{\"packId\":\"tokenId of pack.\",\"user\":\"address of reward recipient.\"}},\"refundPack(address,uint256)\":{\"params\":{\"packId\":\"tokenId of pack.\",\"user\":\"address of pack owner.\"}},\"reveal(address,(address[],bool[],uint256[][],uint256[][]),bytes32[],uint256)\":{\"params\":{\"packContent\":\"reward selected with random index.\",\"packId\":\"tokenId of pack.\",\"proof\":\"Pack contents merkle proof.\",\"user\":\"address of reward recipient.\"}},\"setPacksContent(bytes32,uint256,uint256)\":{\"details\":\"Updating these values before all the packs have been opened may lead to undesirable behavior.\",\"params\":{\"_merkleRoot\":\"merkle root built from all possible pack contents.\",\"_supply\":\"total amount of packs.\",\"packId\":\"tokenId of pack.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"AllPacksOpened()\":[{\"notice\":\"All packs opened.\"}],\"InvalidCommit()\":[{\"notice\":\"Commit expired or never made.\"}],\"InvalidProof()\":[{\"notice\":\"Invalid proof.\"}],\"NoCommit()\":[{\"notice\":\"Commit never made.\"}],\"PendingReveal()\":[{\"notice\":\"Reveal is pending.\"}]},\"events\":{\"Commit(address,uint256)\":{\"notice\":\"Emitted when a user make a commitment\"},\"Reveal(address,uint256)\":{\"notice\":\"Emitted when a reveal is successful\"}},\"kind\":\"user\",\"methods\":{\"commit(uint256)\":{\"notice\":\"Commit to reveal pack content.this function burns user's pack.\"},\"getRevealIdx(address,uint256)\":{\"notice\":\"Get random reveal index.\"},\"refundPack(address,uint256)\":{\"notice\":\"Ask for pack refund after commit expiration.this function mints a pack for the user when his commit is expired.\"},\"reveal(address,(address[],bool[],uint256[][],uint256[][]),bytes32[],uint256)\":{\"notice\":\"Reveal pack content.\"},\"setPacksContent(bytes32,uint256,uint256)\":{\"notice\":\"Set all possible pack contents.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/tokens/ERC1155/presets/pack/IERC1155Pack.sol\":\"IERC1155Pack\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"src/tokens/ERC1155/presets/pack/IERC1155Pack.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\ninterface IERC1155Pack {\\n\\n struct PackContent {\\n address[] tokenAddresses;\\n bool[] isERC721;\\n uint256[][] tokenIds;\\n uint256[][] amounts;\\n }\\n\\n /**\\n * Commit expired or never made.\\n */\\n error InvalidCommit();\\n\\n /**\\n * Reveal is pending.\\n */\\n error PendingReveal();\\n\\n /**\\n * Commit never made.\\n */\\n error NoCommit();\\n\\n /**\\n * Invalid proof.\\n */\\n error InvalidProof();\\n\\n /**\\n * All packs opened.\\n */\\n error AllPacksOpened();\\n\\n /// @notice Emitted when a user make a commitment\\n event Commit(address indexed user, uint256 packId);\\n\\n /// @notice Emitted when a reveal is successful\\n event Reveal(address user, uint256 packId);\\n\\n /**\\n * Set all possible pack contents.\\n * @param _merkleRoot merkle root built from all possible pack contents.\\n * @param _supply total amount of packs.\\n * @param packId tokenId of pack.\\n * @dev Updating these values before all the packs have been opened may lead to undesirable behavior.\\n */\\n function setPacksContent(bytes32 _merkleRoot, uint256 _supply, uint256 packId) external;\\n\\n /**\\n * Get random reveal index.\\n * @param user address of reward recipient.\\n * @param packId tokenId of pack.\\n */\\n function getRevealIdx(address user, uint256 packId) external view returns (uint256);\\n\\n /**\\n * Commit to reveal pack content.\\n * @param packId tokenId of pack.\\n * @notice this function burns user's pack.\\n */\\n function commit(\\n uint256 packId\\n ) external;\\n\\n /**\\n * Reveal pack content.\\n * @param user address of reward recipient.\\n * @param packContent reward selected with random index.\\n * @param proof Pack contents merkle proof.\\n * @param packId tokenId of pack.\\n */\\n function reveal(\\n address user,\\n PackContent calldata packContent,\\n bytes32[] calldata proof,\\n uint256 packId\\n ) external;\\n\\n /**\\n * Ask for pack refund after commit expiration.\\n * @param user address of pack owner.\\n * @param packId tokenId of pack.\\n * @notice this function mints a pack for the user when his commit is expired.\\n */\\n function refundPack(address user, uint256 packId) external;\\n\\n}\\n\",\"keccak256\":\"0x75d783b098a2fc433b06126023ad9bae5a1d11138c3c9bd39c66b16b1d014c88\",\"license\":\"Apache-2.0\"}},\"version\":1}", + "userdoc": { + "errors": { + "AllPacksOpened()": [ + { + "notice": "All packs opened." + } + ], + "InvalidCommit()": [ + { + "notice": "Commit expired or never made." + } + ], + "InvalidProof()": [ + { + "notice": "Invalid proof." + } + ], + "NoCommit()": [ + { + "notice": "Commit never made." + } + ], + "PendingReveal()": [ + { + "notice": "Reveal is pending." + } + ] + }, + "events": { + "Commit(address,uint256)": { + "notice": "Emitted when a user make a commitment" + }, + "Reveal(address,uint256)": { + "notice": "Emitted when a reveal is successful" + } + }, + "kind": "user", + "methods": { + "commit(uint256)": { + "notice": "Commit to reveal pack content.this function burns user's pack." + }, + "getRevealIdx(address,uint256)": { + "notice": "Get random reveal index." + }, + "refundPack(address,uint256)": { + "notice": "Ask for pack refund after commit expiration.this function mints a pack for the user when his commit is expired." + }, + "reveal(address,(address[],bool[],uint256[][],uint256[][]),bytes32[],uint256)": { + "notice": "Reveal pack content." + }, + "setPacksContent(bytes32,uint256,uint256)": { + "notice": "Set all possible pack contents." + } + }, + "version": 1 + } + } + }, + "src/tokens/ERC1155/presets/pack/IERC1155PackFactory.sol": { + "IERC1155PackFactory": { + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "proxyAddr", + "type": "address" + } + ], + "name": "ERC1155PackDeployed", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "proxyOwner", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenOwner", + "type": "address" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "baseURI", + "type": "string" + }, + { + "internalType": "string", + "name": "contractURI", + "type": "string" + }, + { + "internalType": "address", + "name": "royaltyReceiver", + "type": "address" + }, + { + "internalType": "uint96", + "name": "royaltyFeeNumerator", + "type": "uint96" + }, + { + "internalType": "address", + "name": "implicitModeValidator", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "implicitModeProjectId", + "type": "bytes32" + } + ], + "name": "deploy", + "outputs": [ + { + "internalType": "address", + "name": "proxyAddr", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "proxyOwner", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenOwner", + "type": "address" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "baseURI", + "type": "string" + }, + { + "internalType": "string", + "name": "contractURI", + "type": "string" + }, + { + "internalType": "address", + "name": "royaltyReceiver", + "type": "address" + }, + { + "internalType": "uint96", + "name": "royaltyFeeNumerator", + "type": "uint96" + }, + { + "internalType": "address", + "name": "implicitModeValidator", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "implicitModeProjectId", + "type": "bytes32" + } + ], + "name": "determineAddress", + "outputs": [ + { + "internalType": "address", + "name": "proxyAddr", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "devdoc": { + "events": { + "ERC1155PackDeployed(address)": { + "params": { + "proxyAddr": "The address of the deployed proxy." + } + } + }, + "kind": "dev", + "methods": { + "deploy(address,address,string,string,string,address,uint96,address,bytes32)": { + "params": { + "baseURI": "The base URI of the ERC-1155 Pack proxy", + "contractURI": "The contract URI of the ERC-1155 Pack proxy", + "implicitModeProjectId": "The implicit mode project id", + "implicitModeValidator": "The implicit mode validator address", + "name": "The name of the ERC-1155 Pack proxy", + "proxyOwner": "The owner of the ERC-1155 Pack proxy", + "royaltyFeeNumerator": "The royalty fee numerator in basis points (e.g. 15% would be 1500)", + "royaltyReceiver": "Address of who should be sent the royalty payment", + "tokenOwner": "The owner of the ERC-1155 Pack implementation" + }, + "returns": { + "proxyAddr": "The address of the ERC-1155 Pack Proxy" + } + }, + "determineAddress(address,address,string,string,string,address,uint96,address,bytes32)": { + "params": { + "baseURI": "The base URI of the ERC-1155 Pack proxy", + "contractURI": "The contract URI of the ERC-1155 Pack proxy", + "implicitModeProjectId": "The implicit mode project id", + "implicitModeValidator": "The implicit mode validator address", + "name": "The name of the ERC-1155 Pack proxy", + "proxyOwner": "The owner of the ERC-1155 Pack proxy", + "royaltyFeeNumerator": "The royalty fee numerator in basis points (e.g. 15% would be 1500)", + "royaltyReceiver": "Address of who should be sent the royalty payment", + "tokenOwner": "The owner of the ERC-1155 Pack implementation" + }, + "returns": { + "proxyAddr": "The address of the ERC-1155 Pack Proxy" + } + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "deploy(address,address,string,string,string,address,uint96,address,bytes32)": "59a347bd", + "determineAddress(address,address,string,string,string,address,uint96,address,bytes32)": "cfcc5941" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"proxyAddr\",\"type\":\"address\"}],\"name\":\"ERC1155PackDeployed\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proxyOwner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenOwner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"baseURI\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"contractURI\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"royaltyReceiver\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"royaltyFeeNumerator\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"implicitModeValidator\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"implicitModeProjectId\",\"type\":\"bytes32\"}],\"name\":\"deploy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"proxyAddr\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proxyOwner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenOwner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"baseURI\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"contractURI\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"royaltyReceiver\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"royaltyFeeNumerator\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"implicitModeValidator\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"implicitModeProjectId\",\"type\":\"bytes32\"}],\"name\":\"determineAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"proxyAddr\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"ERC1155PackDeployed(address)\":{\"params\":{\"proxyAddr\":\"The address of the deployed proxy.\"}}},\"kind\":\"dev\",\"methods\":{\"deploy(address,address,string,string,string,address,uint96,address,bytes32)\":{\"params\":{\"baseURI\":\"The base URI of the ERC-1155 Pack proxy\",\"contractURI\":\"The contract URI of the ERC-1155 Pack proxy\",\"implicitModeProjectId\":\"The implicit mode project id\",\"implicitModeValidator\":\"The implicit mode validator address\",\"name\":\"The name of the ERC-1155 Pack proxy\",\"proxyOwner\":\"The owner of the ERC-1155 Pack proxy\",\"royaltyFeeNumerator\":\"The royalty fee numerator in basis points (e.g. 15% would be 1500)\",\"royaltyReceiver\":\"Address of who should be sent the royalty payment\",\"tokenOwner\":\"The owner of the ERC-1155 Pack implementation\"},\"returns\":{\"proxyAddr\":\"The address of the ERC-1155 Pack Proxy\"}},\"determineAddress(address,address,string,string,string,address,uint96,address,bytes32)\":{\"params\":{\"baseURI\":\"The base URI of the ERC-1155 Pack proxy\",\"contractURI\":\"The contract URI of the ERC-1155 Pack proxy\",\"implicitModeProjectId\":\"The implicit mode project id\",\"implicitModeValidator\":\"The implicit mode validator address\",\"name\":\"The name of the ERC-1155 Pack proxy\",\"proxyOwner\":\"The owner of the ERC-1155 Pack proxy\",\"royaltyFeeNumerator\":\"The royalty fee numerator in basis points (e.g. 15% would be 1500)\",\"royaltyReceiver\":\"Address of who should be sent the royalty payment\",\"tokenOwner\":\"The owner of the ERC-1155 Pack implementation\"},\"returns\":{\"proxyAddr\":\"The address of the ERC-1155 Pack Proxy\"}}},\"version\":1},\"userdoc\":{\"events\":{\"ERC1155PackDeployed(address)\":{\"notice\":\"Event emitted when a new ERC-1155 Pack proxy contract is deployed.\"}},\"kind\":\"user\",\"methods\":{\"deploy(address,address,string,string,string,address,uint96,address,bytes32)\":{\"notice\":\"Creates an ERC-1155 Pack proxy.\"},\"determineAddress(address,address,string,string,string,address,uint96,address,bytes32)\":{\"notice\":\"Computes the address of a proxy instance.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/tokens/ERC1155/presets/pack/IERC1155PackFactory.sol\":\"IERC1155PackFactory\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"src/tokens/ERC1155/presets/pack/IERC1155PackFactory.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\ninterface IERC1155PackFactoryFunctions {\\n\\n /**\\n * Creates an ERC-1155 Pack proxy.\\n * @param proxyOwner The owner of the ERC-1155 Pack proxy\\n * @param tokenOwner The owner of the ERC-1155 Pack implementation\\n * @param name The name of the ERC-1155 Pack proxy\\n * @param baseURI The base URI of the ERC-1155 Pack proxy\\n * @param contractURI The contract URI of the ERC-1155 Pack proxy\\n * @param royaltyReceiver Address of who should be sent the royalty payment\\n * @param royaltyFeeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\\n * @param implicitModeValidator The implicit mode validator address\\n * @param implicitModeProjectId The implicit mode project id\\n * @return proxyAddr The address of the ERC-1155 Pack Proxy\\n */\\n function deploy(\\n address proxyOwner,\\n address tokenOwner,\\n string memory name,\\n string memory baseURI,\\n string memory contractURI,\\n address royaltyReceiver,\\n uint96 royaltyFeeNumerator,\\n address implicitModeValidator,\\n bytes32 implicitModeProjectId\\n ) external returns (address proxyAddr);\\n\\n /**\\n * Computes the address of a proxy instance.\\n * @param proxyOwner The owner of the ERC-1155 Pack proxy\\n * @param tokenOwner The owner of the ERC-1155 Pack implementation\\n * @param name The name of the ERC-1155 Pack proxy\\n * @param baseURI The base URI of the ERC-1155 Pack proxy\\n * @param contractURI The contract URI of the ERC-1155 Pack proxy\\n * @param royaltyReceiver Address of who should be sent the royalty payment\\n * @param royaltyFeeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\\n * @param implicitModeValidator The implicit mode validator address\\n * @param implicitModeProjectId The implicit mode project id\\n * @return proxyAddr The address of the ERC-1155 Pack Proxy\\n */\\n function determineAddress(\\n address proxyOwner,\\n address tokenOwner,\\n string memory name,\\n string memory baseURI,\\n string memory contractURI,\\n address royaltyReceiver,\\n uint96 royaltyFeeNumerator,\\n address implicitModeValidator,\\n bytes32 implicitModeProjectId\\n ) external returns (address proxyAddr);\\n\\n}\\n\\ninterface IERC1155PackFactorySignals {\\n\\n /**\\n * Event emitted when a new ERC-1155 Pack proxy contract is deployed.\\n * @param proxyAddr The address of the deployed proxy.\\n */\\n event ERC1155PackDeployed(address proxyAddr);\\n\\n}\\n\\ninterface IERC1155PackFactory is IERC1155PackFactoryFunctions, IERC1155PackFactorySignals { }\\n\",\"keccak256\":\"0x9574e4c8bbdebdbcc7dfe8f2313b9ef845f45a924e0e5d109e79b47a2be9beeb\",\"license\":\"Apache-2.0\"}},\"version\":1}", + "userdoc": { + "events": { + "ERC1155PackDeployed(address)": { + "notice": "Event emitted when a new ERC-1155 Pack proxy contract is deployed." + } + }, + "kind": "user", + "methods": { + "deploy(address,address,string,string,string,address,uint96,address,bytes32)": { + "notice": "Creates an ERC-1155 Pack proxy." + }, + "determineAddress(address,address,string,string,string,address,uint96,address,bytes32)": { + "notice": "Computes the address of a proxy instance." + } + }, + "version": 1 + } + }, + "IERC1155PackFactoryFunctions": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "proxyOwner", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenOwner", + "type": "address" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "baseURI", + "type": "string" + }, + { + "internalType": "string", + "name": "contractURI", + "type": "string" + }, + { + "internalType": "address", + "name": "royaltyReceiver", + "type": "address" + }, + { + "internalType": "uint96", + "name": "royaltyFeeNumerator", + "type": "uint96" + }, + { + "internalType": "address", + "name": "implicitModeValidator", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "implicitModeProjectId", + "type": "bytes32" + } + ], + "name": "deploy", + "outputs": [ + { + "internalType": "address", + "name": "proxyAddr", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "proxyOwner", + "type": "address" + }, + { + "internalType": "address", + "name": "tokenOwner", + "type": "address" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "baseURI", + "type": "string" + }, + { + "internalType": "string", + "name": "contractURI", + "type": "string" + }, + { + "internalType": "address", + "name": "royaltyReceiver", + "type": "address" + }, + { + "internalType": "uint96", + "name": "royaltyFeeNumerator", + "type": "uint96" + }, + { + "internalType": "address", + "name": "implicitModeValidator", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "implicitModeProjectId", + "type": "bytes32" + } + ], + "name": "determineAddress", + "outputs": [ + { + "internalType": "address", + "name": "proxyAddr", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "deploy(address,address,string,string,string,address,uint96,address,bytes32)": { + "params": { + "baseURI": "The base URI of the ERC-1155 Pack proxy", + "contractURI": "The contract URI of the ERC-1155 Pack proxy", + "implicitModeProjectId": "The implicit mode project id", + "implicitModeValidator": "The implicit mode validator address", + "name": "The name of the ERC-1155 Pack proxy", + "proxyOwner": "The owner of the ERC-1155 Pack proxy", + "royaltyFeeNumerator": "The royalty fee numerator in basis points (e.g. 15% would be 1500)", + "royaltyReceiver": "Address of who should be sent the royalty payment", + "tokenOwner": "The owner of the ERC-1155 Pack implementation" + }, + "returns": { + "proxyAddr": "The address of the ERC-1155 Pack Proxy" + } + }, + "determineAddress(address,address,string,string,string,address,uint96,address,bytes32)": { + "params": { + "baseURI": "The base URI of the ERC-1155 Pack proxy", + "contractURI": "The contract URI of the ERC-1155 Pack proxy", + "implicitModeProjectId": "The implicit mode project id", + "implicitModeValidator": "The implicit mode validator address", + "name": "The name of the ERC-1155 Pack proxy", + "proxyOwner": "The owner of the ERC-1155 Pack proxy", + "royaltyFeeNumerator": "The royalty fee numerator in basis points (e.g. 15% would be 1500)", + "royaltyReceiver": "Address of who should be sent the royalty payment", + "tokenOwner": "The owner of the ERC-1155 Pack implementation" + }, + "returns": { + "proxyAddr": "The address of the ERC-1155 Pack Proxy" + } + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "deploy(address,address,string,string,string,address,uint96,address,bytes32)": "59a347bd", + "determineAddress(address,address,string,string,string,address,uint96,address,bytes32)": "cfcc5941" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proxyOwner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenOwner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"baseURI\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"contractURI\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"royaltyReceiver\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"royaltyFeeNumerator\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"implicitModeValidator\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"implicitModeProjectId\",\"type\":\"bytes32\"}],\"name\":\"deploy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"proxyAddr\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proxyOwner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenOwner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"baseURI\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"contractURI\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"royaltyReceiver\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"royaltyFeeNumerator\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"implicitModeValidator\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"implicitModeProjectId\",\"type\":\"bytes32\"}],\"name\":\"determineAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"proxyAddr\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"deploy(address,address,string,string,string,address,uint96,address,bytes32)\":{\"params\":{\"baseURI\":\"The base URI of the ERC-1155 Pack proxy\",\"contractURI\":\"The contract URI of the ERC-1155 Pack proxy\",\"implicitModeProjectId\":\"The implicit mode project id\",\"implicitModeValidator\":\"The implicit mode validator address\",\"name\":\"The name of the ERC-1155 Pack proxy\",\"proxyOwner\":\"The owner of the ERC-1155 Pack proxy\",\"royaltyFeeNumerator\":\"The royalty fee numerator in basis points (e.g. 15% would be 1500)\",\"royaltyReceiver\":\"Address of who should be sent the royalty payment\",\"tokenOwner\":\"The owner of the ERC-1155 Pack implementation\"},\"returns\":{\"proxyAddr\":\"The address of the ERC-1155 Pack Proxy\"}},\"determineAddress(address,address,string,string,string,address,uint96,address,bytes32)\":{\"params\":{\"baseURI\":\"The base URI of the ERC-1155 Pack proxy\",\"contractURI\":\"The contract URI of the ERC-1155 Pack proxy\",\"implicitModeProjectId\":\"The implicit mode project id\",\"implicitModeValidator\":\"The implicit mode validator address\",\"name\":\"The name of the ERC-1155 Pack proxy\",\"proxyOwner\":\"The owner of the ERC-1155 Pack proxy\",\"royaltyFeeNumerator\":\"The royalty fee numerator in basis points (e.g. 15% would be 1500)\",\"royaltyReceiver\":\"Address of who should be sent the royalty payment\",\"tokenOwner\":\"The owner of the ERC-1155 Pack implementation\"},\"returns\":{\"proxyAddr\":\"The address of the ERC-1155 Pack Proxy\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deploy(address,address,string,string,string,address,uint96,address,bytes32)\":{\"notice\":\"Creates an ERC-1155 Pack proxy.\"},\"determineAddress(address,address,string,string,string,address,uint96,address,bytes32)\":{\"notice\":\"Computes the address of a proxy instance.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/tokens/ERC1155/presets/pack/IERC1155PackFactory.sol\":\"IERC1155PackFactoryFunctions\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"src/tokens/ERC1155/presets/pack/IERC1155PackFactory.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\ninterface IERC1155PackFactoryFunctions {\\n\\n /**\\n * Creates an ERC-1155 Pack proxy.\\n * @param proxyOwner The owner of the ERC-1155 Pack proxy\\n * @param tokenOwner The owner of the ERC-1155 Pack implementation\\n * @param name The name of the ERC-1155 Pack proxy\\n * @param baseURI The base URI of the ERC-1155 Pack proxy\\n * @param contractURI The contract URI of the ERC-1155 Pack proxy\\n * @param royaltyReceiver Address of who should be sent the royalty payment\\n * @param royaltyFeeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\\n * @param implicitModeValidator The implicit mode validator address\\n * @param implicitModeProjectId The implicit mode project id\\n * @return proxyAddr The address of the ERC-1155 Pack Proxy\\n */\\n function deploy(\\n address proxyOwner,\\n address tokenOwner,\\n string memory name,\\n string memory baseURI,\\n string memory contractURI,\\n address royaltyReceiver,\\n uint96 royaltyFeeNumerator,\\n address implicitModeValidator,\\n bytes32 implicitModeProjectId\\n ) external returns (address proxyAddr);\\n\\n /**\\n * Computes the address of a proxy instance.\\n * @param proxyOwner The owner of the ERC-1155 Pack proxy\\n * @param tokenOwner The owner of the ERC-1155 Pack implementation\\n * @param name The name of the ERC-1155 Pack proxy\\n * @param baseURI The base URI of the ERC-1155 Pack proxy\\n * @param contractURI The contract URI of the ERC-1155 Pack proxy\\n * @param royaltyReceiver Address of who should be sent the royalty payment\\n * @param royaltyFeeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\\n * @param implicitModeValidator The implicit mode validator address\\n * @param implicitModeProjectId The implicit mode project id\\n * @return proxyAddr The address of the ERC-1155 Pack Proxy\\n */\\n function determineAddress(\\n address proxyOwner,\\n address tokenOwner,\\n string memory name,\\n string memory baseURI,\\n string memory contractURI,\\n address royaltyReceiver,\\n uint96 royaltyFeeNumerator,\\n address implicitModeValidator,\\n bytes32 implicitModeProjectId\\n ) external returns (address proxyAddr);\\n\\n}\\n\\ninterface IERC1155PackFactorySignals {\\n\\n /**\\n * Event emitted when a new ERC-1155 Pack proxy contract is deployed.\\n * @param proxyAddr The address of the deployed proxy.\\n */\\n event ERC1155PackDeployed(address proxyAddr);\\n\\n}\\n\\ninterface IERC1155PackFactory is IERC1155PackFactoryFunctions, IERC1155PackFactorySignals { }\\n\",\"keccak256\":\"0x9574e4c8bbdebdbcc7dfe8f2313b9ef845f45a924e0e5d109e79b47a2be9beeb\",\"license\":\"Apache-2.0\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": { + "deploy(address,address,string,string,string,address,uint96,address,bytes32)": { + "notice": "Creates an ERC-1155 Pack proxy." + }, + "determineAddress(address,address,string,string,string,address,uint96,address,bytes32)": { + "notice": "Computes the address of a proxy instance." + } + }, + "version": 1 + } + }, + "IERC1155PackFactorySignals": { + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "proxyAddr", + "type": "address" + } + ], + "name": "ERC1155PackDeployed", + "type": "event" + } + ], + "devdoc": { + "events": { + "ERC1155PackDeployed(address)": { + "params": { + "proxyAddr": "The address of the deployed proxy." + } + } + }, + "kind": "dev", + "methods": {}, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"proxyAddr\",\"type\":\"address\"}],\"name\":\"ERC1155PackDeployed\",\"type\":\"event\"}],\"devdoc\":{\"events\":{\"ERC1155PackDeployed(address)\":{\"params\":{\"proxyAddr\":\"The address of the deployed proxy.\"}}},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"events\":{\"ERC1155PackDeployed(address)\":{\"notice\":\"Event emitted when a new ERC-1155 Pack proxy contract is deployed.\"}},\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/tokens/ERC1155/presets/pack/IERC1155PackFactory.sol\":\"IERC1155PackFactorySignals\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"src/tokens/ERC1155/presets/pack/IERC1155PackFactory.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\ninterface IERC1155PackFactoryFunctions {\\n\\n /**\\n * Creates an ERC-1155 Pack proxy.\\n * @param proxyOwner The owner of the ERC-1155 Pack proxy\\n * @param tokenOwner The owner of the ERC-1155 Pack implementation\\n * @param name The name of the ERC-1155 Pack proxy\\n * @param baseURI The base URI of the ERC-1155 Pack proxy\\n * @param contractURI The contract URI of the ERC-1155 Pack proxy\\n * @param royaltyReceiver Address of who should be sent the royalty payment\\n * @param royaltyFeeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\\n * @param implicitModeValidator The implicit mode validator address\\n * @param implicitModeProjectId The implicit mode project id\\n * @return proxyAddr The address of the ERC-1155 Pack Proxy\\n */\\n function deploy(\\n address proxyOwner,\\n address tokenOwner,\\n string memory name,\\n string memory baseURI,\\n string memory contractURI,\\n address royaltyReceiver,\\n uint96 royaltyFeeNumerator,\\n address implicitModeValidator,\\n bytes32 implicitModeProjectId\\n ) external returns (address proxyAddr);\\n\\n /**\\n * Computes the address of a proxy instance.\\n * @param proxyOwner The owner of the ERC-1155 Pack proxy\\n * @param tokenOwner The owner of the ERC-1155 Pack implementation\\n * @param name The name of the ERC-1155 Pack proxy\\n * @param baseURI The base URI of the ERC-1155 Pack proxy\\n * @param contractURI The contract URI of the ERC-1155 Pack proxy\\n * @param royaltyReceiver Address of who should be sent the royalty payment\\n * @param royaltyFeeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\\n * @param implicitModeValidator The implicit mode validator address\\n * @param implicitModeProjectId The implicit mode project id\\n * @return proxyAddr The address of the ERC-1155 Pack Proxy\\n */\\n function determineAddress(\\n address proxyOwner,\\n address tokenOwner,\\n string memory name,\\n string memory baseURI,\\n string memory contractURI,\\n address royaltyReceiver,\\n uint96 royaltyFeeNumerator,\\n address implicitModeValidator,\\n bytes32 implicitModeProjectId\\n ) external returns (address proxyAddr);\\n\\n}\\n\\ninterface IERC1155PackFactorySignals {\\n\\n /**\\n * Event emitted when a new ERC-1155 Pack proxy contract is deployed.\\n * @param proxyAddr The address of the deployed proxy.\\n */\\n event ERC1155PackDeployed(address proxyAddr);\\n\\n}\\n\\ninterface IERC1155PackFactory is IERC1155PackFactoryFunctions, IERC1155PackFactorySignals { }\\n\",\"keccak256\":\"0x9574e4c8bbdebdbcc7dfe8f2313b9ef845f45a924e0e5d109e79b47a2be9beeb\",\"license\":\"Apache-2.0\"}},\"version\":1}", + "userdoc": { + "events": { + "ERC1155PackDeployed(address)": { + "notice": "Event emitted when a new ERC-1155 Pack proxy contract is deployed." + } + }, + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "src/tokens/ERC721/presets/items/IERC721Items.sol": { + "IERC721Items": { + "abi": [ + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "mintSequential", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "totalSupply", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "mint(address,uint256)": { + "params": { + "to": "Address to mint tokens to.", + "tokenId": "Token id to mint." + } + }, + "mintSequential(address,uint256)": { + "params": { + "amount": "Amount of tokens to mint.", + "to": "Address to mint token to." + } + }, + "totalSupply()": { + "returns": { + "totalSupply": "The total supply of tokens." + } + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "mint(address,uint256)": "40c10f19", + "mintSequential(address,uint256)": "2e73e0fd", + "totalSupply()": "18160ddd" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mintSequential\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"totalSupply\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"mint(address,uint256)\":{\"params\":{\"to\":\"Address to mint tokens to.\",\"tokenId\":\"Token id to mint.\"}},\"mintSequential(address,uint256)\":{\"params\":{\"amount\":\"Amount of tokens to mint.\",\"to\":\"Address to mint token to.\"}},\"totalSupply()\":{\"returns\":{\"totalSupply\":\"The total supply of tokens.\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"InvalidInitialization()\":[{\"notice\":\"Invalid initialization error.\"}]},\"kind\":\"user\",\"methods\":{\"mint(address,uint256)\":{\"notice\":\"Mint tokens.\"},\"mintSequential(address,uint256)\":{\"notice\":\"Mint a sequential token.\"},\"totalSupply()\":{\"notice\":\"Get the total supply of tokens.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/tokens/ERC721/presets/items/IERC721Items.sol\":\"IERC721Items\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"src/tokens/ERC721/presets/items/IERC721Items.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\ninterface IERC721ItemsFunctions {\\n\\n /**\\n * Mint tokens.\\n * @param to Address to mint tokens to.\\n * @param tokenId Token id to mint.\\n */\\n function mint(address to, uint256 tokenId) external;\\n\\n /**\\n * Mint a sequential token.\\n * @param to Address to mint token to.\\n * @param amount Amount of tokens to mint.\\n */\\n function mintSequential(address to, uint256 amount) external;\\n\\n /**\\n * Get the total supply of tokens.\\n * @return totalSupply The total supply of tokens.\\n */\\n function totalSupply() external view returns (uint256 totalSupply);\\n\\n}\\n\\ninterface IERC721ItemsSignals {\\n\\n /**\\n * Invalid initialization error.\\n */\\n error InvalidInitialization();\\n\\n}\\n\\ninterface IERC721Items is IERC721ItemsFunctions, IERC721ItemsSignals { }\\n\",\"keccak256\":\"0x3170e3d97e03d070d03c50cbe5a77ea84209bb8e2bcff3bd8fc55b88cc7f2ba1\",\"license\":\"Apache-2.0\"}},\"version\":1}", + "userdoc": { + "errors": { + "InvalidInitialization()": [ + { + "notice": "Invalid initialization error." + } + ] + }, + "kind": "user", + "methods": { + "mint(address,uint256)": { + "notice": "Mint tokens." + }, + "mintSequential(address,uint256)": { + "notice": "Mint a sequential token." + }, + "totalSupply()": { + "notice": "Get the total supply of tokens." + } + }, + "version": 1 + } + }, + "IERC721ItemsFunctions": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "mintSequential", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "totalSupply", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "mint(address,uint256)": { + "params": { + "to": "Address to mint tokens to.", + "tokenId": "Token id to mint." + } + }, + "mintSequential(address,uint256)": { + "params": { + "amount": "Amount of tokens to mint.", + "to": "Address to mint token to." + } + }, + "totalSupply()": { + "returns": { + "totalSupply": "The total supply of tokens." + } + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "mint(address,uint256)": "40c10f19", + "mintSequential(address,uint256)": "2e73e0fd", + "totalSupply()": "18160ddd" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mintSequential\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"totalSupply\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"mint(address,uint256)\":{\"params\":{\"to\":\"Address to mint tokens to.\",\"tokenId\":\"Token id to mint.\"}},\"mintSequential(address,uint256)\":{\"params\":{\"amount\":\"Amount of tokens to mint.\",\"to\":\"Address to mint token to.\"}},\"totalSupply()\":{\"returns\":{\"totalSupply\":\"The total supply of tokens.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"mint(address,uint256)\":{\"notice\":\"Mint tokens.\"},\"mintSequential(address,uint256)\":{\"notice\":\"Mint a sequential token.\"},\"totalSupply()\":{\"notice\":\"Get the total supply of tokens.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/tokens/ERC721/presets/items/IERC721Items.sol\":\"IERC721ItemsFunctions\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"src/tokens/ERC721/presets/items/IERC721Items.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\ninterface IERC721ItemsFunctions {\\n\\n /**\\n * Mint tokens.\\n * @param to Address to mint tokens to.\\n * @param tokenId Token id to mint.\\n */\\n function mint(address to, uint256 tokenId) external;\\n\\n /**\\n * Mint a sequential token.\\n * @param to Address to mint token to.\\n * @param amount Amount of tokens to mint.\\n */\\n function mintSequential(address to, uint256 amount) external;\\n\\n /**\\n * Get the total supply of tokens.\\n * @return totalSupply The total supply of tokens.\\n */\\n function totalSupply() external view returns (uint256 totalSupply);\\n\\n}\\n\\ninterface IERC721ItemsSignals {\\n\\n /**\\n * Invalid initialization error.\\n */\\n error InvalidInitialization();\\n\\n}\\n\\ninterface IERC721Items is IERC721ItemsFunctions, IERC721ItemsSignals { }\\n\",\"keccak256\":\"0x3170e3d97e03d070d03c50cbe5a77ea84209bb8e2bcff3bd8fc55b88cc7f2ba1\",\"license\":\"Apache-2.0\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": { + "mint(address,uint256)": { + "notice": "Mint tokens." + }, + "mintSequential(address,uint256)": { + "notice": "Mint a sequential token." + }, + "totalSupply()": { + "notice": "Get the total supply of tokens." + } + }, + "version": 1 + } + }, + "IERC721ItemsSignals": { + "abi": [ + { + "inputs": [], + "name": "InvalidInitialization", + "type": "error" + } + ], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"errors\":{\"InvalidInitialization()\":[{\"notice\":\"Invalid initialization error.\"}]},\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/tokens/ERC721/presets/items/IERC721Items.sol\":\"IERC721ItemsSignals\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"src/tokens/ERC721/presets/items/IERC721Items.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\ninterface IERC721ItemsFunctions {\\n\\n /**\\n * Mint tokens.\\n * @param to Address to mint tokens to.\\n * @param tokenId Token id to mint.\\n */\\n function mint(address to, uint256 tokenId) external;\\n\\n /**\\n * Mint a sequential token.\\n * @param to Address to mint token to.\\n * @param amount Amount of tokens to mint.\\n */\\n function mintSequential(address to, uint256 amount) external;\\n\\n /**\\n * Get the total supply of tokens.\\n * @return totalSupply The total supply of tokens.\\n */\\n function totalSupply() external view returns (uint256 totalSupply);\\n\\n}\\n\\ninterface IERC721ItemsSignals {\\n\\n /**\\n * Invalid initialization error.\\n */\\n error InvalidInitialization();\\n\\n}\\n\\ninterface IERC721Items is IERC721ItemsFunctions, IERC721ItemsSignals { }\\n\",\"keccak256\":\"0x3170e3d97e03d070d03c50cbe5a77ea84209bb8e2bcff3bd8fc55b88cc7f2ba1\",\"license\":\"Apache-2.0\"}},\"version\":1}", + "userdoc": { + "errors": { + "InvalidInitialization()": [ + { + "notice": "Invalid initialization error." + } + ] + }, + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "src/tokens/common/ERC2981Controlled.sol": { + "ERC2981Controlled": { + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "salePrice", + "type": "uint256" + } + ], + "name": "royaltyInfo", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "uint96", + "name": "feeNumerator", + "type": "uint96" + } + ], + "name": "setDefaultRoyalty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "uint96", + "name": "feeNumerator", + "type": "uint96" + } + ], + "name": "setTokenRoyalty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "events": { + "RoleAdminChanged(bytes32,bytes32,bytes32)": { + "details": "Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this. _Available since v3.1._" + }, + "RoleGranted(bytes32,address,address)": { + "details": "Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}." + }, + "RoleRevoked(bytes32,address,address)": { + "details": "Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)" + } + }, + "kind": "dev", + "methods": { + "getRoleAdmin(bytes32)": { + "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}." + }, + "getRoleMember(bytes32,uint256)": { + "details": "Returns one of the accounts that have `role`. `index` must be a value between 0 and {getRoleMemberCount}, non-inclusive. Role bearers are not sorted in any particular way, and their ordering may change at any point. WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure you perform all queries on the same block. See the following https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] for more information." + }, + "getRoleMemberCount(bytes32)": { + "details": "Returns the number of accounts that have `role`. Can be used together with {getRoleMember} to enumerate all bearers of a role." + }, + "grantRole(bytes32,address)": { + "details": "Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event." + }, + "hasRole(bytes32,address)": { + "details": "Returns `true` if `account` has been granted `role`." + }, + "renounceRole(bytes32,address)": { + "details": "Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event." + }, + "revokeRole(bytes32,address)": { + "details": "Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event." + }, + "royaltyInfo(uint256,uint256)": { + "details": "Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of exchange. The royalty amount is denominated and should be paid in that same unit of exchange." + }, + "setDefaultRoyalty(address,uint96)": { + "params": { + "feeNumerator": "The royalty fee numerator in basis points (e.g. 15% would be 1500)", + "receiver": "Address of who should be sent the royalty payment" + } + }, + "setTokenRoyalty(uint256,address,uint96)": { + "params": { + "feeNumerator": "The royalty fee numerator in basis points (e.g. 15% would be 1500)", + "receiver": "Address of who should be sent the royalty payment", + "tokenId": "The token id to set the royalty information for" + } + }, + "supportsInterface(bytes4)": { + "params": { + "interfaceId": "Interface id" + }, + "returns": { + "_0": "True if supported" + } + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "DEFAULT_ADMIN_ROLE()": "a217fddf", + "getRoleAdmin(bytes32)": "248a9ca3", + "getRoleMember(bytes32,uint256)": "9010d07c", + "getRoleMemberCount(bytes32)": "ca15c873", + "grantRole(bytes32,address)": "2f2ff15d", + "hasRole(bytes32,address)": "91d14854", + "renounceRole(bytes32,address)": "36568abe", + "revokeRole(bytes32,address)": "d547741f", + "royaltyInfo(uint256,uint256)": "2a55205a", + "setDefaultRoyalty(address,uint96)": "04634d8d", + "setTokenRoyalty(uint256,address,uint96)": "5944c753", + "supportsInterface(bytes4)": "01ffc9a7" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"getRoleMember\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleMemberCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"salePrice\",\"type\":\"uint256\"}],\"name\":\"royaltyInfo\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"feeNumerator\",\"type\":\"uint96\"}],\"name\":\"setDefaultRoyalty\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"feeNumerator\",\"type\":\"uint96\"}],\"name\":\"setTokenRoyalty\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this. _Available since v3.1._\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"getRoleMember(bytes32,uint256)\":{\"details\":\"Returns one of the accounts that have `role`. `index` must be a value between 0 and {getRoleMemberCount}, non-inclusive. Role bearers are not sorted in any particular way, and their ordering may change at any point. WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure you perform all queries on the same block. See the following https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] for more information.\"},\"getRoleMemberCount(bytes32)\":{\"details\":\"Returns the number of accounts that have `role`. Can be used together with {getRoleMember} to enumerate all bearers of a role.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"royaltyInfo(uint256,uint256)\":{\"details\":\"Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of exchange. The royalty amount is denominated and should be paid in that same unit of exchange.\"},\"setDefaultRoyalty(address,uint96)\":{\"params\":{\"feeNumerator\":\"The royalty fee numerator in basis points (e.g. 15% would be 1500)\",\"receiver\":\"Address of who should be sent the royalty payment\"}},\"setTokenRoyalty(uint256,address,uint96)\":{\"params\":{\"feeNumerator\":\"The royalty fee numerator in basis points (e.g. 15% would be 1500)\",\"receiver\":\"Address of who should be sent the royalty payment\",\"tokenId\":\"The token id to set the royalty information for\"}},\"supportsInterface(bytes4)\":{\"params\":{\"interfaceId\":\"Interface id\"},\"returns\":{\"_0\":\"True if supported\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"setDefaultRoyalty(address,uint96)\":{\"notice\":\"Sets the royalty information that all ids in this contract will default to.\"},\"setTokenRoyalty(uint256,address,uint96)\":{\"notice\":\"Sets the royalty information that a given token id in this contract will use.This overrides the default royalty information for this token id\"},\"supportsInterface(bytes4)\":{\"notice\":\"Check interface support.\"}},\"notice\":\"An implementation of ERC-2981 that allows updates by roles.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/tokens/common/ERC2981Controlled.sol\":\"ERC2981Controlled\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Strings.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```solidity\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```solidity\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}\\n * to enforce additional security measures for this role.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n * Overriding this function changes the behavior of the {onlyRole} modifier.\\n *\\n * Format of the revert message is described in {_checkRole}.\\n *\\n * _Available since v4.6._\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n Strings.toHexString(account),\\n \\\" is missing role \\\",\\n Strings.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * May emit a {RoleGranted} event.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n}\\n\",\"keccak256\":\"0x0dd6e52cb394d7f5abe5dca2d4908a6be40417914720932de757de34a99ab87f\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/access/AccessControlEnumerable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControlEnumerable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControlEnumerable.sol\\\";\\nimport \\\"./AccessControl.sol\\\";\\nimport \\\"../utils/structs/EnumerableSet.sol\\\";\\n\\n/**\\n * @dev Extension of {AccessControl} that allows enumerating the members of each role.\\n */\\nabstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl {\\n using EnumerableSet for EnumerableSet.AddressSet;\\n\\n mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers;\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns one of the accounts that have `role`. `index` must be a\\n * value between 0 and {getRoleMemberCount}, non-inclusive.\\n *\\n * Role bearers are not sorted in any particular way, and their ordering may\\n * change at any point.\\n *\\n * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure\\n * you perform all queries on the same block. See the following\\n * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]\\n * for more information.\\n */\\n function getRoleMember(bytes32 role, uint256 index) public view virtual override returns (address) {\\n return _roleMembers[role].at(index);\\n }\\n\\n /**\\n * @dev Returns the number of accounts that have `role`. Can be used\\n * together with {getRoleMember} to enumerate all bearers of a role.\\n */\\n function getRoleMemberCount(bytes32 role) public view virtual override returns (uint256) {\\n return _roleMembers[role].length();\\n }\\n\\n /**\\n * @dev Overload {_grantRole} to track enumerable memberships\\n */\\n function _grantRole(bytes32 role, address account) internal virtual override {\\n super._grantRole(role, account);\\n _roleMembers[role].add(account);\\n }\\n\\n /**\\n * @dev Overload {_revokeRole} to track enumerable memberships\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual override {\\n super._revokeRole(role, account);\\n _roleMembers[role].remove(account);\\n }\\n}\\n\",\"keccak256\":\"0x13f5e15f2a0650c0b6aaee2ef19e89eaf4870d6e79662d572a393334c1397247\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/access/IAccessControlEnumerable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControlEnumerable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\n\\n/**\\n * @dev External interface of AccessControlEnumerable declared to support ERC165 detection.\\n */\\ninterface IAccessControlEnumerable is IAccessControl {\\n /**\\n * @dev Returns one of the accounts that have `role`. `index` must be a\\n * value between 0 and {getRoleMemberCount}, non-inclusive.\\n *\\n * Role bearers are not sorted in any particular way, and their ordering may\\n * change at any point.\\n *\\n * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure\\n * you perform all queries on the same block. See the following\\n * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]\\n * for more information.\\n */\\n function getRoleMember(bytes32 role, uint256 index) external view returns (address);\\n\\n /**\\n * @dev Returns the number of accounts that have `role`. Can be used\\n * together with {getRoleMember} to enumerate all bearers of a role.\\n */\\n function getRoleMemberCount(bytes32 role) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0xba4459ab871dfa300f5212c6c30178b63898c03533a1ede28436f11546626676\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/interfaces/IERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC2981.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Interface for the NFT Royalty Standard.\\n *\\n * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal\\n * support for royalty payments across all NFT marketplaces and ecosystem participants.\\n *\\n * _Available since v4.5._\\n */\\ninterface IERC2981 is IERC165 {\\n /**\\n * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of\\n * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.\\n */\\n function royaltyInfo(\\n uint256 tokenId,\\n uint256 salePrice\\n ) external view returns (address receiver, uint256 royaltyAmount);\\n}\\n\",\"keccak256\":\"0x3976825a61df20457730b79ad0ac9c8908e3c7978ed9bf090c67137c91256b5c\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/token/common/ERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/common/ERC2981.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/IERC2981.sol\\\";\\nimport \\\"../../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.\\n *\\n * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for\\n * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.\\n *\\n * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the\\n * fee is specified in basis points by default.\\n *\\n * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See\\n * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to\\n * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.\\n *\\n * _Available since v4.5._\\n */\\nabstract contract ERC2981 is IERC2981, ERC165 {\\n struct RoyaltyInfo {\\n address receiver;\\n uint96 royaltyFraction;\\n }\\n\\n RoyaltyInfo private _defaultRoyaltyInfo;\\n mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\\n return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @inheritdoc IERC2981\\n */\\n function royaltyInfo(uint256 tokenId, uint256 salePrice) public view virtual override returns (address, uint256) {\\n RoyaltyInfo memory royalty = _tokenRoyaltyInfo[tokenId];\\n\\n if (royalty.receiver == address(0)) {\\n royalty = _defaultRoyaltyInfo;\\n }\\n\\n uint256 royaltyAmount = (salePrice * royalty.royaltyFraction) / _feeDenominator();\\n\\n return (royalty.receiver, royaltyAmount);\\n }\\n\\n /**\\n * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a\\n * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an\\n * override.\\n */\\n function _feeDenominator() internal pure virtual returns (uint96) {\\n return 10000;\\n }\\n\\n /**\\n * @dev Sets the royalty information that all ids in this contract will default to.\\n *\\n * Requirements:\\n *\\n * - `receiver` cannot be the zero address.\\n * - `feeNumerator` cannot be greater than the fee denominator.\\n */\\n function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {\\n require(feeNumerator <= _feeDenominator(), \\\"ERC2981: royalty fee will exceed salePrice\\\");\\n require(receiver != address(0), \\\"ERC2981: invalid receiver\\\");\\n\\n _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);\\n }\\n\\n /**\\n * @dev Removes default royalty information.\\n */\\n function _deleteDefaultRoyalty() internal virtual {\\n delete _defaultRoyaltyInfo;\\n }\\n\\n /**\\n * @dev Sets the royalty information for a specific token id, overriding the global default.\\n *\\n * Requirements:\\n *\\n * - `receiver` cannot be the zero address.\\n * - `feeNumerator` cannot be greater than the fee denominator.\\n */\\n function _setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal virtual {\\n require(feeNumerator <= _feeDenominator(), \\\"ERC2981: royalty fee will exceed salePrice\\\");\\n require(receiver != address(0), \\\"ERC2981: Invalid parameters\\\");\\n\\n _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);\\n }\\n\\n /**\\n * @dev Resets royalty information for the token id back to the global default.\\n */\\n function _resetTokenRoyalty(uint256 tokenId) internal virtual {\\n delete _tokenRoyaltyInfo[tokenId];\\n }\\n}\\n\",\"keccak256\":\"0x990a4133f88b07f92724903f42bb25cdaeca0cf255fb48df26568c40e7c919c6\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\nimport \\\"./math/SignedMath.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\\n */\\n function toString(int256 value) internal pure returns (string memory) {\\n return string(abi.encodePacked(value < 0 ? \\\"-\\\" : \\\"\\\", toString(SignedMath.abs(value))));\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n\\n /**\\n * @dev Returns true if the two strings are equal.\\n */\\n function equal(string memory a, string memory b) internal pure returns (bool) {\\n return keccak256(bytes(a)) == keccak256(bytes(b));\\n }\\n}\\n\",\"keccak256\":\"0x3088eb2868e8d13d89d16670b5f8612c4ab9ff8956272837d8e90106c59c14a0\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\\n // The surrounding unchecked block does not change this fact.\\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1, \\\"Math: mulDiv overflow\\\");\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10 ** 64) {\\n value /= 10 ** 64;\\n result += 64;\\n }\\n if (value >= 10 ** 32) {\\n value /= 10 ** 32;\\n result += 32;\\n }\\n if (value >= 10 ** 16) {\\n value /= 10 ** 16;\\n result += 16;\\n }\\n if (value >= 10 ** 8) {\\n value /= 10 ** 8;\\n result += 8;\\n }\\n if (value >= 10 ** 4) {\\n value /= 10 ** 4;\\n result += 4;\\n }\\n if (value >= 10 ** 2) {\\n value /= 10 ** 2;\\n result += 2;\\n }\\n if (value >= 10 ** 1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard signed math utilities missing in the Solidity language.\\n */\\nlibrary SignedMath {\\n /**\\n * @dev Returns the largest of two signed numbers.\\n */\\n function max(int256 a, int256 b) internal pure returns (int256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two signed numbers.\\n */\\n function min(int256 a, int256 b) internal pure returns (int256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two signed numbers without overflow.\\n * The result is rounded towards zero.\\n */\\n function average(int256 a, int256 b) internal pure returns (int256) {\\n // Formula from the book \\\"Hacker's Delight\\\"\\n int256 x = (a & b) + ((a ^ b) >> 1);\\n return x + (int256(uint256(x) >> 255) & (a ^ b));\\n }\\n\\n /**\\n * @dev Returns the absolute unsigned value of a signed value.\\n */\\n function abs(int256 n) internal pure returns (uint256) {\\n unchecked {\\n // must be unchecked in order to support `n = type(int256).min`\\n return uint256(n >= 0 ? n : -n);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/EnumerableSet.sol)\\n// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for managing\\n * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive\\n * types.\\n *\\n * Sets have the following properties:\\n *\\n * - Elements are added, removed, and checked for existence in constant time\\n * (O(1)).\\n * - Elements are enumerated in O(n). No guarantees are made on the ordering.\\n *\\n * ```solidity\\n * contract Example {\\n * // Add the library methods\\n * using EnumerableSet for EnumerableSet.AddressSet;\\n *\\n * // Declare a set state variable\\n * EnumerableSet.AddressSet private mySet;\\n * }\\n * ```\\n *\\n * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)\\n * and `uint256` (`UintSet`) are supported.\\n *\\n * [WARNING]\\n * ====\\n * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure\\n * unusable.\\n * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.\\n *\\n * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an\\n * array of EnumerableSet.\\n * ====\\n */\\nlibrary EnumerableSet {\\n // To implement this library for multiple types with as little code\\n // repetition as possible, we write it in terms of a generic Set type with\\n // bytes32 values.\\n // The Set implementation uses private functions, and user-facing\\n // implementations (such as AddressSet) are just wrappers around the\\n // underlying Set.\\n // This means that we can only create new EnumerableSets for types that fit\\n // in bytes32.\\n\\n struct Set {\\n // Storage of set values\\n bytes32[] _values;\\n // Position of the value in the `values` array, plus 1 because index 0\\n // means a value is not in the set.\\n mapping(bytes32 => uint256) _indexes;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function _add(Set storage set, bytes32 value) private returns (bool) {\\n if (!_contains(set, value)) {\\n set._values.push(value);\\n // The value is stored at length-1, but we add 1 to all indexes\\n // and use 0 as a sentinel value\\n set._indexes[value] = set._values.length;\\n return true;\\n } else {\\n return false;\\n }\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function _remove(Set storage set, bytes32 value) private returns (bool) {\\n // We read and store the value's index to prevent multiple reads from the same storage slot\\n uint256 valueIndex = set._indexes[value];\\n\\n if (valueIndex != 0) {\\n // Equivalent to contains(set, value)\\n // To delete an element from the _values array in O(1), we swap the element to delete with the last one in\\n // the array, and then remove the last element (sometimes called as 'swap and pop').\\n // This modifies the order of the array, as noted in {at}.\\n\\n uint256 toDeleteIndex = valueIndex - 1;\\n uint256 lastIndex = set._values.length - 1;\\n\\n if (lastIndex != toDeleteIndex) {\\n bytes32 lastValue = set._values[lastIndex];\\n\\n // Move the last value to the index where the value to delete is\\n set._values[toDeleteIndex] = lastValue;\\n // Update the index for the moved value\\n set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex\\n }\\n\\n // Delete the slot where the moved value was stored\\n set._values.pop();\\n\\n // Delete the index for the deleted slot\\n delete set._indexes[value];\\n\\n return true;\\n } else {\\n return false;\\n }\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function _contains(Set storage set, bytes32 value) private view returns (bool) {\\n return set._indexes[value] != 0;\\n }\\n\\n /**\\n * @dev Returns the number of values on the set. O(1).\\n */\\n function _length(Set storage set) private view returns (uint256) {\\n return set._values.length;\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function _at(Set storage set, uint256 index) private view returns (bytes32) {\\n return set._values[index];\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function _values(Set storage set) private view returns (bytes32[] memory) {\\n return set._values;\\n }\\n\\n // Bytes32Set\\n\\n struct Bytes32Set {\\n Set _inner;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {\\n return _add(set._inner, value);\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {\\n return _remove(set._inner, value);\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {\\n return _contains(set._inner, value);\\n }\\n\\n /**\\n * @dev Returns the number of values in the set. O(1).\\n */\\n function length(Bytes32Set storage set) internal view returns (uint256) {\\n return _length(set._inner);\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {\\n return _at(set._inner, index);\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {\\n bytes32[] memory store = _values(set._inner);\\n bytes32[] memory result;\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := store\\n }\\n\\n return result;\\n }\\n\\n // AddressSet\\n\\n struct AddressSet {\\n Set _inner;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function add(AddressSet storage set, address value) internal returns (bool) {\\n return _add(set._inner, bytes32(uint256(uint160(value))));\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function remove(AddressSet storage set, address value) internal returns (bool) {\\n return _remove(set._inner, bytes32(uint256(uint160(value))));\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function contains(AddressSet storage set, address value) internal view returns (bool) {\\n return _contains(set._inner, bytes32(uint256(uint160(value))));\\n }\\n\\n /**\\n * @dev Returns the number of values in the set. O(1).\\n */\\n function length(AddressSet storage set) internal view returns (uint256) {\\n return _length(set._inner);\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function at(AddressSet storage set, uint256 index) internal view returns (address) {\\n return address(uint160(uint256(_at(set._inner, index))));\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function values(AddressSet storage set) internal view returns (address[] memory) {\\n bytes32[] memory store = _values(set._inner);\\n address[] memory result;\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := store\\n }\\n\\n return result;\\n }\\n\\n // UintSet\\n\\n struct UintSet {\\n Set _inner;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function add(UintSet storage set, uint256 value) internal returns (bool) {\\n return _add(set._inner, bytes32(value));\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function remove(UintSet storage set, uint256 value) internal returns (bool) {\\n return _remove(set._inner, bytes32(value));\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function contains(UintSet storage set, uint256 value) internal view returns (bool) {\\n return _contains(set._inner, bytes32(value));\\n }\\n\\n /**\\n * @dev Returns the number of values in the set. O(1).\\n */\\n function length(UintSet storage set) internal view returns (uint256) {\\n return _length(set._inner);\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function at(UintSet storage set, uint256 index) internal view returns (uint256) {\\n return uint256(_at(set._inner, index));\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function values(UintSet storage set) internal view returns (uint256[] memory) {\\n bytes32[] memory store = _values(set._inner);\\n uint256[] memory result;\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := store\\n }\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0x9f4357008a8f7d8c8bf5d48902e789637538d8c016be5766610901b4bba81514\",\"license\":\"MIT\"},\"src/tokens/common/ERC2981Controlled.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\nimport { IERC2981Controlled } from \\\"./IERC2981Controlled.sol\\\";\\n\\nimport { AccessControlEnumerable } from \\\"openzeppelin-contracts/contracts/access/AccessControlEnumerable.sol\\\";\\nimport { ERC2981 } from \\\"openzeppelin-contracts/contracts/token/common/ERC2981.sol\\\";\\n\\n/**\\n * An implementation of ERC-2981 that allows updates by roles.\\n */\\nabstract contract ERC2981Controlled is ERC2981, AccessControlEnumerable, IERC2981Controlled {\\n\\n bytes32 internal constant ROYALTY_ADMIN_ROLE = keccak256(\\\"ROYALTY_ADMIN_ROLE\\\");\\n\\n //\\n // Royalty\\n //\\n\\n /**\\n * Sets the royalty information that all ids in this contract will default to.\\n * @param receiver Address of who should be sent the royalty payment\\n * @param feeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\\n */\\n function setDefaultRoyalty(address receiver, uint96 feeNumerator) external onlyRole(ROYALTY_ADMIN_ROLE) {\\n _setDefaultRoyalty(receiver, feeNumerator);\\n }\\n\\n /**\\n * Sets the royalty information that a given token id in this contract will use.\\n * @param tokenId The token id to set the royalty information for\\n * @param receiver Address of who should be sent the royalty payment\\n * @param feeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\\n * @notice This overrides the default royalty information for this token id\\n */\\n function setTokenRoyalty(\\n uint256 tokenId,\\n address receiver,\\n uint96 feeNumerator\\n ) external onlyRole(ROYALTY_ADMIN_ROLE) {\\n _setTokenRoyalty(tokenId, receiver, feeNumerator);\\n }\\n\\n //\\n // Views\\n //\\n\\n /**\\n * Check interface support.\\n * @param interfaceId Interface id\\n * @return True if supported\\n */\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view virtual override(ERC2981, AccessControlEnumerable) returns (bool) {\\n return ERC2981.supportsInterface(interfaceId) || AccessControlEnumerable.supportsInterface(interfaceId)\\n || type(IERC2981Controlled).interfaceId == interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n}\\n\",\"keccak256\":\"0xf02124d449f7dc76b4b1a26d9b1728d42facfc5f84771e73352e2b0c4b6c566b\",\"license\":\"Apache-2.0\"},\"src/tokens/common/IERC2981Controlled.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\ninterface IERC2981ControlledFunctions {\\n\\n /**\\n * Sets the royalty information that all ids in this contract will default to.\\n * @param receiver Address of who should be sent the royalty payment\\n * @param feeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\\n */\\n function setDefaultRoyalty(address receiver, uint96 feeNumerator) external;\\n\\n /**\\n * Sets the royalty information that a given token id in this contract will use.\\n * @param tokenId The token id to set the royalty information for\\n * @param receiver Address of who should be sent the royalty payment\\n * @param feeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\\n * @notice This overrides the default royalty information for this token id\\n */\\n function setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) external;\\n\\n}\\n\\ninterface IERC2981Controlled is IERC2981ControlledFunctions { }\\n\",\"keccak256\":\"0x65d66b30719fb4161fc4ef666794f8dcb7660528bdff9bf126b12999fac79ee0\",\"license\":\"Apache-2.0\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": { + "setDefaultRoyalty(address,uint96)": { + "notice": "Sets the royalty information that all ids in this contract will default to." + }, + "setTokenRoyalty(uint256,address,uint96)": { + "notice": "Sets the royalty information that a given token id in this contract will use.This overrides the default royalty information for this token id" + }, + "supportsInterface(bytes4)": { + "notice": "Check interface support." + } + }, + "notice": "An implementation of ERC-2981 that allows updates by roles.", + "version": 1 + } + } + }, + "src/tokens/common/IERC2981Controlled.sol": { + "IERC2981Controlled": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "uint96", + "name": "feeNumerator", + "type": "uint96" + } + ], + "name": "setDefaultRoyalty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "uint96", + "name": "feeNumerator", + "type": "uint96" + } + ], + "name": "setTokenRoyalty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "setDefaultRoyalty(address,uint96)": { + "params": { + "feeNumerator": "The royalty fee numerator in basis points (e.g. 15% would be 1500)", + "receiver": "Address of who should be sent the royalty payment" + } + }, + "setTokenRoyalty(uint256,address,uint96)": { + "params": { + "feeNumerator": "The royalty fee numerator in basis points (e.g. 15% would be 1500)", + "receiver": "Address of who should be sent the royalty payment", + "tokenId": "The token id to set the royalty information for" + } + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "setDefaultRoyalty(address,uint96)": "04634d8d", + "setTokenRoyalty(uint256,address,uint96)": "5944c753" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"feeNumerator\",\"type\":\"uint96\"}],\"name\":\"setDefaultRoyalty\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"feeNumerator\",\"type\":\"uint96\"}],\"name\":\"setTokenRoyalty\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"setDefaultRoyalty(address,uint96)\":{\"params\":{\"feeNumerator\":\"The royalty fee numerator in basis points (e.g. 15% would be 1500)\",\"receiver\":\"Address of who should be sent the royalty payment\"}},\"setTokenRoyalty(uint256,address,uint96)\":{\"params\":{\"feeNumerator\":\"The royalty fee numerator in basis points (e.g. 15% would be 1500)\",\"receiver\":\"Address of who should be sent the royalty payment\",\"tokenId\":\"The token id to set the royalty information for\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"setDefaultRoyalty(address,uint96)\":{\"notice\":\"Sets the royalty information that all ids in this contract will default to.\"},\"setTokenRoyalty(uint256,address,uint96)\":{\"notice\":\"Sets the royalty information that a given token id in this contract will use.This overrides the default royalty information for this token id\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/tokens/common/IERC2981Controlled.sol\":\"IERC2981Controlled\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"src/tokens/common/IERC2981Controlled.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\ninterface IERC2981ControlledFunctions {\\n\\n /**\\n * Sets the royalty information that all ids in this contract will default to.\\n * @param receiver Address of who should be sent the royalty payment\\n * @param feeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\\n */\\n function setDefaultRoyalty(address receiver, uint96 feeNumerator) external;\\n\\n /**\\n * Sets the royalty information that a given token id in this contract will use.\\n * @param tokenId The token id to set the royalty information for\\n * @param receiver Address of who should be sent the royalty payment\\n * @param feeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\\n * @notice This overrides the default royalty information for this token id\\n */\\n function setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) external;\\n\\n}\\n\\ninterface IERC2981Controlled is IERC2981ControlledFunctions { }\\n\",\"keccak256\":\"0x65d66b30719fb4161fc4ef666794f8dcb7660528bdff9bf126b12999fac79ee0\",\"license\":\"Apache-2.0\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": { + "setDefaultRoyalty(address,uint96)": { + "notice": "Sets the royalty information that all ids in this contract will default to." + }, + "setTokenRoyalty(uint256,address,uint96)": { + "notice": "Sets the royalty information that a given token id in this contract will use.This overrides the default royalty information for this token id" + } + }, + "version": 1 + } + }, + "IERC2981ControlledFunctions": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "uint96", + "name": "feeNumerator", + "type": "uint96" + } + ], + "name": "setDefaultRoyalty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "uint96", + "name": "feeNumerator", + "type": "uint96" + } + ], + "name": "setTokenRoyalty", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "setDefaultRoyalty(address,uint96)": { + "params": { + "feeNumerator": "The royalty fee numerator in basis points (e.g. 15% would be 1500)", + "receiver": "Address of who should be sent the royalty payment" + } + }, + "setTokenRoyalty(uint256,address,uint96)": { + "params": { + "feeNumerator": "The royalty fee numerator in basis points (e.g. 15% would be 1500)", + "receiver": "Address of who should be sent the royalty payment", + "tokenId": "The token id to set the royalty information for" + } + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "setDefaultRoyalty(address,uint96)": "04634d8d", + "setTokenRoyalty(uint256,address,uint96)": "5944c753" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"feeNumerator\",\"type\":\"uint96\"}],\"name\":\"setDefaultRoyalty\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"feeNumerator\",\"type\":\"uint96\"}],\"name\":\"setTokenRoyalty\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"setDefaultRoyalty(address,uint96)\":{\"params\":{\"feeNumerator\":\"The royalty fee numerator in basis points (e.g. 15% would be 1500)\",\"receiver\":\"Address of who should be sent the royalty payment\"}},\"setTokenRoyalty(uint256,address,uint96)\":{\"params\":{\"feeNumerator\":\"The royalty fee numerator in basis points (e.g. 15% would be 1500)\",\"receiver\":\"Address of who should be sent the royalty payment\",\"tokenId\":\"The token id to set the royalty information for\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"setDefaultRoyalty(address,uint96)\":{\"notice\":\"Sets the royalty information that all ids in this contract will default to.\"},\"setTokenRoyalty(uint256,address,uint96)\":{\"notice\":\"Sets the royalty information that a given token id in this contract will use.This overrides the default royalty information for this token id\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/tokens/common/IERC2981Controlled.sol\":\"IERC2981ControlledFunctions\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"src/tokens/common/IERC2981Controlled.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\ninterface IERC2981ControlledFunctions {\\n\\n /**\\n * Sets the royalty information that all ids in this contract will default to.\\n * @param receiver Address of who should be sent the royalty payment\\n * @param feeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\\n */\\n function setDefaultRoyalty(address receiver, uint96 feeNumerator) external;\\n\\n /**\\n * Sets the royalty information that a given token id in this contract will use.\\n * @param tokenId The token id to set the royalty information for\\n * @param receiver Address of who should be sent the royalty payment\\n * @param feeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500)\\n * @notice This overrides the default royalty information for this token id\\n */\\n function setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) external;\\n\\n}\\n\\ninterface IERC2981Controlled is IERC2981ControlledFunctions { }\\n\",\"keccak256\":\"0x65d66b30719fb4161fc4ef666794f8dcb7660528bdff9bf126b12999fac79ee0\",\"license\":\"Apache-2.0\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": { + "setDefaultRoyalty(address,uint96)": { + "notice": "Sets the royalty information that all ids in this contract will default to." + }, + "setTokenRoyalty(uint256,address,uint96)": { + "notice": "Sets the royalty information that a given token id in this contract will use.This overrides the default royalty information for this token id" + } + }, + "version": 1 + } + } + }, + "src/tokens/common/SignalsImplicitModeControlled.sol": { + "SignalsImplicitModeControlled": { + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "wallet", + "type": "address" + }, + { + "components": [ + { + "internalType": "address", + "name": "approvedSigner", + "type": "address" + }, + { + "internalType": "bytes4", + "name": "identityType", + "type": "bytes4" + }, + { + "internalType": "bytes32", + "name": "issuerHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "audienceHash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "applicationData", + "type": "bytes" + }, + { + "components": [ + { + "internalType": "string", + "name": "redirectUrl", + "type": "string" + }, + { + "internalType": "uint64", + "name": "issuedAt", + "type": "uint64" + } + ], + "internalType": "struct AuthData", + "name": "authData", + "type": "tuple" + } + ], + "internalType": "struct Attestation", + "name": "attestation", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "onlyFallback", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "behaviorOnError", + "type": "uint256" + } + ], + "internalType": "struct Payload.Call", + "name": "call", + "type": "tuple" + } + ], + "name": "acceptImplicitRequest", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "projectId", + "type": "bytes32" + } + ], + "name": "setImplicitModeProjectId", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "validator", + "type": "address" + } + ], + "name": "setImplicitModeValidator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "events": { + "RoleAdminChanged(bytes32,bytes32,bytes32)": { + "details": "Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this. _Available since v3.1._" + }, + "RoleGranted(bytes32,address,address)": { + "details": "Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}." + }, + "RoleRevoked(bytes32,address,address)": { + "details": "Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)" + } + }, + "kind": "dev", + "methods": { + "acceptImplicitRequest(address,(address,bytes4,bytes32,bytes32,bytes,(string,uint64)),(address,uint256,bytes,uint256,bool,bool,uint256))": { + "params": { + "attestation": "The attestation data", + "call": "The call to validate", + "wallet": "The wallet's address" + }, + "returns": { + "_0": "The hash of the implicit request if valid" + } + }, + "getRoleAdmin(bytes32)": { + "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}." + }, + "getRoleMember(bytes32,uint256)": { + "details": "Returns one of the accounts that have `role`. `index` must be a value between 0 and {getRoleMemberCount}, non-inclusive. Role bearers are not sorted in any particular way, and their ordering may change at any point. WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure you perform all queries on the same block. See the following https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] for more information." + }, + "getRoleMemberCount(bytes32)": { + "details": "Returns the number of accounts that have `role`. Can be used together with {getRoleMember} to enumerate all bearers of a role." + }, + "grantRole(bytes32,address)": { + "details": "Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event." + }, + "hasRole(bytes32,address)": { + "details": "Returns `true` if `account` has been granted `role`." + }, + "renounceRole(bytes32,address)": { + "details": "Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event." + }, + "revokeRole(bytes32,address)": { + "details": "Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event." + }, + "setImplicitModeProjectId(bytes32)": { + "params": { + "projectId": "The project id." + } + }, + "setImplicitModeValidator(address)": { + "params": { + "validator": "The validator address." + } + }, + "supportsInterface(bytes4)": { + "details": "Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas." + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "methodIdentifiers": { + "DEFAULT_ADMIN_ROLE()": "a217fddf", + "acceptImplicitRequest(address,(address,bytes4,bytes32,bytes32,bytes,(string,uint64)),(address,uint256,bytes,uint256,bool,bool,uint256))": "9d043a66", + "getRoleAdmin(bytes32)": "248a9ca3", + "getRoleMember(bytes32,uint256)": "9010d07c", + "getRoleMemberCount(bytes32)": "ca15c873", + "grantRole(bytes32,address)": "2f2ff15d", + "hasRole(bytes32,address)": "91d14854", + "renounceRole(bytes32,address)": "36568abe", + "revokeRole(bytes32,address)": "d547741f", + "setImplicitModeProjectId(bytes32)": "ed4c2ac7", + "setImplicitModeValidator(address)": "0bb310de", + "supportsInterface(bytes4)": "01ffc9a7" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wallet\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"approvedSigner\",\"type\":\"address\"},{\"internalType\":\"bytes4\",\"name\":\"identityType\",\"type\":\"bytes4\"},{\"internalType\":\"bytes32\",\"name\":\"issuerHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"audienceHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"applicationData\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"redirectUrl\",\"type\":\"string\"},{\"internalType\":\"uint64\",\"name\":\"issuedAt\",\"type\":\"uint64\"}],\"internalType\":\"struct AuthData\",\"name\":\"authData\",\"type\":\"tuple\"}],\"internalType\":\"struct Attestation\",\"name\":\"attestation\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"delegateCall\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"onlyFallback\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"behaviorOnError\",\"type\":\"uint256\"}],\"internalType\":\"struct Payload.Call\",\"name\":\"call\",\"type\":\"tuple\"}],\"name\":\"acceptImplicitRequest\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"getRoleMember\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleMemberCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"projectId\",\"type\":\"bytes32\"}],\"name\":\"setImplicitModeProjectId\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"setImplicitModeValidator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this. _Available since v3.1._\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call: - if using `revokeRole`, it is the admin role bearer - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"acceptImplicitRequest(address,(address,bytes4,bytes32,bytes32,bytes,(string,uint64)),(address,uint256,bytes,uint256,bool,bool,uint256))\":{\"params\":{\"attestation\":\"The attestation data\",\"call\":\"The call to validate\",\"wallet\":\"The wallet's address\"},\"returns\":{\"_0\":\"The hash of the implicit request if valid\"}},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"getRoleMember(bytes32,uint256)\":{\"details\":\"Returns one of the accounts that have `role`. `index` must be a value between 0 and {getRoleMemberCount}, non-inclusive. Role bearers are not sorted in any particular way, and their ordering may change at any point. WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure you perform all queries on the same block. See the following https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] for more information.\"},\"getRoleMemberCount(bytes32)\":{\"details\":\"Returns the number of accounts that have `role`. Can be used together with {getRoleMember} to enumerate all bearers of a role.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `account`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"setImplicitModeProjectId(bytes32)\":{\"params\":{\"projectId\":\"The project id.\"}},\"setImplicitModeValidator(address)\":{\"params\":{\"validator\":\"The validator address.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"acceptImplicitRequest(address,(address,bytes4,bytes32,bytes32,bytes,(string,uint64)),(address,uint256,bytes,uint256,bool,bool,uint256))\":{\"notice\":\"Determines if an implicit request is valid\"},\"setImplicitModeProjectId(bytes32)\":{\"notice\":\"Updates the settings for implicit mode validation.Only callable by an address with the project admin role.\"},\"setImplicitModeValidator(address)\":{\"notice\":\"Updates the validator for implicit mode validation.Only callable by an address with the project admin role.\"}},\"notice\":\"An abstract contract that allows implicit session access for a given project.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/tokens/common/SignalsImplicitModeControlled.sol\":\"SignalsImplicitModeControlled\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/murky/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc2470-libs/=lib/erc2470-libs/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":murky/=lib/murky/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":sequence-v3/=lib/signals-implicit-mode/lib/sequence-v3/\",\":signals-implicit-mode/=lib/signals-implicit-mode/\",\":solady/=lib/solady/src/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Strings.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```solidity\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```solidity\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}\\n * to enforce additional security measures for this role.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n * Overriding this function changes the behavior of the {onlyRole} modifier.\\n *\\n * Format of the revert message is described in {_checkRole}.\\n *\\n * _Available since v4.6._\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n Strings.toHexString(account),\\n \\\" is missing role \\\",\\n Strings.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * May emit a {RoleGranted} event.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n}\\n\",\"keccak256\":\"0x0dd6e52cb394d7f5abe5dca2d4908a6be40417914720932de757de34a99ab87f\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/access/AccessControlEnumerable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControlEnumerable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControlEnumerable.sol\\\";\\nimport \\\"./AccessControl.sol\\\";\\nimport \\\"../utils/structs/EnumerableSet.sol\\\";\\n\\n/**\\n * @dev Extension of {AccessControl} that allows enumerating the members of each role.\\n */\\nabstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl {\\n using EnumerableSet for EnumerableSet.AddressSet;\\n\\n mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers;\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns one of the accounts that have `role`. `index` must be a\\n * value between 0 and {getRoleMemberCount}, non-inclusive.\\n *\\n * Role bearers are not sorted in any particular way, and their ordering may\\n * change at any point.\\n *\\n * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure\\n * you perform all queries on the same block. See the following\\n * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]\\n * for more information.\\n */\\n function getRoleMember(bytes32 role, uint256 index) public view virtual override returns (address) {\\n return _roleMembers[role].at(index);\\n }\\n\\n /**\\n * @dev Returns the number of accounts that have `role`. Can be used\\n * together with {getRoleMember} to enumerate all bearers of a role.\\n */\\n function getRoleMemberCount(bytes32 role) public view virtual override returns (uint256) {\\n return _roleMembers[role].length();\\n }\\n\\n /**\\n * @dev Overload {_grantRole} to track enumerable memberships\\n */\\n function _grantRole(bytes32 role, address account) internal virtual override {\\n super._grantRole(role, account);\\n _roleMembers[role].add(account);\\n }\\n\\n /**\\n * @dev Overload {_revokeRole} to track enumerable memberships\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual override {\\n super._revokeRole(role, account);\\n _roleMembers[role].remove(account);\\n }\\n}\\n\",\"keccak256\":\"0x13f5e15f2a0650c0b6aaee2ef19e89eaf4870d6e79662d572a393334c1397247\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/access/IAccessControlEnumerable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControlEnumerable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\n\\n/**\\n * @dev External interface of AccessControlEnumerable declared to support ERC165 detection.\\n */\\ninterface IAccessControlEnumerable is IAccessControl {\\n /**\\n * @dev Returns one of the accounts that have `role`. `index` must be a\\n * value between 0 and {getRoleMemberCount}, non-inclusive.\\n *\\n * Role bearers are not sorted in any particular way, and their ordering may\\n * change at any point.\\n *\\n * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure\\n * you perform all queries on the same block. See the following\\n * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]\\n * for more information.\\n */\\n function getRoleMember(bytes32 role, uint256 index) external view returns (address);\\n\\n /**\\n * @dev Returns the number of accounts that have `role`. Can be used\\n * together with {getRoleMember} to enumerate all bearers of a role.\\n */\\n function getRoleMemberCount(bytes32 role) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0xba4459ab871dfa300f5212c6c30178b63898c03533a1ede28436f11546626676\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\nimport \\\"./math/SignedMath.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\\n */\\n function toString(int256 value) internal pure returns (string memory) {\\n return string(abi.encodePacked(value < 0 ? \\\"-\\\" : \\\"\\\", toString(SignedMath.abs(value))));\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n\\n /**\\n * @dev Returns true if the two strings are equal.\\n */\\n function equal(string memory a, string memory b) internal pure returns (bool) {\\n return keccak256(bytes(a)) == keccak256(bytes(b));\\n }\\n}\\n\",\"keccak256\":\"0x3088eb2868e8d13d89d16670b5f8612c4ab9ff8956272837d8e90106c59c14a0\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\\n // The surrounding unchecked block does not change this fact.\\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1, \\\"Math: mulDiv overflow\\\");\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10 ** 64) {\\n value /= 10 ** 64;\\n result += 64;\\n }\\n if (value >= 10 ** 32) {\\n value /= 10 ** 32;\\n result += 32;\\n }\\n if (value >= 10 ** 16) {\\n value /= 10 ** 16;\\n result += 16;\\n }\\n if (value >= 10 ** 8) {\\n value /= 10 ** 8;\\n result += 8;\\n }\\n if (value >= 10 ** 4) {\\n value /= 10 ** 4;\\n result += 4;\\n }\\n if (value >= 10 ** 2) {\\n value /= 10 ** 2;\\n result += 2;\\n }\\n if (value >= 10 ** 1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard signed math utilities missing in the Solidity language.\\n */\\nlibrary SignedMath {\\n /**\\n * @dev Returns the largest of two signed numbers.\\n */\\n function max(int256 a, int256 b) internal pure returns (int256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two signed numbers.\\n */\\n function min(int256 a, int256 b) internal pure returns (int256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two signed numbers without overflow.\\n * The result is rounded towards zero.\\n */\\n function average(int256 a, int256 b) internal pure returns (int256) {\\n // Formula from the book \\\"Hacker's Delight\\\"\\n int256 x = (a & b) + ((a ^ b) >> 1);\\n return x + (int256(uint256(x) >> 255) & (a ^ b));\\n }\\n\\n /**\\n * @dev Returns the absolute unsigned value of a signed value.\\n */\\n function abs(int256 n) internal pure returns (uint256) {\\n unchecked {\\n // must be unchecked in order to support `n = type(int256).min`\\n return uint256(n >= 0 ? n : -n);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc\",\"license\":\"MIT\"},\"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/EnumerableSet.sol)\\n// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for managing\\n * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive\\n * types.\\n *\\n * Sets have the following properties:\\n *\\n * - Elements are added, removed, and checked for existence in constant time\\n * (O(1)).\\n * - Elements are enumerated in O(n). No guarantees are made on the ordering.\\n *\\n * ```solidity\\n * contract Example {\\n * // Add the library methods\\n * using EnumerableSet for EnumerableSet.AddressSet;\\n *\\n * // Declare a set state variable\\n * EnumerableSet.AddressSet private mySet;\\n * }\\n * ```\\n *\\n * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)\\n * and `uint256` (`UintSet`) are supported.\\n *\\n * [WARNING]\\n * ====\\n * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure\\n * unusable.\\n * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.\\n *\\n * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an\\n * array of EnumerableSet.\\n * ====\\n */\\nlibrary EnumerableSet {\\n // To implement this library for multiple types with as little code\\n // repetition as possible, we write it in terms of a generic Set type with\\n // bytes32 values.\\n // The Set implementation uses private functions, and user-facing\\n // implementations (such as AddressSet) are just wrappers around the\\n // underlying Set.\\n // This means that we can only create new EnumerableSets for types that fit\\n // in bytes32.\\n\\n struct Set {\\n // Storage of set values\\n bytes32[] _values;\\n // Position of the value in the `values` array, plus 1 because index 0\\n // means a value is not in the set.\\n mapping(bytes32 => uint256) _indexes;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function _add(Set storage set, bytes32 value) private returns (bool) {\\n if (!_contains(set, value)) {\\n set._values.push(value);\\n // The value is stored at length-1, but we add 1 to all indexes\\n // and use 0 as a sentinel value\\n set._indexes[value] = set._values.length;\\n return true;\\n } else {\\n return false;\\n }\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function _remove(Set storage set, bytes32 value) private returns (bool) {\\n // We read and store the value's index to prevent multiple reads from the same storage slot\\n uint256 valueIndex = set._indexes[value];\\n\\n if (valueIndex != 0) {\\n // Equivalent to contains(set, value)\\n // To delete an element from the _values array in O(1), we swap the element to delete with the last one in\\n // the array, and then remove the last element (sometimes called as 'swap and pop').\\n // This modifies the order of the array, as noted in {at}.\\n\\n uint256 toDeleteIndex = valueIndex - 1;\\n uint256 lastIndex = set._values.length - 1;\\n\\n if (lastIndex != toDeleteIndex) {\\n bytes32 lastValue = set._values[lastIndex];\\n\\n // Move the last value to the index where the value to delete is\\n set._values[toDeleteIndex] = lastValue;\\n // Update the index for the moved value\\n set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex\\n }\\n\\n // Delete the slot where the moved value was stored\\n set._values.pop();\\n\\n // Delete the index for the deleted slot\\n delete set._indexes[value];\\n\\n return true;\\n } else {\\n return false;\\n }\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function _contains(Set storage set, bytes32 value) private view returns (bool) {\\n return set._indexes[value] != 0;\\n }\\n\\n /**\\n * @dev Returns the number of values on the set. O(1).\\n */\\n function _length(Set storage set) private view returns (uint256) {\\n return set._values.length;\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function _at(Set storage set, uint256 index) private view returns (bytes32) {\\n return set._values[index];\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function _values(Set storage set) private view returns (bytes32[] memory) {\\n return set._values;\\n }\\n\\n // Bytes32Set\\n\\n struct Bytes32Set {\\n Set _inner;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {\\n return _add(set._inner, value);\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {\\n return _remove(set._inner, value);\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {\\n return _contains(set._inner, value);\\n }\\n\\n /**\\n * @dev Returns the number of values in the set. O(1).\\n */\\n function length(Bytes32Set storage set) internal view returns (uint256) {\\n return _length(set._inner);\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {\\n return _at(set._inner, index);\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {\\n bytes32[] memory store = _values(set._inner);\\n bytes32[] memory result;\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := store\\n }\\n\\n return result;\\n }\\n\\n // AddressSet\\n\\n struct AddressSet {\\n Set _inner;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function add(AddressSet storage set, address value) internal returns (bool) {\\n return _add(set._inner, bytes32(uint256(uint160(value))));\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function remove(AddressSet storage set, address value) internal returns (bool) {\\n return _remove(set._inner, bytes32(uint256(uint160(value))));\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function contains(AddressSet storage set, address value) internal view returns (bool) {\\n return _contains(set._inner, bytes32(uint256(uint160(value))));\\n }\\n\\n /**\\n * @dev Returns the number of values in the set. O(1).\\n */\\n function length(AddressSet storage set) internal view returns (uint256) {\\n return _length(set._inner);\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function at(AddressSet storage set, uint256 index) internal view returns (address) {\\n return address(uint160(uint256(_at(set._inner, index))));\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function values(AddressSet storage set) internal view returns (address[] memory) {\\n bytes32[] memory store = _values(set._inner);\\n address[] memory result;\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := store\\n }\\n\\n return result;\\n }\\n\\n // UintSet\\n\\n struct UintSet {\\n Set _inner;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function add(UintSet storage set, uint256 value) internal returns (bool) {\\n return _add(set._inner, bytes32(value));\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function remove(UintSet storage set, uint256 value) internal returns (bool) {\\n return _remove(set._inner, bytes32(value));\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function contains(UintSet storage set, uint256 value) internal view returns (bool) {\\n return _contains(set._inner, bytes32(value));\\n }\\n\\n /**\\n * @dev Returns the number of values in the set. O(1).\\n */\\n function length(UintSet storage set) internal view returns (uint256) {\\n return _length(set._inner);\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function at(UintSet storage set, uint256 index) internal view returns (uint256) {\\n return uint256(_at(set._inner, index));\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function values(UintSet storage set) internal view returns (uint256[] memory) {\\n bytes32[] memory store = _values(set._inner);\\n uint256[] memory result;\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := store\\n }\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0x9f4357008a8f7d8c8bf5d48902e789637538d8c016be5766610901b4bba81514\",\"license\":\"MIT\"},\"lib/signals-implicit-mode/lib/sequence-v3/src/extensions/sessions/implicit/Attestation.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.27;\\n\\nimport { LibBytes } from \\\"../../../utils/LibBytes.sol\\\";\\nimport { ACCEPT_IMPLICIT_REQUEST_MAGIC_PREFIX } from \\\"./ISignalsImplicitMode.sol\\\";\\n\\nusing LibBytes for bytes;\\n\\n/// @notice Attestation for a specific session\\n/// @param approvedSigner Address of the approved signer\\n/// @param identityType Identity type\\n/// @param issuerHash Hash of the issuer\\n/// @param audienceHash Hash of the audience\\n/// @param applicationData Unspecified application data\\n/// @param authData Auth data\\nstruct Attestation {\\n address approvedSigner;\\n bytes4 identityType;\\n bytes32 issuerHash;\\n bytes32 audienceHash;\\n bytes applicationData;\\n AuthData authData;\\n}\\n\\n/// @notice Auth data for an attestation\\n/// @param redirectUrl Authorization redirect URL\\n/// @param issuedAt Timestamp of the attestation issuance\\nstruct AuthData {\\n string redirectUrl;\\n uint64 issuedAt;\\n}\\n\\n/// @title LibAttestation\\n/// @author Michael Standen\\n/// @notice Library for attestation management\\nlibrary LibAttestation {\\n\\n /// @notice Hashes an attestation\\n function toHash(\\n Attestation memory attestation\\n ) internal pure returns (bytes32) {\\n return keccak256(toPacked(attestation));\\n }\\n\\n /// @notice Decodes an attestation from a packed bytes array\\n /// @param encoded The packed bytes array\\n /// @param pointer The pointer to the start of the attestation\\n /// @return attestation The decoded attestation\\n /// @return newPointer The new pointer to the end of the attestation\\n function fromPacked(\\n bytes calldata encoded,\\n uint256 pointer\\n ) internal pure returns (Attestation memory attestation, uint256 newPointer) {\\n newPointer = pointer;\\n (attestation.approvedSigner, newPointer) = encoded.readAddress(newPointer);\\n (attestation.identityType, newPointer) = encoded.readBytes4(newPointer);\\n (attestation.issuerHash, newPointer) = encoded.readBytes32(newPointer);\\n (attestation.audienceHash, newPointer) = encoded.readBytes32(newPointer);\\n // Application data (arbitrary bytes)\\n uint256 dataSize;\\n (dataSize, newPointer) = encoded.readUint24(newPointer);\\n attestation.applicationData = encoded[newPointer:newPointer + dataSize];\\n newPointer += dataSize;\\n // Auth data\\n (attestation.authData, newPointer) = fromPackedAuthData(encoded, newPointer);\\n return (attestation, newPointer);\\n }\\n\\n /// @notice Decodes the auth data from a packed bytes\\n /// @param encoded The packed bytes containing the auth data\\n /// @param pointer The pointer to the start of the auth data within the encoded data\\n /// @return authData The decoded auth data\\n /// @return newPointer The pointer to the end of the auth data within the encoded data\\n function fromPackedAuthData(\\n bytes calldata encoded,\\n uint256 pointer\\n ) internal pure returns (AuthData memory authData, uint256 newPointer) {\\n uint24 redirectUrlLength;\\n (redirectUrlLength, pointer) = encoded.readUint24(pointer);\\n authData.redirectUrl = string(encoded[pointer:pointer + redirectUrlLength]);\\n pointer += redirectUrlLength;\\n (authData.issuedAt, pointer) = encoded.readUint64(pointer);\\n return (authData, pointer);\\n }\\n\\n /// @notice Encodes an attestation into a packed bytes array\\n /// @param attestation The attestation to encode\\n /// @return encoded The packed bytes array\\n function toPacked(\\n Attestation memory attestation\\n ) internal pure returns (bytes memory encoded) {\\n return abi.encodePacked(\\n attestation.approvedSigner,\\n attestation.identityType,\\n attestation.issuerHash,\\n attestation.audienceHash,\\n uint24(attestation.applicationData.length),\\n attestation.applicationData,\\n toPackAuthData(attestation.authData)\\n );\\n }\\n\\n /// @notice Encodes the auth data into a packed bytes array\\n /// @param authData The auth data to encode\\n /// @return encoded The packed bytes array\\n function toPackAuthData(\\n AuthData memory authData\\n ) internal pure returns (bytes memory encoded) {\\n return abi.encodePacked(uint24(bytes(authData.redirectUrl).length), bytes(authData.redirectUrl), authData.issuedAt);\\n }\\n\\n /// @notice Generates the implicit request magic return value\\n /// @param attestation The attestation\\n /// @param wallet The wallet\\n /// @return magic The expected implicit request magic\\n function generateImplicitRequestMagic(Attestation memory attestation, address wallet) internal pure returns (bytes32) {\\n return keccak256(\\n abi.encodePacked(ACCEPT_IMPLICIT_REQUEST_MAGIC_PREFIX, wallet, attestation.audienceHash, attestation.issuerHash)\\n );\\n }\\n\\n}\\n\",\"keccak256\":\"0xcaa44022b5eb4bc7ab487b3b1a0125da67e2e891cee983ef6cdb6814f045efc8\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/lib/sequence-v3/src/extensions/sessions/implicit/ISignalsImplicitMode.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.27;\\n\\nimport { Payload } from \\\"../../../modules/Payload.sol\\\";\\nimport { Attestation } from \\\"./Attestation.sol\\\";\\n\\n/// @dev Magic prefix for the implicit request\\nbytes32 constant ACCEPT_IMPLICIT_REQUEST_MAGIC_PREFIX = keccak256(abi.encodePacked(\\\"acceptImplicitRequest\\\"));\\n\\n/// @title ISignalsImplicitMode\\n/// @author Agustin Aguilar, Michael Standen\\n/// @notice Interface for the contracts that support implicit mode validation\\ninterface ISignalsImplicitMode {\\n\\n /// @notice Determines if an implicit request is valid\\n /// @param wallet The wallet's address\\n /// @param attestation The attestation data\\n /// @param call The call to validate\\n /// @return magic The hash of the implicit request if valid\\n function acceptImplicitRequest(\\n address wallet,\\n Attestation calldata attestation,\\n Payload.Call calldata call\\n ) external view returns (bytes32 magic);\\n\\n}\\n\",\"keccak256\":\"0x6cb48f50c49bcb3c7071306fe9fac6c102bc9eabf73d9909e19ab3b9a835d0a8\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/lib/sequence-v3/src/modules/Payload.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.27;\\n\\nimport { LibBytes } from \\\"../utils/LibBytes.sol\\\";\\n\\nusing LibBytes for bytes;\\n\\n/// @title Payload\\n/// @author Agustin Aguilar, Michael Standen, William Hua\\n/// @notice Library for encoding and decoding payloads\\nlibrary Payload {\\n\\n /// @notice Error thrown when the kind is invalid\\n error InvalidKind(uint8 kind);\\n\\n /// @dev keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\")\\n bytes32 private constant EIP712_DOMAIN_TYPEHASH = 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f;\\n\\n /// @dev keccak256(\\\"Sequence Wallet\\\")\\n bytes32 private constant EIP712_DOMAIN_NAME_SEQUENCE =\\n 0x4aa45ca7ad825ceb1bf35643f0a58c295239df563b1b565c2485f96477c56318;\\n\\n /// @dev keccak256(\\\"3\\\")\\n bytes32 private constant EIP712_DOMAIN_VERSION_SEQUENCE =\\n 0x2a80e1ef1d7842f27f2e6be0972bb708b9a135c38860dbe73c27c3486c34f4de;\\n\\n function domainSeparator(bool _noChainId, address _wallet) internal view returns (bytes32 _domainSeparator) {\\n return keccak256(\\n abi.encode(\\n EIP712_DOMAIN_TYPEHASH,\\n EIP712_DOMAIN_NAME_SEQUENCE,\\n EIP712_DOMAIN_VERSION_SEQUENCE,\\n _noChainId ? uint256(0) : uint256(block.chainid),\\n _wallet\\n )\\n );\\n }\\n\\n /// @dev keccak256(\\\"Call(address to,uint256 value,bytes data,uint256 gasLimit,bool delegateCall,bool onlyFallback,uint256 behaviorOnError)\\\")\\n bytes32 private constant CALL_TYPEHASH = 0x0603985259a953da1f65a522f589c17bd1d0117ec1d3abb7c0788aef251ef437;\\n\\n /// @dev keccak256(\\\"Calls(Call[] calls,uint256 space,uint256 nonce,address[] wallets)Call(address to,uint256 value,bytes data,uint256 gasLimit,bool delegateCall,bool onlyFallback,uint256 behaviorOnError)\\\")\\n bytes32 private constant CALLS_TYPEHASH = 0x11e1e4079a79a66e4ade50033cfe2678cdd5341d2dfe5ef9513edb1a0be147a2;\\n\\n /// @dev keccak256(\\\"Message(bytes message,address[] wallets)\\\")\\n bytes32 private constant MESSAGE_TYPEHASH = 0xe19a3b94fc3c7ece3f890d98a99bc422615537a08dea0603fa8425867d87d466;\\n\\n /// @dev keccak256(\\\"ConfigUpdate(bytes32 imageHash,address[] wallets)\\\")\\n bytes32 private constant CONFIG_UPDATE_TYPEHASH = 0x11fdeb7e8373a1aa96bfac8d0ea91526b2c5d15e5cee20e0543e780258f3e8e4;\\n\\n /// @notice Kind of transaction\\n uint8 public constant KIND_TRANSACTIONS = 0x00;\\n /// @notice Kind of digest\\n uint8 public constant KIND_MESSAGE = 0x01;\\n /// @notice Kind of config update\\n uint8 public constant KIND_CONFIG_UPDATE = 0x02;\\n /// @notice Kind of message\\n uint8 public constant KIND_DIGEST = 0x03;\\n\\n /// @notice Behavior on error: ignore error\\n uint8 public constant BEHAVIOR_IGNORE_ERROR = 0x00;\\n /// @notice Behavior on error: revert on error\\n uint8 public constant BEHAVIOR_REVERT_ON_ERROR = 0x01;\\n /// @notice Behavior on error: abort on error\\n uint8 public constant BEHAVIOR_ABORT_ON_ERROR = 0x02;\\n\\n /// @notice Payload call information\\n /// @param to Address of the target contract\\n /// @param value Value to send with the call\\n /// @param data Data to send with the call\\n /// @param gasLimit Gas limit for the call\\n /// @param delegateCall If the call is a delegate call\\n /// @param onlyFallback If the call should only be executed in an error scenario\\n /// @param behaviorOnError Behavior on error\\n struct Call {\\n address to;\\n uint256 value;\\n bytes data;\\n uint256 gasLimit;\\n bool delegateCall;\\n bool onlyFallback;\\n uint256 behaviorOnError;\\n }\\n\\n /// @notice Decoded payload\\n /// @param kind Kind of payload\\n /// @param noChainId If the chain ID should be omitted\\n /// @param calls Array of calls (transaction kind)\\n /// @param space Nonce space for the calls (transaction kind)\\n /// @param nonce Nonce value for the calls (transaction kind)\\n /// @param message Message to validate (message kind)\\n /// @param imageHash Image hash to update to (config update kind)\\n /// @param digest Digest to validate (digest kind)\\n /// @param parentWallets Parent wallets\\n struct Decoded {\\n uint8 kind;\\n bool noChainId;\\n // Transaction kind\\n Call[] calls;\\n uint256 space;\\n uint256 nonce;\\n // Message kind\\n // TODO: Maybe native 721 ?\\n bytes message;\\n // Config update kind\\n bytes32 imageHash;\\n // Digest kind for 1271\\n bytes32 digest;\\n // Parent wallets\\n address[] parentWallets;\\n }\\n\\n function fromMessage(\\n bytes memory message\\n ) internal pure returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_MESSAGE;\\n _decoded.message = message;\\n }\\n\\n function fromConfigUpdate(\\n bytes32 imageHash\\n ) internal pure returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_CONFIG_UPDATE;\\n _decoded.imageHash = imageHash;\\n }\\n\\n function fromDigest(\\n bytes32 digest\\n ) internal pure returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_DIGEST;\\n _decoded.digest = digest;\\n }\\n\\n function fromPackedCalls(\\n bytes calldata packed\\n ) internal view returns (Decoded memory _decoded) {\\n _decoded.kind = KIND_TRANSACTIONS;\\n\\n // Read the global flag\\n (uint256 globalFlag, uint256 pointer) = packed.readFirstUint8();\\n\\n // First bit determines if space is zero or not\\n if (globalFlag & 0x01 == 0x01) {\\n _decoded.space = 0;\\n } else {\\n (_decoded.space, pointer) = packed.readUint160(pointer);\\n }\\n\\n // Next 3 bits determine the size of the nonce\\n uint256 nonceSize = (globalFlag >> 1) & 0x07;\\n\\n if (nonceSize > 0) {\\n // Read the nonce\\n (_decoded.nonce, pointer) = packed.readUintX(pointer, nonceSize);\\n }\\n\\n uint256 numCalls;\\n\\n // Bit 5 determines if the batch contains a single call\\n if (globalFlag & 0x10 == 0x10) {\\n numCalls = 1;\\n } else {\\n // Bit 6 determines if the number of calls uses 1 byte or 2 bytes\\n if (globalFlag & 0x20 == 0x20) {\\n (numCalls, pointer) = packed.readUint16(pointer);\\n } else {\\n (numCalls, pointer) = packed.readUint8(pointer);\\n }\\n }\\n\\n // Read the calls\\n _decoded.calls = new Call[](numCalls);\\n\\n for (uint256 i = 0; i < numCalls; i++) {\\n uint8 flags;\\n (flags, pointer) = packed.readUint8(pointer);\\n\\n // First bit determines if this is a call to self\\n // or a call to another address\\n if (flags & 0x01 == 0x01) {\\n // Call to self\\n _decoded.calls[i].to = address(this);\\n } else {\\n // Call to another address\\n (_decoded.calls[i].to, pointer) = packed.readAddress(pointer);\\n }\\n\\n // Second bit determines if the call has value or not\\n if (flags & 0x02 == 0x02) {\\n (_decoded.calls[i].value, pointer) = packed.readUint256(pointer);\\n }\\n\\n // Third bit determines if the call has data or not\\n if (flags & 0x04 == 0x04) {\\n // 3 bytes determine the size of the calldata\\n uint256 calldataSize;\\n (calldataSize, pointer) = packed.readUint24(pointer);\\n _decoded.calls[i].data = packed[pointer:pointer + calldataSize];\\n pointer += calldataSize;\\n }\\n\\n // Fourth bit determines if the call has a gas limit or not\\n if (flags & 0x08 == 0x08) {\\n (_decoded.calls[i].gasLimit, pointer) = packed.readUint256(pointer);\\n }\\n\\n // Fifth bit determines if the call is a delegate call or not\\n _decoded.calls[i].delegateCall = (flags & 0x10 == 0x10);\\n\\n // Sixth bit determines if the call is fallback only\\n _decoded.calls[i].onlyFallback = (flags & 0x20 == 0x20);\\n\\n // Last 2 bits are directly mapped to the behavior on error\\n _decoded.calls[i].behaviorOnError = (flags & 0xC0) >> 6;\\n }\\n }\\n\\n function hashCall(\\n Call memory c\\n ) internal pure returns (bytes32) {\\n return keccak256(\\n abi.encode(\\n CALL_TYPEHASH, c.to, c.value, keccak256(c.data), c.gasLimit, c.delegateCall, c.onlyFallback, c.behaviorOnError\\n )\\n );\\n }\\n\\n function hashCalls(\\n Call[] memory calls\\n ) internal pure returns (bytes32) {\\n // In EIP712, an array is often hashed as the keccak256 of the concatenated\\n // hashes of each item. So we hash each Call, pack them, and hash again.\\n bytes32[] memory callHashes = new bytes32[](calls.length);\\n for (uint256 i = 0; i < calls.length; i++) {\\n callHashes[i] = hashCall(calls[i]);\\n }\\n return keccak256(abi.encodePacked(callHashes));\\n }\\n\\n function toEIP712(\\n Decoded memory _decoded\\n ) internal pure returns (bytes32) {\\n bytes32 walletsHash = keccak256(abi.encodePacked(_decoded.parentWallets));\\n\\n if (_decoded.kind == KIND_TRANSACTIONS) {\\n bytes32 callsHash = hashCalls(_decoded.calls);\\n // The top-level struct for Calls might be something like:\\n // Calls(bytes32 callsHash,uint256 space,uint256 nonce,bytes32 walletsHash)\\n return keccak256(abi.encode(CALLS_TYPEHASH, callsHash, _decoded.space, _decoded.nonce, walletsHash));\\n } else if (_decoded.kind == KIND_MESSAGE) {\\n // If you define your top-level as: Message(bytes32 messageHash,bytes32 walletsHash)\\n return keccak256(abi.encode(MESSAGE_TYPEHASH, keccak256(_decoded.message), walletsHash));\\n } else if (_decoded.kind == KIND_CONFIG_UPDATE) {\\n // Top-level: ConfigUpdate(bytes32 imageHash,bytes32 walletsHash)\\n return keccak256(abi.encode(CONFIG_UPDATE_TYPEHASH, _decoded.imageHash, walletsHash));\\n } else if (_decoded.kind == KIND_DIGEST) {\\n // Top-level: Use MESSAGE_TYPEHASH but assume the digest is already the hashed message\\n return keccak256(abi.encode(MESSAGE_TYPEHASH, _decoded.digest, walletsHash));\\n } else {\\n // Unknown kind\\n revert InvalidKind(_decoded.kind);\\n }\\n }\\n\\n function hash(\\n Decoded memory _decoded\\n ) internal view returns (bytes32) {\\n bytes32 domain = domainSeparator(_decoded.noChainId, address(this));\\n bytes32 structHash = toEIP712(_decoded);\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domain, structHash));\\n }\\n\\n function hashFor(Decoded memory _decoded, address _wallet) internal view returns (bytes32) {\\n bytes32 domain = domainSeparator(_decoded.noChainId, _wallet);\\n bytes32 structHash = toEIP712(_decoded);\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domain, structHash));\\n }\\n\\n}\\n\",\"keccak256\":\"0x25066fa78d12d0d73d463b97b37528291f3d4d60ca642247441538b83d6597d6\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/lib/sequence-v3/src/utils/LibBytes.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.18;\\n\\n/// @title Library for reading data from bytes arrays\\n/// @author Agustin Aguilar (aa@horizon.io), Michael Standen (mstan@horizon.io)\\n/// @notice This library contains functions for reading data from bytes arrays.\\n/// @dev These functions do not check if the input index is within the bounds of the data array.\\n/// @dev Reading out of bounds may return dirty values.\\nlibrary LibBytes {\\n\\n function readFirstUint8(\\n bytes calldata _data\\n ) internal pure returns (uint8 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(_data.offset)\\n a := shr(248, word)\\n newPointer := 1\\n }\\n }\\n\\n function readUint8(bytes calldata _data, uint256 _index) internal pure returns (uint8 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(248, word)\\n newPointer := add(_index, 1)\\n }\\n }\\n\\n function readUint16(bytes calldata _data, uint256 _index) internal pure returns (uint16 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(240, word)\\n newPointer := add(_index, 2)\\n }\\n }\\n\\n function readUint24(bytes calldata _data, uint256 _index) internal pure returns (uint24 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(232, word)\\n newPointer := add(_index, 3)\\n }\\n }\\n\\n function readUint64(bytes calldata _data, uint256 _index) internal pure returns (uint64 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(192, word)\\n newPointer := add(_index, 8)\\n }\\n }\\n\\n function readUint160(bytes calldata _data, uint256 _index) internal pure returns (uint160 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := shr(96, word)\\n newPointer := add(_index, 20)\\n }\\n }\\n\\n function readUint256(bytes calldata _data, uint256 _index) internal pure returns (uint256 a, uint256 newPointer) {\\n assembly {\\n a := calldataload(add(_index, _data.offset))\\n newPointer := add(_index, 32)\\n }\\n }\\n\\n function readUintX(\\n bytes calldata _data,\\n uint256 _index,\\n uint256 _length\\n ) internal pure returns (uint256 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n let shift := sub(256, mul(_length, 8))\\n a := and(shr(shift, word), sub(shl(mul(8, _length), 1), 1))\\n newPointer := add(_index, _length)\\n }\\n }\\n\\n function readBytes4(bytes calldata _data, uint256 _pointer) internal pure returns (bytes4 a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_pointer, _data.offset))\\n a := and(word, 0xffffffff00000000000000000000000000000000000000000000000000000000)\\n newPointer := add(_pointer, 4)\\n }\\n }\\n\\n function readBytes32(bytes calldata _data, uint256 _pointer) internal pure returns (bytes32 a, uint256 newPointer) {\\n assembly {\\n a := calldataload(add(_pointer, _data.offset))\\n newPointer := add(_pointer, 32)\\n }\\n }\\n\\n function readAddress(bytes calldata _data, uint256 _index) internal pure returns (address a, uint256 newPointer) {\\n assembly {\\n let word := calldataload(add(_index, _data.offset))\\n a := and(shr(96, word), 0xffffffffffffffffffffffffffffffffffffffff)\\n newPointer := add(_index, 20)\\n }\\n }\\n\\n /// @dev ERC-2098 Compact Signature\\n function readRSVCompact(\\n bytes calldata _data,\\n uint256 _index\\n ) internal pure returns (bytes32 r, bytes32 s, uint8 v, uint256 newPointer) {\\n uint256 yParityAndS;\\n assembly {\\n r := calldataload(add(_index, _data.offset))\\n yParityAndS := calldataload(add(_index, add(_data.offset, 32)))\\n newPointer := add(_index, 64)\\n }\\n uint256 yParity = uint256(yParityAndS >> 255);\\n s = bytes32(uint256(yParityAndS) & ((1 << 255) - 1));\\n v = uint8(yParity) + 27;\\n }\\n\\n}\\n\",\"keccak256\":\"0x4fe0b4786b2157e12384b90ae9daa1009b74b2547a8a24b800a8b998278c874b\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/src/helper/SignalsImplicitMode.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.13;\\n\\nimport { IImplicitProjectValidation } from \\\"../registry/IImplicitProjectValidation.sol\\\";\\n\\nimport { ERC165, IERC165 } from \\\"openzeppelin-contracts/contracts/utils/introspection/ERC165.sol\\\";\\nimport { Attestation } from \\\"sequence-v3/src/extensions/sessions/implicit/Attestation.sol\\\";\\nimport { ISignalsImplicitMode } from \\\"sequence-v3/src/extensions/sessions/implicit/ISignalsImplicitMode.sol\\\";\\nimport { Payload } from \\\"sequence-v3/src/modules/Payload.sol\\\";\\n\\n/// @title SignalsImplicitMode\\n/// @author Michael Standen\\n/// @notice Base contract for implicit mode validation by project\\nabstract contract SignalsImplicitMode is ISignalsImplicitMode, ERC165 {\\n\\n IImplicitProjectValidation internal _validator;\\n bytes32 internal _projectId;\\n\\n /// @notice Initialize implicit mode validation\\n /// @param validator The IImplicitProjectValidation address\\n /// @param projectId The project id\\n function _initializeSignalsImplicitMode(address validator, bytes32 projectId) internal {\\n _validator = IImplicitProjectValidation(validator);\\n _projectId = projectId;\\n }\\n\\n /// @inheritdoc ISignalsImplicitMode\\n function acceptImplicitRequest(\\n address wallet,\\n Attestation calldata attestation,\\n Payload.Call calldata call\\n ) external view returns (bytes32) {\\n _validateImplicitRequest(wallet, attestation, call);\\n return _validator.validateAttestation(wallet, attestation, _projectId);\\n }\\n\\n /// @notice Validates an implicit request\\n /// @dev Optional hook for additional validation of the implicit requests\\n /// @param wallet The wallet's address\\n /// @param attestation The attestation data\\n /// @param call The call to validate\\n function _validateImplicitRequest(\\n address wallet,\\n Attestation calldata attestation,\\n Payload.Call calldata call\\n ) internal view virtual { }\\n\\n /// @inheritdoc IERC165\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view virtual override returns (bool) {\\n return interfaceId == type(ISignalsImplicitMode).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n}\\n\",\"keccak256\":\"0xd9107be2460f7f7ec4bdfefc3d10c79aa92b9285e1b12a75cb2a8d17b150a2ec\",\"license\":\"Apache-2.0\"},\"lib/signals-implicit-mode/src/registry/IImplicitProjectValidation.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.13;\\n\\nimport { Attestation } from \\\"sequence-v3/src/extensions/sessions/implicit/Attestation.sol\\\";\\n\\n/// @title IImplicitProjectValidation\\n/// @author Michael Standen\\n/// @notice Interface for contracts supporting validation of implicit sessions for projects\\ninterface IImplicitProjectValidation {\\n\\n /// @notice Invalid redirect url error\\n error InvalidRedirectUrl();\\n\\n /// @notice Check if a project has a code\\n /// @param wallet The wallet address\\n /// @param attestation The attestation\\n /// @param projectId The project id\\n /// @return magic The attestation magic bytes for the wallet address\\n function validateAttestation(\\n address wallet,\\n Attestation calldata attestation,\\n bytes32 projectId\\n ) external view returns (bytes32);\\n\\n}\\n\",\"keccak256\":\"0x1e8c305e011aa13d774e0ff3cfd9286af3d8174c4e33ba5ef8f724ea2dd6e5b2\",\"license\":\"Apache-2.0\"},\"src/tokens/common/SignalsImplicitModeControlled.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.19;\\n\\nimport { AccessControlEnumerable } from \\\"openzeppelin-contracts/contracts/access/AccessControlEnumerable.sol\\\";\\nimport {\\n IERC165,\\n IImplicitProjectValidation,\\n SignalsImplicitMode\\n} from \\\"signals-implicit-mode/src/helper/SignalsImplicitMode.sol\\\";\\n\\n/**\\n * An abstract contract that allows implicit session access for a given project.\\n */\\nabstract contract SignalsImplicitModeControlled is AccessControlEnumerable, SignalsImplicitMode {\\n\\n bytes32 internal constant _IMPLICIT_MODE_ADMIN_ROLE = keccak256(\\\"IMPLICIT_MODE_ADMIN_ROLE\\\");\\n\\n function _initializeImplicitMode(address owner, address validator, bytes32 projectId) internal {\\n _grantRole(_IMPLICIT_MODE_ADMIN_ROLE, owner);\\n _initializeSignalsImplicitMode(validator, projectId);\\n }\\n\\n /**\\n * Updates the validator for implicit mode validation.\\n * @param validator The validator address.\\n * @notice Only callable by an address with the project admin role.\\n */\\n function setImplicitModeValidator(\\n address validator\\n ) external onlyRole(_IMPLICIT_MODE_ADMIN_ROLE) {\\n _validator = IImplicitProjectValidation(validator);\\n }\\n\\n /**\\n * Updates the settings for implicit mode validation.\\n * @param projectId The project id.\\n * @notice Only callable by an address with the project admin role.\\n */\\n function setImplicitModeProjectId(\\n bytes32 projectId\\n ) external onlyRole(_IMPLICIT_MODE_ADMIN_ROLE) {\\n _projectId = projectId;\\n }\\n\\n /// @inheritdoc IERC165\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view virtual override(AccessControlEnumerable, SignalsImplicitMode) returns (bool) {\\n return\\n AccessControlEnumerable.supportsInterface(interfaceId) || SignalsImplicitMode.supportsInterface(interfaceId);\\n }\\n\\n}\\n\",\"keccak256\":\"0xb1a20575f188af254f90ec7df7f70415610ba5f41f7966ce383b50063220b860\",\"license\":\"Apache-2.0\"}},\"version\":1}", + "userdoc": { + "kind": "user", + "methods": { + "acceptImplicitRequest(address,(address,bytes4,bytes32,bytes32,bytes,(string,uint64)),(address,uint256,bytes,uint256,bool,bool,uint256))": { + "notice": "Determines if an implicit request is valid" + }, + "setImplicitModeProjectId(bytes32)": { + "notice": "Updates the settings for implicit mode validation.Only callable by an address with the project admin role." + }, + "setImplicitModeValidator(address)": { + "notice": "Updates the validator for implicit mode validation.Only callable by an address with the project admin role." + } + }, + "notice": "An abstract contract that allows implicit session access for a given project.", + "version": 1 + } + } + } + }, + "sources": { + "lib/openzeppelin-contracts/contracts/access/AccessControl.sol": { + "id": 0 + }, + "lib/openzeppelin-contracts/contracts/access/AccessControlEnumerable.sol": { + "id": 1 + }, + "lib/openzeppelin-contracts/contracts/access/IAccessControl.sol": { + "id": 2 + }, + "lib/openzeppelin-contracts/contracts/access/IAccessControlEnumerable.sol": { + "id": 3 + }, + "lib/openzeppelin-contracts/contracts/access/Ownable.sol": { + "id": 4 + }, + "lib/openzeppelin-contracts/contracts/interfaces/IERC1967.sol": { + "id": 5 + }, + "lib/openzeppelin-contracts/contracts/interfaces/IERC2981.sol": { + "id": 6 + }, + "lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol": { + "id": 7 + }, + "lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Upgrade.sol": { + "id": 8 + }, + "lib/openzeppelin-contracts/contracts/proxy/Proxy.sol": { + "id": 9 + }, + "lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol": { + "id": 10 + }, + "lib/openzeppelin-contracts/contracts/proxy/beacon/UpgradeableBeacon.sol": { + "id": 11 + }, + "lib/openzeppelin-contracts/contracts/token/common/ERC2981.sol": { + "id": 12 + }, + "lib/openzeppelin-contracts/contracts/utils/Address.sol": { + "id": 13 + }, + "lib/openzeppelin-contracts/contracts/utils/Context.sol": { + "id": 14 + }, + "lib/openzeppelin-contracts/contracts/utils/Create2.sol": { + "id": 15 + }, + "lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol": { + "id": 16 + }, + "lib/openzeppelin-contracts/contracts/utils/Strings.sol": { + "id": 17 + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol": { + "id": 18 + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol": { + "id": 19 + }, + "lib/openzeppelin-contracts/contracts/utils/math/Math.sol": { + "id": 20 + }, + "lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol": { + "id": 21 + }, + "lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol": { + "id": 22 + }, + "lib/signals-implicit-mode/lib/sequence-v3/src/extensions/sessions/implicit/Attestation.sol": { + "id": 23 + }, + "lib/signals-implicit-mode/lib/sequence-v3/src/extensions/sessions/implicit/ISignalsImplicitMode.sol": { + "id": 24 + }, + "lib/signals-implicit-mode/lib/sequence-v3/src/modules/Payload.sol": { + "id": 25 + }, + "lib/signals-implicit-mode/lib/sequence-v3/src/utils/LibBytes.sol": { + "id": 26 + }, + "lib/signals-implicit-mode/src/helper/SignalsImplicitMode.sol": { + "id": 27 + }, + "lib/signals-implicit-mode/src/registry/IImplicitProjectValidation.sol": { + "id": 28 + }, + "lib/solady/src/tokens/ERC1155.sol": { + "id": 29 + }, + "lib/solady/src/utils/LibBytes.sol": { + "id": 30 + }, + "lib/solady/src/utils/LibString.sol": { + "id": 31 + }, + "lib/solady/src/utils/MerkleProofLib.sol": { + "id": 32 + }, + "src/proxies/SequenceProxyFactory.sol": { + "id": 33 + }, + "src/proxies/TransparentUpgradeableBeaconProxy.sol": { + "id": 34 + }, + "src/proxies/openzeppelin/BeaconProxy.sol": { + "id": 35 + }, + "src/proxies/openzeppelin/ERC1967Proxy.sol": { + "id": 36 + }, + "src/proxies/openzeppelin/TransparentUpgradeableProxy.sol": { + "id": 37 + }, + "src/tokens/ERC1155/ERC1155BaseToken.sol": { + "id": 38 + }, + "src/tokens/ERC1155/extensions/supply/ERC1155Supply.sol": { + "id": 39 + }, + "src/tokens/ERC1155/extensions/supply/IERC1155Supply.sol": { + "id": 40 + }, + "src/tokens/ERC1155/presets/items/ERC1155Items.sol": { + "id": 41 + }, + "src/tokens/ERC1155/presets/items/IERC1155Items.sol": { + "id": 42 + }, + "src/tokens/ERC1155/presets/pack/ERC1155Pack.sol": { + "id": 43 + }, + "src/tokens/ERC1155/presets/pack/ERC1155PackFactory.sol": { + "id": 44 + }, + "src/tokens/ERC1155/presets/pack/IERC1155Pack.sol": { + "id": 45 + }, + "src/tokens/ERC1155/presets/pack/IERC1155PackFactory.sol": { + "id": 46 + }, + "src/tokens/ERC721/presets/items/IERC721Items.sol": { + "id": 47 + }, + "src/tokens/common/ERC2981Controlled.sol": { + "id": 48 + }, + "src/tokens/common/IERC2981Controlled.sol": { + "id": 49 + }, + "src/tokens/common/SignalsImplicitModeControlled.sol": { + "id": 50 + } + } + }, + "solcLongVersion": "0.8.27+commit.40a35a09", + "solcVersion": "0.8.27" +} diff --git a/jobs/builder/factories_v2.yaml b/jobs/builder/factories_v2.yaml index 515d70a..3a3e122 100644 --- a/jobs/builder/factories_v2.yaml +++ b/jobs/builder/factories_v2.yaml @@ -2,6 +2,7 @@ name: "factories" version: "2" description: "Factory contracts for the builder" depends_on: ["era-evm-predeploy-erc2470"] +deprecated: true actions: - name: "erc20-factory" diff --git a/jobs/builder/factories_v3.yaml b/jobs/builder/factories_v3.yaml new file mode 100644 index 0000000..5b4d36f --- /dev/null +++ b/jobs/builder/factories_v3.yaml @@ -0,0 +1,421 @@ +name: "factories" +version: "3" +description: "Factory contracts for the builder" +depends_on: ["era-evm-predeploy-erc2470"] + +actions: + - name: "erc20-factory" + template: "erc-2470" + arguments: + salt: "{{salt-zero}}" + creationCode: + type: "constructor-encode" + arguments: + creationCode: "{{Contract(./build-info/v1/ERC20-factory.json:ERC20ItemsFactory).creationCode}}" + types: ["address"] + values: ["{{developer-multisig-01}}"] + output: true + + - name: "erc721-factory" + template: "erc-2470" + arguments: + salt: "{{salt-zero}}" + creationCode: + type: "constructor-encode" + arguments: + creationCode: "{{Contract(./build-info/v1/ERC721-factory.json:ERC721ItemsFactory).creationCode}}" + types: ["address"] + values: ["{{developer-multisig-01}}"] + output: true + + - name: "erc1155-factory" + template: "erc-2470" + arguments: + salt: "{{salt-zero}}" + creationCode: + type: "constructor-encode" + arguments: + creationCode: "{{Contract(./build-info/v1/ERC1155-factory.json:ERC1155ItemsFactory).creationCode}}" + types: ["address"] + values: ["{{developer-multisig-01}}"] + output: true + + - name: "erc721-sale-factory" + template: "erc-2470" + arguments: + salt: "{{salt-zero}}" + creationCode: + type: "constructor-encode" + arguments: + creationCode: "{{Contract(./build-info/v1/ERC721-Sale-factory.json:ERC721SaleFactory).creationCode}}" + types: ["address"] + values: ["{{developer-multisig-01}}"] + output: true + + - name: "erc1155-sale-factory" + template: "erc-2470" + arguments: + salt: "{{salt-zero}}" + creationCode: + type: "constructor-encode" + arguments: + creationCode: "{{Contract(./build-info/v1/ERC1155-Sale-factory.json:ERC1155SaleFactory).creationCode}}" + types: ["address"] + values: ["{{developer-multisig-01}}"] + output: true + + - name: "erc721-soulbound-factory" + template: "erc-2470" + arguments: + salt: "{{salt-zero}}" + creationCode: + type: "constructor-encode" + arguments: + creationCode: "{{Contract(./build-info/v1/ERC721-Soulbound-factory.json:ERC721SoulboundFactory).creationCode}}" + types: ["address"] + values: ["{{developer-multisig-01}}"] + output: true + + - name: "erc1155-soulbound-factory" + template: "erc-2470" + arguments: + salt: "{{salt-zero}}" + creationCode: + type: "constructor-encode" + arguments: + creationCode: "{{Contract(./build-info/v1/ERC1155-Soulbound-factory.json:ERC1155SoulboundFactory).creationCode}}" + types: ["address"] + values: ["{{developer-multisig-01}}"] + output: true + + - name: "erc1155-holder" + template: "erc-2470" + arguments: + salt: "{{salt-zero}}" + creationCode: + type: "constructor-encode" + arguments: + creationCode: "{{Contract(./build-info/v2/ERC1155-Holder.json:ERC1155Holder).creationCode}}" + output: true + + - name: "erc1155-pack-factory" + template: "erc-2470" + arguments: + salt: "{{salt-zero}}" + creationCode: + type: "constructor-encode" + arguments: + creationCode: "{{Contract(./build-info/v2/ERC1155-Pack-factory.json:ERC1155PackFactory).creationCode}}" + types: ["address", "address"] + values: ["{{developer-multisig-01}}", "{{erc1155-holder.address}}"] + output: true + + - name: "verify-erc20-factory" + depends_on: ["erc20-factory"] + template: "verify-contract" + arguments: + address: "{{erc20-factory.address}}" + contract: "{{Contract(./build-info/v1/ERC20-factory.json:ERC20ItemsFactory)}}" + constructorArguments: + type: "constructor-encode" + arguments: + types: ["address"] + values: ["{{developer-multisig-01}}"] + output: false + + - name: "verify-erc20-implementation" + depends_on: ["verify-erc20-factory"] + template: "verify-contract" + arguments: + address: + type: "compute-create" + arguments: + deployerAddress: "{{erc20-factory.address}}" + nonce: "1" + contract: "{{Contract(./build-info/v1/ERC20-factory.json:ERC20Items)}}" + output: false + + - name: "verify-erc20-implementation-proxy" + depends_on: ["verify-erc20-implementation"] + template: "verify-contract" + arguments: + address: + type: "compute-create" + arguments: + deployerAddress: "{{erc20-factory.address}}" + nonce: "2" + contract: "{{Contract(./build-info/v1/ERC20-factory.json:UpgradeableBeacon)}}" + constructorArguments: + type: "constructor-encode" + arguments: + types: ["address"] + values: + - type: "compute-create" + arguments: + deployerAddress: "{{erc20-factory.address}}" + nonce: "1" + output: false + + - name: "verify-erc721-factory" + depends_on: ["erc721-factory"] + template: "verify-contract" + arguments: + address: "{{erc721-factory.address}}" + contract: "{{Contract(./build-info/v1/ERC721-factory.json:ERC721ItemsFactory)}}" + constructorArguments: + type: "constructor-encode" + arguments: + types: ["address"] + values: ["{{developer-multisig-01}}"] + output: false + + - name: "verify-erc721-implementation" + depends_on: ["verify-erc721-factory"] + template: "verify-contract" + arguments: + address: + type: "compute-create" + arguments: + deployerAddress: "{{erc721-factory.address}}" + nonce: "1" + contract: "{{Contract(./build-info/v1/ERC721-factory.json:ERC721Items)}}" + output: false + + - name: "verify-erc721-implementation-proxy" + depends_on: ["verify-erc721-implementation"] + template: "verify-contract" + arguments: + address: + type: "compute-create" + arguments: + deployerAddress: "{{erc721-factory.address}}" + nonce: "2" + contract: "{{Contract(./build-info/v1/ERC721-factory.json:UpgradeableBeacon)}}" + constructorArguments: + type: "constructor-encode" + arguments: + types: ["address"] + values: + - type: "compute-create" + arguments: + deployerAddress: "{{erc721-factory.address}}" + nonce: "1" + output: false + - name: "verify-erc1155-factory" + depends_on: ["erc1155-factory"] + template: "verify-contract" + arguments: + address: "{{erc1155-factory.address}}" + contract: "{{Contract(./build-info/v1/ERC1155-factory.json:ERC1155ItemsFactory)}}" + constructorArguments: + type: "constructor-encode" + arguments: + types: ["address"] + values: ["{{developer-multisig-01}}"] + output: false + + - name: "verify-erc1155-implementation" + depends_on: ["verify-erc1155-factory"] + template: "verify-contract" + arguments: + address: + type: "compute-create" + arguments: + deployerAddress: "{{erc1155-factory.address}}" + nonce: "1" + contract: "{{Contract(./build-info/v1/ERC1155-factory.json:ERC1155Items)}}" + output: false + + - name: "verify-erc1155-implementation-proxy" + depends_on: ["verify-erc1155-implementation"] + template: "verify-contract" + arguments: + address: + type: "compute-create" + arguments: + deployerAddress: "{{erc1155-factory.address}}" + nonce: "2" + contract: "{{Contract(./build-info/v1/ERC1155-factory.json:UpgradeableBeacon)}}" + constructorArguments: + type: "constructor-encode" + arguments: + types: ["address"] + values: + - type: "compute-create" + arguments: + deployerAddress: "{{erc1155-factory.address}}" + nonce: "1" + output: false + + - name: "verify-erc721-sale-factory" + depends_on: ["erc721-sale-factory"] + template: "verify-contract" + arguments: + address: "{{erc721-sale-factory.address}}" + contract: "{{Contract(./build-info/v1/ERC721-Sale-factory.json:ERC721SaleFactory)}}" + constructorArguments: + type: "constructor-encode" + arguments: + types: ["address"] + values: ["{{developer-multisig-01}}"] + output: false + + - name: "verify-erc721-sale-implementation" + depends_on: ["verify-erc721-sale-factory"] + template: "verify-contract" + arguments: + address: + type: "compute-create" + arguments: + deployerAddress: "{{erc721-sale-factory.address}}" + nonce: "1" + contract: "{{Contract(./build-info/v1/ERC721-Sale-factory.json:ERC721Sale)}}" + output: false + + - name: "verify-erc721-sale-implementation-proxy" + depends_on: ["verify-erc721-sale-implementation"] + template: "verify-contract" + arguments: + address: + type: "compute-create" + arguments: + deployerAddress: "{{erc721-sale-factory.address}}" + nonce: "2" + contract: "{{Contract(./build-info/v1/ERC721-Sale-factory.json:UpgradeableBeacon)}}" + constructorArguments: + type: "constructor-encode" + arguments: + types: ["address"] + values: + - type: "compute-create" + arguments: + deployerAddress: "{{erc721-sale-factory.address}}" + nonce: "1" + output: false + + - name: "verify-erc1155-sale-factory" + depends_on: ["erc1155-sale-factory"] + template: "verify-contract" + arguments: + address: "{{erc1155-sale-factory.address}}" + contract: "{{Contract(./build-info/v1/ERC1155-Sale-factory.json:ERC1155SaleFactory)}}" + constructorArguments: + type: "constructor-encode" + arguments: + types: ["address"] + values: ["{{developer-multisig-01}}"] + output: false + + - name: "verify-erc1155-sale-implementation" + depends_on: ["verify-erc1155-sale-factory"] + template: "verify-contract" + arguments: + address: + type: "compute-create" + arguments: + deployerAddress: "{{erc1155-sale-factory.address}}" + nonce: "1" + contract: "{{Contract(./build-info/v1/ERC1155-Sale-factory.json:ERC1155Sale)}}" + output: false + + - name: "verify-erc1155-sale-implementation-proxy" + depends_on: ["verify-erc1155-sale-implementation"] + template: "verify-contract" + arguments: + address: + type: "compute-create" + arguments: + deployerAddress: "{{erc1155-sale-factory.address}}" + nonce: "2" + contract: "{{Contract(./build-info/v1/ERC1155-Sale-factory.json:UpgradeableBeacon)}}" + constructorArguments: + type: "constructor-encode" + arguments: + types: ["address"] + values: + - type: "compute-create" + arguments: + deployerAddress: "{{erc1155-sale-factory.address}}" + nonce: "1" + output: false + + - name: "verify-erc721-soulbound-factory" + depends_on: ["erc721-soulbound-factory"] + template: "verify-contract" + arguments: + address: "{{erc721-soulbound-factory.address}}" + contract: "{{Contract(./build-info/v1/ERC721-Soulbound-factory.json:ERC721SoulboundFactory)}}" + constructorArguments: + type: "constructor-encode" + arguments: + types: ["address"] + values: ["{{developer-multisig-01}}"] + output: false + + - name: "verify-erc721-soulbound-implementation" + depends_on: ["verify-erc721-soulbound-factory"] + template: "verify-contract" + arguments: + address: + type: "compute-create" + arguments: + deployerAddress: "{{erc721-soulbound-factory.address}}" + nonce: "1" + contract: "{{Contract(./build-info/v1/ERC721-Soulbound-factory.json:ERC721Soulbound)}}" + output: false + + - name: "verify-erc721-soulbound-implementation-proxy" + depends_on: ["verify-erc721-soulbound-implementation"] + template: "verify-contract" + arguments: + address: + type: "compute-create" + arguments: + deployerAddress: "{{erc721-soulbound-factory.address}}" + nonce: "2" + contract: "{{Contract(./build-info/v1/ERC721-Soulbound-factory.json:UpgradeableBeacon)}}" + constructorArguments: + type: "constructor-encode" + arguments: + types: ["address"] + values: + - type: "compute-create" + arguments: + deployerAddress: "{{erc721-soulbound-factory.address}}" + nonce: "1" + output: false + + - name: "verify-erc1155-soulbound-factory" + depends_on: ["erc1155-soulbound-factory"] + template: "verify-contract" + arguments: + address: "{{erc1155-soulbound-factory.address}}" + contract: "{{Contract(./build-info/v1/ERC1155-Soulbound-factory.json:ERC1155SoulboundFactory)}}" + constructorArguments: + type: "constructor-encode" + arguments: + types: ["address"] + values: ["{{developer-multisig-01}}"] + output: false + + - name: "verify-erc1155-holder" + depends_on: ["erc1155-holder"] + template: "verify-contract" + arguments: + address: "{{erc1155-holder.address}}" + contract: "{{Contract(./build-info/v2/ERC1155-Holder.json:ERC1155Holder)}}" + output: false + + + - name: "verify-erc1155-pack-factory" + depends_on: ["erc1155-pack-factory"] + template: "verify-contract" + arguments: + address: "{{erc1155-pack-factory.address}}" + contract: "{{Contract(./build-info/v2/ERC1155-Pack-factory.json:ERC1155PackFactory)}}" + constructorArguments: + type: "constructor-encode" + arguments: + types: ["address", "address"] + values: ["{{developer-multisig-01}}", "{{erc1155-holder.address}}"] + output: false \ No newline at end of file